@amodalai/react 0.1.26 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-VAUsolBG.js","sources":["../src/hooks/useChat.ts","../src/hooks/useWidgetEvents.ts","../src/hooks/useSessionHistory.ts","../src/theme.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\nimport type {\n ChatState,\n ChatAction,\n ChatMessage,\n AssistantTextMessage,\n ToolCallInfo,\n KBProposalInfo,\n WidgetInfo,\n ContentBlock,\n ChatUser,\n} from '../types';\nimport { streamChat, getSessionHistory } from '../client/chat-api';\nimport { WidgetEventBus } from '../events/event-bus';\nimport type { WidgetEvent, EntityExtractor } from '../events/types';\n\nconst initialState: ChatState = {\n messages: [],\n sessionId: null,\n isStreaming: false,\n error: null,\n activeToolCalls: [],\n isHistorical: false, usage: {inputTokens: 0, outputTokens: 0},\n};\n\nlet messageCounter = 0;\n\nfunction createMessageId(): string {\n messageCounter++;\n return `msg-${Date.now()}-${String(messageCounter)}`;\n}\n\nexport function chatReducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case 'SEND_MESSAGE': {\n const userMessage: ChatMessage = {\n type: 'user',\n id: createMessageId(),\n text: action.text,\n timestamp: new Date().toISOString(),\n };\n const assistantMessage: AssistantTextMessage = {\n type: 'assistant_text',\n id: createMessageId(),\n text: '',\n toolCalls: [],\n confirmations: [],\n skillActivations: [],\n kbProposals: [],\n widgets: [],\n contentBlocks: [],\n timestamp: new Date().toISOString(),\n };\n return {\n ...state,\n messages: [...state.messages, userMessage, assistantMessage],\n isStreaming: true,\n error: null,\n activeToolCalls: [],\n isHistorical: false, usage: {inputTokens: 0, outputTokens: 0},\n };\n }\n case 'STREAM_INIT':\n return { ...state, sessionId: action.sessionId };\n case 'STREAM_TEXT_DELTA': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n // Append to content blocks: merge into last text block or create new one\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'text') {\n blocks[blocks.length - 1] = { type: 'text', text: lastBlock.text + action.content };\n } else {\n blocks.push({ type: 'text', text: action.content });\n }\n msgs[msgs.length - 1] = { ...last, text: last.text + action.content, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_TOOL_CALL_START': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n const toolCall: ToolCallInfo = {\n toolId: action.toolId,\n toolName: action.toolName,\n parameters: action.parameters,\n status: 'running',\n };\n if (last && last.type === 'assistant_text') {\n // Add to flat toolCalls array (backwards compat)\n const updatedToolCalls = [...last.toolCalls, toolCall];\n // Add to contentBlocks: append to existing tool_calls block or create new one\n const blocks = [...last.contentBlocks];\n const lastBlock = blocks[blocks.length - 1];\n if (lastBlock && lastBlock.type === 'tool_calls') {\n blocks[blocks.length - 1] = { type: 'tool_calls', calls: [...lastBlock.calls, toolCall] };\n } else {\n blocks.push({ type: 'tool_calls', calls: [toolCall] });\n }\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedToolCalls, contentBlocks: blocks };\n }\n return {\n ...state,\n messages: msgs,\n activeToolCalls: [...state.activeToolCalls, toolCall],\n };\n }\n case 'STREAM_TOOL_CALL_RESULT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updateCall = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.toolId\n ? {\n ...tc,\n status: action.status,\n result: action.result,\n duration_ms: action.duration_ms,\n error: action.error,\n }\n : tc;\n const updatedCalls = last.toolCalls.map(updateCall);\n // Also update inside contentBlocks\n const blocks = last.contentBlocks.map((block): ContentBlock =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(updateCall) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n const activeToolCalls = state.activeToolCalls.filter(\n (tc) => tc.toolId !== action.toolId,\n );\n return { ...state, messages: msgs, activeToolCalls };\n }\n case 'STREAM_SUBAGENT_EVENT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const appendEvent = (tc: ToolCallInfo): ToolCallInfo =>\n tc.toolId === action.parentToolId\n ? { ...tc, subagentEvents: [...(tc.subagentEvents ?? []), action.event] }\n : tc;\n const updatedCalls = last.toolCalls.map(appendEvent);\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(appendEvent) }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, toolCalls: updatedCalls, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_SKILL_ACTIVATED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n msgs[msgs.length - 1] = {\n ...last,\n skillActivations: [...last.skillActivations, action.skill],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_KB_PROPOSAL': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n const proposal: KBProposalInfo = {\n scope: action.scope,\n title: action.title,\n reasoning: action.reasoning,\n };\n if (last && last.type === 'assistant_text') {\n msgs[msgs.length - 1] = {\n ...last,\n kbProposals: [...last.kbProposals, proposal],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_WIDGET': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const widget: WidgetInfo = {\n widgetType: action.widgetType,\n data: action.data,\n };\n const block: ContentBlock = {\n type: 'widget',\n widgetType: action.widgetType,\n data: action.data,\n };\n msgs[msgs.length - 1] = {\n ...last,\n widgets: [...last.widgets, widget],\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_ASK_USER': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'ask_user',\n askId: action.askId,\n questions: action.questions,\n status: 'pending',\n };\n msgs[msgs.length - 1] = {\n ...last,\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'ASK_USER_SUBMITTED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'ask_user' && block.askId === action.askId\n ? { ...block, status: 'submitted' as const, answers: action.answers }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_CONFIRMATION_REQUIRED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const block: ContentBlock = {\n type: 'confirmation',\n confirmation: action.confirmation,\n };\n msgs[msgs.length - 1] = {\n ...last,\n confirmations: [...last.confirmations, action.confirmation],\n contentBlocks: [...last.contentBlocks, block],\n };\n }\n return { ...state, messages: msgs };\n }\n case 'CONFIRMATION_RESPONDED': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.type === 'assistant_text') {\n const updatedConfirmations = last.confirmations.map((c) =>\n c.correlationId === action.correlationId\n ? { ...c, status: (action.approved ? 'approved' : 'denied') as import('../types').ConfirmationInfo['status'] }\n : c,\n );\n const blocks = last.contentBlocks.map((block) =>\n block.type === 'confirmation' && block.confirmation.correlationId === action.correlationId\n ? { ...block, confirmation: { ...block.confirmation, status: (action.approved ? 'approved' : 'denied') as import('../types').ConfirmationInfo['status'] } }\n : block,\n );\n msgs[msgs.length - 1] = { ...last, confirmations: updatedConfirmations, contentBlocks: blocks };\n }\n return { ...state, messages: msgs };\n }\n case 'STREAM_CREDENTIAL_SAVED':\n case 'STREAM_APPROVED':\n // These events are tracked but don't modify message state currently\n return state;\n case 'STREAM_ERROR':\n return { ...state, isStreaming: false, error: action.message, activeToolCalls: [] };\n case 'STREAM_DONE': {\n // Mark any still-running tool calls as stopped\n const doneMessages = [...state.messages];\n const lastMsg = doneMessages[doneMessages.length - 1];\n if (lastMsg && lastMsg.type === 'assistant_text') {\n const stopRunning = (tc: ToolCallInfo): ToolCallInfo =>\n tc.status === 'running' ? { ...tc, status: 'error', error: 'Stopped' } : tc;\n const stoppedCalls = lastMsg.toolCalls.map(stopRunning);\n const stoppedBlocks = lastMsg.contentBlocks.map((block) =>\n block.type === 'tool_calls'\n ? { ...block, calls: block.calls.map(stopRunning) }\n : block,\n );\n doneMessages[doneMessages.length - 1] = { ...lastMsg, toolCalls: stoppedCalls, contentBlocks: stoppedBlocks };\n }\n return { ...state, messages: doneMessages, isStreaming: false, activeToolCalls: [] };\n }\n case 'LOAD_HISTORY':\n return {\n ...initialState,\n messages: action.messages,\n sessionId: action.sessionId,\n isHistorical: true,\n };\n case 'RESET':\n return { ...initialState };\n default:\n return state;\n }\n}\n\nexport interface UseChatOptions {\n serverUrl: string;\n user: ChatUser;\n /** Return a Bearer token (API key or JWT) for authenticated requests. */\n getToken?: () => string | null | undefined;\n onToolCall?: (call: ToolCallInfo) => void;\n onKBProposal?: (proposal: KBProposalInfo) => void;\n /** Callback for all widget events (agent-driven + interaction). */\n onEvent?: (event: WidgetEvent) => void;\n /** Custom entity extractors. If provided, replaces the default extractor. */\n entityExtractors?: EntityExtractor[];\n /** Session type — controls which skills, tools, KB docs load into this session. */\n sessionType?: string;\n /** Specific deployment ID to load instead of the active deployment. */\n deployId?: string;\n /** Auto-send this message when the hook mounts. Sent exactly once via ref guard. */\n initialMessage?: string;\n /** Load an existing session on mount (read-only history view). Takes precedence over initialMessage. */\n resumeSessionId?: string;\n /** Called when the SSE stream ends (agent finishes responding). */\n onStreamEnd?: () => void;\n /** Called when a session ID is received from the server (first stream init). */\n onSessionCreated?: (sessionId: string) => void;\n}\n\nexport interface UseChatReturn {\n messages: ChatMessage[];\n send: (text: string) => void;\n /** Stop the current stream without clearing history. */\n stop: () => void;\n isStreaming: boolean;\n activeToolCalls: ToolCallInfo[];\n session: { id: string | null; role?: string };\n error: string | null;\n reset: () => void;\n /** Event bus for subscribing to widget events. */\n eventBus: WidgetEventBus;\n /** Submit answers to a pending ask_user prompt. */\n submitAskUserResponse: (askId: string, answers: Record<string, string>) => void;\n /** Load a historical session for read-only viewing. */\n loadSession: (sessionId: string) => void;\n /** True when viewing a loaded historical session. */\n isHistorical: boolean;\n}\n\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { serverUrl, user, getToken, onToolCall, onKBProposal, onEvent, entityExtractors, sessionType, deployId, initialMessage, resumeSessionId, onStreamEnd, onSessionCreated } = options;\n const [state, dispatch] = useReducer(chatReducer, initialState);\n const sessionIdRef = useRef<string | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const callbacksRef = useRef({ onToolCall, onKBProposal, getToken, onEvent, onStreamEnd, onSessionCreated });\n callbacksRef.current = { onToolCall, onKBProposal, getToken, onEvent, onStreamEnd, onSessionCreated };\n\n // Create event bus once, configure extractors\n const eventBusRef = useRef<WidgetEventBus | null>(null);\n if (!eventBusRef.current) {\n eventBusRef.current = new WidgetEventBus();\n if (entityExtractors) {\n eventBusRef.current.setExtractors(entityExtractors);\n }\n }\n const eventBus = eventBusRef.current;\n\n // Forward entity_referenced events to onEvent callback\n const entityRefHandlerRef = useRef<((e: WidgetEvent) => void) | null>(null);\n if (!entityRefHandlerRef.current) {\n entityRefHandlerRef.current = (e: WidgetEvent) => {\n callbacksRef.current.onEvent?.(e);\n };\n eventBus.on('entity_referenced', entityRefHandlerRef.current);\n }\n\n // Track pending tool calls for name/param lookup on result\n const pendingToolCallsRef = useRef<Map<string, { toolName: string; parameters: Record<string, unknown> }>>(new Map());\n\n // Keep ref in sync\n sessionIdRef.current = state.sessionId;\n\n const send = useCallback(\n (text: string) => {\n if (state.isStreaming) return;\n\n dispatch({ type: 'SEND_MESSAGE', text });\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n const runStream = async () => {\n let receivedDone = false;\n try {\n const token = callbacksRef.current.getToken?.() ?? undefined;\n const stream = streamChat(\n serverUrl,\n {\n message: text,\n session_id: sessionIdRef.current ?? undefined,\n role: user.role,\n session_type: sessionType,\n deploy_id: deployId,\n },\n controller.signal,\n token,\n );\n\n for await (const event of stream) {\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- TODO: handle all cases\n switch (event.type) {\n case 'init':\n dispatch({ type: 'STREAM_INIT', sessionId: event.session_id });\n callbacksRef.current.onSessionCreated?.(event.session_id);\n break;\n case 'text_delta':\n dispatch({ type: 'STREAM_TEXT_DELTA', content: event.content });\n break;\n case 'tool_call_start':\n dispatch({\n type: 'STREAM_TOOL_CALL_START',\n toolId: event.tool_id,\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n pendingToolCallsRef.current.set(event.tool_id, {\n toolName: event.tool_name,\n parameters: event.parameters,\n });\n break;\n case 'tool_call_result': {\n const pending = pendingToolCallsRef.current.get(event.tool_id);\n const toolCallResult: ToolCallInfo = {\n toolId: event.tool_id,\n toolName: pending?.toolName ?? '',\n parameters: pending?.parameters ?? {},\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n };\n pendingToolCallsRef.current.delete(event.tool_id);\n dispatch({\n type: 'STREAM_TOOL_CALL_RESULT',\n toolId: event.tool_id,\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n });\n callbacksRef.current.onToolCall?.(toolCallResult);\n\n // Emit tool_executed event\n const toolEvent: WidgetEvent = {\n type: 'tool_executed',\n toolName: toolCallResult.toolName,\n toolId: toolCallResult.toolId,\n parameters: toolCallResult.parameters,\n status: event.status,\n result: event.result,\n duration_ms: event.duration_ms,\n error: event.error,\n timestamp: event.timestamp,\n };\n eventBus.processEvent(toolEvent);\n callbacksRef.current.onEvent?.(toolEvent);\n break;\n }\n case 'subagent_event':\n dispatch({\n type: 'STREAM_SUBAGENT_EVENT',\n parentToolId: event.parent_tool_id,\n event: {\n agentName: event.agent_name,\n eventType: event.event_type,\n toolName: event.tool_name,\n toolArgs: event.tool_args,\n result: event.result,\n text: event.text,\n error: event.error,\n timestamp: event.timestamp,\n },\n });\n break;\n case 'skill_activated': {\n dispatch({ type: 'STREAM_SKILL_ACTIVATED', skill: event.skill });\n const skillEvent: WidgetEvent = {\n type: 'skill_activated',\n skill: event.skill,\n timestamp: event.timestamp,\n };\n eventBus.processEvent(skillEvent);\n callbacksRef.current.onEvent?.(skillEvent);\n break;\n }\n case 'kb_proposal': {\n const proposal = {\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n };\n dispatch({\n type: 'STREAM_KB_PROPOSAL',\n scope: event.scope,\n title: event.title,\n reasoning: event.reasoning,\n });\n callbacksRef.current.onKBProposal?.(proposal);\n\n const kbEvent: WidgetEvent = {\n type: 'kb_proposal',\n proposal,\n timestamp: event.timestamp,\n };\n eventBus.processEvent(kbEvent);\n callbacksRef.current.onEvent?.(kbEvent);\n break;\n }\n case 'widget': {\n dispatch({\n type: 'STREAM_WIDGET',\n widgetType: event.widget_type,\n data: event.data,\n });\n const widgetEvent: WidgetEvent = {\n type: 'widget_rendered',\n widgetType: event.widget_type,\n data: event.data,\n timestamp: event.timestamp,\n };\n eventBus.processEvent(widgetEvent);\n callbacksRef.current.onEvent?.(widgetEvent);\n break;\n }\n case 'ask_user':\n dispatch({\n type: 'STREAM_ASK_USER',\n askId: event.ask_id,\n questions: event.questions,\n });\n break;\n case 'credential_saved':\n dispatch({ type: 'STREAM_CREDENTIAL_SAVED', connectionName: event.connection_name });\n break;\n case 'approved':\n dispatch({ type: 'STREAM_APPROVED', resourceType: event.resource_type, previewId: event.preview_id });\n break;\n case 'error':\n dispatch({ type: 'STREAM_ERROR', message: event.message });\n break;\n case 'done':\n receivedDone = true;\n dispatch({ type: 'STREAM_DONE' });\n callbacksRef.current.onStreamEnd?.();\n break;\n default:\n break;\n }\n }\n } catch (err) {\n if (!(err instanceof DOMException && err.name === 'AbortError')) {\n dispatch({\n type: 'STREAM_ERROR',\n message: err instanceof Error ? err.message : 'Unknown error',\n });\n }\n } finally {\n abortControllerRef.current = null;\n // Safety net: if the stream ended without a 'done' event\n // (e.g., error path, network drop), still fire onStreamEnd\n if (!receivedDone && !controller.signal.aborted) {\n dispatch({ type: 'STREAM_DONE' });\n callbacksRef.current.onStreamEnd?.();\n }\n }\n };\n\n void runStream();\n },\n [serverUrl, user.role, state.isStreaming, eventBus, sessionType, deployId],\n );\n\n // Resume an existing session on mount (takes precedence over initialMessage).\n const resumeLoadedRef = useRef(false);\n useEffect(() => {\n if (!resumeSessionId || resumeLoadedRef.current) return;\n resumeLoadedRef.current = true;\n // Mark initial message as delivered so it never fires after session load\n initialMessageDeliveredRef.current = true;\n loadSession(resumeSessionId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resumeSessionId]);\n\n // Auto-send initialMessage once on mount. Uses two refs:\n // - `sent`: flips true once send() is called — prevents re-sends on re-renders\n // caused by dependency changes (e.g. `send` changing when isStreaming toggles).\n // - `delivered`: flips true when the stream completes without abort — prevents\n // re-sends after successful delivery. Stays false if the stream was aborted\n // (React StrictMode unmount), allowing retry on remount.\n const initialMessageSentRef = useRef(false);\n const initialMessageDeliveredRef = useRef(false);\n useEffect(() => {\n // Skip if resuming an existing session (prop-based or history-loaded)\n if (resumeSessionId) return;\n if (state.isHistorical) return;\n if (!initialMessage || initialMessageDeliveredRef.current) return;\n // Reset the sent guard — this effect re-runs on StrictMode remount\n // after the previous stream was aborted by cleanup.\n initialMessageSentRef.current = false;\n\n // Use a microtask to let React finish its synchronous StrictMode\n // unmount/remount cycle before starting the fetch.\n const timer = setTimeout(() => {\n if (!initialMessageSentRef.current && !initialMessageDeliveredRef.current) {\n initialMessageSentRef.current = true;\n send(initialMessage);\n }\n }, 0);\n\n return () => {\n clearTimeout(timer);\n };\n // Only depend on initialMessage — send is stable enough via ref pattern,\n // and we don't want dependency changes to re-trigger the initial send.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialMessage, state.isHistorical]);\n\n // Track successful delivery so re-renders never re-send.\n useEffect(() => {\n if (initialMessage && initialMessageSentRef.current && !state.isStreaming && state.messages.length > 0) {\n initialMessageDeliveredRef.current = true;\n }\n }, [initialMessage, state.isStreaming, state.messages.length]);\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n dispatch({ type: 'STREAM_DONE' });\n }, []);\n\n const reset = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n dispatch({ type: 'RESET' });\n }, []);\n\n const submitAskUserResponse = useCallback(\n (askId: string, answers: Record<string, string>) => {\n const sid = sessionIdRef.current;\n if (!sid) return;\n\n dispatch({ type: 'ASK_USER_SUBMITTED', askId, answers });\n\n const doSubmit = async () => {\n try {\n const token = callbacksRef.current.getToken?.() ?? undefined;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n await fetch(\n `${serverUrl}/chat/sessions/${sid}/ask-user-response`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify({ ask_id: askId, answers }),\n },\n );\n } catch {\n // Non-critical: if this fails the server will time out the ask_user\n }\n };\n\n void doSubmit();\n },\n [serverUrl],\n );\n\n const loadSession = useCallback(\n (sessionId: string) => {\n // Suppress initial message when loading a previous session\n initialMessageDeliveredRef.current = true;\n const doLoad = async () => {\n try {\n const token = callbacksRef.current.getToken?.() ?? undefined;\n const detail = await getSessionHistory(serverUrl, sessionId, token);\n // Convert stored messages to ChatMessage format\n const chatMessages: ChatMessage[] = detail.messages.map((m) => {\n if (m.type === 'assistant_text') {\n // Map stored tool calls to ToolCallInfo (args -> parameters)\n const toolCalls: ToolCallInfo[] = (m.toolCalls ?? []).map((tc) => ({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n toolId: tc['toolId'] as string ?? '',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n toolName: tc['toolName'] as string ?? '',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored args from DB\n parameters: (tc['args'] as Record<string, unknown>) ?? {},\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n status: (tc['status'] as ToolCallInfo['status']) ?? 'success',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n duration_ms: tc['duration_ms'] as number | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n error: tc['error'] as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored tool call from DB\n result: tc['result'] as string | undefined,\n }));\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored widgets from DB\n const widgets = (m.widgets ?? []) as unknown as Array<import('../types').WidgetInfo>;\n\n // Rebuild content blocks from stored data.\n // If the server saved ordered contentBlocks, use them to preserve\n // the original interleave of text / tool_calls / widgets.\n const storedBlocks = m.contentBlocks;\n const contentBlocks: Array<import('../types').ContentBlock> = [];\n if (storedBlocks && storedBlocks.length > 0) {\n // Build a lookup from toolId -> ToolCallInfo\n const toolCallById = new Map(toolCalls.map((tc) => [tc.toolId, tc]));\n for (const block of storedBlocks) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored block from DB\n const blockType = block['type'] as string;\n if (blockType === 'text') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored block from DB\n const text = block['text'] as string;\n if (text.length > 0) {\n contentBlocks.push({ type: 'text', text });\n }\n } else if (blockType === 'tool_calls') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored block from DB\n const callIds = block['callIds'] as string[] | undefined;\n const calls = callIds\n ? callIds.map((id) => toolCallById.get(id)).filter(\n (tc): tc is import('../types').ToolCallInfo => tc != null,\n )\n : toolCalls;\n if (calls.length > 0) {\n contentBlocks.push({ type: 'tool_calls', calls });\n }\n } else if (blockType === 'widget') {\n contentBlocks.push({\n type: 'widget',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored block from DB\n widgetType: block['widgetType'] as string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- stored widget data from DB\n data: (block['data'] as Record<string, unknown>) ?? {},\n });\n }\n }\n } else {\n // Fallback: legacy messages without stored contentBlocks\n if (toolCalls.length > 0) {\n contentBlocks.push({ type: 'tool_calls', calls: toolCalls });\n }\n if (m.text.length > 0) {\n contentBlocks.push({ type: 'text', text: m.text });\n }\n for (const w of widgets) {\n contentBlocks.push({ type: 'widget', widgetType: w.widgetType, data: w.data });\n }\n }\n\n return {\n type: 'assistant_text' as const,\n id: m.id,\n text: m.text,\n toolCalls,\n confirmations: [],\n skillActivations: m.skillActivations ?? [],\n kbProposals: [],\n widgets,\n contentBlocks,\n timestamp: m.timestamp,\n };\n }\n if (m.type === 'error') {\n return {\n type: 'error' as const,\n id: m.id,\n message: m.text,\n timestamp: m.timestamp,\n };\n }\n return {\n type: 'user' as const,\n id: m.id,\n text: m.text,\n timestamp: m.timestamp,\n };\n });\n dispatch({ type: 'LOAD_HISTORY', sessionId, messages: chatMessages });\n } catch (err) {\n dispatch({\n type: 'STREAM_ERROR',\n message: err instanceof Error ? err.message : 'Failed to load session',\n });\n }\n };\n void doLoad();\n },\n [serverUrl],\n );\n\n // Abort on unmount\n useEffect(\n () => () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n },\n [],\n );\n\n return {\n messages: state.messages,\n send,\n stop,\n isStreaming: state.isStreaming,\n activeToolCalls: state.activeToolCalls,\n session: { id: state.sessionId, role: user.role },\n error: state.error,\n reset,\n eventBus,\n submitAskUserResponse,\n loadSession,\n isHistorical: state.isHistorical,\n };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { WidgetEventBus } from '../events/event-bus';\nimport type { WidgetEventMap, WidgetEvent } from '../events/types';\n\ntype Unsubscribe = () => void;\n\nexport interface UseWidgetEventsReturn {\n /** Subscribe to a specific event type. Returns unsubscribe function. */\n on: <K extends keyof WidgetEventMap>(\n event: K,\n listener: (data: WidgetEventMap[K]) => void,\n ) => Unsubscribe;\n /** Subscribe to all events. Returns unsubscribe function. */\n onAny: (listener: (data: WidgetEvent) => void) => Unsubscribe;\n}\n\n/**\n * React hook for subscribing to widget events with automatic cleanup on unmount.\n * Subscriptions created via `on` / `onAny` are tracked and removed when the\n * component unmounts.\n */\nexport function useWidgetEvents(eventBus: WidgetEventBus | null | undefined): UseWidgetEventsReturn {\n // Track all active subscriptions for cleanup\n const subscriptions = useRef<Array<() => void>>([]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n for (const unsub of subscriptions.current) {\n unsub();\n }\n subscriptions.current = [];\n },\n [],\n );\n\n const on = useCallback(\n <K extends keyof WidgetEventMap>(\n event: K,\n listener: (data: WidgetEventMap[K]) => void,\n ): Unsubscribe => {\n if (!eventBus) {\n return () => {};\n }\n eventBus.on(event, listener);\n const unsub = () => {\n eventBus.off(event, listener);\n };\n subscriptions.current.push(unsub);\n return unsub;\n },\n [eventBus],\n );\n\n const onAny = useCallback(\n (listener: (data: WidgetEvent) => void): Unsubscribe => {\n if (!eventBus) {\n return () => {};\n }\n eventBus.on('*', listener);\n const unsub = () => {\n eventBus.off('*', listener);\n };\n subscriptions.current.push(unsub);\n return unsub;\n },\n [eventBus],\n );\n\n return { on, onAny };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { listSessions, updateSession } from '../client/chat-api';\nimport type { SessionHistoryItem } from '../client/chat-api';\n\nexport interface UseSessionHistoryOptions {\n serverUrl: string;\n getToken?: () => string | null | undefined;\n enabled: boolean;\n}\n\nexport interface UseSessionHistoryReturn {\n sessions: SessionHistoryItem[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n updateTags: (sessionId: string, tags: string[]) => void;\n updateTitle: (sessionId: string, title: string) => void;\n allTags: string[];\n}\n\nexport function useSessionHistory(options: UseSessionHistoryOptions): UseSessionHistoryReturn {\n const { serverUrl, getToken, enabled } = options;\n const [sessions, setSessions] = useState<SessionHistoryItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const getTokenRef = useRef(getToken);\n getTokenRef.current = getToken;\n\n const refresh = useCallback(() => {\n if (!enabled) return;\n setIsLoading(true);\n setError(null);\n\n const doFetch = async () => {\n try {\n const token = getTokenRef.current?.() ?? undefined;\n const result = await listSessions(serverUrl, token);\n setSessions(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load sessions');\n } finally {\n setIsLoading(false);\n }\n };\n void doFetch();\n }, [serverUrl, enabled]);\n\n const updateTags = useCallback(\n (sessionId: string, tags: string[]) => {\n const doUpdate = async () => {\n try {\n const token = getTokenRef.current?.() ?? undefined;\n await updateSession(serverUrl, sessionId, { tags }, token);\n setSessions((prev) =>\n prev.map((s) => (s.id === sessionId ? { ...s, tags } : s)),\n );\n } catch {\n // Non-critical\n }\n };\n void doUpdate();\n },\n [serverUrl],\n );\n\n const updateTitle = useCallback(\n (sessionId: string, title: string) => {\n const doUpdate = async () => {\n try {\n const token = getTokenRef.current?.() ?? undefined;\n await updateSession(serverUrl, sessionId, { title }, token);\n setSessions((prev) =>\n prev.map((s) => (s.id === sessionId ? { ...s, title } : s)),\n );\n } catch {\n // Non-critical\n }\n };\n void doUpdate();\n },\n [serverUrl],\n );\n\n // Collect all unique tags across sessions\n const allTags = [...new Set(sessions.flatMap((s) => s.tags))].sort();\n\n // Auto-fetch on mount if enabled\n useEffect(() => {\n if (enabled) {\n refresh();\n }\n }, [enabled, refresh]);\n\n return { sessions, isLoading, error, refresh, updateTags, updateTitle, allTags };\n}\n","/**\n * @license\n * Copyright 2025 Amodal Labs, Inc.\n * SPDX-License-Identifier: MIT\n */\n\nimport type { ChatTheme } from './types';\n\nexport const defaultTheme: ChatTheme = {\n primaryColor: '#1e40af',\n backgroundColor: '#ffffff',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '14px',\n borderRadius: '8px',\n userBubbleColor: '#1e40af',\n agentBubbleColor: '#f3f4f6',\n toolCallColor: '#f9fafb',\n headerText: 'AI Assistant',\n placeholder: 'Type a message...',\n emptyStateText: 'Send a message to start a conversation.',\n};\n\nconst themeToCSS: Record<keyof ChatTheme, string> = {\n primaryColor: '--pcw-primary',\n backgroundColor: '--pcw-bg',\n fontFamily: '--pcw-font',\n fontSize: '--pcw-font-size',\n borderRadius: '--pcw-radius',\n userBubbleColor: '--pcw-user-bubble',\n agentBubbleColor: '--pcw-agent-bubble',\n toolCallColor: '--pcw-tool-call-bg',\n headerText: '--pcw-header-text',\n placeholder: '--pcw-placeholder',\n emptyStateText: '--pcw-empty-state-text',\n};\n\n/**\n * Apply theme values as CSS custom properties on a DOM element.\n */\nexport function applyTheme(element: HTMLElement, theme: ChatTheme): void {\n const merged = { ...defaultTheme, ...theme };\n for (const [key, cssVar] of Object.entries(themeToCSS)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Known theme keys\n const value = merged[key as keyof ChatTheme];\n if (value !== undefined) {\n element.style.setProperty(cssVar, value);\n }\n }\n}\n\n/**\n * Get the merged theme with defaults filled in.\n */\nexport function mergeTheme(theme?: ChatTheme): Required<ChatTheme> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- All defaults provided\n return { ...defaultTheme, ...theme } as Required<ChatTheme>;\n}\n"],"names":["initialState","messageCounter","createMessageId","chatReducer","state","action","userMessage","assistantMessage","msgs","last","blocks","lastBlock","toolCall","updatedToolCalls","updateCall","tc","updatedCalls","block","activeToolCalls","appendEvent","proposal","widget","updatedConfirmations","c","doneMessages","lastMsg","stopRunning","stoppedCalls","stoppedBlocks","useChat","options","serverUrl","user","getToken","onToolCall","onKBProposal","onEvent","entityExtractors","sessionType","deployId","initialMessage","resumeSessionId","onStreamEnd","onSessionCreated","dispatch","useReducer","sessionIdRef","useRef","abortControllerRef","callbacksRef","eventBusRef","WidgetEventBus","eventBus","entityRefHandlerRef","e","_b","_a","pendingToolCallsRef","send","useCallback","text","controller","receivedDone","token","stream","streamChat","event","_d","_c","pending","toolCallResult","_f","_e","toolEvent","_h","_g","skillEvent","_j","_i","_l","_k","kbEvent","_n","_m","widgetEvent","_p","_o","_r","_q","err","_t","_s","resumeLoadedRef","useEffect","initialMessageDeliveredRef","loadSession","initialMessageSentRef","timer","stop","reset","submitAskUserResponse","askId","answers","sid","headers","sessionId","chatMessages","getSessionHistory","m","toolCalls","widgets","storedBlocks","contentBlocks","toolCallById","blockType","callIds","calls","id","w","useWidgetEvents","subscriptions","unsub","on","listener","onAny","useSessionHistory","enabled","sessions","setSessions","useState","isLoading","setIsLoading","error","setError","getTokenRef","refresh","result","listSessions","updateTags","tags","updateSession","prev","s","updateTitle","title","allTags","defaultTheme","themeToCSS","applyTheme","element","theme","merged","key","cssVar","value","mergeTheme"],"mappings":"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"}