@tambo-ai/react 0.71.0 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
  2. package/dist/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
  3. package/dist/v1/hooks/use-tambo-v1-component-state.js +134 -0
  4. package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
  5. package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
  6. package/dist/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
  7. package/dist/v1/hooks/use-tambo-v1-component-state.test.js +292 -0
  8. package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
  9. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
  10. package/dist/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
  11. package/dist/v1/hooks/use-tambo-v1-thread-input.js +76 -0
  12. package/dist/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
  13. package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
  14. package/dist/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
  15. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +168 -0
  16. package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
  17. package/dist/v1/index.d.ts +23 -12
  18. package/dist/v1/index.d.ts.map +1 -1
  19. package/dist/v1/index.js +48 -14
  20. package/dist/v1/index.js.map +1 -1
  21. package/dist/v1/providers/tambo-v1-provider.d.ts +43 -1
  22. package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  23. package/dist/v1/providers/tambo-v1-provider.js +24 -3
  24. package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
  25. package/dist/v1/providers/tambo-v1-provider.test.js +58 -0
  26. package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -1
  27. package/dist/v1/types/message.d.ts +27 -2
  28. package/dist/v1/types/message.d.ts.map +1 -1
  29. package/dist/v1/types/message.js.map +1 -1
  30. package/dist/v1/utils/component-renderer.d.ts +89 -0
  31. package/dist/v1/utils/component-renderer.d.ts.map +1 -0
  32. package/dist/v1/utils/component-renderer.js +216 -0
  33. package/dist/v1/utils/component-renderer.js.map +1 -0
  34. package/dist/v1/utils/component-renderer.test.d.ts +2 -0
  35. package/dist/v1/utils/component-renderer.test.d.ts.map +1 -0
  36. package/dist/v1/utils/component-renderer.test.js +380 -0
  37. package/dist/v1/utils/component-renderer.test.js.map +1 -0
  38. package/dist/v1/utils/event-accumulator.js +28 -8
  39. package/dist/v1/utils/event-accumulator.js.map +1 -1
  40. package/dist/v1/utils/event-accumulator.test.js +201 -6
  41. package/dist/v1/utils/event-accumulator.test.js.map +1 -1
  42. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts +44 -0
  43. package/esm/v1/hooks/use-tambo-v1-component-state.d.ts.map +1 -0
  44. package/esm/v1/hooks/use-tambo-v1-component-state.js +131 -0
  45. package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -0
  46. package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts +2 -0
  47. package/esm/v1/hooks/use-tambo-v1-component-state.test.d.ts.map +1 -0
  48. package/esm/v1/hooks/use-tambo-v1-component-state.test.js +290 -0
  49. package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -0
  50. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts +62 -0
  51. package/esm/v1/hooks/use-tambo-v1-thread-input.d.ts.map +1 -0
  52. package/esm/v1/hooks/use-tambo-v1-thread-input.js +73 -0
  53. package/esm/v1/hooks/use-tambo-v1-thread-input.js.map +1 -0
  54. package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts +2 -0
  55. package/esm/v1/hooks/use-tambo-v1-thread-input.test.d.ts.map +1 -0
  56. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +166 -0
  57. package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -0
  58. package/esm/v1/index.d.ts +23 -12
  59. package/esm/v1/index.d.ts.map +1 -1
  60. package/esm/v1/index.js +31 -12
  61. package/esm/v1/index.js.map +1 -1
  62. package/esm/v1/providers/tambo-v1-provider.d.ts +43 -1
  63. package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
  64. package/esm/v1/providers/tambo-v1-provider.js +24 -4
  65. package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
  66. package/esm/v1/providers/tambo-v1-provider.test.js +59 -1
  67. package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -1
  68. package/esm/v1/types/message.d.ts +27 -2
  69. package/esm/v1/types/message.d.ts.map +1 -1
  70. package/esm/v1/types/message.js.map +1 -1
  71. package/esm/v1/utils/component-renderer.d.ts +89 -0
  72. package/esm/v1/utils/component-renderer.d.ts.map +1 -0
  73. package/esm/v1/utils/component-renderer.js +175 -0
  74. package/esm/v1/utils/component-renderer.js.map +1 -0
  75. package/esm/v1/utils/component-renderer.test.d.ts +2 -0
  76. package/esm/v1/utils/component-renderer.test.d.ts.map +1 -0
  77. package/esm/v1/utils/component-renderer.test.js +375 -0
  78. package/esm/v1/utils/component-renderer.test.js.map +1 -0
  79. package/esm/v1/utils/event-accumulator.js +28 -8
  80. package/esm/v1/utils/event-accumulator.js.map +1 -1
  81. package/esm/v1/utils/event-accumulator.test.js +201 -6
  82. package/esm/v1/utils/event-accumulator.test.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"event-accumulator.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Event Accumulation Logic for v1 Streaming API\n *\n * Implements a reducer that transforms AG-UI event streams into React state.\n * Used with useReducer to accumulate events into thread state.\n */\n\nimport type {\n AGUIEvent,\n CustomEvent,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport {\n asTamboCustomEvent,\n type ComponentEndEvent,\n type ComponentPropsDeltaEvent,\n type ComponentStartEvent,\n type ComponentStateDeltaEvent,\n type RunAwaitingInputEvent,\n} from \"../types/event\";\nimport type { Content, TamboV1Message } from \"../types/message\";\nimport type { StreamingState, TamboV1Thread } from \"../types/thread\";\nimport { applyJsonPatch } from \"./json-patch\";\n\n/**\n * Error thrown when an unreachable case is reached in a switch statement.\n * This indicates a programming error where not all cases were handled.\n */\nexport class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${JSON.stringify(value)}`);\n this.name = \"UnreachableCaseError\";\n }\n}\n\n/**\n * Per-thread state managed by the stream reducer.\n * Tracks thread data, streaming status, and accumulating data.\n */\nexport interface ThreadState {\n thread: TamboV1Thread;\n streaming: StreamingState;\n /**\n * Accumulating tool call arguments as JSON strings (for streaming).\n * Maps tool call ID to accumulated JSON string.\n */\n accumulatingToolArgs: Map<string, string>;\n}\n\n/**\n * State managed by the stream reducer.\n * Maintains a map of all threads being tracked.\n */\nexport interface StreamState {\n /**\n * Map of thread ID to thread state\n */\n threadMap: Record<string, ThreadState>;\n\n /**\n * Current active thread ID (for UI context)\n */\n currentThreadId: string | null;\n}\n\n/**\n * Event action - dispatches an AG-UI event to update thread state.\n */\nexport interface EventAction {\n type: \"EVENT\";\n event: AGUIEvent;\n threadId: string;\n}\n\n/**\n * Initialize thread action - creates a new thread in the threadMap.\n */\nexport interface InitThreadAction {\n type: \"INIT_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Set current thread action - changes the active thread.\n */\nexport interface SetCurrentThreadAction {\n type: \"SET_CURRENT_THREAD\";\n threadId: string | null;\n}\n\n/**\n * Start new thread action - atomically creates and switches to a new thread.\n * This prevents race conditions when multiple calls happen concurrently.\n */\nexport interface StartNewThreadAction {\n type: \"START_NEW_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Action type for the stream reducer.\n */\nexport type StreamAction =\n | EventAction\n | InitThreadAction\n | SetCurrentThreadAction\n | StartNewThreadAction;\n\n/**\n * Initial streaming state.\n */\nconst initialStreamingState: StreamingState = {\n status: \"idle\",\n};\n\n/**\n * Create initial thread state for a new thread.\n * @param threadId - Unique thread identifier\n * @returns Initial thread state\n */\nexport function createInitialThreadState(threadId: string): ThreadState {\n const now = new Date().toISOString();\n return {\n thread: {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: now,\n updatedAt: now,\n },\n streaming: initialStreamingState,\n accumulatingToolArgs: new Map(),\n };\n}\n\n/**\n * Create initial stream state with empty threadMap.\n * @returns Initial stream state\n */\nexport function createInitialState(): StreamState {\n return {\n threadMap: {},\n currentThreadId: null,\n };\n}\n\n// ============================================================================\n// Helper Functions for Immutable State Updates\n// ============================================================================\n\n/**\n * Location of a content block within messages.\n */\ninterface ContentLocation {\n messageIndex: number;\n contentIndex: number;\n}\n\n/**\n * Replace a message at a specific index immutably.\n * @param messages - Current messages array\n * @param index - Index of message to replace\n * @param updatedMessage - New message to insert\n * @returns New messages array with the message replaced\n */\nfunction updateMessageAtIndex(\n messages: TamboV1Message[],\n index: number,\n updatedMessage: TamboV1Message,\n): TamboV1Message[] {\n return [\n ...messages.slice(0, index),\n updatedMessage,\n ...messages.slice(index + 1),\n ];\n}\n\n/**\n * Replace a content block at a specific index within a message's content immutably.\n * @param content - Current content array\n * @param index - Index of content to replace\n * @param updatedContent - New content to insert\n * @returns New content array with the content replaced\n */\nfunction updateContentAtIndex(\n content: Content[],\n index: number,\n updatedContent: Content,\n): Content[] {\n return [\n ...content.slice(0, index),\n updatedContent,\n ...content.slice(index + 1),\n ];\n}\n\n/**\n * Find a content block by ID across all messages, searching from most recent.\n *\n * TODO: This is O(n*m) where n = messages and m = content blocks per message.\n * For high-frequency streaming with many messages, consider maintaining an\n * index map of contentId -> {messageIndex, contentIndex} that gets updated\n * when content blocks are created.\n * @param messages - Messages to search\n * @param contentType - Type of content to find (\"component\" or \"tool_use\")\n * @param contentId - ID of the content block\n * @param eventName - Name of the event (for error messages)\n * @returns Location of the content block\n * @throws {Error} If content not found\n */\nfunction findContentById(\n messages: TamboV1Message[],\n contentType: \"component\" | \"tool_use\",\n contentId: string,\n eventName: string,\n): ContentLocation {\n for (let i = messages.length - 1; i >= 0; i--) {\n const idx = messages[i].content.findIndex(\n (c) => c.type === contentType && c.id === contentId,\n );\n if (idx !== -1) {\n return { messageIndex: i, contentIndex: idx };\n }\n }\n throw new Error(`${contentType} ${contentId} not found for ${eventName}`);\n}\n\n/**\n * Create updated thread state with new messages.\n * @param threadState - Current thread state\n * @param messages - New messages array\n * @returns Updated thread state\n */\nfunction updateThreadMessages(\n threadState: ThreadState,\n messages: TamboV1Message[],\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Stream reducer that accumulates events into thread state.\n *\n * This reducer handles all AG-UI events and Tambo custom events,\n * transforming them into immutable state updates per thread.\n * @param state - Current stream state\n * @param action - Action to process\n * @returns Updated stream state\n */\nexport function streamReducer(\n state: StreamState,\n action: StreamAction,\n): StreamState {\n // Handle non-event actions first\n switch (action.type) {\n case \"INIT_THREAD\": {\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return state;\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n case \"SET_CURRENT_THREAD\": {\n return {\n ...state,\n currentThreadId: action.threadId,\n };\n }\n\n case \"START_NEW_THREAD\": {\n // Atomic action: initialize thread AND set as current in one reducer pass\n // This prevents race conditions when multiple startNewThread() calls happen\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return {\n ...state,\n currentThreadId: threadId,\n };\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n }\n\n case \"EVENT\":\n // Fall through to event handling below\n break;\n }\n\n // Handle EVENT action\n const { event, threadId } = action;\n\n // Get the current thread state, auto-initializing if needed\n // Auto-initialization handles the case where events arrive before explicit thread init\n // (e.g., when creating a new thread and RUN_STARTED is the first event)\n let threadState = state.threadMap[threadId];\n let updatedState = state;\n\n if (!threadState) {\n // Auto-initialize the thread to avoid dropping events\n threadState = createInitialThreadState(threadId);\n updatedState = {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n // Process the event for this specific thread\n let updatedThreadState: ThreadState;\n\n // Switch on event.type - AGUIEvent is a discriminated union so TypeScript\n // automatically narrows the type in each case branch\n switch (event.type) {\n case EventType.RUN_STARTED:\n updatedThreadState = handleRunStarted(threadState, event);\n break;\n\n case EventType.RUN_FINISHED:\n updatedThreadState = handleRunFinished(threadState, event);\n break;\n\n case EventType.RUN_ERROR:\n updatedThreadState = handleRunError(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_START:\n updatedThreadState = handleTextMessageStart(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleTextMessageContent(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_END:\n updatedThreadState = handleTextMessageEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_START:\n updatedThreadState = handleToolCallStart(threadState, event);\n break;\n\n case EventType.TOOL_CALL_ARGS:\n updatedThreadState = handleToolCallArgs(threadState, event);\n break;\n\n case EventType.TOOL_CALL_END:\n updatedThreadState = handleToolCallEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_RESULT:\n updatedThreadState = handleToolCallResult(threadState, event);\n break;\n\n case EventType.CUSTOM:\n updatedThreadState = handleCustomEvent(threadState, event);\n break;\n\n // Unsupported AG-UI event types - may be added in future phases\n case EventType.TEXT_MESSAGE_CHUNK:\n case EventType.THINKING_TEXT_MESSAGE_START:\n case EventType.THINKING_TEXT_MESSAGE_CONTENT:\n case EventType.THINKING_TEXT_MESSAGE_END:\n case EventType.TOOL_CALL_CHUNK:\n case EventType.THINKING_START:\n case EventType.THINKING_END:\n case EventType.STATE_SNAPSHOT:\n case EventType.STATE_DELTA:\n case EventType.MESSAGES_SNAPSHOT:\n case EventType.ACTIVITY_SNAPSHOT:\n case EventType.ACTIVITY_DELTA:\n case EventType.RAW:\n case EventType.STEP_STARTED:\n case EventType.STEP_FINISHED:\n // Log warning - these events are being ignored\n\n console.warn(\n `[StreamReducer] Received unsupported event type: ${event.type}. ` +\n `This event will be ignored.`,\n );\n return updatedState;\n\n default: {\n // Exhaustiveness check: if a new event type is added to AGUIEvent\n // and not handled above, TypeScript will error here\n const _exhaustiveCheck: never = event;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n\n // Return updated state with modified thread\n return {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [threadId]: updatedThreadState,\n },\n };\n}\n\n/**\n * Handle RUN_STARTED event.\n * @param threadState - Current thread state\n * @param event - Run started event\n * @returns Updated thread state\n */\nfunction handleRunStarted(\n threadState: ThreadState,\n event: RunStartedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"streaming\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n status: \"streaming\",\n runId: event.runId,\n startTime: event.timestamp ?? Date.now(),\n },\n };\n}\n\n/**\n * Handle RUN_FINISHED event.\n * @param threadState - Current thread state\n * @param _event - Run finished event (unused)\n * @returns Updated thread state\n */\nfunction handleRunFinished(\n threadState: ThreadState,\n _event: RunFinishedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"complete\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"complete\",\n },\n };\n}\n\n/**\n * Handle RUN_ERROR event.\n * @param threadState - Current thread state\n * @param event - Run error event\n * @returns Updated thread state\n */\nfunction handleRunError(\n threadState: ThreadState,\n event: RunErrorEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"error\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"error\",\n error: {\n message: event.message,\n code: event.code,\n },\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_START event.\n * Creates a new message in the thread.\n * @param threadState - Current thread state\n * @param event - Text message start event\n * @returns Updated thread state\n */\nfunction handleTextMessageStart(\n threadState: ThreadState,\n event: TextMessageStartEvent,\n): ThreadState {\n const newMessage: TamboV1Message = {\n id: event.messageId,\n role: event.role === \"user\" ? \"user\" : \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...threadState.thread.messages, newMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_CONTENT event.\n * Appends text content to the current message.\n * @param threadState - Current thread state\n * @param event - Text message content event\n * @returns Updated thread state\n */\nfunction handleTextMessageContent(\n threadState: ThreadState,\n event: TextMessageContentEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message to update\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TEXT_MESSAGE_CONTENT event`,\n );\n }\n\n const message = messages[messageIndex];\n const content = message.content;\n\n // Find or create text content block\n const lastContent = content[content.length - 1];\n const isTextBlock = lastContent?.type === \"text\";\n\n const updatedContent: Content[] = isTextBlock\n ? [\n ...content.slice(0, -1),\n {\n ...lastContent,\n text: lastContent.text + event.delta,\n },\n ]\n : [\n ...content,\n {\n type: \"text\",\n text: event.delta,\n },\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updatedContent,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TEXT_MESSAGE_END event.\n * Marks the message as complete.\n * @param threadState - Current thread state\n * @param event - Text message end event\n * @returns Updated thread state\n */\nfunction handleTextMessageEnd(\n threadState: ThreadState,\n event: TextMessageEndEvent,\n): ThreadState {\n const activeMessageId = threadState.streaming.messageId;\n\n if (activeMessageId && event.messageId !== activeMessageId) {\n throw new Error(\n `TEXT_MESSAGE_END messageId mismatch (thread ${threadState.thread.id}): expected ${activeMessageId}, got ${event.messageId}`,\n );\n }\n\n return {\n ...threadState,\n streaming: {\n ...threadState.streaming,\n messageId: undefined,\n },\n };\n}\n\n/**\n * Handle TOOL_CALL_START event.\n * Adds a tool use content block to the current message.\n * @param threadState - Current thread state\n * @param event - Tool call start event\n * @returns Updated thread state\n */\nfunction handleToolCallStart(\n threadState: ThreadState,\n event: ToolCallStartEvent,\n): ThreadState {\n const messageId = event.parentMessageId;\n const messages = threadState.thread.messages;\n\n // If no parent message ID, use the last message\n const messageIndex = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : messages.length - 1;\n\n if (messageIndex === -1) {\n throw new Error(\n messageId\n ? `Message ${messageId} not found for TOOL_CALL_START event`\n : `No messages exist for TOOL_CALL_START event`,\n );\n }\n\n const message = messages[messageIndex];\n const newContent: Content = {\n type: \"tool_use\",\n id: event.toolCallId,\n name: event.toolCallName,\n input: {},\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TOOL_CALL_ARGS event.\n * Accumulates JSON string deltas for tool call arguments.\n * The accumulated string will be parsed at TOOL_CALL_END.\n * @param threadState - Current thread state\n * @param event - Tool call args event\n * @returns Updated thread state\n */\nfunction handleToolCallArgs(\n threadState: ThreadState,\n event: ToolCallArgsEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n\n // Accumulate the JSON string delta\n const accumulatedArgs = threadState.accumulatingToolArgs;\n const existingArgs = accumulatedArgs.get(toolCallId) ?? \"\";\n const newAccumulatedArgs = new Map(accumulatedArgs);\n newAccumulatedArgs.set(toolCallId, existingArgs + event.delta);\n\n return {\n ...threadState,\n accumulatingToolArgs: newAccumulatedArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_END event.\n * Parses the accumulated JSON arguments and updates the tool_use content block.\n * @param threadState - Current thread state\n * @param event - Tool call end event\n * @returns Updated thread state\n */\nfunction handleToolCallEnd(\n threadState: ThreadState,\n event: ToolCallEndEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n const messages = threadState.thread.messages;\n\n // Get accumulated JSON args string\n const accumulatedJson = threadState.accumulatingToolArgs.get(toolCallId);\n if (!accumulatedJson) {\n // No args accumulated - tool call has empty input\n return threadState;\n }\n\n // Parse the accumulated JSON\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(accumulatedJson);\n } catch (error) {\n throw new Error(\n `Failed to parse tool call arguments for ${toolCallId}: ${error instanceof Error ? error.message : String(error)}. JSON: ${accumulatedJson}`,\n );\n }\n\n // Find the tool_use content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_END event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_END event`,\n );\n }\n\n // Update the tool_use content with parsed input\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n // Clear accumulated args for this tool call\n const newAccumulatingToolArgs = new Map(threadState.accumulatingToolArgs);\n newAccumulatingToolArgs.delete(toolCallId);\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatingToolArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_RESULT event.\n * Adds tool result to the message.\n * @param threadState - Current thread state\n * @param event - Tool call result event\n * @returns Updated thread state\n */\nfunction handleToolCallResult(\n threadState: ThreadState,\n event: ToolCallResultEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TOOL_CALL_RESULT event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add tool result content\n const newContent: Content = {\n type: \"tool_result\",\n toolUseId: event.toolCallId,\n content: [\n {\n type: \"text\",\n text: event.content,\n },\n ],\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle custom events (Tambo-specific).\n * @param threadState - Current thread state\n * @param event - Custom event (already narrowed from AGUIEvent)\n * @returns Updated thread state\n */\nfunction handleCustomEvent(\n threadState: ThreadState,\n event: CustomEvent,\n): ThreadState {\n // Use centralized casting function to get properly typed Tambo event\n const customEvent = asTamboCustomEvent(event);\n\n if (!customEvent) {\n // Unknown custom event - log and return unchanged\n console.warn(`[StreamReducer] Unknown custom event name: ${event.name}`);\n return threadState;\n }\n\n switch (customEvent.name) {\n case \"tambo.component.start\":\n return handleComponentStart(threadState, customEvent);\n\n case \"tambo.component.props_delta\":\n return handleComponentDelta(threadState, customEvent, \"props\");\n\n case \"tambo.component.state_delta\":\n return handleComponentDelta(threadState, customEvent, \"state\");\n\n case \"tambo.component.end\":\n return handleComponentEnd(threadState, customEvent);\n\n case \"tambo.run.awaiting_input\":\n return handleRunAwaitingInput(threadState, customEvent);\n\n default: {\n // Exhaustiveness check: if a new event type is added to TamboCustomEvent\n // and not handled here, TypeScript will error\n const _exhaustiveCheck: never = customEvent;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n}\n\n/**\n * Handle tambo.component.start event.\n * Adds a component content block to the message.\n * @param threadState - Current thread state\n * @param event - Component start event\n * @returns Updated thread state\n */\nfunction handleComponentStart(\n threadState: ThreadState,\n event: ComponentStartEvent,\n): ThreadState {\n const messageId = event.value.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for tambo.component.start event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add component content block\n const newContent: Content = {\n type: \"component\",\n id: event.value.componentId,\n name: event.value.componentName,\n props: {},\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle component delta events (both props_delta and state_delta).\n * Applies JSON Patch to the specified field.\n * @param threadState - Current thread state\n * @param event - Component delta event (props or state)\n * @param field - Which field to update ('props' or 'state')\n * @returns Updated thread state\n */\nfunction handleComponentDelta(\n threadState: ThreadState,\n event: ComponentPropsDeltaEvent | ComponentStateDeltaEvent,\n field: \"props\" | \"state\",\n): ThreadState {\n const componentId = event.value.componentId;\n const operations = event.value.operations;\n const messages = threadState.thread.messages;\n const eventName = `tambo.component.${field}_delta`;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n `${eventName} event`,\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for ${eventName} event`,\n );\n }\n\n // Get current value (state defaults to {} if undefined)\n const currentValue =\n field === \"props\"\n ? (componentContent.props as Record<string, unknown>)\n : ((componentContent.state as Record<string, unknown>) ?? {});\n\n // Apply JSON Patch\n const updatedValue = applyJsonPatch(currentValue, operations);\n\n const updatedContent: Content = {\n ...componentContent,\n [field]: updatedValue,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.component.end event.\n * Marks component as complete.\n * @param threadState - Current thread state\n * @param _event - Component end event (unused)\n * @returns Updated thread state\n */\nfunction handleComponentEnd(\n threadState: ThreadState,\n _event: ComponentEndEvent,\n): ThreadState {\n // For now, this doesn't change state\n return threadState;\n}\n\n/**\n * Handle tambo.run.awaiting_input event.\n * Sets thread status to waiting for client-side tool execution.\n * @param threadState - Current thread state\n * @param _event - Run awaiting input event (unused)\n * @returns Updated thread state\n */\nfunction handleRunAwaitingInput(\n threadState: ThreadState,\n _event: RunAwaitingInputEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"waiting\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"waiting\",\n },\n };\n}\n"]}
1
+ {"version":3,"file":"event-accumulator.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Event Accumulation Logic for v1 Streaming API\n *\n * Implements a reducer that transforms AG-UI event streams into React state.\n * Used with useReducer to accumulate events into thread state.\n */\n\nimport type {\n AGUIEvent,\n CustomEvent,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport { EventType } from \"@ag-ui/core\";\nimport {\n asTamboCustomEvent,\n type ComponentEndEvent,\n type ComponentPropsDeltaEvent,\n type ComponentStartEvent,\n type ComponentStateDeltaEvent,\n type RunAwaitingInputEvent,\n} from \"../types/event\";\nimport type { Content, TamboV1Message } from \"../types/message\";\nimport type { StreamingState, TamboV1Thread } from \"../types/thread\";\nimport { applyJsonPatch } from \"./json-patch\";\n\n/**\n * Error thrown when an unreachable case is reached in a switch statement.\n * This indicates a programming error where not all cases were handled.\n */\nexport class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${JSON.stringify(value)}`);\n this.name = \"UnreachableCaseError\";\n }\n}\n\n/**\n * Per-thread state managed by the stream reducer.\n * Tracks thread data, streaming status, and accumulating data.\n */\nexport interface ThreadState {\n thread: TamboV1Thread;\n streaming: StreamingState;\n /**\n * Accumulating tool call arguments as JSON strings (for streaming).\n * Maps tool call ID to accumulated JSON string.\n */\n accumulatingToolArgs: Map<string, string>;\n}\n\n/**\n * State managed by the stream reducer.\n * Maintains a map of all threads being tracked.\n */\nexport interface StreamState {\n /**\n * Map of thread ID to thread state\n */\n threadMap: Record<string, ThreadState>;\n\n /**\n * Current active thread ID (for UI context)\n */\n currentThreadId: string | null;\n}\n\n/**\n * Event action - dispatches an AG-UI event to update thread state.\n */\nexport interface EventAction {\n type: \"EVENT\";\n event: AGUIEvent;\n threadId: string;\n}\n\n/**\n * Initialize thread action - creates a new thread in the threadMap.\n */\nexport interface InitThreadAction {\n type: \"INIT_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Set current thread action - changes the active thread.\n */\nexport interface SetCurrentThreadAction {\n type: \"SET_CURRENT_THREAD\";\n threadId: string | null;\n}\n\n/**\n * Start new thread action - atomically creates and switches to a new thread.\n * This prevents race conditions when multiple calls happen concurrently.\n */\nexport interface StartNewThreadAction {\n type: \"START_NEW_THREAD\";\n threadId: string;\n initialThread?: Partial<TamboV1Thread>;\n}\n\n/**\n * Action type for the stream reducer.\n */\nexport type StreamAction =\n | EventAction\n | InitThreadAction\n | SetCurrentThreadAction\n | StartNewThreadAction;\n\n/**\n * Initial streaming state.\n */\nconst initialStreamingState: StreamingState = {\n status: \"idle\",\n};\n\n/**\n * Create initial thread state for a new thread.\n * @param threadId - Unique thread identifier\n * @returns Initial thread state\n */\nexport function createInitialThreadState(threadId: string): ThreadState {\n const now = new Date().toISOString();\n return {\n thread: {\n id: threadId,\n messages: [],\n status: \"idle\",\n createdAt: now,\n updatedAt: now,\n },\n streaming: initialStreamingState,\n accumulatingToolArgs: new Map(),\n };\n}\n\n/**\n * Create initial stream state with empty threadMap.\n * @returns Initial stream state\n */\nexport function createInitialState(): StreamState {\n return {\n threadMap: {},\n currentThreadId: null,\n };\n}\n\n// ============================================================================\n// Helper Functions for Immutable State Updates\n// ============================================================================\n\n/**\n * Location of a content block within messages.\n */\ninterface ContentLocation {\n messageIndex: number;\n contentIndex: number;\n}\n\n/**\n * Replace a message at a specific index immutably.\n * @param messages - Current messages array\n * @param index - Index of message to replace\n * @param updatedMessage - New message to insert\n * @returns New messages array with the message replaced\n */\nfunction updateMessageAtIndex(\n messages: TamboV1Message[],\n index: number,\n updatedMessage: TamboV1Message,\n): TamboV1Message[] {\n return [\n ...messages.slice(0, index),\n updatedMessage,\n ...messages.slice(index + 1),\n ];\n}\n\n/**\n * Replace a content block at a specific index within a message's content immutably.\n * @param content - Current content array\n * @param index - Index of content to replace\n * @param updatedContent - New content to insert\n * @returns New content array with the content replaced\n */\nfunction updateContentAtIndex(\n content: Content[],\n index: number,\n updatedContent: Content,\n): Content[] {\n return [\n ...content.slice(0, index),\n updatedContent,\n ...content.slice(index + 1),\n ];\n}\n\n/**\n * Find a content block by ID across all messages, searching from most recent.\n *\n * TODO: This is O(n*m) where n = messages and m = content blocks per message.\n * For high-frequency streaming with many messages, consider maintaining an\n * index map of contentId -> {messageIndex, contentIndex} that gets updated\n * when content blocks are created.\n * @param messages - Messages to search\n * @param contentType - Type of content to find (\"component\" or \"tool_use\")\n * @param contentId - ID of the content block\n * @param eventName - Name of the event (for error messages)\n * @returns Location of the content block\n * @throws {Error} If content not found\n */\nfunction findContentById(\n messages: TamboV1Message[],\n contentType: \"component\" | \"tool_use\",\n contentId: string,\n eventName: string,\n): ContentLocation {\n for (let i = messages.length - 1; i >= 0; i--) {\n const idx = messages[i].content.findIndex(\n (c) => c.type === contentType && c.id === contentId,\n );\n if (idx !== -1) {\n return { messageIndex: i, contentIndex: idx };\n }\n }\n throw new Error(`${contentType} ${contentId} not found for ${eventName}`);\n}\n\n/**\n * Create updated thread state with new messages.\n * @param threadState - Current thread state\n * @param messages - New messages array\n * @returns Updated thread state\n */\nfunction updateThreadMessages(\n threadState: ThreadState,\n messages: TamboV1Message[],\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages,\n updatedAt: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Stream reducer that accumulates events into thread state.\n *\n * This reducer handles all AG-UI events and Tambo custom events,\n * transforming them into immutable state updates per thread.\n * @param state - Current stream state\n * @param action - Action to process\n * @returns Updated stream state\n */\nexport function streamReducer(\n state: StreamState,\n action: StreamAction,\n): StreamState {\n // Handle non-event actions first\n switch (action.type) {\n case \"INIT_THREAD\": {\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return state;\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n case \"SET_CURRENT_THREAD\": {\n return {\n ...state,\n currentThreadId: action.threadId,\n };\n }\n\n case \"START_NEW_THREAD\": {\n // Atomic action: initialize thread AND set as current in one reducer pass\n // This prevents race conditions when multiple startNewThread() calls happen\n const { threadId, initialThread } = action;\n // Don't overwrite existing thread\n if (state.threadMap[threadId]) {\n return {\n ...state,\n currentThreadId: threadId,\n };\n }\n const baseState = createInitialThreadState(threadId);\n const threadState = initialThread\n ? {\n ...baseState,\n thread: {\n ...baseState.thread,\n ...initialThread,\n id: threadId,\n },\n }\n : baseState;\n return {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n currentThreadId: threadId,\n };\n }\n\n case \"EVENT\":\n // Fall through to event handling below\n break;\n }\n\n // Handle EVENT action\n const { event, threadId } = action;\n\n // Get the current thread state, auto-initializing if needed\n // Auto-initialization handles the case where events arrive before explicit thread init\n // (e.g., when creating a new thread and RUN_STARTED is the first event)\n let threadState = state.threadMap[threadId];\n let updatedState = state;\n\n if (!threadState) {\n // Auto-initialize the thread to avoid dropping events\n threadState = createInitialThreadState(threadId);\n updatedState = {\n ...state,\n threadMap: {\n ...state.threadMap,\n [threadId]: threadState,\n },\n };\n }\n\n // Process the event for this specific thread\n let updatedThreadState: ThreadState;\n\n // Switch on event.type - AGUIEvent is a discriminated union so TypeScript\n // automatically narrows the type in each case branch\n switch (event.type) {\n case EventType.RUN_STARTED:\n updatedThreadState = handleRunStarted(threadState, event);\n break;\n\n case EventType.RUN_FINISHED:\n updatedThreadState = handleRunFinished(threadState, event);\n break;\n\n case EventType.RUN_ERROR:\n updatedThreadState = handleRunError(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_START:\n updatedThreadState = handleTextMessageStart(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_CONTENT:\n updatedThreadState = handleTextMessageContent(threadState, event);\n break;\n\n case EventType.TEXT_MESSAGE_END:\n updatedThreadState = handleTextMessageEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_START:\n updatedThreadState = handleToolCallStart(threadState, event);\n break;\n\n case EventType.TOOL_CALL_ARGS:\n updatedThreadState = handleToolCallArgs(threadState, event);\n break;\n\n case EventType.TOOL_CALL_END:\n updatedThreadState = handleToolCallEnd(threadState, event);\n break;\n\n case EventType.TOOL_CALL_RESULT:\n updatedThreadState = handleToolCallResult(threadState, event);\n break;\n\n case EventType.CUSTOM:\n updatedThreadState = handleCustomEvent(threadState, event);\n break;\n\n // Unsupported AG-UI event types - may be added in future phases\n case EventType.TEXT_MESSAGE_CHUNK:\n case EventType.THINKING_TEXT_MESSAGE_START:\n case EventType.THINKING_TEXT_MESSAGE_CONTENT:\n case EventType.THINKING_TEXT_MESSAGE_END:\n case EventType.TOOL_CALL_CHUNK:\n case EventType.THINKING_START:\n case EventType.THINKING_END:\n case EventType.STATE_SNAPSHOT:\n case EventType.STATE_DELTA:\n case EventType.MESSAGES_SNAPSHOT:\n case EventType.ACTIVITY_SNAPSHOT:\n case EventType.ACTIVITY_DELTA:\n case EventType.RAW:\n case EventType.STEP_STARTED:\n case EventType.STEP_FINISHED:\n // Log warning - these events are being ignored\n\n console.warn(\n `[StreamReducer] Received unsupported event type: ${event.type}. ` +\n `This event will be ignored.`,\n );\n return updatedState;\n\n default: {\n // Exhaustiveness check: if a new event type is added to AGUIEvent\n // and not handled above, TypeScript will error here\n const _exhaustiveCheck: never = event;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n\n // Return updated state with modified thread\n return {\n ...updatedState,\n threadMap: {\n ...updatedState.threadMap,\n [threadId]: updatedThreadState,\n },\n };\n}\n\n/**\n * Handle RUN_STARTED event.\n * @param threadState - Current thread state\n * @param event - Run started event\n * @returns Updated thread state\n */\nfunction handleRunStarted(\n threadState: ThreadState,\n event: RunStartedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"streaming\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n status: \"streaming\",\n runId: event.runId,\n startTime: event.timestamp ?? Date.now(),\n },\n };\n}\n\n/**\n * Handle RUN_FINISHED event.\n * @param threadState - Current thread state\n * @param _event - Run finished event (unused)\n * @returns Updated thread state\n */\nfunction handleRunFinished(\n threadState: ThreadState,\n _event: RunFinishedEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"complete\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"complete\",\n },\n };\n}\n\n/**\n * Handle RUN_ERROR event.\n * @param threadState - Current thread state\n * @param event - Run error event\n * @returns Updated thread state\n */\nfunction handleRunError(\n threadState: ThreadState,\n event: RunErrorEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"error\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"error\",\n error: {\n message: event.message,\n code: event.code,\n },\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_START event.\n * Creates a new message in the thread.\n * @param threadState - Current thread state\n * @param event - Text message start event\n * @returns Updated thread state\n */\nfunction handleTextMessageStart(\n threadState: ThreadState,\n event: TextMessageStartEvent,\n): ThreadState {\n const newMessage: TamboV1Message = {\n id: event.messageId,\n role: event.role === \"user\" ? \"user\" : \"assistant\",\n content: [],\n createdAt: new Date().toISOString(),\n };\n\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n messages: [...threadState.thread.messages, newMessage],\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n messageId: event.messageId,\n },\n };\n}\n\n/**\n * Handle TEXT_MESSAGE_CONTENT event.\n * Appends text content to the current message.\n * @param threadState - Current thread state\n * @param event - Text message content event\n * @returns Updated thread state\n */\nfunction handleTextMessageContent(\n threadState: ThreadState,\n event: TextMessageContentEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message to update\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TEXT_MESSAGE_CONTENT event`,\n );\n }\n\n const message = messages[messageIndex];\n const content = message.content;\n\n // Find or create text content block\n const lastContent = content[content.length - 1];\n const isTextBlock = lastContent?.type === \"text\";\n\n const updatedContent: Content[] = isTextBlock\n ? [\n ...content.slice(0, -1),\n {\n ...lastContent,\n text: lastContent.text + event.delta,\n },\n ]\n : [\n ...content,\n {\n type: \"text\",\n text: event.delta,\n },\n ];\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updatedContent,\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TEXT_MESSAGE_END event.\n * Marks the message as complete.\n * @param threadState - Current thread state\n * @param event - Text message end event\n * @returns Updated thread state\n */\nfunction handleTextMessageEnd(\n threadState: ThreadState,\n event: TextMessageEndEvent,\n): ThreadState {\n const activeMessageId = threadState.streaming.messageId;\n\n if (activeMessageId && event.messageId !== activeMessageId) {\n throw new Error(\n `TEXT_MESSAGE_END messageId mismatch (thread ${threadState.thread.id}): expected ${activeMessageId}, got ${event.messageId}`,\n );\n }\n\n return {\n ...threadState,\n streaming: {\n ...threadState.streaming,\n messageId: undefined,\n },\n };\n}\n\n/**\n * Handle TOOL_CALL_START event.\n * Adds a tool use content block to the current message.\n * @param threadState - Current thread state\n * @param event - Tool call start event\n * @returns Updated thread state\n */\nfunction handleToolCallStart(\n threadState: ThreadState,\n event: ToolCallStartEvent,\n): ThreadState {\n const messageId = event.parentMessageId;\n const messages = threadState.thread.messages;\n\n // If no parent message ID, use the last message\n const messageIndex = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : messages.length - 1;\n\n if (messageIndex === -1) {\n throw new Error(\n messageId\n ? `Message ${messageId} not found for TOOL_CALL_START event`\n : `No messages exist for TOOL_CALL_START event`,\n );\n }\n\n const message = messages[messageIndex];\n const newContent: Content = {\n type: \"tool_use\",\n id: event.toolCallId,\n name: event.toolCallName,\n input: {},\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle TOOL_CALL_ARGS event.\n * Accumulates JSON string deltas for tool call arguments.\n * The accumulated string will be parsed at TOOL_CALL_END.\n * @param threadState - Current thread state\n * @param event - Tool call args event\n * @returns Updated thread state\n */\nfunction handleToolCallArgs(\n threadState: ThreadState,\n event: ToolCallArgsEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n\n // Accumulate the JSON string delta\n const accumulatedArgs = threadState.accumulatingToolArgs;\n const existingArgs = accumulatedArgs.get(toolCallId) ?? \"\";\n const newAccumulatedArgs = new Map(accumulatedArgs);\n newAccumulatedArgs.set(toolCallId, existingArgs + event.delta);\n\n return {\n ...threadState,\n accumulatingToolArgs: newAccumulatedArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_END event.\n * Parses the accumulated JSON arguments and updates the tool_use content block.\n * @param threadState - Current thread state\n * @param event - Tool call end event\n * @returns Updated thread state\n */\nfunction handleToolCallEnd(\n threadState: ThreadState,\n event: ToolCallEndEvent,\n): ThreadState {\n const toolCallId = event.toolCallId;\n const messages = threadState.thread.messages;\n\n // Get accumulated JSON args string\n const accumulatedJson = threadState.accumulatingToolArgs.get(toolCallId);\n if (!accumulatedJson) {\n // No args accumulated - tool call has empty input\n return threadState;\n }\n\n // Parse the accumulated JSON\n let parsedInput: unknown;\n try {\n parsedInput = JSON.parse(accumulatedJson);\n } catch (error) {\n throw new Error(\n `Failed to parse tool call arguments for ${toolCallId}: ${error instanceof Error ? error.message : String(error)}. JSON: ${accumulatedJson}`,\n );\n }\n\n // Find the tool_use content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"tool_use\",\n toolCallId,\n \"TOOL_CALL_END event\",\n );\n\n const message = messages[messageIndex];\n const toolUseContent = message.content[contentIndex];\n\n if (toolUseContent.type !== \"tool_use\") {\n throw new Error(\n `Content at index ${contentIndex} is not a tool_use block for TOOL_CALL_END event`,\n );\n }\n\n // Update the tool_use content with parsed input\n const updatedContent: Content = {\n ...toolUseContent,\n input: parsedInput,\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n // Clear accumulated args for this tool call\n const newAccumulatingToolArgs = new Map(threadState.accumulatingToolArgs);\n newAccumulatingToolArgs.delete(toolCallId);\n\n return {\n ...updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n ),\n accumulatingToolArgs: newAccumulatingToolArgs,\n };\n}\n\n/**\n * Handle TOOL_CALL_RESULT event.\n * Adds tool result to the message.\n * @param threadState - Current thread state\n * @param event - Tool call result event\n * @returns Updated thread state\n */\nfunction handleToolCallResult(\n threadState: ThreadState,\n event: ToolCallResultEvent,\n): ThreadState {\n const messageId = event.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for TOOL_CALL_RESULT event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add tool result content\n const newContent: Content = {\n type: \"tool_result\",\n toolUseId: event.toolCallId,\n content: [\n {\n type: \"text\",\n text: event.content,\n },\n ],\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle custom events (Tambo-specific).\n * @param threadState - Current thread state\n * @param event - Custom event (already narrowed from AGUIEvent)\n * @returns Updated thread state\n */\nfunction handleCustomEvent(\n threadState: ThreadState,\n event: CustomEvent,\n): ThreadState {\n // Use centralized casting function to get properly typed Tambo event\n const customEvent = asTamboCustomEvent(event);\n\n if (!customEvent) {\n // Unknown custom event - log and return unchanged\n console.warn(`[StreamReducer] Unknown custom event name: ${event.name}`);\n return threadState;\n }\n\n switch (customEvent.name) {\n case \"tambo.component.start\":\n return handleComponentStart(threadState, customEvent);\n\n case \"tambo.component.props_delta\":\n return handleComponentDelta(threadState, customEvent, \"props\");\n\n case \"tambo.component.state_delta\":\n return handleComponentDelta(threadState, customEvent, \"state\");\n\n case \"tambo.component.end\":\n return handleComponentEnd(threadState, customEvent);\n\n case \"tambo.run.awaiting_input\":\n return handleRunAwaitingInput(threadState, customEvent);\n\n default: {\n // Exhaustiveness check: if a new event type is added to TamboCustomEvent\n // and not handled here, TypeScript will error\n const _exhaustiveCheck: never = customEvent;\n throw new UnreachableCaseError(_exhaustiveCheck);\n }\n }\n}\n\n/**\n * Handle tambo.component.start event.\n * Adds a component content block to the message with 'started' streaming state.\n * @param threadState - Current thread state\n * @param event - Component start event\n * @returns Updated thread state\n */\nfunction handleComponentStart(\n threadState: ThreadState,\n event: ComponentStartEvent,\n): ThreadState {\n const messageId = event.value.messageId;\n const messages = threadState.thread.messages;\n\n // Find the message\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n throw new Error(\n `Message ${messageId} not found for tambo.component.start event`,\n );\n }\n\n const message = messages[messageIndex];\n\n // Add component content block with 'started' streaming state\n const newContent: Content = {\n type: \"component\",\n id: event.value.componentId,\n name: event.value.componentName,\n props: {},\n streamingState: \"started\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: [...message.content, newContent],\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle component delta events (both props_delta and state_delta).\n * Applies JSON Patch to the specified field and sets streamingState to 'streaming'.\n * @param threadState - Current thread state\n * @param event - Component delta event (props or state)\n * @param field - Which field to update ('props' or 'state')\n * @returns Updated thread state\n */\nfunction handleComponentDelta(\n threadState: ThreadState,\n event: ComponentPropsDeltaEvent | ComponentStateDeltaEvent,\n field: \"props\" | \"state\",\n): ThreadState {\n const componentId = event.value.componentId;\n const operations = event.value.operations;\n const messages = threadState.thread.messages;\n const eventName = `tambo.component.${field}_delta`;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n `${eventName} event`,\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for ${eventName} event`,\n );\n }\n\n // Get current value (state defaults to {} if undefined)\n const currentValue =\n field === \"props\"\n ? (componentContent.props as Record<string, unknown>)\n : ((componentContent.state as Record<string, unknown>) ?? {});\n\n // Apply JSON Patch\n const updatedValue = applyJsonPatch(currentValue, operations);\n\n // Update field and set streaming state to 'streaming'\n const updatedContent: Content = {\n ...componentContent,\n [field]: updatedValue,\n streamingState: \"streaming\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.component.end event.\n * Sets component streaming state to 'done'.\n * @param threadState - Current thread state\n * @param event - Component end event\n * @returns Updated thread state\n */\nfunction handleComponentEnd(\n threadState: ThreadState,\n event: ComponentEndEvent,\n): ThreadState {\n const componentId = event.value.componentId;\n const messages = threadState.thread.messages;\n\n // Find the component content block\n const { messageIndex, contentIndex } = findContentById(\n messages,\n \"component\",\n componentId,\n \"tambo.component.end event\",\n );\n\n const message = messages[messageIndex];\n const componentContent = message.content[contentIndex];\n\n if (componentContent.type !== \"component\") {\n throw new Error(\n `Content at index ${contentIndex} is not a component block for tambo.component.end event`,\n );\n }\n\n // Set streaming state to 'done'\n const updatedContent: Content = {\n ...componentContent,\n streamingState: \"done\",\n };\n\n const updatedMessage: TamboV1Message = {\n ...message,\n content: updateContentAtIndex(\n message.content,\n contentIndex,\n updatedContent,\n ),\n };\n\n return updateThreadMessages(\n threadState,\n updateMessageAtIndex(messages, messageIndex, updatedMessage),\n );\n}\n\n/**\n * Handle tambo.run.awaiting_input event.\n * Sets thread status to waiting for client-side tool execution.\n * @param threadState - Current thread state\n * @param _event - Run awaiting input event (unused)\n * @returns Updated thread state\n */\nfunction handleRunAwaitingInput(\n threadState: ThreadState,\n _event: RunAwaitingInputEvent,\n): ThreadState {\n return {\n ...threadState,\n thread: {\n ...threadState.thread,\n status: \"waiting\",\n updatedAt: new Date().toISOString(),\n },\n streaming: {\n ...threadState.streaming,\n status: \"waiting\",\n },\n };\n}\n"]}
@@ -12,10 +12,10 @@ function asToolUseContent(content, index) {
12
12
  return content[index];
13
13
  }
14
14
  /**
15
- * Helper to extract a ComponentContent from a message content array.
15
+ * Helper to extract a V1ComponentContent from a message content array.
16
16
  * @param content - Content array from a message
17
17
  * @param index - Index of the content item
18
- * @returns The content as ComponentContent
18
+ * @returns The content as V1ComponentContent
19
19
  */
20
20
  function asComponentContent(content, index) {
21
21
  return content[index];
@@ -644,6 +644,7 @@ describe("streamReducer", () => {
644
644
  id: "comp_1",
645
645
  name: "WeatherCard",
646
646
  props: {},
647
+ streamingState: "started",
647
648
  });
648
649
  });
649
650
  it("handles tambo.component.props_delta event", () => {
@@ -653,7 +654,13 @@ describe("streamReducer", () => {
653
654
  id: "msg_1",
654
655
  role: "assistant",
655
656
  content: [
656
- { type: "component", id: "comp_1", name: "Test", props: {} },
657
+ {
658
+ type: "component",
659
+ id: "comp_1",
660
+ name: "Test",
661
+ props: {},
662
+ streamingState: "started",
663
+ },
657
664
  ],
658
665
  createdAt: "2024-01-01T00:00:00.000Z",
659
666
  },
@@ -673,6 +680,7 @@ describe("streamReducer", () => {
673
680
  });
674
681
  const component = asComponentContent(result.threadMap.thread_1.thread.messages[0].content, 0);
675
682
  expect(component.props).toEqual({ temperature: 72 });
683
+ expect(component.streamingState).toBe("streaming");
676
684
  });
677
685
  it("throws when component not found for props_delta", () => {
678
686
  const state = createTestStreamState("thread_1");
@@ -723,7 +731,13 @@ describe("streamReducer", () => {
723
731
  id: "msg_1",
724
732
  role: "assistant",
725
733
  content: [
726
- { type: "component", id: "comp_1", name: "Counter", props: {} },
734
+ {
735
+ type: "component",
736
+ id: "comp_1",
737
+ name: "Counter",
738
+ props: {},
739
+ streamingState: "started",
740
+ },
727
741
  ],
728
742
  createdAt: "2024-01-01T00:00:00.000Z",
729
743
  },
@@ -743,6 +757,7 @@ describe("streamReducer", () => {
743
757
  });
744
758
  const component = asComponentContent(result.threadMap.thread_1.thread.messages[0].content, 0);
745
759
  expect(component.state).toEqual({ count: 42 });
760
+ expect(component.streamingState).toBe("streaming");
746
761
  });
747
762
  it("handles tambo.component.end event", () => {
748
763
  const state = createTestStreamState("thread_1");
@@ -751,7 +766,13 @@ describe("streamReducer", () => {
751
766
  id: "msg_1",
752
767
  role: "assistant",
753
768
  content: [
754
- { type: "component", id: "comp_1", name: "Test", props: {} },
769
+ {
770
+ type: "component",
771
+ id: "comp_1",
772
+ name: "Test",
773
+ props: {},
774
+ streamingState: "streaming",
775
+ },
755
776
  ],
756
777
  createdAt: "2024-01-01T00:00:00.000Z",
757
778
  },
@@ -766,14 +787,188 @@ describe("streamReducer", () => {
766
787
  event,
767
788
  threadId: "thread_1",
768
789
  });
769
- // component.end doesn't change state currently, just returns unchanged
790
+ // component.end sets streamingState to 'done'
770
791
  expect(result.threadMap.thread_1.thread.messages[0].content[0]).toEqual({
771
792
  type: "component",
772
793
  id: "comp_1",
773
794
  name: "Test",
774
795
  props: {},
796
+ streamingState: "done",
775
797
  });
776
798
  });
799
+ it("throws when message not found for tambo.component.start", () => {
800
+ const state = createTestStreamState("thread_1");
801
+ state.threadMap.thread_1.thread.messages = [
802
+ {
803
+ id: "msg_1",
804
+ role: "assistant",
805
+ content: [],
806
+ createdAt: "2024-01-01T00:00:00.000Z",
807
+ },
808
+ ];
809
+ const event = {
810
+ type: core_1.EventType.CUSTOM,
811
+ name: "tambo.component.start",
812
+ value: {
813
+ messageId: "unknown_msg",
814
+ componentId: "comp_1",
815
+ componentName: "Test",
816
+ },
817
+ };
818
+ expect(() => {
819
+ (0, event_accumulator_1.streamReducer)(state, {
820
+ type: "EVENT",
821
+ event,
822
+ threadId: "thread_1",
823
+ });
824
+ }).toThrow("Message unknown_msg not found for tambo.component.start event");
825
+ });
826
+ it("throws when component not found for tambo.component.end", () => {
827
+ const state = createTestStreamState("thread_1");
828
+ state.threadMap.thread_1.thread.messages = [
829
+ {
830
+ id: "msg_1",
831
+ role: "assistant",
832
+ content: [],
833
+ createdAt: "2024-01-01T00:00:00.000Z",
834
+ },
835
+ ];
836
+ const event = {
837
+ type: core_1.EventType.CUSTOM,
838
+ name: "tambo.component.end",
839
+ value: { componentId: "unknown_comp" },
840
+ };
841
+ expect(() => {
842
+ (0, event_accumulator_1.streamReducer)(state, {
843
+ type: "EVENT",
844
+ event,
845
+ threadId: "thread_1",
846
+ });
847
+ }).toThrow("component unknown_comp not found");
848
+ });
849
+ it("handles multiple component props_delta operations", () => {
850
+ const state = createTestStreamState("thread_1");
851
+ state.threadMap.thread_1.thread.messages = [
852
+ {
853
+ id: "msg_1",
854
+ role: "assistant",
855
+ content: [
856
+ {
857
+ type: "component",
858
+ id: "comp_1",
859
+ name: "Test",
860
+ props: { existing: "value" },
861
+ streamingState: "started",
862
+ },
863
+ ],
864
+ createdAt: "2024-01-01T00:00:00.000Z",
865
+ },
866
+ ];
867
+ const event = {
868
+ type: core_1.EventType.CUSTOM,
869
+ name: "tambo.component.props_delta",
870
+ value: {
871
+ componentId: "comp_1",
872
+ operations: [
873
+ { op: "add", path: "/newProp", value: "new" },
874
+ { op: "replace", path: "/existing", value: "updated" },
875
+ ],
876
+ },
877
+ };
878
+ const result = (0, event_accumulator_1.streamReducer)(state, {
879
+ type: "EVENT",
880
+ event,
881
+ threadId: "thread_1",
882
+ });
883
+ const component = asComponentContent(result.threadMap.thread_1.thread.messages[0].content, 0);
884
+ expect(component.props).toEqual({
885
+ existing: "updated",
886
+ newProp: "new",
887
+ });
888
+ });
889
+ it("handles multiple components in same message", () => {
890
+ const state = createTestStreamState("thread_1");
891
+ state.threadMap.thread_1.thread.messages = [
892
+ {
893
+ id: "msg_1",
894
+ role: "assistant",
895
+ content: [
896
+ {
897
+ type: "component",
898
+ id: "comp_1",
899
+ name: "First",
900
+ props: {},
901
+ streamingState: "done",
902
+ },
903
+ ],
904
+ createdAt: "2024-01-01T00:00:00.000Z",
905
+ },
906
+ ];
907
+ // Add second component
908
+ const event = {
909
+ type: core_1.EventType.CUSTOM,
910
+ name: "tambo.component.start",
911
+ value: {
912
+ messageId: "msg_1",
913
+ componentId: "comp_2",
914
+ componentName: "Second",
915
+ },
916
+ };
917
+ const result = (0, event_accumulator_1.streamReducer)(state, {
918
+ type: "EVENT",
919
+ event,
920
+ threadId: "thread_1",
921
+ });
922
+ const content = result.threadMap.thread_1.thread.messages[0].content;
923
+ expect(content).toHaveLength(2);
924
+ expect(asComponentContent(content, 0).id).toBe("comp_1");
925
+ expect(asComponentContent(content, 1).id).toBe("comp_2");
926
+ });
927
+ it("updates correct component when multiple exist", () => {
928
+ const state = createTestStreamState("thread_1");
929
+ state.threadMap.thread_1.thread.messages = [
930
+ {
931
+ id: "msg_1",
932
+ role: "assistant",
933
+ content: [
934
+ {
935
+ type: "component",
936
+ id: "comp_1",
937
+ name: "First",
938
+ props: { value: 1 },
939
+ streamingState: "done",
940
+ },
941
+ {
942
+ type: "component",
943
+ id: "comp_2",
944
+ name: "Second",
945
+ props: { value: 2 },
946
+ streamingState: "streaming",
947
+ },
948
+ ],
949
+ createdAt: "2024-01-01T00:00:00.000Z",
950
+ },
951
+ ];
952
+ // Update second component
953
+ const event = {
954
+ type: core_1.EventType.CUSTOM,
955
+ name: "tambo.component.props_delta",
956
+ value: {
957
+ componentId: "comp_2",
958
+ operations: [{ op: "replace", path: "/value", value: 99 }],
959
+ },
960
+ };
961
+ const result = (0, event_accumulator_1.streamReducer)(state, {
962
+ type: "EVENT",
963
+ event,
964
+ threadId: "thread_1",
965
+ });
966
+ const content = result.threadMap.thread_1.thread.messages[0].content;
967
+ // First component unchanged
968
+ expect(asComponentContent(content, 0).props).toEqual({ value: 1 });
969
+ // Second component updated
970
+ expect(asComponentContent(content, 1).props).toEqual({ value: 99 });
971
+ });
777
972
  });
778
973
  describe("snapshot tests for complex state transitions", () => {
779
974
  it("matches snapshot for full message flow", () => {