@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.
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.js +134 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +292 -0
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.js +76 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +168 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
- package/dist/v1/index.d.ts +23 -12
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +48 -14
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +43 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +24 -3
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.test.js +58 -0
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/dist/v1/types/message.d.ts +27 -2
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/utils/component-renderer.d.ts +89 -0
- package/dist/v1/utils/component-renderer.d.ts.map +1 -0
- package/dist/v1/utils/component-renderer.js +216 -0
- package/dist/v1/utils/component-renderer.js.map +1 -0
- package/dist/v1/utils/component-renderer.test.d.ts +2 -0
- package/dist/v1/utils/component-renderer.test.d.ts.map +1 -0
- package/dist/v1/utils/component-renderer.test.js +380 -0
- package/dist/v1/utils/component-renderer.test.js.map +1 -0
- package/dist/v1/utils/event-accumulator.js +28 -8
- package/dist/v1/utils/event-accumulator.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +201 -6
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.js +131 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +290 -0
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.js +73 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +166 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
- package/esm/v1/index.d.ts +23 -12
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +31 -12
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +43 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +24 -4
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.test.js +59 -1
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
- package/esm/v1/types/message.d.ts +27 -2
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/utils/component-renderer.d.ts +89 -0
- package/esm/v1/utils/component-renderer.d.ts.map +1 -0
- package/esm/v1/utils/component-renderer.js +175 -0
- package/esm/v1/utils/component-renderer.js.map +1 -0
- package/esm/v1/utils/component-renderer.test.d.ts +2 -0
- package/esm/v1/utils/component-renderer.test.d.ts.map +1 -0
- package/esm/v1/utils/component-renderer.test.js +375 -0
- package/esm/v1/utils/component-renderer.test.js.map +1 -0
- package/esm/v1/utils/event-accumulator.js +28 -8
- package/esm/v1/utils/event-accumulator.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +201 -6
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-accumulator.test.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EventType,\n type CustomEvent,\n type RunErrorEvent,\n type RunFinishedEvent,\n type RunStartedEvent,\n type StateSnapshotEvent,\n type TextMessageContentEvent,\n type TextMessageEndEvent,\n type TextMessageStartEvent,\n type ToolCallArgsEvent,\n type ToolCallEndEvent,\n type ToolCallResultEvent,\n type ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport type {\n ComponentContent,\n ToolUseContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport {\n createInitialState,\n createInitialThreadState,\n streamReducer,\n type StreamState,\n type ThreadState,\n} from \"./event-accumulator\";\nimport type { Content } from \"../types/message\";\n\n/**\n * Helper to extract a ToolUseContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as ToolUseContent\n */\nfunction asToolUseContent(content: Content[], index: number): ToolUseContent {\n return content[index] as ToolUseContent;\n}\n\n/**\n * Helper to extract a ComponentContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as ComponentContent\n */\nfunction asComponentContent(\n content: Content[],\n index: number,\n): ComponentContent {\n return content[index] as ComponentContent;\n}\n\n// Helper to create a base thread state for testing\nfunction createTestThreadState(threadId: string): ThreadState {\n return {\n ...createInitialThreadState(threadId),\n thread: {\n ...createInitialThreadState(threadId).thread,\n // Use fixed timestamps for snapshot stability\n createdAt: \"2024-01-01T00:00:00.000Z\",\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n },\n };\n}\n\n// Helper to create stream state with a thread\nfunction createTestStreamState(threadId: string): StreamState {\n return {\n threadMap: {\n [threadId]: createTestThreadState(threadId),\n },\n currentThreadId: threadId,\n };\n}\n\ndescribe(\"createInitialThreadState\", () => {\n it(\"creates thread state with correct structure\", () => {\n const state = createInitialThreadState(\"thread_123\");\n\n expect(state.thread.id).toBe(\"thread_123\");\n expect(state.thread.messages).toEqual([]);\n expect(state.thread.status).toBe(\"idle\");\n expect(state.streaming.status).toBe(\"idle\");\n expect(state.accumulatingToolArgs).toBeInstanceOf(Map);\n expect(state.accumulatingToolArgs.size).toBe(0);\n });\n});\n\ndescribe(\"createInitialState\", () => {\n it(\"creates empty stream state\", () => {\n const state = createInitialState();\n\n expect(state.threadMap).toEqual({});\n expect(state.currentThreadId).toBeNull();\n });\n});\n\ndescribe(\"streamReducer\", () => {\n // Mock console.warn for tests that check logging\n let consoleWarnSpy: jest.SpyInstance;\n\n beforeEach(() => {\n consoleWarnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n });\n\n afterEach(() => {\n consoleWarnSpy.mockRestore();\n });\n\n describe(\"unknown thread handling\", () => {\n it(\"auto-initializes unknown thread when receiving events\", () => {\n const state = createInitialState();\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"unknown_thread\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"unknown_thread\",\n });\n\n // Should auto-initialize the thread rather than dropping the event\n expect(result.threadMap.unknown_thread).toBeDefined();\n expect(result.threadMap.unknown_thread.thread.id).toBe(\"unknown_thread\");\n expect(result.threadMap.unknown_thread.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.threadMap.unknown_thread.streaming.runId).toBe(\"run_1\");\n // No warning should be logged for auto-initialization\n expect(consoleWarnSpy).not.toHaveBeenCalled();\n });\n });\n\n describe(\"unsupported event types\", () => {\n it(\"logs warning for unsupported AG-UI events\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result).toBe(state);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"unsupported event type\"),\n );\n });\n\n it(\"throws for completely unknown event types (fail-fast)\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Create an event with an unknown type (not in EventType enum)\n // This tests fail-fast behavior when SDK returns unexpected event types\n const event = {\n type: \"TOTALLY_UNKNOWN_EVENT_TYPE\",\n };\n\n expect(() =>\n streamReducer(state, {\n type: \"EVENT\",\n event: event as unknown as RunStartedEvent,\n threadId: \"thread_1\",\n }),\n ).toThrow(\"Unreachable case\");\n });\n\n it(\"logs warning for unknown custom event names\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"unknown.custom.event\",\n value: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Unknown custom event name\"),\n );\n });\n });\n\n describe(\"RUN_STARTED event\", () => {\n it(\"updates thread status to streaming\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.runId).toBe(\"run_123\");\n });\n\n it(\"uses provided timestamp for startTime\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.startTime).toBe(1704067200000);\n });\n });\n\n describe(\"RUN_FINISHED event\", () => {\n it(\"updates thread status to complete\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n state.threadMap.thread_1.streaming.status = \"streaming\";\n\n const event: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"complete\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"complete\");\n });\n });\n\n describe(\"RUN_ERROR event\", () => {\n it(\"updates thread status to error with details\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: \"Something went wrong\",\n code: \"ERR_001\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.error).toEqual({\n message: \"Something went wrong\",\n code: \"ERR_001\",\n });\n });\n });\n\n describe(\"TEXT_MESSAGE_START event\", () => {\n it(\"creates new message in thread\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].id).toBe(\"msg_1\");\n expect(messages[0].role).toBe(\"assistant\");\n expect(messages[0].content).toEqual([]);\n });\n\n it(\"creates user message when role is user\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"user\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe(\"user\");\n });\n });\n\n describe(\"TEXT_MESSAGE_CONTENT event\", () => {\n it(\"appends text content to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Add a message first\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello \",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello \" });\n });\n\n it(\"creates new text block after non-text content\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"After tool call\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(2);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"test\",\n input: {},\n });\n expect(content[1]).toEqual({ type: \"text\", text: \"After tool call\" });\n });\n\n it(\"accumulates text content deltas\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello \" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"world!\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello world!\" });\n });\n\n it(\"throws when message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"unknown_msg\",\n delta: \"Hello\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found\");\n });\n });\n\n describe(\"TEXT_MESSAGE_END event\", () => {\n it(\"throws when messageId doesn't match active message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Set up an active message in streaming state\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"wrong_msg_id\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"TEXT_MESSAGE_END messageId mismatch\");\n });\n\n it(\"clears active messageId on success\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.messageId).toBeUndefined();\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"adds tool_use content block to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"uses last message when no parentMessageId provided\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId - should use last message\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n\n it(\"throws when parentMessageId message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"unknown_msg\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found for TOOL_CALL_START event\");\n });\n\n it(\"throws when no messages exist\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId, no messages\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"No messages exist for TOOL_CALL_START event\");\n });\n });\n\n describe(\"TOOL_CALL_ARGS and TOOL_CALL_END events\", () => {\n it(\"handles TOOL_CALL_END with no accumulated args\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_END without any TOOL_CALL_ARGS first\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n // Should return unchanged state since no args were accumulated\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n });\n\n it(\"accumulates and parses tool arguments\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_ARGS\n const argsEvent1: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":',\n };\n\n let result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent1,\n threadId: \"thread_1\",\n });\n\n const argsEvent2: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '\"NYC\"}',\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: argsEvent2,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n const toolContent = asToolUseContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(toolContent.input).toEqual({ city: \"NYC\" });\n });\n\n it(\"throws when tool arguments JSON is invalid\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send invalid JSON via TOOL_CALL_ARGS\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: \"{invalid json\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END - should throw when parsing\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n expect(() => {\n streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Failed to parse tool call arguments\");\n });\n });\n\n describe(\"custom component events\", () => {\n it(\"handles tambo.component.start event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"WeatherCard\",\n props: {},\n });\n });\n\n it(\"handles tambo.component.props_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Test\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.props).toEqual({ temperature: 72 });\n });\n\n it(\"throws when component not found for props_delta\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [], // No component\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"unknown_comp\",\n operations: [{ op: \"add\", path: \"/value\", value: 1 }],\n },\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"component unknown_comp not found\");\n });\n\n it(\"handles tambo.run.awaiting_input event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"tool_1\", \"tool_2\"] },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"waiting\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"waiting\");\n });\n\n it(\"handles tambo.component.state_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Counter\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.state_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/count\", value: 42 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.state).toEqual({ count: 42 });\n });\n\n it(\"handles tambo.component.end event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Test\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n // component.end doesn't change state currently, just returns unchanged\n expect(result.threadMap.thread_1.thread.messages[0].content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: {},\n });\n });\n });\n\n describe(\"snapshot tests for complex state transitions\", () => {\n it(\"matches snapshot for full message flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // RUN_STARTED\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runStarted,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_START\n const msgStart: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgStart,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_CONTENT\n const msgContent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello, how can I help?\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgContent,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_END\n const msgEnd: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgEnd,\n threadId: \"thread_1\",\n });\n\n // RUN_FINISHED\n const runFinished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runFinished,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for component streaming flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // COMPONENT_START\n const compStart: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compStart,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add city\n const propsDelta1: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/city\", value: \"New York\" }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta1,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add temperature\n const propsDelta2: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta2,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_END\n const compEnd: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compEnd,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for tool call flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message with tool_use\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"get_weather\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // TOOL_CALL_ARGS\n const toolArgs: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":\"San Francisco\",\"units\":\"fahrenheit\"}',\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolArgs,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_END\n const toolEnd: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolEnd,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_RESULT\n const toolResult: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: \"tool_1\",\n messageId: \"msg_1\",\n content: \"Temperature: 65°F, Sunny\",\n role: \"tool\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolResult,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"event-accumulator.test.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EventType,\n type CustomEvent,\n type RunErrorEvent,\n type RunFinishedEvent,\n type RunStartedEvent,\n type StateSnapshotEvent,\n type TextMessageContentEvent,\n type TextMessageEndEvent,\n type TextMessageStartEvent,\n type ToolCallArgsEvent,\n type ToolCallEndEvent,\n type ToolCallResultEvent,\n type ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport type { ToolUseContent } from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport {\n createInitialState,\n createInitialThreadState,\n streamReducer,\n type StreamState,\n type ThreadState,\n} from \"./event-accumulator\";\nimport type { Content, V1ComponentContent } from \"../types/message\";\n\n/**\n * Helper to extract a ToolUseContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as ToolUseContent\n */\nfunction asToolUseContent(content: Content[], index: number): ToolUseContent {\n return content[index] as ToolUseContent;\n}\n\n/**\n * Helper to extract a V1ComponentContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as V1ComponentContent\n */\nfunction asComponentContent(\n content: Content[],\n index: number,\n): V1ComponentContent {\n return content[index] as V1ComponentContent;\n}\n\n// Helper to create a base thread state for testing\nfunction createTestThreadState(threadId: string): ThreadState {\n return {\n ...createInitialThreadState(threadId),\n thread: {\n ...createInitialThreadState(threadId).thread,\n // Use fixed timestamps for snapshot stability\n createdAt: \"2024-01-01T00:00:00.000Z\",\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n },\n };\n}\n\n// Helper to create stream state with a thread\nfunction createTestStreamState(threadId: string): StreamState {\n return {\n threadMap: {\n [threadId]: createTestThreadState(threadId),\n },\n currentThreadId: threadId,\n };\n}\n\ndescribe(\"createInitialThreadState\", () => {\n it(\"creates thread state with correct structure\", () => {\n const state = createInitialThreadState(\"thread_123\");\n\n expect(state.thread.id).toBe(\"thread_123\");\n expect(state.thread.messages).toEqual([]);\n expect(state.thread.status).toBe(\"idle\");\n expect(state.streaming.status).toBe(\"idle\");\n expect(state.accumulatingToolArgs).toBeInstanceOf(Map);\n expect(state.accumulatingToolArgs.size).toBe(0);\n });\n});\n\ndescribe(\"createInitialState\", () => {\n it(\"creates empty stream state\", () => {\n const state = createInitialState();\n\n expect(state.threadMap).toEqual({});\n expect(state.currentThreadId).toBeNull();\n });\n});\n\ndescribe(\"streamReducer\", () => {\n // Mock console.warn for tests that check logging\n let consoleWarnSpy: jest.SpyInstance;\n\n beforeEach(() => {\n consoleWarnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n });\n\n afterEach(() => {\n consoleWarnSpy.mockRestore();\n });\n\n describe(\"unknown thread handling\", () => {\n it(\"auto-initializes unknown thread when receiving events\", () => {\n const state = createInitialState();\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"unknown_thread\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"unknown_thread\",\n });\n\n // Should auto-initialize the thread rather than dropping the event\n expect(result.threadMap.unknown_thread).toBeDefined();\n expect(result.threadMap.unknown_thread.thread.id).toBe(\"unknown_thread\");\n expect(result.threadMap.unknown_thread.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.threadMap.unknown_thread.streaming.runId).toBe(\"run_1\");\n // No warning should be logged for auto-initialization\n expect(consoleWarnSpy).not.toHaveBeenCalled();\n });\n });\n\n describe(\"unsupported event types\", () => {\n it(\"logs warning for unsupported AG-UI events\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result).toBe(state);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"unsupported event type\"),\n );\n });\n\n it(\"throws for completely unknown event types (fail-fast)\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Create an event with an unknown type (not in EventType enum)\n // This tests fail-fast behavior when SDK returns unexpected event types\n const event = {\n type: \"TOTALLY_UNKNOWN_EVENT_TYPE\",\n };\n\n expect(() =>\n streamReducer(state, {\n type: \"EVENT\",\n event: event as unknown as RunStartedEvent,\n threadId: \"thread_1\",\n }),\n ).toThrow(\"Unreachable case\");\n });\n\n it(\"logs warning for unknown custom event names\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"unknown.custom.event\",\n value: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Unknown custom event name\"),\n );\n });\n });\n\n describe(\"RUN_STARTED event\", () => {\n it(\"updates thread status to streaming\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.runId).toBe(\"run_123\");\n });\n\n it(\"uses provided timestamp for startTime\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.startTime).toBe(1704067200000);\n });\n });\n\n describe(\"RUN_FINISHED event\", () => {\n it(\"updates thread status to complete\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n state.threadMap.thread_1.streaming.status = \"streaming\";\n\n const event: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"complete\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"complete\");\n });\n });\n\n describe(\"RUN_ERROR event\", () => {\n it(\"updates thread status to error with details\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: \"Something went wrong\",\n code: \"ERR_001\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.error).toEqual({\n message: \"Something went wrong\",\n code: \"ERR_001\",\n });\n });\n });\n\n describe(\"TEXT_MESSAGE_START event\", () => {\n it(\"creates new message in thread\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].id).toBe(\"msg_1\");\n expect(messages[0].role).toBe(\"assistant\");\n expect(messages[0].content).toEqual([]);\n });\n\n it(\"creates user message when role is user\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"user\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe(\"user\");\n });\n });\n\n describe(\"TEXT_MESSAGE_CONTENT event\", () => {\n it(\"appends text content to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Add a message first\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello \",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello \" });\n });\n\n it(\"creates new text block after non-text content\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"After tool call\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(2);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"test\",\n input: {},\n });\n expect(content[1]).toEqual({ type: \"text\", text: \"After tool call\" });\n });\n\n it(\"accumulates text content deltas\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello \" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"world!\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello world!\" });\n });\n\n it(\"throws when message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"unknown_msg\",\n delta: \"Hello\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found\");\n });\n });\n\n describe(\"TEXT_MESSAGE_END event\", () => {\n it(\"throws when messageId doesn't match active message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Set up an active message in streaming state\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"wrong_msg_id\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"TEXT_MESSAGE_END messageId mismatch\");\n });\n\n it(\"clears active messageId on success\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.messageId).toBeUndefined();\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"adds tool_use content block to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"uses last message when no parentMessageId provided\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId - should use last message\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n\n it(\"throws when parentMessageId message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"unknown_msg\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found for TOOL_CALL_START event\");\n });\n\n it(\"throws when no messages exist\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId, no messages\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"No messages exist for TOOL_CALL_START event\");\n });\n });\n\n describe(\"TOOL_CALL_ARGS and TOOL_CALL_END events\", () => {\n it(\"handles TOOL_CALL_END with no accumulated args\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_END without any TOOL_CALL_ARGS first\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n // Should return unchanged state since no args were accumulated\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n });\n\n it(\"accumulates and parses tool arguments\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_ARGS\n const argsEvent1: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":',\n };\n\n let result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent1,\n threadId: \"thread_1\",\n });\n\n const argsEvent2: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '\"NYC\"}',\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: argsEvent2,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n const toolContent = asToolUseContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(toolContent.input).toEqual({ city: \"NYC\" });\n });\n\n it(\"throws when tool arguments JSON is invalid\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send invalid JSON via TOOL_CALL_ARGS\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: \"{invalid json\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END - should throw when parsing\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n expect(() => {\n streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Failed to parse tool call arguments\");\n });\n });\n\n describe(\"custom component events\", () => {\n it(\"handles tambo.component.start event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"WeatherCard\",\n props: {},\n streamingState: \"started\",\n });\n });\n\n it(\"handles tambo.component.props_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: {},\n streamingState: \"started\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.props).toEqual({ temperature: 72 });\n expect(component.streamingState).toBe(\"streaming\");\n });\n\n it(\"throws when component not found for props_delta\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [], // No component\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"unknown_comp\",\n operations: [{ op: \"add\", path: \"/value\", value: 1 }],\n },\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"component unknown_comp not found\");\n });\n\n it(\"handles tambo.run.awaiting_input event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"tool_1\", \"tool_2\"] },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"waiting\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"waiting\");\n });\n\n it(\"handles tambo.component.state_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"Counter\",\n props: {},\n streamingState: \"started\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.state_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/count\", value: 42 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.state).toEqual({ count: 42 });\n expect(component.streamingState).toBe(\"streaming\");\n });\n\n it(\"handles tambo.component.end event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: {},\n streamingState: \"streaming\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n // component.end sets streamingState to 'done'\n expect(result.threadMap.thread_1.thread.messages[0].content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: {},\n streamingState: \"done\",\n });\n });\n\n it(\"throws when message not found for tambo.component.start\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"unknown_msg\",\n componentId: \"comp_1\",\n componentName: \"Test\",\n },\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\n \"Message unknown_msg not found for tambo.component.start event\",\n );\n });\n\n it(\"throws when component not found for tambo.component.end\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"unknown_comp\" },\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"component unknown_comp not found\");\n });\n\n it(\"handles multiple component props_delta operations\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: { existing: \"value\" },\n streamingState: \"started\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [\n { op: \"add\", path: \"/newProp\", value: \"new\" },\n { op: \"replace\", path: \"/existing\", value: \"updated\" },\n ],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.props).toEqual({\n existing: \"updated\",\n newProp: \"new\",\n });\n });\n\n it(\"handles multiple components in same message\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"First\",\n props: {},\n streamingState: \"done\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Add second component\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_2\",\n componentName: \"Second\",\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(2);\n expect(asComponentContent(content, 0).id).toBe(\"comp_1\");\n expect(asComponentContent(content, 1).id).toBe(\"comp_2\");\n });\n\n it(\"updates correct component when multiple exist\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n {\n type: \"component\",\n id: \"comp_1\",\n name: \"First\",\n props: { value: 1 },\n streamingState: \"done\",\n },\n {\n type: \"component\",\n id: \"comp_2\",\n name: \"Second\",\n props: { value: 2 },\n streamingState: \"streaming\",\n },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Update second component\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_2\",\n operations: [{ op: \"replace\", path: \"/value\", value: 99 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n // First component unchanged\n expect(asComponentContent(content, 0).props).toEqual({ value: 1 });\n // Second component updated\n expect(asComponentContent(content, 1).props).toEqual({ value: 99 });\n });\n });\n\n describe(\"snapshot tests for complex state transitions\", () => {\n it(\"matches snapshot for full message flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // RUN_STARTED\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runStarted,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_START\n const msgStart: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgStart,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_CONTENT\n const msgContent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello, how can I help?\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgContent,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_END\n const msgEnd: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgEnd,\n threadId: \"thread_1\",\n });\n\n // RUN_FINISHED\n const runFinished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runFinished,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for component streaming flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // COMPONENT_START\n const compStart: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compStart,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add city\n const propsDelta1: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/city\", value: \"New York\" }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta1,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add temperature\n const propsDelta2: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta2,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_END\n const compEnd: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compEnd,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for tool call flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message with tool_use\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"get_weather\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // TOOL_CALL_ARGS\n const toolArgs: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":\"San Francisco\",\"units\":\"fahrenheit\"}',\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolArgs,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_END\n const toolEnd: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolEnd,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_RESULT\n const toolResult: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: \"tool_1\",\n messageId: \"msg_1\",\n content: \"Temperature: 65°F, Sunny\",\n role: \"tool\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolResult,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return type for useTamboV1ComponentState hook.
|
|
3
|
+
* Similar to useState but with additional metadata.
|
|
4
|
+
*/
|
|
5
|
+
export type UseTamboV1ComponentStateReturn<S> = [
|
|
6
|
+
currentState: S,
|
|
7
|
+
setState: (newState: S | ((prev: S) => S)) => void,
|
|
8
|
+
meta: {
|
|
9
|
+
isPending: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
flush: () => void;
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Hook for managing component state with bidirectional server sync.
|
|
16
|
+
*
|
|
17
|
+
* This hook acts like useState but automatically syncs state changes
|
|
18
|
+
* to the Tambo backend. Server-side state updates are also reflected
|
|
19
|
+
* in the component.
|
|
20
|
+
*
|
|
21
|
+
* Must be used within a component rendered via the component renderer.
|
|
22
|
+
* @param keyName - The unique key to identify this state value within the component's state
|
|
23
|
+
* @param initialValue - Initial value for the state (used if no server state exists)
|
|
24
|
+
* @param debounceTime - Debounce time in milliseconds (default: 500ms)
|
|
25
|
+
* @returns Tuple of [currentState, setState, meta]
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* function Counter() {
|
|
29
|
+
* const [count, setCount, { isPending }] = useTamboV1ComponentState('count', 0);
|
|
30
|
+
*
|
|
31
|
+
* return (
|
|
32
|
+
* <div>
|
|
33
|
+
* <span>{count}</span>
|
|
34
|
+
* <button onClick={() => setCount(c => c + 1)} disabled={isPending}>
|
|
35
|
+
* Increment
|
|
36
|
+
* </button>
|
|
37
|
+
* </div>
|
|
38
|
+
* );
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function useTamboV1ComponentState<S = undefined>(keyName: string, initialValue?: S, debounceTime?: number): UseTamboV1ComponentStateReturn<S | undefined>;
|
|
43
|
+
export declare function useTamboV1ComponentState<S>(keyName: string, initialValue: S, debounceTime?: number): UseTamboV1ComponentStateReturn<S>;
|
|
44
|
+
//# sourceMappingURL=use-tambo-v1-component-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-component-state.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAAI;IAC9C,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI;IAClD,IAAI,EAAE;QACJ,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB;CACF,CAAC;AAgCF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,GAAG,SAAS,EACpD,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,8BAA8B,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AACjD,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,CAAC,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,8BAA8B,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
/**
|
|
3
|
+
* useTamboV1ComponentState - Component State Hook for v1 API
|
|
4
|
+
*
|
|
5
|
+
* Provides bidirectional state synchronization between React components
|
|
6
|
+
* and the Tambo backend. State changes are debounced before syncing to
|
|
7
|
+
* the server, and server state updates are reflected in the component.
|
|
8
|
+
*
|
|
9
|
+
* Must be used within a component rendered via the component renderer.
|
|
10
|
+
*/
|
|
11
|
+
import { useCallback, useEffect, useState, useRef } from "react";
|
|
12
|
+
import { useDebouncedCallback } from "use-debounce";
|
|
13
|
+
import { deepEqual } from "fast-equals";
|
|
14
|
+
import { useTamboClient } from "../../providers/tambo-client-provider";
|
|
15
|
+
import { useV1ComponentContent } from "../utils/component-renderer";
|
|
16
|
+
import { useStreamState } from "../providers/tambo-v1-stream-context";
|
|
17
|
+
/**
|
|
18
|
+
* Find a component content block by ID in a specific thread.
|
|
19
|
+
* Only searches the specified thread to prevent cross-thread data access
|
|
20
|
+
* and improve performance (O(m*k) instead of O(n*m*k)).
|
|
21
|
+
* @param streamState - The current stream state
|
|
22
|
+
* @param threadId - The thread ID to search in
|
|
23
|
+
* @param componentId - The component ID to find
|
|
24
|
+
* @returns The component content block, or undefined if not found
|
|
25
|
+
*/
|
|
26
|
+
function findComponentContent(streamState, threadId, componentId) {
|
|
27
|
+
// Only search the specified thread (not all threads)
|
|
28
|
+
const threadState = streamState.threadMap[threadId];
|
|
29
|
+
if (!threadState) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
for (const message of threadState.thread.messages) {
|
|
33
|
+
for (const content of message.content) {
|
|
34
|
+
if (content.type === "component" && content.id === componentId) {
|
|
35
|
+
return content;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
export function useTamboV1ComponentState(keyName, initialValue, debounceTime = 500) {
|
|
42
|
+
const client = useTamboClient();
|
|
43
|
+
const { componentId, threadId } = useV1ComponentContent();
|
|
44
|
+
const streamState = useStreamState();
|
|
45
|
+
// Find the component content to get server state (only search current thread)
|
|
46
|
+
const componentContent = findComponentContent(streamState, threadId, componentId);
|
|
47
|
+
const serverState = componentContent?.state;
|
|
48
|
+
const serverValue = serverState?.[keyName];
|
|
49
|
+
// Local state - initialized from server state or initial value
|
|
50
|
+
const [localState, setLocalState] = useState(() => serverValue ?? initialValue);
|
|
51
|
+
// Track pending state and errors
|
|
52
|
+
const [isPending, setIsPending] = useState(false);
|
|
53
|
+
const [error, setError] = useState(null);
|
|
54
|
+
// Track the last value we sent to avoid overwriting with stale server state
|
|
55
|
+
const lastSentValueRef = useRef(undefined);
|
|
56
|
+
// Track whether there's a pending local change that hasn't synced yet
|
|
57
|
+
const hasPendingLocalChangeRef = useRef(false);
|
|
58
|
+
// Track in-flight sync requests to avoid stale completions clearing pending state
|
|
59
|
+
const syncSeqRef = useRef(0);
|
|
60
|
+
// Debounced function to sync state to server
|
|
61
|
+
const syncToServer = useDebouncedCallback(async (newState) => {
|
|
62
|
+
const seq = ++syncSeqRef.current;
|
|
63
|
+
setIsPending(true);
|
|
64
|
+
setError(null);
|
|
65
|
+
lastSentValueRef.current = newState;
|
|
66
|
+
try {
|
|
67
|
+
await client.threads.state.updateState(componentId, {
|
|
68
|
+
threadId,
|
|
69
|
+
state: { [keyName]: newState },
|
|
70
|
+
});
|
|
71
|
+
// Clear pending flag after successful sync
|
|
72
|
+
hasPendingLocalChangeRef.current = false;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
// Clear pending flag on error to allow server reconciliation
|
|
76
|
+
hasPendingLocalChangeRef.current = false;
|
|
77
|
+
const syncError = err instanceof Error ? err : new Error(String(err));
|
|
78
|
+
setError(syncError);
|
|
79
|
+
console.error(`[useTamboV1ComponentState] Failed to sync state for ${componentId}:`, syncError);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
// Only clear isPending if this is the most recent request
|
|
83
|
+
if (seq === syncSeqRef.current) {
|
|
84
|
+
setIsPending(false);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, debounceTime);
|
|
88
|
+
// setState function that updates local state and triggers debounced sync
|
|
89
|
+
const setState = useCallback((newState) => {
|
|
90
|
+
setLocalState((prev) => {
|
|
91
|
+
const nextState = typeof newState === "function"
|
|
92
|
+
? newState(prev)
|
|
93
|
+
: newState;
|
|
94
|
+
// Mark that we have a pending local change
|
|
95
|
+
hasPendingLocalChangeRef.current = true;
|
|
96
|
+
// Trigger debounced sync to server
|
|
97
|
+
void syncToServer(nextState);
|
|
98
|
+
return nextState;
|
|
99
|
+
});
|
|
100
|
+
}, [syncToServer]);
|
|
101
|
+
// Sync from server state when it changes (e.g., from streaming events)
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (serverValue === undefined) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Don't overwrite local changes that haven't synced yet
|
|
107
|
+
if (hasPendingLocalChangeRef.current) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Only sync if the server value is different from what we last sent
|
|
111
|
+
// This prevents overwriting local state with stale server values
|
|
112
|
+
if (lastSentValueRef.current !== undefined &&
|
|
113
|
+
deepEqual(serverValue, lastSentValueRef.current)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Use functional update to avoid localState in deps
|
|
117
|
+
setLocalState((prev) => deepEqual(serverValue, prev) ? prev : serverValue);
|
|
118
|
+
}, [serverValue]);
|
|
119
|
+
// Flush pending updates on unmount
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
return () => {
|
|
122
|
+
void syncToServer.flush();
|
|
123
|
+
};
|
|
124
|
+
}, [syncToServer]);
|
|
125
|
+
// Flush function for immediate sync
|
|
126
|
+
const flush = useCallback(() => {
|
|
127
|
+
void syncToServer.flush();
|
|
128
|
+
}, [syncToServer]);
|
|
129
|
+
return [localState, setState, { isPending, error, flush }];
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=use-tambo-v1-component-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-component-state.js","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n/**\n * useTamboV1ComponentState - Component State Hook for v1 API\n *\n * Provides bidirectional state synchronization between React components\n * and the Tambo backend. State changes are debounced before syncing to\n * the server, and server state updates are reflected in the component.\n *\n * Must be used within a component rendered via the component renderer.\n */\n\nimport { useCallback, useEffect, useState, useRef } from \"react\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { deepEqual } from \"fast-equals\";\nimport { useTamboClient } from \"../../providers/tambo-client-provider\";\nimport { useV1ComponentContent } from \"../utils/component-renderer\";\nimport { useStreamState } from \"../providers/tambo-v1-stream-context\";\nimport type { V1ComponentContent } from \"../types/message\";\n\n/**\n * Return type for useTamboV1ComponentState hook.\n * Similar to useState but with additional metadata.\n */\nexport type UseTamboV1ComponentStateReturn<S> = [\n currentState: S,\n setState: (newState: S | ((prev: S) => S)) => void,\n meta: {\n isPending: boolean;\n error: Error | null;\n flush: () => void;\n },\n];\n\n/**\n * Find a component content block by ID in a specific thread.\n * Only searches the specified thread to prevent cross-thread data access\n * and improve performance (O(m*k) instead of O(n*m*k)).\n * @param streamState - The current stream state\n * @param threadId - The thread ID to search in\n * @param componentId - The component ID to find\n * @returns The component content block, or undefined if not found\n */\nfunction findComponentContent(\n streamState: ReturnType<typeof useStreamState>,\n threadId: string,\n componentId: string,\n): V1ComponentContent | undefined {\n // Only search the specified thread (not all threads)\n const threadState = streamState.threadMap[threadId];\n if (!threadState) {\n return undefined;\n }\n\n for (const message of threadState.thread.messages) {\n for (const content of message.content) {\n if (content.type === \"component\" && content.id === componentId) {\n return content;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Hook for managing component state with bidirectional server sync.\n *\n * This hook acts like useState but automatically syncs state changes\n * to the Tambo backend. Server-side state updates are also reflected\n * in the component.\n *\n * Must be used within a component rendered via the component renderer.\n * @param keyName - The unique key to identify this state value within the component's state\n * @param initialValue - Initial value for the state (used if no server state exists)\n * @param debounceTime - Debounce time in milliseconds (default: 500ms)\n * @returns Tuple of [currentState, setState, meta]\n * @example\n * ```tsx\n * function Counter() {\n * const [count, setCount, { isPending }] = useTamboV1ComponentState('count', 0);\n *\n * return (\n * <div>\n * <span>{count}</span>\n * <button onClick={() => setCount(c => c + 1)} disabled={isPending}>\n * Increment\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTamboV1ComponentState<S = undefined>(\n keyName: string,\n initialValue?: S,\n debounceTime?: number,\n): UseTamboV1ComponentStateReturn<S | undefined>;\nexport function useTamboV1ComponentState<S>(\n keyName: string,\n initialValue: S,\n debounceTime?: number,\n): UseTamboV1ComponentStateReturn<S>;\nexport function useTamboV1ComponentState<S>(\n keyName: string,\n initialValue?: S,\n debounceTime = 500,\n): UseTamboV1ComponentStateReturn<S> {\n const client = useTamboClient();\n const { componentId, threadId } = useV1ComponentContent();\n const streamState = useStreamState();\n\n // Find the component content to get server state (only search current thread)\n const componentContent = findComponentContent(\n streamState,\n threadId,\n componentId,\n );\n const serverState = componentContent?.state as\n | Record<string, unknown>\n | undefined;\n const serverValue = serverState?.[keyName] as S | undefined;\n\n // Local state - initialized from server state or initial value\n const [localState, setLocalState] = useState<S>(\n () => serverValue ?? (initialValue as S),\n );\n\n // Track pending state and errors\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Track the last value we sent to avoid overwriting with stale server state\n const lastSentValueRef = useRef<S | undefined>(undefined);\n\n // Track whether there's a pending local change that hasn't synced yet\n const hasPendingLocalChangeRef = useRef(false);\n\n // Track in-flight sync requests to avoid stale completions clearing pending state\n const syncSeqRef = useRef(0);\n\n // Debounced function to sync state to server\n const syncToServer = useDebouncedCallback(async (newState: S) => {\n const seq = ++syncSeqRef.current;\n setIsPending(true);\n setError(null);\n lastSentValueRef.current = newState;\n\n try {\n await client.threads.state.updateState(componentId, {\n threadId,\n state: { [keyName]: newState },\n });\n // Clear pending flag after successful sync\n hasPendingLocalChangeRef.current = false;\n } catch (err) {\n // Clear pending flag on error to allow server reconciliation\n hasPendingLocalChangeRef.current = false;\n const syncError = err instanceof Error ? err : new Error(String(err));\n setError(syncError);\n console.error(\n `[useTamboV1ComponentState] Failed to sync state for ${componentId}:`,\n syncError,\n );\n } finally {\n // Only clear isPending if this is the most recent request\n if (seq === syncSeqRef.current) {\n setIsPending(false);\n }\n }\n }, debounceTime);\n\n // setState function that updates local state and triggers debounced sync\n const setState = useCallback(\n (newState: S | ((prev: S) => S)) => {\n setLocalState((prev) => {\n const nextState =\n typeof newState === \"function\"\n ? (newState as (prev: S) => S)(prev)\n : newState;\n\n // Mark that we have a pending local change\n hasPendingLocalChangeRef.current = true;\n\n // Trigger debounced sync to server\n void syncToServer(nextState);\n\n return nextState;\n });\n },\n [syncToServer],\n );\n\n // Sync from server state when it changes (e.g., from streaming events)\n useEffect(() => {\n if (serverValue === undefined) {\n return;\n }\n\n // Don't overwrite local changes that haven't synced yet\n if (hasPendingLocalChangeRef.current) {\n return;\n }\n\n // Only sync if the server value is different from what we last sent\n // This prevents overwriting local state with stale server values\n if (\n lastSentValueRef.current !== undefined &&\n deepEqual(serverValue, lastSentValueRef.current)\n ) {\n return;\n }\n\n // Use functional update to avoid localState in deps\n setLocalState((prev) =>\n deepEqual(serverValue, prev) ? prev : serverValue,\n );\n }, [serverValue]);\n\n // Flush pending updates on unmount\n useEffect(() => {\n return () => {\n void syncToServer.flush();\n };\n }, [syncToServer]);\n\n // Flush function for immediate sync\n const flush = useCallback(() => {\n void syncToServer.flush();\n }, [syncToServer]);\n\n return [localState, setState, { isPending, error, flush }];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tambo-v1-component-state.test.d.ts","sourceRoot":"","sources":["../../../src/v1/hooks/use-tambo-v1-component-state.test.tsx"],"names":[],"mappings":""}
|