@tambo-ai/react 0.71.0 → 0.72.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 (83) hide show
  1. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
  2. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
  3. package/dist/v1/hooks/use-tambo-v1-component-state.js +134 -0
  4. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
  5. package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
  6. package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
  7. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +292 -0
  8. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
  9. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
  10. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
  11. package/dist/v1/hooks/use-tambo-v1-thread-input.js +76 -0
  12. package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
  13. package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
  14. package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
  15. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +168 -0
  16. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
  17. package/dist/v1/index.d.ts +23 -12
  18. package/dist/v1/index.d.ts.map +1 -1
  19. package/dist/v1/index.js +48 -14
  20. package/dist/v1/index.js.map +1 -1
  21. package/dist/v1/providers/tambo-v1-provider.d.ts +43 -1
  22. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  23. package/dist/v1/providers/tambo-v1-provider.js +24 -3
  24. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  25. package/dist/v1/providers/tambo-v1-provider.test.js +58 -0
  26. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  27. package/dist/v1/types/message.d.ts +27 -2
  28. package/dist/v1/types/message.d.ts.map +1 -1
  29. package/dist/v1/types/message.js.map +1 -1
  30. package/dist/v1/utils/component-renderer.d.ts +89 -0
  31. package/dist/v1/utils/component-renderer.d.ts.map +1 -0
  32. package/dist/v1/utils/component-renderer.js +216 -0
  33. package/dist/v1/utils/component-renderer.js.map +1 -0
  34. package/dist/v1/utils/component-renderer.test.d.ts +2 -0
  35. package/dist/v1/utils/component-renderer.test.d.ts.map +1 -0
  36. package/dist/v1/utils/component-renderer.test.js +380 -0
  37. package/dist/v1/utils/component-renderer.test.js.map +1 -0
  38. package/dist/v1/utils/event-accumulator.js +28 -8
  39. package/dist/v1/utils/event-accumulator.js.map +1 -1
  40. package/dist/v1/utils/event-accumulator.test.js +201 -6
  41. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  42. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
  43. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
  44. package/esm/v1/hooks/use-tambo-v1-component-state.js +131 -0
  45. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
  46. package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
  47. package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
  48. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +290 -0
  49. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
  50. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
  51. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
  52. package/esm/v1/hooks/use-tambo-v1-thread-input.js +73 -0
  53. package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
  54. package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
  55. package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
  56. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +166 -0
  57. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
  58. package/esm/v1/index.d.ts +23 -12
  59. package/esm/v1/index.d.ts.map +1 -1
  60. package/esm/v1/index.js +31 -12
  61. package/esm/v1/index.js.map +1 -1
  62. package/esm/v1/providers/tambo-v1-provider.d.ts +43 -1
  63. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  64. package/esm/v1/providers/tambo-v1-provider.js +24 -4
  65. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  66. package/esm/v1/providers/tambo-v1-provider.test.js +59 -1
  67. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  68. package/esm/v1/types/message.d.ts +27 -2
  69. package/esm/v1/types/message.d.ts.map +1 -1
  70. package/esm/v1/types/message.js.map +1 -1
  71. package/esm/v1/utils/component-renderer.d.ts +89 -0
  72. package/esm/v1/utils/component-renderer.d.ts.map +1 -0
  73. package/esm/v1/utils/component-renderer.js +175 -0
  74. package/esm/v1/utils/component-renderer.js.map +1 -0
  75. package/esm/v1/utils/component-renderer.test.d.ts +2 -0
  76. package/esm/v1/utils/component-renderer.test.d.ts.map +1 -0
  77. package/esm/v1/utils/component-renderer.test.js +375 -0
  78. package/esm/v1/utils/component-renderer.test.js.map +1 -0
  79. package/esm/v1/utils/event-accumulator.js +28 -8
  80. package/esm/v1/utils/event-accumulator.js.map +1 -1
  81. package/esm/v1/utils/event-accumulator.test.js +201 -6
  82. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useTamboV1ThreadInput = useTamboV1ThreadInput;
5
+ /**
6
+ * useTamboV1ThreadInput - Thread Input Hook for v1 API
7
+ *
8
+ * Manages thread input state and message submission, mirroring
9
+ * the beta SDK's useTamboThreadInput API.
10
+ */
11
+ const react_1 = require("react");
12
+ const use_tambo_v1_send_message_1 = require("./use-tambo-v1-send-message");
13
+ /**
14
+ * Hook to manage thread input state and message submission.
15
+ *
16
+ * Provides a similar API to the beta SDK's useTamboThreadInput,
17
+ * managing input value state and providing a submit function.
18
+ * @param threadId - Optional thread ID to send messages to. If not provided, creates new thread
19
+ * @returns Thread input state and submit function
20
+ * @example
21
+ * ```tsx
22
+ * function ChatInput({ threadId }: { threadId?: string }) {
23
+ * const { value, setValue, submit, isPending } = useTamboV1ThreadInput(threadId);
24
+ *
25
+ * const handleSubmit = async (e: React.FormEvent) => {
26
+ * e.preventDefault();
27
+ * const result = await submit();
28
+ * console.log('Sent to thread:', result.threadId);
29
+ * };
30
+ *
31
+ * return (
32
+ * <form onSubmit={handleSubmit}>
33
+ * <input
34
+ * value={value}
35
+ * onChange={(e) => setValue(e.target.value)}
36
+ * disabled={isPending}
37
+ * />
38
+ * <button type="submit" disabled={isPending || !value.trim()}>
39
+ * Send
40
+ * </button>
41
+ * </form>
42
+ * );
43
+ * }
44
+ * ```
45
+ */
46
+ function useTamboV1ThreadInput(threadId) {
47
+ const [value, setValue] = (0, react_1.useState)("");
48
+ const mutation = (0, use_tambo_v1_send_message_1.useTamboV1SendMessage)(threadId);
49
+ const submit = (0, react_1.useCallback)(async (options) => {
50
+ const trimmedValue = value.trim();
51
+ if (!trimmedValue) {
52
+ throw new Error("Message cannot be empty");
53
+ }
54
+ const result = await mutation.mutateAsync({
55
+ message: {
56
+ role: "user",
57
+ content: [{ type: "text", text: trimmedValue }],
58
+ },
59
+ debug: options?.debug,
60
+ });
61
+ // Clear input on successful submission
62
+ setValue("");
63
+ return result;
64
+ }, [value, mutation]);
65
+ return {
66
+ value,
67
+ setValue,
68
+ submit,
69
+ isPending: mutation.isPending,
70
+ isError: mutation.isError,
71
+ error: mutation.error,
72
+ isSuccess: mutation.isSuccess,
73
+ reset: mutation.reset,
74
+ };
75
+ }
76
+ //# sourceMappingURL=use-tambo-v1-thread-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tambo-v1-thread-input.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA0Eb,sDAuCC;AA/GD;;;;;GAKG;AAEH,iCAA8C;AAC9C,2EAAoE;AA+BpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAgB,qBAAqB,CACnC,QAAiB;IAEjB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAA,iDAAqB,EAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,MAAM,GAAG,IAAA,mBAAW,EACxB,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;YACxC,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;aAChD;YACD,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,uCAAuC;QACvC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEb,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB,CAAC;IAEF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,MAAM;QACN,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1ThreadInput - Thread Input Hook for v1 API\n *\n * Manages thread input state and message submission, mirroring\n * the beta SDK's useTamboThreadInput API.\n */\n\nimport { useCallback, useState } from \"react\";\nimport { useTamboV1SendMessage } from \"./use-tambo-v1-send-message\";\n\n/**\n * Options for submitting a message\n */\nexport interface SubmitOptions {\n /**\n * Enable debug logging for the stream\n */\n debug?: boolean;\n}\n\n/**\n * Return type for useTamboV1ThreadInput hook\n */\nexport interface UseTamboV1ThreadInputReturn {\n /** Current value of the input field */\n value: string;\n /** Function to update the input value */\n setValue: React.Dispatch<React.SetStateAction<string>>;\n /** Submit the current input. Clears input on success. */\n submit: (\n options?: SubmitOptions,\n ) => Promise<{ threadId: string | undefined }>;\n isPending: boolean;\n isError: boolean;\n error: Error | null;\n isSuccess: boolean;\n reset: () => void;\n}\n\n/**\n * Hook to manage thread input state and message submission.\n *\n * Provides a similar API to the beta SDK's useTamboThreadInput,\n * managing input value state and providing a submit function.\n * @param threadId - Optional thread ID to send messages to. If not provided, creates new thread\n * @returns Thread input state and submit function\n * @example\n * ```tsx\n * function ChatInput({ threadId }: { threadId?: string }) {\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput(threadId);\n *\n * const handleSubmit = async (e: React.FormEvent) => {\n * e.preventDefault();\n * const result = await submit();\n * console.log('Sent to thread:', result.threadId);\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * disabled={isPending}\n * />\n * <button type=\"submit\" disabled={isPending || !value.trim()}>\n * Send\n * </button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useTamboV1ThreadInput(\n threadId?: string,\n): UseTamboV1ThreadInputReturn {\n const [value, setValue] = useState(\"\");\n const mutation = useTamboV1SendMessage(threadId);\n\n const submit = useCallback(\n async (options?: SubmitOptions) => {\n const trimmedValue = value.trim();\n if (!trimmedValue) {\n throw new Error(\"Message cannot be empty\");\n }\n\n const result = await mutation.mutateAsync({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: trimmedValue }],\n },\n debug: options?.debug,\n });\n\n // Clear input on successful submission\n setValue(\"\");\n\n return result;\n },\n [value, mutation],\n );\n\n return {\n value,\n setValue,\n submit,\n isPending: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n isSuccess: mutation.isSuccess,\n reset: mutation.reset,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-tambo-v1-thread-input.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tambo-v1-thread-input.test.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("@testing-library/react");
4
+ const use_tambo_v1_thread_input_1 = require("./use-tambo-v1-thread-input");
5
+ // Create mock functions
6
+ const mockMutateAsync = jest.fn();
7
+ const mockMutate = jest.fn();
8
+ const mockReset = jest.fn();
9
+ // Mock useTamboV1SendMessage module
10
+ jest.mock("./use-tambo-v1-send-message");
11
+ const use_tambo_v1_send_message_1 = require("./use-tambo-v1-send-message");
12
+ // Helper to set up the mock with default values
13
+ function setupMock(overrides = {}) {
14
+ const mockReturn = {
15
+ mutateAsync: mockMutateAsync,
16
+ mutate: mockMutate,
17
+ isPending: false,
18
+ isError: false,
19
+ error: null,
20
+ isSuccess: false,
21
+ isIdle: true,
22
+ isPaused: false,
23
+ status: "idle",
24
+ data: undefined,
25
+ variables: undefined,
26
+ failureCount: 0,
27
+ failureReason: null,
28
+ reset: mockReset,
29
+ context: undefined,
30
+ submittedAt: 0,
31
+ ...overrides,
32
+ };
33
+ jest.mocked(use_tambo_v1_send_message_1.useTamboV1SendMessage).mockReturnValue(mockReturn);
34
+ return mockReturn;
35
+ }
36
+ describe("useTamboV1ThreadInput", () => {
37
+ beforeEach(() => {
38
+ jest.clearAllMocks();
39
+ mockMutateAsync.mockResolvedValue({ threadId: "thread_123" });
40
+ setupMock();
41
+ });
42
+ describe("State Management", () => {
43
+ it("initializes with empty value", () => {
44
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
45
+ expect(result.current.value).toBe("");
46
+ });
47
+ it("updates value via setValue", () => {
48
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
49
+ (0, react_1.act)(() => {
50
+ result.current.setValue("Hello world");
51
+ });
52
+ expect(result.current.value).toBe("Hello world");
53
+ });
54
+ it("supports functional updates for setValue", () => {
55
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
56
+ (0, react_1.act)(() => {
57
+ result.current.setValue("Hello");
58
+ });
59
+ (0, react_1.act)(() => {
60
+ result.current.setValue((prev) => `${prev} world`);
61
+ });
62
+ expect(result.current.value).toBe("Hello world");
63
+ });
64
+ });
65
+ describe("Submit Behavior", () => {
66
+ it("submits message and clears input on success", async () => {
67
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)("thread_123"));
68
+ (0, react_1.act)(() => {
69
+ result.current.setValue("Test message");
70
+ });
71
+ await (0, react_1.act)(async () => {
72
+ const response = await result.current.submit();
73
+ expect(response.threadId).toBe("thread_123");
74
+ });
75
+ // Input should be cleared
76
+ expect(result.current.value).toBe("");
77
+ // Should have called mutateAsync with correct message format
78
+ expect(mockMutateAsync).toHaveBeenCalledWith({
79
+ message: {
80
+ role: "user",
81
+ content: [{ type: "text", text: "Test message" }],
82
+ },
83
+ debug: undefined,
84
+ });
85
+ });
86
+ it("throws error when submitting empty message", async () => {
87
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
88
+ await expect(result.current.submit()).rejects.toThrow("Message cannot be empty");
89
+ expect(mockMutateAsync).not.toHaveBeenCalled();
90
+ });
91
+ it("throws error when submitting whitespace-only message", async () => {
92
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
93
+ (0, react_1.act)(() => {
94
+ result.current.setValue(" ");
95
+ });
96
+ await expect(result.current.submit()).rejects.toThrow("Message cannot be empty");
97
+ expect(mockMutateAsync).not.toHaveBeenCalled();
98
+ });
99
+ it("passes debug option to mutation", async () => {
100
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
101
+ (0, react_1.act)(() => {
102
+ result.current.setValue("Debug message");
103
+ });
104
+ await (0, react_1.act)(async () => {
105
+ await result.current.submit({ debug: true });
106
+ });
107
+ expect(mockMutateAsync).toHaveBeenCalledWith({
108
+ message: {
109
+ role: "user",
110
+ content: [{ type: "text", text: "Debug message" }],
111
+ },
112
+ debug: true,
113
+ });
114
+ });
115
+ it("trims whitespace from message", async () => {
116
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
117
+ (0, react_1.act)(() => {
118
+ result.current.setValue(" Trimmed message ");
119
+ });
120
+ await (0, react_1.act)(async () => {
121
+ await result.current.submit();
122
+ });
123
+ expect(mockMutateAsync).toHaveBeenCalledWith({
124
+ message: {
125
+ role: "user",
126
+ content: [{ type: "text", text: "Trimmed message" }],
127
+ },
128
+ debug: undefined,
129
+ });
130
+ });
131
+ });
132
+ describe("Thread ID Handling", () => {
133
+ it("passes threadId to useTamboV1SendMessage", () => {
134
+ (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)("custom_thread_id"));
135
+ expect(use_tambo_v1_send_message_1.useTamboV1SendMessage).toHaveBeenCalledWith("custom_thread_id");
136
+ });
137
+ it("passes undefined threadId when not provided", () => {
138
+ (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
139
+ expect(use_tambo_v1_send_message_1.useTamboV1SendMessage).toHaveBeenCalledWith(undefined);
140
+ });
141
+ });
142
+ describe("Mutation State", () => {
143
+ it("exposes isPending state", () => {
144
+ setupMock({ isPending: true });
145
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
146
+ expect(result.current.isPending).toBe(true);
147
+ });
148
+ it("exposes isError state", () => {
149
+ setupMock({ isError: true, error: new Error("Test error") });
150
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
151
+ expect(result.current.isError).toBe(true);
152
+ expect(result.current.error?.message).toBe("Test error");
153
+ });
154
+ it("exposes isSuccess state", () => {
155
+ setupMock({ isSuccess: true });
156
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
157
+ expect(result.current.isSuccess).toBe(true);
158
+ });
159
+ it("exposes reset function", () => {
160
+ const { result } = (0, react_1.renderHook)(() => (0, use_tambo_v1_thread_input_1.useTamboV1ThreadInput)());
161
+ (0, react_1.act)(() => {
162
+ result.current.reset();
163
+ });
164
+ expect(mockReset).toHaveBeenCalled();
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=use-tambo-v1-thread-input.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tambo-v1-thread-input.test.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-thread-input.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { renderHook, act } from \"@testing-library/react\";\nimport { useTamboV1ThreadInput } from \"./use-tambo-v1-thread-input\";\n\n// Create mock functions\nconst mockMutateAsync = jest.fn();\nconst mockMutate = jest.fn();\nconst mockReset = jest.fn();\n\n// Mock useTamboV1SendMessage module\njest.mock(\"./use-tambo-v1-send-message\");\n\nimport { useTamboV1SendMessage } from \"./use-tambo-v1-send-message\";\n\n// Helper to set up the mock with default values\nfunction setupMock(overrides: Record<string, unknown> = {}) {\n const mockReturn = {\n mutateAsync: mockMutateAsync,\n mutate: mockMutate,\n isPending: false as const,\n isError: false as const,\n error: null,\n isSuccess: false as const,\n isIdle: true as const,\n isPaused: false as const,\n status: \"idle\" as const,\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: mockReset,\n context: undefined,\n submittedAt: 0,\n ...overrides,\n };\n jest.mocked(useTamboV1SendMessage).mockReturnValue(mockReturn);\n return mockReturn;\n}\n\ndescribe(\"useTamboV1ThreadInput\", () => {\n beforeEach(() => {\n jest.clearAllMocks();\n mockMutateAsync.mockResolvedValue({ threadId: \"thread_123\" });\n setupMock();\n });\n\n describe(\"State Management\", () => {\n it(\"initializes with empty value\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n expect(result.current.value).toBe(\"\");\n });\n\n it(\"updates value via setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.setValue(\"Hello world\");\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n\n it(\"supports functional updates for setValue\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.setValue(\"Hello\");\n });\n\n act(() => {\n result.current.setValue((prev) => `${prev} world`);\n });\n\n expect(result.current.value).toBe(\"Hello world\");\n });\n });\n\n describe(\"Submit Behavior\", () => {\n it(\"submits message and clears input on success\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput(\"thread_123\"));\n\n act(() => {\n result.current.setValue(\"Test message\");\n });\n\n await act(async () => {\n const response = await result.current.submit();\n expect(response.threadId).toBe(\"thread_123\");\n });\n\n // Input should be cleared\n expect(result.current.value).toBe(\"\");\n\n // Should have called mutateAsync with correct message format\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Test message\" }],\n },\n debug: undefined,\n });\n });\n\n it(\"throws error when submitting empty message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"throws error when submitting whitespace-only message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.setValue(\" \");\n });\n\n await expect(result.current.submit()).rejects.toThrow(\n \"Message cannot be empty\",\n );\n\n expect(mockMutateAsync).not.toHaveBeenCalled();\n });\n\n it(\"passes debug option to mutation\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.setValue(\"Debug message\");\n });\n\n await act(async () => {\n await result.current.submit({ debug: true });\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Debug message\" }],\n },\n debug: true,\n });\n });\n\n it(\"trims whitespace from message\", async () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.setValue(\" Trimmed message \");\n });\n\n await act(async () => {\n await result.current.submit();\n });\n\n expect(mockMutateAsync).toHaveBeenCalledWith({\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"Trimmed message\" }],\n },\n debug: undefined,\n });\n });\n });\n\n describe(\"Thread ID Handling\", () => {\n it(\"passes threadId to useTamboV1SendMessage\", () => {\n renderHook(() => useTamboV1ThreadInput(\"custom_thread_id\"));\n\n expect(useTamboV1SendMessage).toHaveBeenCalledWith(\"custom_thread_id\");\n });\n\n it(\"passes undefined threadId when not provided\", () => {\n renderHook(() => useTamboV1ThreadInput());\n\n expect(useTamboV1SendMessage).toHaveBeenCalledWith(undefined);\n });\n });\n\n describe(\"Mutation State\", () => {\n it(\"exposes isPending state\", () => {\n setupMock({ isPending: true });\n\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n expect(result.current.isPending).toBe(true);\n });\n\n it(\"exposes isError state\", () => {\n setupMock({ isError: true, error: new Error(\"Test error\") });\n\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n expect(result.current.isError).toBe(true);\n expect(result.current.error?.message).toBe(\"Test error\");\n });\n\n it(\"exposes isSuccess state\", () => {\n setupMock({ isSuccess: true });\n\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n expect(result.current.isSuccess).toBe(true);\n });\n\n it(\"exposes reset function\", () => {\n const { result } = renderHook(() => useTamboV1ThreadInput());\n\n act(() => {\n result.current.reset();\n });\n\n expect(mockReset).toHaveBeenCalled();\n });\n });\n});\n"]}
@@ -10,7 +10,7 @@
10
10
  * import {
11
11
  * TamboV1Provider,
12
12
  * useTamboV1,
13
- * useTamboV1SendMessage,
13
+ * useTamboV1ThreadInput,
14
14
  * } from '@tambo-ai/react/v1';
15
15
  *
16
16
  * function App() {
@@ -28,21 +28,21 @@
28
28
  * function ChatInterface() {
29
29
  * const [threadId, setThreadId] = useState<string>();
30
30
  * const { messages, isStreaming } = useTamboV1(threadId);
31
- * const sendMessage = useTamboV1SendMessage(threadId);
31
+ * const { value, setValue, submit, isPending } = useTamboV1ThreadInput(threadId);
32
32
  *
33
- * const handleSend = async (text: string) => {
34
- * const result = await sendMessage.mutateAsync({
35
- * message: { role: 'user', content: [{ type: 'text', text }] },
36
- * });
33
+ * const handleSubmit = async (e: React.FormEvent) => {
34
+ * e.preventDefault();
35
+ * const result = await submit();
37
36
  * if (!threadId) setThreadId(result.threadId);
38
37
  * };
39
38
  *
40
39
  * return (
41
- * <div>
40
+ * <form onSubmit={handleSubmit}>
42
41
  * {messages.map(msg => <Message key={msg.id} message={msg} />)}
43
42
  * {isStreaming && <LoadingIndicator />}
44
- * <MessageInput onSend={handleSend} />
45
- * </div>
43
+ * <input value={value} onChange={(e) => setValue(e.target.value)} />
44
+ * <button disabled={isPending}>Send</button>
45
+ * </form>
46
46
  * );
47
47
  * }
48
48
  * ```
@@ -57,17 +57,28 @@
57
57
  * SDK types: `import type { ... } from '@tambo-ai/typescript-sdk'`
58
58
  * AG-UI events: `import { EventType, type BaseEvent } from '@ag-ui/core'`
59
59
  */
60
- export { TamboV1Provider, type TamboV1ProviderProps, } from "./providers/tambo-v1-provider";
60
+ export { TamboV1Provider, useContextKey, type TamboV1ProviderProps, } from "./providers/tambo-v1-provider";
61
61
  export { TamboV1StreamProvider, useStreamState, useStreamDispatch, useThreadManagement, type ThreadManagement, } from "./providers/tambo-v1-stream-context";
62
62
  export { TamboRegistryProvider } from "../providers/tambo-registry-provider";
63
+ export { TamboContextHelpersProvider, useTamboContextHelpers, } from "../providers/tambo-context-helpers-provider";
63
64
  export { useTamboV1, type UseTamboV1Return } from "./hooks/use-tambo-v1";
64
- export { useTamboV1Messages, type UseTamboV1MessagesReturn, } from "./hooks/use-tambo-v1-messages";
65
- export { useTamboV1SendMessage, type SendMessageOptions, } from "./hooks/use-tambo-v1-send-message";
65
+ export { useTamboV1ThreadInput, type UseTamboV1ThreadInputReturn, type SubmitOptions, } from "./hooks/use-tambo-v1-thread-input";
66
66
  export { useTamboV1Thread } from "./hooks/use-tambo-v1-thread";
67
67
  export { useTamboV1ThreadList } from "./hooks/use-tambo-v1-thread-list";
68
+ export { useTamboV1ComponentState, type UseTamboV1ComponentStateReturn, } from "./hooks/use-tambo-v1-component-state";
69
+ export { useTamboClient } from "../providers/tambo-client-provider";
70
+ export { useTamboRegistry } from "../providers/tambo-registry-provider";
71
+ export { useV1ComponentContent, useV1ComponentContentOptional, renderComponentContent, renderMessageContent, renderMessageComponents, isComponentContent, type V1ComponentContentContext, type RenderComponentOptions, } from "./utils/component-renderer";
68
72
  export { applyJsonPatch } from "./utils/json-patch";
69
73
  export { toAvailableComponent, toAvailableComponents, toAvailableTool, toAvailableTools, } from "./utils/registry-conversion";
70
74
  export { executeClientTool, executeAllPendingTools, type PendingToolCall, } from "./utils/tool-executor";
71
75
  export { ToolCallTracker } from "./utils/tool-call-tracker";
72
76
  export { handleEventStream } from "./utils/stream-handler";
77
+ export { defineTool } from "../util/registry";
78
+ export { currentPageContextHelper, currentTimeContextHelper, } from "../context-helpers";
79
+ export type { AdditionalContext, ContextHelperFn, ContextHelpers, } from "../context-helpers";
80
+ export type { ComponentContextToolMetadata, ComponentRegistry, ParameterSpec, RegisteredComponent, TamboTool, ToolAnnotations, } from "../model/component-metadata";
81
+ export { MCPTransport } from "../model/mcp-server-info";
82
+ export type { McpServerInfo, NormalizedMcpServerInfo, } from "../model/mcp-server-info";
83
+ export type { ListResourceItem, ReadResourceResult, ResourceSource, } from "../model/resource-info";
73
84
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/v1/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AAMH,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAM7E,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,GAC9B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,qBAAqB,EACrB,KAAK,kBAAkB,GACxB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/v1/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AAMH,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAG7E,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,6CAA6C,CAAC;AAMrD,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,KAAK,aAAa,GACnB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EACL,wBAAwB,EACxB,KAAK,8BAA8B,GACpC,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAMxE,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,eAAe,GAChB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EACV,aAAa,EACb,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,wBAAwB,CAAC"}
package/dist/v1/index.js CHANGED
@@ -11,7 +11,7 @@
11
11
  * import {
12
12
  * TamboV1Provider,
13
13
  * useTamboV1,
14
- * useTamboV1SendMessage,
14
+ * useTamboV1ThreadInput,
15
15
  * } from '@tambo-ai/react/v1';
16
16
  *
17
17
  * function App() {
@@ -29,21 +29,21 @@
29
29
  * function ChatInterface() {
30
30
  * const [threadId, setThreadId] = useState<string>();
31
31
  * const { messages, isStreaming } = useTamboV1(threadId);
32
- * const sendMessage = useTamboV1SendMessage(threadId);
32
+ * const { value, setValue, submit, isPending } = useTamboV1ThreadInput(threadId);
33
33
  *
34
- * const handleSend = async (text: string) => {
35
- * const result = await sendMessage.mutateAsync({
36
- * message: { role: 'user', content: [{ type: 'text', text }] },
37
- * });
34
+ * const handleSubmit = async (e: React.FormEvent) => {
35
+ * e.preventDefault();
36
+ * const result = await submit();
38
37
  * if (!threadId) setThreadId(result.threadId);
39
38
  * };
40
39
  *
41
40
  * return (
42
- * <div>
41
+ * <form onSubmit={handleSubmit}>
43
42
  * {messages.map(msg => <Message key={msg.id} message={msg} />)}
44
43
  * {isStreaming && <LoadingIndicator />}
45
- * <MessageInput onSend={handleSend} />
46
- * </div>
44
+ * <input value={value} onChange={(e) => setValue(e.target.value)} />
45
+ * <button disabled={isPending}>Send</button>
46
+ * </form>
47
47
  * );
48
48
  * }
49
49
  * ```
@@ -59,12 +59,13 @@
59
59
  * AG-UI events: `import { EventType, type BaseEvent } from '@ag-ui/core'`
60
60
  */
61
61
  Object.defineProperty(exports, "__esModule", { value: true });
62
- exports.handleEventStream = exports.ToolCallTracker = exports.executeAllPendingTools = exports.executeClientTool = exports.toAvailableTools = exports.toAvailableTool = exports.toAvailableComponents = exports.toAvailableComponent = exports.applyJsonPatch = exports.useTamboV1ThreadList = exports.useTamboV1Thread = exports.useTamboV1SendMessage = exports.useTamboV1Messages = exports.useTamboV1 = exports.TamboRegistryProvider = exports.useThreadManagement = exports.useStreamDispatch = exports.useStreamState = exports.TamboV1StreamProvider = exports.TamboV1Provider = void 0;
62
+ exports.MCPTransport = exports.currentTimeContextHelper = exports.currentPageContextHelper = exports.defineTool = exports.handleEventStream = exports.ToolCallTracker = exports.executeAllPendingTools = exports.executeClientTool = exports.toAvailableTools = exports.toAvailableTool = exports.toAvailableComponents = exports.toAvailableComponent = exports.applyJsonPatch = exports.isComponentContent = exports.renderMessageComponents = exports.renderMessageContent = exports.renderComponentContent = exports.useV1ComponentContentOptional = exports.useV1ComponentContent = exports.useTamboRegistry = exports.useTamboClient = exports.useTamboV1ComponentState = exports.useTamboV1ThreadList = exports.useTamboV1Thread = exports.useTamboV1ThreadInput = exports.useTamboV1 = exports.useTamboContextHelpers = exports.TamboContextHelpersProvider = exports.TamboRegistryProvider = exports.useThreadManagement = exports.useStreamDispatch = exports.useStreamState = exports.TamboV1StreamProvider = exports.useContextKey = exports.TamboV1Provider = void 0;
63
63
  // =============================================================================
64
64
  // Providers
65
65
  // =============================================================================
66
66
  var tambo_v1_provider_1 = require("./providers/tambo-v1-provider");
67
67
  Object.defineProperty(exports, "TamboV1Provider", { enumerable: true, get: function () { return tambo_v1_provider_1.TamboV1Provider; } });
68
+ Object.defineProperty(exports, "useContextKey", { enumerable: true, get: function () { return tambo_v1_provider_1.useContextKey; } });
68
69
  var tambo_v1_stream_context_1 = require("./providers/tambo-v1-stream-context");
69
70
  Object.defineProperty(exports, "TamboV1StreamProvider", { enumerable: true, get: function () { return tambo_v1_stream_context_1.TamboV1StreamProvider; } });
70
71
  Object.defineProperty(exports, "useStreamState", { enumerable: true, get: function () { return tambo_v1_stream_context_1.useStreamState; } });
@@ -73,19 +74,39 @@ Object.defineProperty(exports, "useThreadManagement", { enumerable: true, get: f
73
74
  // Re-export registry provider from beta SDK (works with v1)
74
75
  var tambo_registry_provider_1 = require("../providers/tambo-registry-provider");
75
76
  Object.defineProperty(exports, "TamboRegistryProvider", { enumerable: true, get: function () { return tambo_registry_provider_1.TamboRegistryProvider; } });
77
+ // Re-export context helpers from beta SDK (works with v1)
78
+ var tambo_context_helpers_provider_1 = require("../providers/tambo-context-helpers-provider");
79
+ Object.defineProperty(exports, "TamboContextHelpersProvider", { enumerable: true, get: function () { return tambo_context_helpers_provider_1.TamboContextHelpersProvider; } });
80
+ Object.defineProperty(exports, "useTamboContextHelpers", { enumerable: true, get: function () { return tambo_context_helpers_provider_1.useTamboContextHelpers; } });
76
81
  // =============================================================================
77
82
  // Hooks
78
83
  // =============================================================================
79
84
  var use_tambo_v1_1 = require("./hooks/use-tambo-v1");
80
85
  Object.defineProperty(exports, "useTamboV1", { enumerable: true, get: function () { return use_tambo_v1_1.useTamboV1; } });
81
- var use_tambo_v1_messages_1 = require("./hooks/use-tambo-v1-messages");
82
- Object.defineProperty(exports, "useTamboV1Messages", { enumerable: true, get: function () { return use_tambo_v1_messages_1.useTamboV1Messages; } });
83
- var use_tambo_v1_send_message_1 = require("./hooks/use-tambo-v1-send-message");
84
- Object.defineProperty(exports, "useTamboV1SendMessage", { enumerable: true, get: function () { return use_tambo_v1_send_message_1.useTamboV1SendMessage; } });
86
+ var use_tambo_v1_thread_input_1 = require("./hooks/use-tambo-v1-thread-input");
87
+ Object.defineProperty(exports, "useTamboV1ThreadInput", { enumerable: true, get: function () { return use_tambo_v1_thread_input_1.useTamboV1ThreadInput; } });
85
88
  var use_tambo_v1_thread_1 = require("./hooks/use-tambo-v1-thread");
86
89
  Object.defineProperty(exports, "useTamboV1Thread", { enumerable: true, get: function () { return use_tambo_v1_thread_1.useTamboV1Thread; } });
87
90
  var use_tambo_v1_thread_list_1 = require("./hooks/use-tambo-v1-thread-list");
88
91
  Object.defineProperty(exports, "useTamboV1ThreadList", { enumerable: true, get: function () { return use_tambo_v1_thread_list_1.useTamboV1ThreadList; } });
92
+ var use_tambo_v1_component_state_1 = require("./hooks/use-tambo-v1-component-state");
93
+ Object.defineProperty(exports, "useTamboV1ComponentState", { enumerable: true, get: function () { return use_tambo_v1_component_state_1.useTamboV1ComponentState; } });
94
+ // Re-export client hook from beta SDK (works with v1)
95
+ var tambo_client_provider_1 = require("../providers/tambo-client-provider");
96
+ Object.defineProperty(exports, "useTamboClient", { enumerable: true, get: function () { return tambo_client_provider_1.useTamboClient; } });
97
+ // Re-export registry hook from beta SDK (works with v1)
98
+ var tambo_registry_provider_2 = require("../providers/tambo-registry-provider");
99
+ Object.defineProperty(exports, "useTamboRegistry", { enumerable: true, get: function () { return tambo_registry_provider_2.useTamboRegistry; } });
100
+ // =============================================================================
101
+ // Component Rendering
102
+ // =============================================================================
103
+ var component_renderer_1 = require("./utils/component-renderer");
104
+ Object.defineProperty(exports, "useV1ComponentContent", { enumerable: true, get: function () { return component_renderer_1.useV1ComponentContent; } });
105
+ Object.defineProperty(exports, "useV1ComponentContentOptional", { enumerable: true, get: function () { return component_renderer_1.useV1ComponentContentOptional; } });
106
+ Object.defineProperty(exports, "renderComponentContent", { enumerable: true, get: function () { return component_renderer_1.renderComponentContent; } });
107
+ Object.defineProperty(exports, "renderMessageContent", { enumerable: true, get: function () { return component_renderer_1.renderMessageContent; } });
108
+ Object.defineProperty(exports, "renderMessageComponents", { enumerable: true, get: function () { return component_renderer_1.renderMessageComponents; } });
109
+ Object.defineProperty(exports, "isComponentContent", { enumerable: true, get: function () { return component_renderer_1.isComponentContent; } });
89
110
  // =============================================================================
90
111
  // Utilities
91
112
  // =============================================================================
@@ -103,4 +124,17 @@ var tool_call_tracker_1 = require("./utils/tool-call-tracker");
103
124
  Object.defineProperty(exports, "ToolCallTracker", { enumerable: true, get: function () { return tool_call_tracker_1.ToolCallTracker; } });
104
125
  var stream_handler_1 = require("./utils/stream-handler");
105
126
  Object.defineProperty(exports, "handleEventStream", { enumerable: true, get: function () { return stream_handler_1.handleEventStream; } });
127
+ // =============================================================================
128
+ // Re-exports from Beta SDK (compatible with v1)
129
+ // =============================================================================
130
+ // Tool definition helper
131
+ var registry_1 = require("../util/registry");
132
+ Object.defineProperty(exports, "defineTool", { enumerable: true, get: function () { return registry_1.defineTool; } });
133
+ // Built-in context helpers
134
+ var context_helpers_1 = require("../context-helpers");
135
+ Object.defineProperty(exports, "currentPageContextHelper", { enumerable: true, get: function () { return context_helpers_1.currentPageContextHelper; } });
136
+ Object.defineProperty(exports, "currentTimeContextHelper", { enumerable: true, get: function () { return context_helpers_1.currentTimeContextHelper; } });
137
+ // MCP server types
138
+ var mcp_server_info_1 = require("../model/mcp-server-info");
139
+ Object.defineProperty(exports, "MCPTransport", { enumerable: true, get: function () { return mcp_server_info_1.MCPTransport; } });
106
140
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/v1/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;;;AAEH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,mEAGuC;AAFrC,oHAAA,eAAe,OAAA;AAIjB,+EAM6C;AAL3C,gIAAA,qBAAqB,OAAA;AACrB,yHAAA,cAAc,OAAA;AACd,4HAAA,iBAAiB,OAAA;AACjB,8HAAA,mBAAmB,OAAA;AAIrB,4DAA4D;AAC5D,gFAA6E;AAApE,gIAAA,qBAAqB,OAAA;AAE9B,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,qDAAyE;AAAhE,0GAAA,UAAU,OAAA;AAEnB,uEAGuC;AAFrC,2HAAA,kBAAkB,OAAA;AAIpB,+EAG2C;AAFzC,kIAAA,qBAAqB,OAAA;AAIvB,mEAA+D;AAAtD,uHAAA,gBAAgB,OAAA;AAEzB,6EAAwE;AAA/D,gIAAA,oBAAoB,OAAA;AAE7B,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,iDAAoD;AAA3C,4GAAA,cAAc,OAAA;AAEvB,mEAKqC;AAJnC,2HAAA,oBAAoB,OAAA;AACpB,4HAAA,qBAAqB,OAAA;AACrB,sHAAA,eAAe,OAAA;AACf,uHAAA,gBAAgB,OAAA;AAGlB,uDAI+B;AAH7B,kHAAA,iBAAiB,OAAA;AACjB,uHAAA,sBAAsB,OAAA;AAIxB,+DAA4D;AAAnD,oHAAA,eAAe,OAAA;AAExB,yDAA2D;AAAlD,mHAAA,iBAAiB,OAAA","sourcesContent":["/**\n * `@tambo-ai/react/v1` - React SDK for Tambo v1 API\n *\n * Provides React hooks and providers for building AI-powered applications\n * using the v1 streaming API with AG-UI protocol.\n *\n * ## Quick Start\n *\n * ```tsx\n * import {\n * TamboV1Provider,\n * useTamboV1,\n * useTamboV1SendMessage,\n * } from '@tambo-ai/react/v1';\n *\n * function App() {\n * return (\n * <TamboV1Provider\n * apiKey={process.env.NEXT_PUBLIC_TAMBO_API_KEY!}\n * components={[WeatherCard]}\n * tools={[searchTool]}\n * >\n * <ChatInterface />\n * </TamboV1Provider>\n * );\n * }\n *\n * function ChatInterface() {\n * const [threadId, setThreadId] = useState<string>();\n * const { messages, isStreaming } = useTamboV1(threadId);\n * const sendMessage = useTamboV1SendMessage(threadId);\n *\n * const handleSend = async (text: string) => {\n * const result = await sendMessage.mutateAsync({\n * message: { role: 'user', content: [{ type: 'text', text }] },\n * });\n * if (!threadId) setThreadId(result.threadId);\n * };\n *\n * return (\n * <div>\n * {messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {isStreaming && <LoadingIndicator />}\n * <MessageInput onSend={handleSend} />\n * </div>\n * );\n * }\n * ```\n *\n * ## Type Imports\n *\n * Types are imported directly from specific files:\n * - Thread state: `import type { TamboV1Thread } from '@tambo-ai/react/v1/types/thread'`\n * - Messages: `import type { TamboV1Message } from '@tambo-ai/react/v1/types/message'`\n * - Custom events: `import type { ComponentStartEvent } from '@tambo-ai/react/v1/types/event'`\n *\n * SDK types: `import type { ... } from '@tambo-ai/typescript-sdk'`\n * AG-UI events: `import { EventType, type BaseEvent } from '@ag-ui/core'`\n */\n\n// =============================================================================\n// Providers\n// =============================================================================\n\nexport {\n TamboV1Provider,\n type TamboV1ProviderProps,\n} from \"./providers/tambo-v1-provider\";\n\nexport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n type ThreadManagement,\n} from \"./providers/tambo-v1-stream-context\";\n\n// Re-export registry provider from beta SDK (works with v1)\nexport { TamboRegistryProvider } from \"../providers/tambo-registry-provider\";\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useTamboV1, type UseTamboV1Return } from \"./hooks/use-tambo-v1\";\n\nexport {\n useTamboV1Messages,\n type UseTamboV1MessagesReturn,\n} from \"./hooks/use-tambo-v1-messages\";\n\nexport {\n useTamboV1SendMessage,\n type SendMessageOptions,\n} from \"./hooks/use-tambo-v1-send-message\";\n\nexport { useTamboV1Thread } from \"./hooks/use-tambo-v1-thread\";\n\nexport { useTamboV1ThreadList } from \"./hooks/use-tambo-v1-thread-list\";\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { applyJsonPatch } from \"./utils/json-patch\";\n\nexport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"./utils/registry-conversion\";\n\nexport {\n executeClientTool,\n executeAllPendingTools,\n type PendingToolCall,\n} from \"./utils/tool-executor\";\n\nexport { ToolCallTracker } from \"./utils/tool-call-tracker\";\n\nexport { handleEventStream } from \"./utils/stream-handler\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/v1/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;;;AAEH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,mEAIuC;AAHrC,oHAAA,eAAe,OAAA;AACf,kHAAA,aAAa,OAAA;AAIf,+EAM6C;AAL3C,gIAAA,qBAAqB,OAAA;AACrB,yHAAA,cAAc,OAAA;AACd,4HAAA,iBAAiB,OAAA;AACjB,8HAAA,mBAAmB,OAAA;AAIrB,4DAA4D;AAC5D,gFAA6E;AAApE,gIAAA,qBAAqB,OAAA;AAE9B,0DAA0D;AAC1D,8FAGqD;AAFnD,6IAAA,2BAA2B,OAAA;AAC3B,wIAAA,sBAAsB,OAAA;AAGxB,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,qDAAyE;AAAhE,0GAAA,UAAU,OAAA;AAEnB,+EAI2C;AAHzC,kIAAA,qBAAqB,OAAA;AAKvB,mEAA+D;AAAtD,uHAAA,gBAAgB,OAAA;AAEzB,6EAAwE;AAA/D,gIAAA,oBAAoB,OAAA;AAE7B,qFAG8C;AAF5C,wIAAA,wBAAwB,OAAA;AAI1B,sDAAsD;AACtD,4EAAoE;AAA3D,uHAAA,cAAc,OAAA;AAEvB,wDAAwD;AACxD,gFAAwE;AAA/D,2HAAA,gBAAgB,OAAA;AAEzB,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,iEASoC;AARlC,2HAAA,qBAAqB,OAAA;AACrB,mIAAA,6BAA6B,OAAA;AAC7B,4HAAA,sBAAsB,OAAA;AACtB,0HAAA,oBAAoB,OAAA;AACpB,6HAAA,uBAAuB,OAAA;AACvB,wHAAA,kBAAkB,OAAA;AAKpB,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,iDAAoD;AAA3C,4GAAA,cAAc,OAAA;AAEvB,mEAKqC;AAJnC,2HAAA,oBAAoB,OAAA;AACpB,4HAAA,qBAAqB,OAAA;AACrB,sHAAA,eAAe,OAAA;AACf,uHAAA,gBAAgB,OAAA;AAGlB,uDAI+B;AAH7B,kHAAA,iBAAiB,OAAA;AACjB,uHAAA,sBAAsB,OAAA;AAIxB,+DAA4D;AAAnD,oHAAA,eAAe,OAAA;AAExB,yDAA2D;AAAlD,mHAAA,iBAAiB,OAAA;AAE1B,gFAAgF;AAChF,gDAAgD;AAChD,gFAAgF;AAEhF,yBAAyB;AACzB,6CAA8C;AAArC,sGAAA,UAAU,OAAA;AAEnB,2BAA2B;AAC3B,sDAG4B;AAF1B,2HAAA,wBAAwB,OAAA;AACxB,2HAAA,wBAAwB,OAAA;AAoB1B,mBAAmB;AACnB,4DAAwD;AAA/C,+GAAA,YAAY,OAAA","sourcesContent":["/**\n * `@tambo-ai/react/v1` - React SDK for Tambo v1 API\n *\n * Provides React hooks and providers for building AI-powered applications\n * using the v1 streaming API with AG-UI protocol.\n *\n * ## Quick Start\n *\n * ```tsx\n * import {\n * TamboV1Provider,\n * useTamboV1,\n * useTamboV1ThreadInput,\n * } from '@tambo-ai/react/v1';\n *\n * function App() {\n * return (\n * <TamboV1Provider\n * apiKey={process.env.NEXT_PUBLIC_TAMBO_API_KEY!}\n * components={[WeatherCard]}\n * tools={[searchTool]}\n * >\n * <ChatInterface />\n * </TamboV1Provider>\n * );\n * }\n *\n * function ChatInterface() {\n * const [threadId, setThreadId] = useState<string>();\n * const { messages, isStreaming } = useTamboV1(threadId);\n * const { value, setValue, submit, isPending } = useTamboV1ThreadInput(threadId);\n *\n * const handleSubmit = async (e: React.FormEvent) => {\n * e.preventDefault();\n * const result = await submit();\n * if (!threadId) setThreadId(result.threadId);\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * {messages.map(msg => <Message key={msg.id} message={msg} />)}\n * {isStreaming && <LoadingIndicator />}\n * <input value={value} onChange={(e) => setValue(e.target.value)} />\n * <button disabled={isPending}>Send</button>\n * </form>\n * );\n * }\n * ```\n *\n * ## Type Imports\n *\n * Types are imported directly from specific files:\n * - Thread state: `import type { TamboV1Thread } from '@tambo-ai/react/v1/types/thread'`\n * - Messages: `import type { TamboV1Message } from '@tambo-ai/react/v1/types/message'`\n * - Custom events: `import type { ComponentStartEvent } from '@tambo-ai/react/v1/types/event'`\n *\n * SDK types: `import type { ... } from '@tambo-ai/typescript-sdk'`\n * AG-UI events: `import { EventType, type BaseEvent } from '@ag-ui/core'`\n */\n\n// =============================================================================\n// Providers\n// =============================================================================\n\nexport {\n TamboV1Provider,\n useContextKey,\n type TamboV1ProviderProps,\n} from \"./providers/tambo-v1-provider\";\n\nexport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n type ThreadManagement,\n} from \"./providers/tambo-v1-stream-context\";\n\n// Re-export registry provider from beta SDK (works with v1)\nexport { TamboRegistryProvider } from \"../providers/tambo-registry-provider\";\n\n// Re-export context helpers from beta SDK (works with v1)\nexport {\n TamboContextHelpersProvider,\n useTamboContextHelpers,\n} from \"../providers/tambo-context-helpers-provider\";\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport { useTamboV1, type UseTamboV1Return } from \"./hooks/use-tambo-v1\";\n\nexport {\n useTamboV1ThreadInput,\n type UseTamboV1ThreadInputReturn,\n type SubmitOptions,\n} from \"./hooks/use-tambo-v1-thread-input\";\n\nexport { useTamboV1Thread } from \"./hooks/use-tambo-v1-thread\";\n\nexport { useTamboV1ThreadList } from \"./hooks/use-tambo-v1-thread-list\";\n\nexport {\n useTamboV1ComponentState,\n type UseTamboV1ComponentStateReturn,\n} from \"./hooks/use-tambo-v1-component-state\";\n\n// Re-export client hook from beta SDK (works with v1)\nexport { useTamboClient } from \"../providers/tambo-client-provider\";\n\n// Re-export registry hook from beta SDK (works with v1)\nexport { useTamboRegistry } from \"../providers/tambo-registry-provider\";\n\n// =============================================================================\n// Component Rendering\n// =============================================================================\n\nexport {\n useV1ComponentContent,\n useV1ComponentContentOptional,\n renderComponentContent,\n renderMessageContent,\n renderMessageComponents,\n isComponentContent,\n type V1ComponentContentContext,\n type RenderComponentOptions,\n} from \"./utils/component-renderer\";\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { applyJsonPatch } from \"./utils/json-patch\";\n\nexport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"./utils/registry-conversion\";\n\nexport {\n executeClientTool,\n executeAllPendingTools,\n type PendingToolCall,\n} from \"./utils/tool-executor\";\n\nexport { ToolCallTracker } from \"./utils/tool-call-tracker\";\n\nexport { handleEventStream } from \"./utils/stream-handler\";\n\n// =============================================================================\n// Re-exports from Beta SDK (compatible with v1)\n// =============================================================================\n\n// Tool definition helper\nexport { defineTool } from \"../util/registry\";\n\n// Built-in context helpers\nexport {\n currentPageContextHelper,\n currentTimeContextHelper,\n} from \"../context-helpers\";\n\n// Context helper types\nexport type {\n AdditionalContext,\n ContextHelperFn,\n ContextHelpers,\n} from \"../context-helpers\";\n\n// Component and tool types\nexport type {\n ComponentContextToolMetadata,\n ComponentRegistry,\n ParameterSpec,\n RegisteredComponent,\n TamboTool,\n ToolAnnotations,\n} from \"../model/component-metadata\";\n\n// MCP server types\nexport { MCPTransport } from \"../model/mcp-server-info\";\nexport type {\n McpServerInfo,\n NormalizedMcpServerInfo,\n} from \"../model/mcp-server-info\";\n\n// Resource types\nexport type {\n ListResourceItem,\n ReadResourceResult,\n ResourceSource,\n} from \"../model/resource-info\";\n"]}
@@ -4,6 +4,7 @@
4
4
  * Composes the necessary providers for the v1 SDK:
5
5
  * - TamboClientProvider: API client and authentication
6
6
  * - TamboRegistryProvider: Component and tool registration
7
+ * - TamboContextHelpersProvider: Context helper functions
7
8
  * - TamboV1StreamProvider: Streaming state management
8
9
  *
9
10
  * This provider should wrap your entire application or the portion
@@ -13,7 +14,14 @@ import React, { type PropsWithChildren } from "react";
13
14
  import { QueryClient } from "@tanstack/react-query";
14
15
  import { type TamboClientProviderProps } from "../../providers/tambo-client-provider";
15
16
  import { type TamboRegistryProviderProps } from "../../providers/tambo-registry-provider";
17
+ import type { ContextHelpers } from "../../context-helpers";
16
18
  import type { McpServerInfo } from "../../model/mcp-server-info";
19
+ import type { ListResourceItem, ResourceSource } from "../../model/resource-info";
20
+ /**
21
+ * Hook to access the contextKey from TamboV1Provider.
22
+ * @returns The contextKey if provided, undefined otherwise
23
+ */
24
+ export declare function useContextKey(): string | undefined;
17
25
  /**
18
26
  * Props for TamboV1Provider
19
27
  */
@@ -38,6 +46,35 @@ export interface TamboV1ProviderProps extends Pick<TamboClientProviderProps, "ap
38
46
  * If not provided, an error will be thrown for unknown tools.
39
47
  */
40
48
  onCallUnregisteredTool?: TamboRegistryProviderProps["onCallUnregisteredTool"];
49
+ /**
50
+ * Static resources to register with the registry.
51
+ * These will be available for the AI to access.
52
+ */
53
+ resources?: ListResourceItem[];
54
+ /**
55
+ * Dynamic resource search function.
56
+ * Must be paired with getResource.
57
+ * Called when searching for resources dynamically.
58
+ */
59
+ listResources?: ResourceSource["listResources"];
60
+ /**
61
+ * Dynamic resource fetch function.
62
+ * Must be paired with listResources.
63
+ * Called when fetching a specific resource by URI.
64
+ */
65
+ getResource?: ResourceSource["getResource"];
66
+ /**
67
+ * Configuration for context helpers.
68
+ * A dictionary of functions that provide additional context to the AI.
69
+ * Each key becomes the context name, and the function returns the value.
70
+ */
71
+ contextHelpers?: ContextHelpers;
72
+ /**
73
+ * Optional context key for thread scoping/isolation.
74
+ * Threads created with the same contextKey are grouped together.
75
+ * Useful for multi-tenant applications or separating conversation contexts.
76
+ */
77
+ contextKey?: string;
41
78
  /**
42
79
  * Optional custom QueryClient instance.
43
80
  * If not provided, a default client will be created.
@@ -67,6 +104,11 @@ export interface TamboV1ProviderProps extends Pick<TamboClientProviderProps, "ap
67
104
  * @param props.tools - Tools to register for client-side execution
68
105
  * @param props.mcpServers - MCP servers to register for additional tools/resources
69
106
  * @param props.onCallUnregisteredTool - Callback for handling unknown tool calls
107
+ * @param props.resources - Static resources to register with the AI
108
+ * @param props.listResources - Dynamic resource search function (must be paired with getResource)
109
+ * @param props.getResource - Dynamic resource fetch function (must be paired with listResources)
110
+ * @param props.contextHelpers - Configuration for context helper functions
111
+ * @param props.contextKey - Optional context key for thread scoping/isolation
70
112
  * @param props.queryClient - Optional custom React Query client
71
113
  * @param props.children - Child components
72
114
  * @returns Provider component tree
@@ -87,5 +129,5 @@ export interface TamboV1ProviderProps extends Pick<TamboClientProviderProps, "ap
87
129
  * }
88
130
  * ```
89
131
  */
90
- export declare function TamboV1Provider({ apiKey, tamboUrl, environment, userToken, components, tools, mcpServers, onCallUnregisteredTool, queryClient, children, }: PropsWithChildren<TamboV1ProviderProps>): React.JSX.Element;
132
+ export declare function TamboV1Provider({ apiKey, tamboUrl, environment, userToken, components, tools, mcpServers, onCallUnregisteredTool, resources, listResources, getResource, contextHelpers, contextKey, queryClient, children, }: PropsWithChildren<TamboV1ProviderProps>): React.JSX.Element;
91
133
  //# sourceMappingURL=tambo-v1-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tambo-v1-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,EAAE,KAAK,iBAAiB,EAAY,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,wBAAwB,EACxB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CACpD;IACC;;;OAGG;IACH,UAAU,CAAC,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAE5C;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;IAExC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,0BAA0B,CAAC,wBAAwB,CAAC,CAAC;IAE9E;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,EACL,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,qBAoCzC"}
1
+ {"version":3,"file":"tambo-v1-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAGZ,KAAK,iBAAiB,EAEvB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAuB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,2BAA2B,CAAC;AAQnC;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAChD,wBAAwB,EACxB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CACpD;IACC;;;OAGG;IACH,UAAU,CAAC,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC;IAEtD;;;OAGG;IACH,KAAK,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAE5C;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;IAExC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,0BAA0B,CAAC,wBAAwB,CAAC,CAAC;IAE9E;;;OAGG;IACH,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IAEhD;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IAE5C;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,EACL,UAAU,EACV,sBAAsB,EACtB,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,UAAU,EACV,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,qBA2CzC"}