@tambo-ai/react 0.72.0 → 0.73.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp/mcp-hooks.d.ts +4 -0
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +4 -0
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +3 -0
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +3 -0
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/util/resource-content-resolver.d.ts.map +1 -1
- package/dist/util/resource-content-resolver.js +2 -0
- package/dist/util/resource-content-resolver.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +22 -9
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +9 -2
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +22 -9
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts +91 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +152 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js +511 -0
- package/dist/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +6 -57
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.js +7 -67
- package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +201 -72
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +6 -4
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +16 -7
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +22 -13
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +31 -39
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +27 -9
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +22 -11
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +27 -10
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +19 -10
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +43 -53
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +94 -19
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts +74 -0
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js +212 -0
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -0
- package/dist/v1/providers/tambo-v1-stub-provider.test.d.ts +2 -0
- package/dist/v1/providers/tambo-v1-stub-provider.test.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-stub-provider.test.js +162 -0
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +105 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +191 -0
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -0
- package/dist/v1/utils/component-renderer.d.ts +15 -67
- package/dist/v1/utils/component-renderer.d.ts.map +1 -1
- package/dist/v1/utils/component-renderer.js +3 -149
- package/dist/v1/utils/component-renderer.js.map +1 -1
- package/dist/v1/utils/component-renderer.test.js +15 -350
- package/dist/v1/utils/component-renderer.test.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +4 -0
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +4 -0
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +3 -0
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +3 -0
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/util/resource-content-resolver.d.ts.map +1 -1
- package/esm/util/resource-content-resolver.js +2 -0
- package/esm/util/resource-content-resolver.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +22 -9
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +9 -2
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +22 -9
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts +91 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +149 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js +506 -0
- package/esm/v1/hooks/use-tambo-v1-suggestions.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +6 -57
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +5 -66
- package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +199 -73
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +6 -4
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +2 -2
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +2 -2
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +16 -7
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +22 -13
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +23 -18
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +27 -9
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +20 -10
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +28 -11
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +19 -10
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +44 -54
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +95 -20
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +74 -0
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-stub-provider.js +176 -0
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -0
- package/esm/v1/providers/tambo-v1-stub-provider.test.d.ts +2 -0
- package/esm/v1/providers/tambo-v1-stub-provider.test.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-stub-provider.test.js +157 -0
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +105 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +153 -0
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -0
- package/esm/v1/utils/component-renderer.d.ts +15 -67
- package/esm/v1/utils/component-renderer.d.ts.map +1 -1
- package/esm/v1/utils/component-renderer.js +4 -146
- package/esm/v1/utils/component-renderer.js.map +1 -1
- package/esm/v1/utils/component-renderer.test.js +16 -351
- package/esm/v1/utils/component-renderer.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventType } from "@ag-ui/core";
|
|
2
2
|
import { renderHook, act } from "@testing-library/react";
|
|
3
3
|
import React from "react";
|
|
4
|
-
import { TamboV1StreamProvider, useStreamState, useStreamDispatch, } from "./tambo-v1-stream-context";
|
|
4
|
+
import { TamboV1StreamProvider, useStreamState, useStreamDispatch, useThreadManagement, } from "./tambo-v1-stream-context";
|
|
5
5
|
describe("TamboV1StreamProvider", () => {
|
|
6
6
|
describe("useStreamState", () => {
|
|
7
7
|
it("throws when used outside provider", () => {
|
|
@@ -14,33 +14,51 @@ describe("TamboV1StreamProvider", () => {
|
|
|
14
14
|
}).toThrow("useStreamState must be used within TamboV1StreamProvider");
|
|
15
15
|
consoleSpy.mockRestore();
|
|
16
16
|
});
|
|
17
|
-
it("returns initial state with empty threadMap
|
|
17
|
+
it("returns initial state with empty threadMap", () => {
|
|
18
18
|
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
19
19
|
const { result } = renderHook(() => useStreamState(), { wrapper });
|
|
20
20
|
expect(result.current.threadMap).toEqual({});
|
|
21
21
|
expect(result.current.currentThreadId).toBeNull();
|
|
22
22
|
});
|
|
23
|
-
it("initializes thread
|
|
24
|
-
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider,
|
|
25
|
-
const { result } = renderHook(() =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
it("initializes thread via dispatch", () => {
|
|
24
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
25
|
+
const { result } = renderHook(() => ({
|
|
26
|
+
state: useStreamState(),
|
|
27
|
+
dispatch: useStreamDispatch(),
|
|
28
|
+
}), { wrapper });
|
|
29
|
+
act(() => {
|
|
30
|
+
result.current.dispatch({
|
|
31
|
+
type: "INIT_THREAD",
|
|
32
|
+
threadId: "thread_123",
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
expect(result.current.state.threadMap.thread_123).toBeDefined();
|
|
36
|
+
expect(result.current.state.threadMap.thread_123.thread.id).toBe("thread_123");
|
|
37
|
+
expect(result.current.state.threadMap.thread_123.thread.status).toBe("idle");
|
|
38
|
+
expect(result.current.state.threadMap.thread_123.thread.messages).toEqual([]);
|
|
31
39
|
});
|
|
32
|
-
it("
|
|
33
|
-
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
it("initializes thread with initial data via dispatch", () => {
|
|
41
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
42
|
+
const { result } = renderHook(() => ({
|
|
43
|
+
state: useStreamState(),
|
|
44
|
+
dispatch: useStreamDispatch(),
|
|
45
|
+
}), { wrapper });
|
|
46
|
+
act(() => {
|
|
47
|
+
result.current.dispatch({
|
|
48
|
+
type: "INIT_THREAD",
|
|
49
|
+
threadId: "thread_123",
|
|
50
|
+
initialThread: {
|
|
51
|
+
title: "Test Thread",
|
|
52
|
+
metadata: { key: "value" },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
expect(result.current.state.threadMap.thread_123.thread.title).toBe("Test Thread");
|
|
57
|
+
expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual({
|
|
40
58
|
key: "value",
|
|
41
59
|
});
|
|
42
60
|
// Default values should still be set
|
|
43
|
-
expect(result.current.threadMap.thread_123.thread.status).toBe("idle");
|
|
61
|
+
expect(result.current.state.threadMap.thread_123.thread.status).toBe("idle");
|
|
44
62
|
});
|
|
45
63
|
});
|
|
46
64
|
describe("useStreamDispatch", () => {
|
|
@@ -54,11 +72,18 @@ describe("TamboV1StreamProvider", () => {
|
|
|
54
72
|
consoleSpy.mockRestore();
|
|
55
73
|
});
|
|
56
74
|
it("dispatches events to update state", () => {
|
|
57
|
-
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider,
|
|
75
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
58
76
|
const { result } = renderHook(() => ({
|
|
59
77
|
state: useStreamState(),
|
|
60
78
|
dispatch: useStreamDispatch(),
|
|
61
79
|
}), { wrapper });
|
|
80
|
+
// Initialize the thread first
|
|
81
|
+
act(() => {
|
|
82
|
+
result.current.dispatch({
|
|
83
|
+
type: "INIT_THREAD",
|
|
84
|
+
threadId: "thread_123",
|
|
85
|
+
});
|
|
86
|
+
});
|
|
62
87
|
const runStartedEvent = {
|
|
63
88
|
type: EventType.RUN_STARTED,
|
|
64
89
|
runId: "run_1",
|
|
@@ -76,5 +101,55 @@ describe("TamboV1StreamProvider", () => {
|
|
|
76
101
|
expect(result.current.state.threadMap.thread_123.streaming.runId).toBe("run_1");
|
|
77
102
|
});
|
|
78
103
|
});
|
|
104
|
+
describe("useThreadManagement", () => {
|
|
105
|
+
it("throws when used outside provider", () => {
|
|
106
|
+
const consoleSpy = jest
|
|
107
|
+
.spyOn(console, "error")
|
|
108
|
+
.mockImplementation(() => { });
|
|
109
|
+
expect(() => {
|
|
110
|
+
renderHook(() => useThreadManagement());
|
|
111
|
+
}).toThrow("useThreadManagement must be used within TamboV1StreamProvider");
|
|
112
|
+
consoleSpy.mockRestore();
|
|
113
|
+
});
|
|
114
|
+
it("initThread creates a new thread", () => {
|
|
115
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
116
|
+
const { result } = renderHook(() => ({
|
|
117
|
+
state: useStreamState(),
|
|
118
|
+
management: useThreadManagement(),
|
|
119
|
+
}), { wrapper });
|
|
120
|
+
act(() => {
|
|
121
|
+
result.current.management.initThread("thread_456");
|
|
122
|
+
});
|
|
123
|
+
expect(result.current.state.threadMap.thread_456).toBeDefined();
|
|
124
|
+
expect(result.current.state.threadMap.thread_456.thread.id).toBe("thread_456");
|
|
125
|
+
});
|
|
126
|
+
it("switchThread changes currentThreadId", () => {
|
|
127
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
128
|
+
const { result } = renderHook(() => ({
|
|
129
|
+
state: useStreamState(),
|
|
130
|
+
management: useThreadManagement(),
|
|
131
|
+
}), { wrapper });
|
|
132
|
+
// Initialize and switch to a thread
|
|
133
|
+
act(() => {
|
|
134
|
+
result.current.management.initThread("thread_789");
|
|
135
|
+
result.current.management.switchThread("thread_789");
|
|
136
|
+
});
|
|
137
|
+
expect(result.current.state.currentThreadId).toBe("thread_789");
|
|
138
|
+
});
|
|
139
|
+
it("startNewThread creates temp thread and switches to it", () => {
|
|
140
|
+
const wrapper = ({ children }) => (React.createElement(TamboV1StreamProvider, null, children));
|
|
141
|
+
const { result } = renderHook(() => ({
|
|
142
|
+
state: useStreamState(),
|
|
143
|
+
management: useThreadManagement(),
|
|
144
|
+
}), { wrapper });
|
|
145
|
+
let tempId;
|
|
146
|
+
act(() => {
|
|
147
|
+
tempId = result.current.management.startNewThread();
|
|
148
|
+
});
|
|
149
|
+
expect(tempId).toMatch(/^temp_/);
|
|
150
|
+
expect(result.current.state.currentThreadId).toBe(tempId);
|
|
151
|
+
expect(result.current.state.threadMap[tempId]).toBeDefined();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
79
154
|
});
|
|
80
155
|
//# sourceMappingURL=tambo-v1-stream-context.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n} from \"./tambo-v1-stream-context\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with empty threadMap when no threadId\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.threadMap).toEqual({});\n expect(result.current.currentThreadId).toBeNull();\n });\n\n it(\"initializes thread when threadId is provided\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.currentThreadId).toBe(\"thread_123\");\n expect(result.current.threadMap.thread_123).toBeDefined();\n expect(result.current.threadMap.thread_123.thread.id).toBe(\"thread_123\");\n expect(result.current.threadMap.thread_123.thread.status).toBe(\"idle\");\n expect(result.current.threadMap.thread_123.thread.messages).toEqual([]);\n });\n\n it(\"merges initialThread with default state\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider\n threadId=\"thread_123\"\n initialThread={{\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n }}\n >\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.threadMap.thread_123.thread.metadata).toEqual({\n key: \"value\",\n });\n // Default values should still be set\n expect(result.current.threadMap.thread_123.thread.status).toBe(\"idle\");\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider threadId=\"thread_123\">\n {children}\n </TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper },\n );\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-v1-stream-context.test.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stream-context.test.tsx"],"names":[],"mappings":"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","sourcesContent":["import { EventType, type RunStartedEvent } from \"@ag-ui/core\";\nimport { renderHook, act } from \"@testing-library/react\";\nimport React from \"react\";\nimport {\n TamboV1StreamProvider,\n useStreamState,\n useStreamDispatch,\n useThreadManagement,\n} from \"./tambo-v1-stream-context\";\n\ndescribe(\"TamboV1StreamProvider\", () => {\n describe(\"useStreamState\", () => {\n it(\"throws when used outside provider\", () => {\n // Suppress console.error for expected error\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamState());\n }).toThrow(\"useStreamState must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"returns initial state with empty threadMap\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(() => useStreamState(), { wrapper });\n\n expect(result.current.threadMap).toEqual({});\n expect(result.current.currentThreadId).toBeNull();\n });\n\n it(\"initializes thread via dispatch\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123).toBeDefined();\n expect(result.current.state.threadMap.thread_123.thread.id).toBe(\n \"thread_123\",\n );\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n expect(result.current.state.threadMap.thread_123.thread.messages).toEqual(\n [],\n );\n });\n\n it(\"initializes thread with initial data via dispatch\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper },\n );\n\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n initialThread: {\n title: \"Test Thread\",\n metadata: { key: \"value\" },\n },\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.title).toBe(\n \"Test Thread\",\n );\n expect(result.current.state.threadMap.thread_123.thread.metadata).toEqual(\n {\n key: \"value\",\n },\n );\n // Default values should still be set\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"idle\",\n );\n });\n });\n\n describe(\"useStreamDispatch\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useStreamDispatch());\n }).toThrow(\"useStreamDispatch must be used within TamboV1StreamProvider\");\n\n consoleSpy.mockRestore();\n });\n\n it(\"dispatches events to update state\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n dispatch: useStreamDispatch(),\n }),\n { wrapper },\n );\n\n // Initialize the thread first\n act(() => {\n result.current.dispatch({\n type: \"INIT_THREAD\",\n threadId: \"thread_123\",\n });\n });\n\n const runStartedEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_123\",\n };\n\n act(() => {\n result.current.dispatch({\n type: \"EVENT\",\n event: runStartedEvent,\n threadId: \"thread_123\",\n });\n });\n\n expect(result.current.state.threadMap.thread_123.thread.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.current.state.threadMap.thread_123.streaming.runId).toBe(\n \"run_1\",\n );\n });\n });\n\n describe(\"useThreadManagement\", () => {\n it(\"throws when used outside provider\", () => {\n const consoleSpy = jest\n .spyOn(console, \"error\")\n .mockImplementation(() => {});\n\n expect(() => {\n renderHook(() => useThreadManagement());\n }).toThrow(\n \"useThreadManagement must be used within TamboV1StreamProvider\",\n );\n\n consoleSpy.mockRestore();\n });\n\n it(\"initThread creates a new thread\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper },\n );\n\n act(() => {\n result.current.management.initThread(\"thread_456\");\n });\n\n expect(result.current.state.threadMap.thread_456).toBeDefined();\n expect(result.current.state.threadMap.thread_456.thread.id).toBe(\n \"thread_456\",\n );\n });\n\n it(\"switchThread changes currentThreadId\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper },\n );\n\n // Initialize and switch to a thread\n act(() => {\n result.current.management.initThread(\"thread_789\");\n result.current.management.switchThread(\"thread_789\");\n });\n\n expect(result.current.state.currentThreadId).toBe(\"thread_789\");\n });\n\n it(\"startNewThread creates temp thread and switches to it\", () => {\n const wrapper = ({ children }: { children: React.ReactNode }) => (\n <TamboV1StreamProvider>{children}</TamboV1StreamProvider>\n );\n\n const { result } = renderHook(\n () => ({\n state: useStreamState(),\n management: useThreadManagement(),\n }),\n { wrapper },\n );\n\n let tempId: string;\n act(() => {\n tempId = result.current.management.startNewThread();\n });\n\n expect(tempId!).toMatch(/^temp_/);\n expect(result.current.state.currentThreadId).toBe(tempId!);\n expect(result.current.state.threadMap[tempId!]).toBeDefined();\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React, { type PropsWithChildren } from "react";
|
|
2
|
+
import type { TamboComponent, TamboTool } from "../../model/component-metadata";
|
|
3
|
+
import type { TamboV1Message } from "../types/message";
|
|
4
|
+
import type { TamboV1Thread } from "../types/thread";
|
|
5
|
+
/**
|
|
6
|
+
* Props for TamboV1StubProvider
|
|
7
|
+
*/
|
|
8
|
+
export interface TamboV1StubProviderProps {
|
|
9
|
+
/**
|
|
10
|
+
* Thread data to display.
|
|
11
|
+
* Can be a full TamboV1Thread or just an array of messages.
|
|
12
|
+
*/
|
|
13
|
+
thread?: TamboV1Thread | {
|
|
14
|
+
messages: TamboV1Message[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Optional thread ID. Defaults to "stub_thread" or thread.id if provided.
|
|
18
|
+
*/
|
|
19
|
+
threadId?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Components to register with the registry.
|
|
22
|
+
*/
|
|
23
|
+
components?: TamboComponent[];
|
|
24
|
+
/**
|
|
25
|
+
* Tools to register with the registry.
|
|
26
|
+
*/
|
|
27
|
+
tools?: TamboTool[];
|
|
28
|
+
/**
|
|
29
|
+
* User key for the config context.
|
|
30
|
+
*/
|
|
31
|
+
userKey?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Initial input value for the thread input context.
|
|
34
|
+
*/
|
|
35
|
+
inputValue?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the thread is currently streaming.
|
|
38
|
+
*/
|
|
39
|
+
isStreaming?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Override for the submit function.
|
|
42
|
+
* If not provided, submit will be a no-op that returns the threadId.
|
|
43
|
+
*/
|
|
44
|
+
onSubmit?: () => Promise<{
|
|
45
|
+
threadId: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Override for the setValue function.
|
|
49
|
+
*/
|
|
50
|
+
onSetValue?: (value: string | ((prev: string) => string)) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Override for startNewThread.
|
|
53
|
+
*/
|
|
54
|
+
onStartNewThread?: () => string;
|
|
55
|
+
/**
|
|
56
|
+
* Override for switchThread.
|
|
57
|
+
*/
|
|
58
|
+
onSwitchThread?: (threadId: string | null) => void;
|
|
59
|
+
/**
|
|
60
|
+
* Override for initThread.
|
|
61
|
+
*/
|
|
62
|
+
onInitThread?: (threadId: string) => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* TamboV1StubProvider provides mock implementations of all v1 contexts
|
|
66
|
+
* for testing components that use Tambo hooks.
|
|
67
|
+
*
|
|
68
|
+
* All operations are no-ops by default, returning stub data.
|
|
69
|
+
* Override specific behaviors via props as needed for testing.
|
|
70
|
+
* Stream state is derived once from props and is not updated by thread management.
|
|
71
|
+
* @returns A provider wrapper suitable for tests
|
|
72
|
+
*/
|
|
73
|
+
export declare function TamboV1StubProvider({ children, thread: threadData, threadId: providedThreadId, components, tools, userKey, inputValue: initialInputValue, isStreaming, onSubmit, onSetValue, onStartNewThread, onSwitchThread, onInitThread, }: PropsWithChildren<TamboV1StubProviderProps>): React.JSX.Element;
|
|
74
|
+
//# sourceMappingURL=tambo-v1-stub-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tambo-v1-stub-provider.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,EAAW,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAEV,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgBrD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAExD;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAElE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAEhC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,gBAAgB,EAC1B,UAAe,EACf,KAAU,EACV,OAAO,EACP,UAAU,EAAE,iBAAsB,EAClC,WAAmB,EACnB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,EAAE,iBAAiB,CAAC,wBAAwB,CAAC,qBAwL7C"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import React, { useMemo } from "react";
|
|
4
|
+
import { TamboClientContext } from "../../providers/tambo-client-provider";
|
|
5
|
+
import { TamboRegistryContext } from "../../providers/tambo-registry-provider";
|
|
6
|
+
import { TamboV1ConfigContext } from "./tambo-v1-provider";
|
|
7
|
+
import { TamboV1StreamProvider, } from "./tambo-v1-stream-context";
|
|
8
|
+
import { TamboV1ThreadInputContext, } from "./tambo-v1-thread-input-provider";
|
|
9
|
+
/**
|
|
10
|
+
* Creates a default TamboV1Thread from messages or returns the full thread.
|
|
11
|
+
* @returns A normalized thread object
|
|
12
|
+
*/
|
|
13
|
+
function normalizeThread(threadData, threadId) {
|
|
14
|
+
if (!threadData) {
|
|
15
|
+
return {
|
|
16
|
+
id: threadId,
|
|
17
|
+
messages: [],
|
|
18
|
+
status: "idle",
|
|
19
|
+
createdAt: new Date().toISOString(),
|
|
20
|
+
updatedAt: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if ("id" in threadData && "status" in threadData) {
|
|
24
|
+
return threadData;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
id: threadId,
|
|
28
|
+
messages: threadData.messages,
|
|
29
|
+
status: "idle",
|
|
30
|
+
createdAt: new Date().toISOString(),
|
|
31
|
+
updatedAt: new Date().toISOString(),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* TamboV1StubProvider provides mock implementations of all v1 contexts
|
|
36
|
+
* for testing components that use Tambo hooks.
|
|
37
|
+
*
|
|
38
|
+
* All operations are no-ops by default, returning stub data.
|
|
39
|
+
* Override specific behaviors via props as needed for testing.
|
|
40
|
+
* Stream state is derived once from props and is not updated by thread management.
|
|
41
|
+
* @returns A provider wrapper suitable for tests
|
|
42
|
+
*/
|
|
43
|
+
export function TamboV1StubProvider({ children, thread: threadData, threadId: providedThreadId, components = [], tools = [], userKey, inputValue: initialInputValue = "", isStreaming = false, onSubmit, onSetValue, onStartNewThread, onSwitchThread, onInitThread, }) {
|
|
44
|
+
// Determine thread ID
|
|
45
|
+
const threadId = providedThreadId ??
|
|
46
|
+
(threadData && "id" in threadData ? threadData.id : "stub_thread");
|
|
47
|
+
// Normalize thread data
|
|
48
|
+
const thread = normalizeThread(threadData, threadId);
|
|
49
|
+
// Create stub QueryClient
|
|
50
|
+
const queryClient = useMemo(() => new QueryClient({
|
|
51
|
+
defaultOptions: {
|
|
52
|
+
queries: { retry: false },
|
|
53
|
+
mutations: { retry: false },
|
|
54
|
+
},
|
|
55
|
+
}), []);
|
|
56
|
+
// Create stub client
|
|
57
|
+
const stubClient = useMemo(() => ({}), []);
|
|
58
|
+
// Build component registry
|
|
59
|
+
const componentList = useMemo(() => {
|
|
60
|
+
const list = {};
|
|
61
|
+
for (const component of components) {
|
|
62
|
+
list[component.name] = {
|
|
63
|
+
component: component.component,
|
|
64
|
+
loadingComponent: component.loadingComponent,
|
|
65
|
+
name: component.name,
|
|
66
|
+
description: component.description,
|
|
67
|
+
props: component.propsDefinition ?? {},
|
|
68
|
+
contextTools: [],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return list;
|
|
72
|
+
}, [components]);
|
|
73
|
+
// Build tool registry
|
|
74
|
+
const toolRegistry = useMemo(() => {
|
|
75
|
+
return tools.reduce((acc, tool) => {
|
|
76
|
+
acc[tool.name] = tool;
|
|
77
|
+
return acc;
|
|
78
|
+
}, {});
|
|
79
|
+
}, [tools]);
|
|
80
|
+
// Stream state
|
|
81
|
+
const streamState = useMemo(() => {
|
|
82
|
+
const threadState = {
|
|
83
|
+
thread,
|
|
84
|
+
streaming: {
|
|
85
|
+
status: isStreaming ? "streaming" : "idle",
|
|
86
|
+
},
|
|
87
|
+
accumulatingToolArgs: new Map(),
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
threadMap: { [threadId]: threadState },
|
|
91
|
+
currentThreadId: threadId,
|
|
92
|
+
};
|
|
93
|
+
}, [thread, threadId, isStreaming]);
|
|
94
|
+
// Stream dispatch (no-op)
|
|
95
|
+
const streamDispatch = useMemo(() => () => { }, []);
|
|
96
|
+
// Thread management
|
|
97
|
+
const threadManagement = useMemo(() => ({
|
|
98
|
+
initThread: onInitThread ?? (() => { }),
|
|
99
|
+
switchThread: onSwitchThread ?? (() => { }),
|
|
100
|
+
startNewThread: onStartNewThread ??
|
|
101
|
+
(() => {
|
|
102
|
+
const newId = `stub_${crypto.randomUUID()}`;
|
|
103
|
+
return newId;
|
|
104
|
+
}),
|
|
105
|
+
}), [onInitThread, onSwitchThread, onStartNewThread]);
|
|
106
|
+
// Config context
|
|
107
|
+
const config = useMemo(() => ({ userKey }), [userKey]);
|
|
108
|
+
// Input state (managed internally for stub)
|
|
109
|
+
const [inputValue, setInputValueInternal] = React.useState(initialInputValue);
|
|
110
|
+
// Thread input context
|
|
111
|
+
const threadInputContext = useMemo(() => {
|
|
112
|
+
const setValue = onSetValue ?? setInputValueInternal;
|
|
113
|
+
const submit = onSubmit ??
|
|
114
|
+
(async () => {
|
|
115
|
+
return { threadId };
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
value: inputValue,
|
|
119
|
+
setValue,
|
|
120
|
+
submit,
|
|
121
|
+
threadId,
|
|
122
|
+
setThreadId: () => { },
|
|
123
|
+
images: [],
|
|
124
|
+
addImage: async () => { },
|
|
125
|
+
addImages: async () => { },
|
|
126
|
+
removeImage: () => { },
|
|
127
|
+
clearImages: () => { },
|
|
128
|
+
isPending: false,
|
|
129
|
+
isError: false,
|
|
130
|
+
error: null,
|
|
131
|
+
isIdle: true,
|
|
132
|
+
isSuccess: false,
|
|
133
|
+
status: "idle",
|
|
134
|
+
data: undefined,
|
|
135
|
+
variables: undefined,
|
|
136
|
+
failureCount: 0,
|
|
137
|
+
failureReason: null,
|
|
138
|
+
reset: () => { },
|
|
139
|
+
context: undefined,
|
|
140
|
+
submittedAt: 0,
|
|
141
|
+
isPaused: false,
|
|
142
|
+
};
|
|
143
|
+
}, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);
|
|
144
|
+
// Registry context
|
|
145
|
+
const registryContext = useMemo(() => ({
|
|
146
|
+
componentList,
|
|
147
|
+
toolRegistry,
|
|
148
|
+
componentToolAssociations: {},
|
|
149
|
+
mcpServerInfos: [],
|
|
150
|
+
resources: [],
|
|
151
|
+
resourceSource: null,
|
|
152
|
+
onCallUnregisteredTool: undefined,
|
|
153
|
+
registerComponent: () => { },
|
|
154
|
+
registerTool: () => { },
|
|
155
|
+
registerTools: () => { },
|
|
156
|
+
addToolAssociation: () => { },
|
|
157
|
+
registerMcpServer: () => { },
|
|
158
|
+
registerMcpServers: () => { },
|
|
159
|
+
registerResource: () => { },
|
|
160
|
+
registerResources: () => { },
|
|
161
|
+
registerResourceSource: () => { },
|
|
162
|
+
}), [componentList, toolRegistry]);
|
|
163
|
+
// Client context
|
|
164
|
+
const clientContext = useMemo(() => ({
|
|
165
|
+
client: stubClient,
|
|
166
|
+
queryClient,
|
|
167
|
+
isUpdatingToken: false,
|
|
168
|
+
}), [stubClient, queryClient]);
|
|
169
|
+
return (React.createElement(QueryClientProvider, { client: queryClient },
|
|
170
|
+
React.createElement(TamboClientContext.Provider, { value: clientContext },
|
|
171
|
+
React.createElement(TamboRegistryContext.Provider, { value: registryContext },
|
|
172
|
+
React.createElement(TamboV1ConfigContext.Provider, { value: config },
|
|
173
|
+
React.createElement(TamboV1StreamProvider, { state: streamState, dispatch: streamDispatch, threadManagement: threadManagement },
|
|
174
|
+
React.createElement(TamboV1ThreadInputContext.Provider, { value: threadInputContext }, children)))))));
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=tambo-v1-stub-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tambo-v1-stub-provider.js","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * TamboV1StubProvider - Mock Provider for Testing\n *\n * Provides stubbed versions of all v1 contexts for testing components\n * that use Tambo hooks without making real API calls.\n * @example\n * ```tsx\n * const mockThread = {\n * id: \"thread_123\",\n * messages: [\n * { id: \"msg_1\", role: \"user\", content: [{ type: \"text\", text: \"Hello\" }], createdAt: \"...\" },\n * { id: \"msg_2\", role: \"assistant\", content: [{ type: \"text\", text: \"Hi!\" }], createdAt: \"...\" },\n * ],\n * status: \"idle\",\n * createdAt: \"2024-01-01T00:00:00Z\",\n * updatedAt: \"2024-01-01T00:00:00Z\",\n * };\n *\n * function TestComponent() {\n * return (\n * <TamboV1StubProvider thread={mockThread}>\n * <MyComponent />\n * </TamboV1StubProvider>\n * );\n * }\n * ```\n */\n\nimport TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport React, { useMemo, type PropsWithChildren } from \"react\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n} from \"../../model/component-metadata\";\nimport { TamboClientContext } from \"../../providers/tambo-client-provider\";\nimport { TamboRegistryContext } from \"../../providers/tambo-registry-provider\";\nimport type { TamboV1Message } from \"../types/message\";\nimport type { TamboV1Thread } from \"../types/thread\";\nimport type {\n StreamAction,\n StreamState,\n ThreadState,\n} from \"../utils/event-accumulator\";\nimport { TamboV1ConfigContext, type TamboV1Config } from \"./tambo-v1-provider\";\nimport {\n TamboV1StreamProvider,\n type ThreadManagement,\n} from \"./tambo-v1-stream-context\";\nimport {\n TamboV1ThreadInputContext,\n type TamboV1ThreadInputContextProps,\n} from \"./tambo-v1-thread-input-provider\";\n\n/**\n * Props for TamboV1StubProvider\n */\nexport interface TamboV1StubProviderProps {\n /**\n * Thread data to display.\n * Can be a full TamboV1Thread or just an array of messages.\n */\n thread?: TamboV1Thread | { messages: TamboV1Message[] };\n\n /**\n * Optional thread ID. Defaults to \"stub_thread\" or thread.id if provided.\n */\n threadId?: string;\n\n /**\n * Components to register with the registry.\n */\n components?: TamboComponent[];\n\n /**\n * Tools to register with the registry.\n */\n tools?: TamboTool[];\n\n /**\n * User key for the config context.\n */\n userKey?: string;\n\n /**\n * Initial input value for the thread input context.\n */\n inputValue?: string;\n\n /**\n * Whether the thread is currently streaming.\n */\n isStreaming?: boolean;\n\n /**\n * Override for the submit function.\n * If not provided, submit will be a no-op that returns the threadId.\n */\n onSubmit?: () => Promise<{ threadId: string }>;\n\n /**\n * Override for the setValue function.\n */\n onSetValue?: (value: string | ((prev: string) => string)) => void;\n\n /**\n * Override for startNewThread.\n */\n onStartNewThread?: () => string;\n\n /**\n * Override for switchThread.\n */\n onSwitchThread?: (threadId: string | null) => void;\n\n /**\n * Override for initThread.\n */\n onInitThread?: (threadId: string) => void;\n}\n\n/**\n * Creates a default TamboV1Thread from messages or returns the full thread.\n * @returns A normalized thread object\n */\nfunction normalizeThread(\n threadData: TamboV1Thread | { messages: TamboV1Message[] } | undefined,\n threadId: string,\n): TamboV1Thread {\n if (!threadData) {\n return {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n }\n\n if (\"id\" in threadData && \"status\" in threadData) {\n return threadData;\n }\n\n return {\n id: threadId,\n messages: threadData.messages,\n status: \"idle\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n}\n\n/**\n * TamboV1StubProvider provides mock implementations of all v1 contexts\n * for testing components that use Tambo hooks.\n *\n * All operations are no-ops by default, returning stub data.\n * Override specific behaviors via props as needed for testing.\n * Stream state is derived once from props and is not updated by thread management.\n * @returns A provider wrapper suitable for tests\n */\nexport function TamboV1StubProvider({\n children,\n thread: threadData,\n threadId: providedThreadId,\n components = [],\n tools = [],\n userKey,\n inputValue: initialInputValue = \"\",\n isStreaming = false,\n onSubmit,\n onSetValue,\n onStartNewThread,\n onSwitchThread,\n onInitThread,\n}: PropsWithChildren<TamboV1StubProviderProps>) {\n // Determine thread ID\n const threadId =\n providedThreadId ??\n (threadData && \"id\" in threadData ? threadData.id : \"stub_thread\");\n\n // Normalize thread data\n const thread = normalizeThread(threadData, threadId);\n\n // Create stub QueryClient\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n }),\n [],\n );\n\n // Create stub client\n const stubClient = useMemo(() => ({}) as TamboAI, []);\n\n // Build component registry\n const componentList = useMemo(() => {\n const list: TamboRegistryContext[\"componentList\"] = {};\n\n for (const component of components) {\n list[component.name] = {\n component: component.component,\n loadingComponent: component.loadingComponent,\n name: component.name,\n description: component.description,\n props: component.propsDefinition ?? {},\n contextTools: [],\n };\n }\n\n return list;\n }, [components]);\n\n // Build tool registry\n const toolRegistry = useMemo(() => {\n return tools.reduce((acc, tool) => {\n acc[tool.name] = tool;\n return acc;\n }, {} as TamboToolRegistry);\n }, [tools]);\n\n // Stream state\n const streamState = useMemo<StreamState>(() => {\n const threadState: ThreadState = {\n thread,\n streaming: {\n status: isStreaming ? \"streaming\" : \"idle\",\n },\n accumulatingToolArgs: new Map(),\n };\n\n return {\n threadMap: { [threadId]: threadState },\n currentThreadId: threadId,\n };\n }, [thread, threadId, isStreaming]);\n\n // Stream dispatch (no-op)\n const streamDispatch = useMemo<React.Dispatch<StreamAction>>(\n () => () => {},\n [],\n );\n\n // Thread management\n const threadManagement = useMemo<ThreadManagement>(\n () => ({\n initThread: onInitThread ?? (() => {}),\n switchThread: onSwitchThread ?? (() => {}),\n startNewThread:\n onStartNewThread ??\n (() => {\n const newId = `stub_${crypto.randomUUID()}`;\n return newId;\n }),\n }),\n [onInitThread, onSwitchThread, onStartNewThread],\n );\n\n // Config context\n const config = useMemo<TamboV1Config>(() => ({ userKey }), [userKey]);\n\n // Input state (managed internally for stub)\n const [inputValue, setInputValueInternal] = React.useState(initialInputValue);\n\n // Thread input context\n const threadInputContext = useMemo<TamboV1ThreadInputContextProps>(() => {\n const setValue: React.Dispatch<React.SetStateAction<string>> =\n onSetValue ?? setInputValueInternal;\n\n const submit: TamboV1ThreadInputContextProps[\"submit\"] =\n onSubmit ??\n (async () => {\n return { threadId };\n });\n\n return {\n value: inputValue,\n setValue,\n submit,\n threadId,\n setThreadId: () => {},\n images: [],\n addImage: async () => {},\n addImages: async () => {},\n removeImage: () => {},\n clearImages: () => {},\n isPending: false,\n isError: false,\n error: null,\n isIdle: true,\n isSuccess: false,\n status: \"idle\",\n data: undefined,\n variables: undefined,\n failureCount: 0,\n failureReason: null,\n reset: () => {},\n context: undefined,\n submittedAt: 0,\n isPaused: false,\n };\n }, [inputValue, threadId, onSubmit, onSetValue, setInputValueInternal]);\n\n // Registry context\n const registryContext = useMemo<TamboRegistryContext>(\n () => ({\n componentList,\n toolRegistry,\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n onCallUnregisteredTool: undefined,\n registerComponent: () => {},\n registerTool: () => {},\n registerTools: () => {},\n addToolAssociation: () => {},\n registerMcpServer: () => {},\n registerMcpServers: () => {},\n registerResource: () => {},\n registerResources: () => {},\n registerResourceSource: () => {},\n }),\n [componentList, toolRegistry],\n );\n\n // Client context\n const clientContext = useMemo(\n () => ({\n client: stubClient,\n queryClient,\n isUpdatingToken: false,\n }),\n [stubClient, queryClient],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <TamboClientContext.Provider value={clientContext}>\n <TamboRegistryContext.Provider value={registryContext}>\n <TamboV1ConfigContext.Provider value={config}>\n <TamboV1StreamProvider\n state={streamState}\n dispatch={streamDispatch}\n threadManagement={threadManagement}\n >\n <TamboV1ThreadInputContext.Provider value={threadInputContext}>\n {children}\n </TamboV1ThreadInputContext.Provider>\n </TamboV1StreamProvider>\n </TamboV1ConfigContext.Provider>\n </TamboRegistryContext.Provider>\n </TamboClientContext.Provider>\n </QueryClientProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tambo-v1-stub-provider.test.d.ts","sourceRoot":"","sources":["../../../src/v1/providers/tambo-v1-stub-provider.test.tsx"],"names":[],"mappings":""}
|