@paymanai/payman-typescript-ask-sdk 1.2.11 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +136 -108
- package/dist/index.d.ts +136 -108
- package/dist/index.js +589 -1203
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +588 -1204
- package/dist/index.mjs.map +1 -1
- package/dist/index.native.js +591 -1205
- package/dist/index.native.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/utils/userActionClient.ts","../src/utils/chatStore.ts","../src/utils/activeStreamStore.ts","../src/utils/ragImageResolver.ts","../src/hooks/useStreamManager.ts","../src/hooks/useChat.ts","../src/utils/v2EventProcessor.ts","../src/hooks/useStreamManagerV2.ts","../src/hooks/useChatV2.ts","../src/hooks/useVoice.ts"],"names":["events","useRef","useCallback","useState","useMemo","useEffect","completeLastInProgressStep","FRIENDLY_ERROR_MESSAGE"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cross-platform UUID v4 generator\n * Works in both browser and React Native environments\n */\nexport function generateId(): string {\n\t// Simple UUID v4 implementation that doesn't rely on crypto API\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\tconst r = (Math.random() * 16) | 0;\n\t\tconst v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n","/**\n * Streaming client for handling SSE (Server-Sent Events) from the API\n */\n\nexport type StreamEvent = {\n\teventType: string;\n\tworkerName?: string;\n\tmessage?: string;\n\terrorMessage?: string;\n\tresponse?: unknown;\n\texecutionId?: string;\n\tsessionId?: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\telapsedMs?: number;\n\tuserActionRequest?: {\n\t\tuserActionId: string;\n\t\tuserActionType?: string;\n\t\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\n\t\tmetadata?: Record<string, string>;\n\t};\n\t[key: string]: unknown;\n};\n\nexport type StreamOptions = {\n\tsignal?: AbortSignal;\n\tonEvent?: (event: StreamEvent) => void;\n\tonError?: (error: Error) => void;\n\tonComplete?: () => void;\n};\n\n/**\n * Parse buffer for complete JSON objects (raw JSON streaming, not SSE format)\n * Handles concatenated JSON objects without newlines between them\n */\nfunction parseJSONBuffer(buffer: string): {\n\tevents: StreamEvent[];\n\tremaining: string;\n} {\n\tconst events: StreamEvent[] = [];\n\tlet braceCount = 0;\n\tlet startIndex = 0;\n\tlet inString = false;\n\tlet escapeNext = false;\n\tlet lastParsedIndex = -1;\n\n\t// Find complete JSON objects in the buffer\n\tfor (let i = 0; i < buffer.length; i++) {\n\t\tconst char = buffer[i];\n\n\t\tif (escapeNext) {\n\t\t\tescapeNext = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tescapeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !escapeNext) {\n\t\t\tinString = !inString;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inString) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"{\") {\n\t\t\tif (braceCount === 0) {\n\t\t\t\tstartIndex = i;\n\t\t\t}\n\t\t\tbraceCount++;\n\t\t} else if (char === \"}\") {\n\t\t\tbraceCount--;\n\t\t\tif (braceCount === 0) {\n\t\t\t\t// Found a complete JSON object\n\t\t\t\tconst jsonStr = buffer.substring(startIndex, i + 1);\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(jsonStr);\n\t\t\t\t\tconst event = parsed as StreamEvent;\n\t\t\t\t\tevents.push(event);\n\t\t\t\t\tlastParsedIndex = i;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to parse JSON event:\", jsonStr, err);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return parsed events and remaining buffer\n\tconst remaining =\n\t\tlastParsedIndex >= 0 ? buffer.substring(lastParsedIndex + 1) : buffer;\n\treturn { events, remaining };\n}\n\n/**\n * Stream workflow events from the API\n */\nexport async function streamWorkflowEvents(\n\turl: string,\n\tbody: Record<string, unknown>,\n\theaders: Record<string, string>,\n\toptions: StreamOptions = {}\n): Promise<void> {\n\tconst { signal, onEvent, onError, onComplete } = options;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\n\n/**\n * Extract a user-friendly message from a streaming event\n */\nexport function getEventMessage(event: StreamEvent): string {\n\tif (event.message?.trim()) {\n\t\treturn event.message.trim();\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage.trim();\n\t}\n\n\tconst eventType = event.eventType;\n\tswitch (eventType) {\n\t\tcase \"STARTED\":\n\t\tcase \"WORKFLOW_STARTED\":\n\t\t\treturn \"Starting workflow...\";\n\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\treturn \"Planning execution strategy...\";\n\t\tcase \"ORCHESTRATOR_COMPLETED\":\n\t\t\treturn \"Planning complete\";\n\t\tcase \"INTENT_STARTED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} started`\n\t\t\t\t: \"Processing intent...\";\n\t\tcase \"INTENT_PROGRESS\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} in progress`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_COMPLETED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} completed`\n\t\t\t\t: \"Intent completed\";\n\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\treturn \"Combining results...\";\n\t\tcase \"AGGREGATOR_COMPLETED\":\n\t\t\treturn \"Results combined\";\n\t\tcase \"COMPLETED\":\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\t\treturn \"Workflow completed successfully\";\n\t\tcase \"ERROR\":\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"INTENT_ERROR\":\n\t\t\treturn event.errorMessage || \"An error occurred\";\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn \"Verification successful\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn \"Verification expired\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn \"Invalid input, please try again\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn \"Verification rejected\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn \"Verification failed\";\n\t\tcase \"INTENT_THINKING\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} thinking...`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_THINKING_CONT\":\n\t\t\treturn event.message || \"\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\treturn \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\n/**\n * Orchestrator completion often includes \"Identified N task(s) to execute\", which is redundant in the UI.\n */\nexport function workingPhaseDetailForDisplay(raw: string): string {\n\tconst t = raw.trim();\n\tif (!t) return \"\";\n\tif (/^Identified\\s+\\d+\\s+tasks?\\s+to\\s+execute\\.?$/i.test(t)) {\n\t\treturn \"\";\n\t}\n\treturn t;\n}\n\n/**\n * Extract final response content from the event\n */\nexport function extractResponseContent(response: unknown): string {\n\t// Handle direct string response (most common from API)\n\tif (typeof response === \"string\") {\n\t\treturn response;\n\t}\n\n\t// Handle object responses with nested content\n\tif (typeof response === \"object\" && response !== null) {\n\t\tconst resp = response as Record<string, unknown>;\n\n\t\t// Try common field names\n\t\tif (\"text\" in resp && typeof resp.text === \"string\") {\n\t\t\treturn resp.text;\n\t\t}\n\t\tif (\"content\" in resp && typeof resp.content === \"string\") {\n\t\t\treturn resp.content;\n\t\t}\n\t\tif (\"message\" in resp && typeof resp.message === \"string\") {\n\t\t\treturn resp.message;\n\t\t}\n\t\tif (\"answer\" in resp && typeof resp.answer === \"string\") {\n\t\t\treturn resp.answer;\n\t\t}\n\n\t\t// Fallback to JSON string\n\t\treturn JSON.stringify(response);\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Complete the last in-progress step (if any) by marking it as completed.\n */\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** State shape used by processStreamEvent */\nexport type EventProcessorState = {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\tcurrentThinkingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\t/** Current thinking block text (resets each INTENT_THINKING) — shown live in bubble */\n\tactiveThinkingText?: string;\n\t/** All thinking accumulated across every block — shown after streaming ends */\n\tallThinkingText: string;\n\t/** True between ORCHESTRATOR_THINKING and ORCHESTRATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinOrchestratorPhase: boolean;\n\t/** True between AGGREGATOR_THINKING and AGGREGATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinAggregatorPhase: boolean;\n};\n\n/**\n * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: EventProcessorState,\n): EventProcessorState {\n\tconst eventType = event.eventType;\n\n\t// Ignore keep-alive events from backend — do not show or process in UI (case-insensitive for robustness)\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\treturn state;\n\t}\n\n\tconst message = getEventMessage(event);\n\n\t// Close any active thinking block when a non-thinking event arrives\n\tif (eventType !== \"INTENT_THINKING\" && eventType !== \"INTENT_THINKING_CONT\") {\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst thinkingStep = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\t\t// Clear live thinking so the bubble can show the current step instead\n\t\tstate.activeThinkingText = undefined;\n\t}\n\n\t// Only extract response content from WORKFLOW_COMPLETED event.\n\t// When the workflow completes with a response (e.g. after INTENT_ERROR), use it as the message and clear intent-level error so we show the agent response, not \"Oops something went wrong\".\n\t// When there is no response/workflowMsg (e.g. preflight failed, aggregator failed), show \"Oops, something went wrong\".\n\tif (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\tlet content = extractResponseContent(event.response);\n\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\tcontent = trace.workflowMsg;\n\t\t}\n\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\telse content = extractResponseContent(agg.response);\n\t\t}\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t// Subintent may have failed (INTENT_ERROR) but workflow still produced a response — show it, not the error.\n\t\t\tstate.hasError = false;\n\t\t\tstate.errorMessage = \"\";\n\t\t} else {\n\t\t\t// No workflow response (e.g. preflight failed, aggregator failed) — show \"Oops, something went wrong\"\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t}\n\t}\n\n\t// Skip WORKFLOW_STARTED - don't show it in UI\n\tif (eventType === \"STARTED\" || eventType === \"WORKFLOW_STARTED\") {\n\t\t// Skip this event, don't add a step\n\t} else if (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\t// Mark all in-progress steps as completed (for final workflow completion)\n\t\tstate.steps.forEach((step) => {\n\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t}\n\t\t});\n\t} else if (eventType === \"INTENT_ERROR\") {\n\t\t// Subintent failed — do NOT set hasError. Workflow may still complete with a response (WORKFLOW_COMPLETED).\n\t\t// Only WORKFLOW_FAILED / ERROR / WORKFLOW_ERROR set hasError. Mark the step as error for UI.\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t// Mark any in-progress intent step as error\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"error\";\n\t\t}\n\t} else if (eventType === \"ERROR\" || eventType === \"WORKFLOW_ERROR\") {\n\t\t// Mark as error and store error message (don't add as step)\n\t\tstate.hasError = true;\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\t} else if (eventType === \"ORCHESTRATOR_COMPLETED\") {\n\t\tstate.inOrchestratorPhase = false;\n\t\t// Complete the ORCHESTRATOR_THINKING step\n\t\tconst orchestratorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (orchestratorStep) {\n\t\t\torchestratorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\torchestratorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (orchestratorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"INTENT_COMPLETED\") {\n\t\t// Complete the INTENT_STARTED step\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\tintentStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (intentStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"AGGREGATOR_COMPLETED\") {\n\t\tstate.inAggregatorPhase = false;\n\t\t// Complete the AGGREGATOR_THINKING step\n\t\tconst aggregatorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (aggregatorStep) {\n\t\t\taggregatorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\taggregatorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (aggregatorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (\n\t\teventType === \"ORCHESTRATOR_THINKING\" ||\n\t\teventType === \"INTENT_STARTED\" ||\n\t\teventType === \"INTENT_PROGRESS\" ||\n\t\teventType === \"AGGREGATOR_THINKING\"\n\t) {\n\t\tif (eventType === \"ORCHESTRATOR_THINKING\") {\n\t\t\tstate.inOrchestratorPhase = true;\n\t\t}\n\t\tif (eventType === \"AGGREGATOR_THINKING\") {\n\t\t\tstate.inAggregatorPhase = true;\n\t\t}\n\t\t// Only add steps for important events\n\t\tif (eventType === \"INTENT_PROGRESS\") {\n\t\t\t// Update existing INTENT_STARTED step message if it exists\n\t\t\tconst intentStep = state.steps.find(\n\t\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t\t);\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.message = message;\n\t\t\t\tstate.currentExecutingStepId = intentStep.id;\n\t\t\t} else {\n\t\t\t\t// No existing intent step, create one\n\t\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\t\tstate.steps.push({\n\t\t\t\t\tid: stepId,\n\t\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t\t});\n\t\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add progress step for THINKING and STARTED events\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t}\n\t}\n\t// ============================================\n\t// USER_ACTION events\n\t// ============================================\n\telse if (eventType === \"USER_ACTION_REQUIRED\") {\n\t\t// Complete any prior in-progress step\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Store the request data from the event\n\t\tif (event.userActionRequest) {\n\t\t\tstate.userActionRequest = {\n\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t};\n\t\t}\n\t\tstate.userActionPending = true;\n\n\t\t// Add an in_progress step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t\tstate.currentExecutingStepId = stepId;\n\t} else if (eventType === \"USER_ACTION_SUCCESS\") {\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"approved\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_INVALID\") {\n\t\t// Complete the prior USER_ACTION step (REQUIRED or previous INVALID retry)\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Add as error step (red cross)\n\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: errorStepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\n\t\t// Add a new in_progress step so the spinner stays visible while user retries\n\t\t// and so subsequent events (another INVALID, SUCCESS, etc.) have a step to complete\n\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: retryStepId,\n\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\tmessage: \"Waiting for verification...\",\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\tstate.currentExecutingStepId = retryStepId;\n\t\t// userActionRequest and userActionPending stay set (modal stays open)\n\t} else if (eventType === \"USER_ACTION_EXPIRED\") {\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_REJECTED\") {\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"rejected\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_RESENT\") {\n\t\t// Informational only -- don't complete the prior step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_FAILED\") {\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"INTENT_THINKING\") {\n\t\t// Close previous thinking block if a new one arrives back-to-back\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst prev = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (prev) prev.isThinking = false;\n\t\t}\n\n\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\tif (lastInProgress) {\n\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\tlastInProgress.isThinking = true;\n\t\t\tstate.currentThinkingStepId = lastInProgress.id;\n\t\t} else {\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\n\t\tif (state.allThinkingText) state.allThinkingText += \"\\n\\n\";\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tstate.activeThinkingText = \"\";\n\t\t}\n\t} else if (eventType === \"INTENT_THINKING_CONT\") {\n\t\tconst delta = event.message || \"\";\n\t\tif (!delta) return state;\n\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst step = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (step) {\n\t\t\t\tstep.thinkingText = (step.thinkingText || \"\") + delta;\n\t\t\t}\n\t\t}\n\n\t\tstate.allThinkingText += delta;\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tif (state.activeThinkingText == null) state.activeThinkingText = \"\";\n\t\t\tstate.activeThinkingText += delta;\n\t\t}\n\t}\n\t// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\nimport { workingPhaseDetailForDisplay } from \"./eventProcessor\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * Build a richly-formatted thinking string from the SDK's `steps` array\n * and raw `allThinkingText`. This matches the demo's streaming format\n * so both the SDK and demo produce identical thinking output.\n *\n * The SDK's `allThinkingText` only contains raw `INTENT_THINKING_CONT`\n * deltas — no phase headers. This function reconstructs the full format\n * from the steps array, which stores every event the SDK processes.\n */\nexport function buildFormattedThinking(\n\tsteps: StreamingStep[] | undefined,\n\tallThinkingText: string,\n): string {\n\tconst parts: string[] = [];\n\tconst safeSteps = steps ?? [];\n\n\t// Detect orphaned \"preflight\" thinking:\n\t// INTENT_THINKING events that fire before any INTENT_STARTED don't\n\t// create steps, so their text lives only in allThinkingText.\n\tconst cleanAll = allThinkingText.replace(/^\\s+/, \"\");\n\tif (cleanAll) {\n\t\tconst firstStepWithThinking = safeSteps.find(\n\t\t\t(s) => s.thinkingText && s.thinkingText.trim(),\n\t\t);\n\n\t\tif (!firstStepWithThinking) {\n\t\t\tparts.push(\"**Preflight**\");\n\t\t\tparts.push(cleanAll);\n\t\t} else {\n\t\t\tconst stepText = firstStepWithThinking.thinkingText!.trim();\n\t\t\tconst idx = cleanAll.indexOf(stepText);\n\t\t\tif (idx > 0) {\n\t\t\t\tconst orphaned = cleanAll.substring(0, idx).replace(/\\s+$/, \"\");\n\t\t\t\tif (orphaned) {\n\t\t\t\t\tparts.push(\"**Preflight**\");\n\t\t\t\t\tparts.push(orphaned);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build formatted sections from steps\n\tfor (const step of safeSteps) {\n\t\tswitch (step.eventType) {\n\t\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\t\tparts.push(\"**Planning**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"WORKING\": {\n\t\t\t\tconst detail = workingPhaseDetailForDisplay(step.message || \"\");\n\t\t\t\tparts.push(\"**Working**\");\n\t\t\t\tif (detail) parts.push(detail);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_STARTED\": {\n\t\t\t\tlet label = step.message || \"Processing\";\n\t\t\t\tconst started = label.match(/^(.+?)\\s+started$/i);\n\t\t\t\tconst progress = label.match(/^(.+?)\\s+in progress$/i);\n\t\t\t\tif (started) label = started[1];\n\t\t\t\telse if (progress) label = progress[1];\n\t\t\t\tparts.push(`**${label}**`);\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\telse if (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\t\tparts.push(\"**Finalizing**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\t\tparts.push(\"**Verification Required**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\tparts.push(`✓ ${step.message || \"Verification successful\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification rejected\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification expired\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification failed\"}`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(\"\\n\") : allThinkingText;\n}\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? FRIENDLY_ERROR_MESSAGE\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : \"\",\n\t\tcurrentMessage: state.hasError ? undefined : state.currentMessage,\n\t\tstreamProgress: state.hasError ? (\"error\" as const) : (\"processing\" as const),\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\tsessionId: state.sessionId,\n\t\tsteps,\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t};\n}\n\n/**\n * Create error message update for abort or error scenarios\n */\nexport function createErrorMessageUpdate(\n\terror: Error,\n\tstate: {\n\t\taccumulatedContent: string;\n\t\tcurrentMessage?: string;\n\t\tsteps: StreamingStep[];\n\t}\n): Partial<MessageDisplay> {\n\tconst isAborted = error.name === \"AbortError\";\n\n\treturn {\n\t\tisStreaming: false,\n\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\tisError: !isAborted,\n\t\tisCancelled: isAborted,\n\t\terrorDetails: isAborted ? undefined : error.message,\n\t\tcontent: isAborted\n\t\t\t? state.accumulatedContent || \"\"\n\t\t\t: state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,\n\t\t// Preserve currentMessage when cancelled so UI can show it\n\t\tcurrentMessage: isAborted ? state.currentMessage || \"Thinking...\" : undefined,\n\t\tsteps: [...state.steps].map((step) => {\n\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t}\n\t\t\treturn step;\n\t\t}),\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Create final completed message\n */\nexport function createFinalMessage(\n\tstreamingId: string,\n\tstate: {\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t\taccumulatedContent: string;\n\t\tsessionId?: string;\n\t\texecutionId?: string;\n\t\tfinalData?: unknown;\n\t\tsteps: StreamingStep[];\n\t\tuserActionResult?: UserActionResult;\n\t\tallThinkingText?: string;\n\t\tisResolvingImages?: boolean;\n\t}\n): MessageDisplay {\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || \"\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tisStreaming: false,\n\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\ttracingData: state.finalData,\n\t\tsteps,\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: undefined,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t\tisResolvingImages: state.hasError ? undefined : state.isResolvingImages,\n\t};\n}\n\n/**\n * Create cancelled message update\n */\nexport function createCancelledMessageUpdate(\n\tsteps: StreamingStep[],\n\tcurrentMessage?: string\n): Partial<MessageDisplay> {\n\tconst updatedSteps = steps.map((step) => {\n\t\tif (step.status === \"in_progress\") {\n\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t}\n\t\treturn step;\n\t});\n\n\treturn {\n\t\tisStreaming: false,\n\t\tisCancelled: true,\n\t\tsteps: updatedSteps,\n\t\tcurrentExecutingStepId: undefined,\n\t\t// Preserve currentMessage so UI can show it with X icon\n\t\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\n}\n","import type { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\n): Record<string, unknown> {\n\tconst sessionOwner = config.sessionParams;\n\tconst sessionAttributes =\n\t\tsessionOwner?.attributes && Object.keys(sessionOwner.attributes).length > 0\n\t\t\t? sessionOwner.attributes\n\t\t\t: undefined;\n\n\treturn {\n\t\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\n\n\tif (config.workflowVersion !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflowVersion));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\n}\n\n/**\n * Build user action URL (submit / cancel / resend)\n * Derives base path from the stream endpoint by stripping the \"/stream\" suffix.\n */\nexport function buildUserActionUrl(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n * Derives the base path from the stream endpoint (same pattern as buildUserActionUrl)\n * so that playground URLs stay on the playground path and workflow URLs stay on the\n * workflows path. An explicit resolveImagesEndpoint in config always wins.\n */\nexport function buildResolveImagesUrl(config: ChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\tconst streamEndpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst [endpointPath] = streamEndpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\treturn `${config.api.baseUrl}${basePath}/resolve-image-urls`;\n}\n\n/**\n * Build request headers\n */\nexport function buildRequestHeaders(config: ChatConfig): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t...config.api.headers,\n\t};\n\tif (config.api.authToken) {\n\t\theaders.Authorization = `Bearer ${config.api.authToken}`;\n\t}\n\treturn headers;\n}\n","import type { ChatConfig } from \"../types\";\nimport { buildUserActionUrl, buildRequestHeaders } from \"./requestBuilder\";\n\ntype UserActionResponse = {\n\tsuccess: boolean;\n\tmessage: string;\n};\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws on non-2xx status or JSON parse failure.\n */\nasync function sendUserActionRequest(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\tconst url = buildUserActionUrl(config, userActionId, action);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst hasBody = data !== undefined;\n\tconst headers = hasBody\n\t\t? { \"Content-Type\": \"application/json\", ...baseHeaders }\n\t\t: baseHeaders;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: hasBody ? JSON.stringify(data) : undefined,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn await response.json();\n}\n\n/**\n * Submit a user action (e.g. OTP verification)\n */\nexport async function submitUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", data);\n}\n\n/**\n * Cancel / reject a user action\n */\nexport async function cancelUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"cancel\");\n}\n\n/**\n * Resend a user action (e.g. request a new OTP)\n */\nexport async function resendUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"resend\");\n}\n","import type { MessageDisplay } from \"../types\";\n\nconst memoryStore = new Map<string, MessageDisplay[]>();\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\treturn memoryStore.get(key) ?? [];\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tmemoryStore.set(key, messages);\n\t},\n\tdelete(key: string): void {\n\t\tmemoryStore.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","import type { ChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: ChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep, UserActionRequest, UserActionResult } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent, getEventMessage } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\tcurrentThinkingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText: string;\n\tinOrchestratorPhase: boolean;\n\tinAggregatorPhase: boolean;\n};\n\nexport function useStreamManager(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\t// Keep latest values in refs so the startStream callback never goes stale\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tcurrentThinkingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t\tuserActionRequest: undefined,\n\t\t\t\tuserActionPending: false,\n\t\t\t\tuserActionResult: undefined,\n\t\t\t\tallThinkingText: \"\",\n\t\t\t\tinOrchestratorPhase: false,\n\t\t\t\tinAggregatorPhase: false,\n\t\t\t};\n\n\t\t\t// Throttle thinking display: show prefix that catches up at readable pace\n\t\t\tconst THROTTLE_MS = 120;\n\t\t\tconst CHARS_PER_TICK = 10;\n\t\t\tconst displayedLengthRef = { current: 0 };\n\t\t\tlet throttleIntervalId: ReturnType<typeof setInterval> | null = null;\n\n\t\t\tconst getActiveStepMessage = () =>\n\t\t\t\tstate.steps.find((s) => s.id === state.currentExecutingStepId)?.message ||\n\t\t\t\t[...state.steps].reverse().find((s) => s.status === \"in_progress\")?.message;\n\n\t\t\tconst advanceDisplayLength = (full: string) => {\n\t\t\t\tlet newLen = Math.min(displayedLengthRef.current + CHARS_PER_TICK, full.length);\n\t\t\t\tif (newLen > 0 && newLen < full.length) {\n\t\t\t\t\tconst code = full.charCodeAt(newLen - 1);\n\t\t\t\t\tif (code >= 0xD800 && code <= 0xDBFF) {\n\t\t\t\t\t\tnewLen = Math.min(newLen + 1, full.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdisplayedLengthRef.current = newLen;\n\t\t\t};\n\n\t\t\tconst clearThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) {\n\t\t\t\t\tclearInterval(throttleIntervalId);\n\t\t\t\t\tthrottleIntervalId = null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Clear throttle on abort (e.g. cancelStream or new stream replacing this one) so the interval\n\t\t\t// doesn’t keep ticking after unmount or cancel and call setMessages on unmounted component.\n\t\t\tabortController.signal.addEventListener(\"abort\", clearThrottle, { once: true });\n\n\t\t\t// Throttle callback intentionally reads the mutable `state` object so it always sees\n\t\t\t// the latest activeThinkingText/steps from processStreamEvent. Do not replace state\n\t\t\t// with an immutable copy or the interval will show stale data.\n\t\t\tconst ensureThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) return;\n\t\t\t\tthrottleIntervalId = setInterval(() => {\n\t\t\t\t\tif (abortController.signal.aborted) { clearThrottle(); return; }\n\t\t\t\t\tconst full = state.activeThinkingText ?? \"\";\n\t\t\t\t\tif (displayedLengthRef.current < full.length) {\n\t\t\t\t\t\tadvanceDisplayLength(full);\n\t\t\t\t\t\tconst displayText = full.slice(0, displayedLengthRef.current);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayText,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: getActiveStepMessage() || \"Thinking...\",\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}, THROTTLE_MS);\n\t\t\t};\n\n\t\t\t// Build request (read config from ref for latest value)\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Ignore KEEP_ALIVE — backend sends it to keep connection alive; don't show or update UI (case-insensitive)\n\t\t\t\t\t\tif (typeof event.eventType === \"string\" && event.eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\t\t\t\t\t\t// Still capture executionId/sessionId if backend sends them in keep-alive (e.g. first chunk)\n\t\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Capture activeThinkingText length before processStreamEvent (it clears it on non-thinking events)\n\t\t\t\t\t\tconst activeThinkingLengthBeforeProcess = state.activeThinkingText?.length ?? 0;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Throttle thinking display: start/stop lazily; reset on new block, flush when leaving\n\t\t\t\t\t\tif (eventType === \"INTENT_THINKING\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = 0;\n\t\t\t\t\t\t\tensureThrottle();\n\t\t\t\t\t\t} else if (eventType !== \"INTENT_THINKING_CONT\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = activeThinkingLengthBeforeProcess;\n\t\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isIntentThinkingEvent =\n\t\t\t\t\t\t\teventType === \"INTENT_THINKING\" || eventType === \"INTENT_THINKING_CONT\";\n\n\t\t\t\t\t\t// Get current message from event (fallback to step message or event-type message)\n\t\t\t\t\t\tconst rawMessage = event.message?.trim() || event.errorMessage?.trim();\n\t\t\t\t\t\tconst currentMessage = isIntentThinkingEvent\n\t\t\t\t\t\t\t? (getActiveStepMessage() || \"Thinking...\")\n\t\t\t\t\t\t\t: rawMessage ||\n\t\t\t\t\t\t\t\t(event.eventType?.startsWith(\"USER_ACTION_\")\n\t\t\t\t\t\t\t\t\t? getEventMessage(event)\n\t\t\t\t\t\t\t\t\t: getActiveStepMessage() || getEventMessage(event));\n\n\t\t\t\t\t\t// Use throttled thinking prefix for display; state keeps full text for allThinkingText\n\t\t\t\t\t\tconst displayThinking =\n\t\t\t\t\t\t\tstate.activeThinkingText != null\n\t\t\t\t\t\t\t\t? state.activeThinkingText.slice(0, displayedLengthRef.current)\n\t\t\t\t\t\t\t\t: state.activeThinkingText;\n\n\t\t\t\t\t\t// Update streaming message\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayThinking,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error, state),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// If the OTP modal is still open when the stream ends, close it\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.accumulatedContent);\n\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t// Clear throttle on success path too: on abort, streamWorkflowEvents returns without throwing,\n\t\t\t\t// so we'd skip the catch block and the interval would only self-clear on next tick.\n\t\t\t\tclearThrottle();\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.accumulatedContent);\n\n\t\t\t\t// Resolve RAG image URLs only after the final response has had a chance\n\t\t\t\t// to paint, so text shows up immediately and images hydrate afterward.\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.accumulatedContent,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// On failure, clear the resolving state and keep original content\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tclearThrottle();\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error as Error, state),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay, UserActionState } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n} from \"../utils/userActionClient\";\n\nexport type UseChatReturn = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string) => Promise<void>;\n\tclearMessages: () => void;\n\t/** Prepend older messages to the top of the list (e.g. loaded from history pagination) */\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\t/** User action (OTP) state — always present, inert when workflow has no user actions */\n\tuserActionState: UserActionState;\n\t/** Submit OTP for approval */\n\tapproveUserAction: (otp: string) => Promise<void>;\n\t/** Reject / cancel a user action */\n\trejectUserAction: () => Promise<void>;\n\t/** Resend OTP code */\n\tresendOtp: () => Promise<void>;\n};\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}): UseChatReturn {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => {\n\t\tif (config.userId) return chatStore.get(config.userId);\n\t\treturn config.initialMessages ?? [];\n\t});\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(\n\t\tconfig.userId\n\t\t\t? (chatStore.get(config.userId).find((m) => m.sessionId)?.sessionId ?? config.initialSessionId ?? undefined)\n\t\t\t: (config.initialSessionId ?? undefined)\n\t);\n\tconst prevUserIdRef = useRef<string | undefined>(config.userId);\n\n\t// Keep latest callbacks and config in refs so memoized closures never go stale\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\t// Store-aware setMessages: writes to activeStreamStore (survives unmount) AND React state\n\t// When unmounted, React's setMessages is a no-op but the store keeps getting updates\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.applyMessages(userId, updater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]));\n\t\t\t}\n\t\t\tsetMessages(updater);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[]\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback(\n\t\t(waiting: boolean) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.setWaiting(userId, waiting);\n\t\t\t}\n\t\t\tsetIsWaitingForResponse(waiting);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[]\n\t);\n\n\t// User action (OTP) state\n\tconst [userActionState, setUserActionState] = useState<UserActionState>({\n\t\trequest: null,\n\t\tresult: null,\n\t\tclearOtpTrigger: 0,\n\t});\n\n\t// Keep latest userActionState in a ref so action methods always read current value\n\tconst userActionStateRef = useRef(userActionState);\n\tuserActionStateRef.current = userActionState;\n\n\t// Wrap callbacks to intercept user action events and update local state.\n\t// Uses callbacksRef so this object is stable and doesn't recreate on every render.\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(() => ({\n\t\t...callbacksRef.current,\n\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\tonUserActionRequired: (request) => {\n\t\t\tsetUserActionState((prev) => ({ ...prev, request, result: null }));\n\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t},\n\t\tonUserActionEvent: (eventType, message) => {\n\t\t\tswitch (eventType) {\n\t\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"approved\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"rejected\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, clearOtpTrigger: prev.clearOtpTrigger + 1 }));\n\t\t\t\t\tbreak;\n\t\t\t\t// USER_ACTION_RESENT: no state change, modal stays open\n\t\t\t}\n\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, message);\n\t\t},\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}), []);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && configRef.current.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\t// Register stream with singleton so it survives navigation\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId) {\n\t\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\t\tactiveStreamStore.start(userId, abortController, initialMessages);\n\t\t\t}\n\n\t\t\t// Start streaming (pass our controller so the singleton owns it)\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tsessionIdRef.current,\n\t\t\t\tabortController\n\t\t\t);\n\n\t\t\t// Stream done — persist and clean up singleton entry\n\t\t\tif (userId) {\n\t\t\t\tactiveStreamStore.complete(userId);\n\t\t\t}\n\n\t\t\t// Update session ID if we got a new one.\n\t\t\t// If the stream was aborted (e.g. resetSession was called), do NOT\n\t\t\t// restore the old session ID — the reset already cleared it.\n\t\t\tif (!abortController.signal.aborted && newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[startStream]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t}\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\t// Clear OTP/user-action state when stream is cancelled to avoid stale UI state\n\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: null }));\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(\n\t\t\t\t\t\t\tmsg.steps || [],\n\t\t\t\t\t\t\tmsg.currentMessage\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t})\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, []);\n\n\tconst getSessionId = useCallback(() => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst getMessages = useCallback(() => {\n\t\treturn messages;\n\t}, [messages]);\n\n\t// ============================================\n\t// User Action (OTP) methods\n\t// ============================================\n\n\tconst approveUserAction = useCallback(\n\t\tasync (otp: string) => {\n\t\t\tconst request = userActionStateRef.current.request;\n\t\t\tif (!request) return;\n\t\t\ttry {\n\t\t\t\tawait submitUserActionApi(configRef.current, request.userActionId, { otp });\n\t\t\t\t// Stream events (SUCCESS / INVALID) will handle modal close / OTP clear\n\t\t\t} catch (error) {\n\t\t\t\t// REST failed — keep OTP input cleared so user can retry.\n\t\t\t\t// If the session is truly dead the stream will close and the\n\t\t\t\t// modal will be dismissed via the stream error/complete handlers.\n\t\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t\t}));\n\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst rejectUserAction = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\t// Show \"Rejecting...\" in thinking area\n\t\t\tsetMessages((prev) => {\n\t\t\t\tlet lastStreamingIdx = -1;\n\t\t\t\tfor (let i = prev.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (prev[i].role === \"assistant\" && prev[i].isStreaming) {\n\t\t\t\t\t\tlastStreamingIdx = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastStreamingIdx === -1) return prev;\n\t\t\t\treturn prev.map((msg, i) =>\n\t\t\t\t\ti === lastStreamingIdx ? { ...msg, currentMessage: \"Rejecting...\" } : msg\n\t\t\t\t);\n\t\t\t});\n\t\t\tawait cancelUserActionApi(configRef.current, request.userActionId);\n\t\t\t// Stream REJECTED event will close modal and show Rejected badge\n\t\t} catch (error) {\n\t\t\t// REST failed — keep modal open so user can retry reject.\n\t\t\t// If the session is truly dead the stream will close and the\n\t\t\t// modal will be dismissed via the stream error/complete handlers.\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst resendOtp = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait resendUserActionApi(configRef.current, request.userActionId);\n\t\t\t// Stream RESENT event will fire onUserActionEvent\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\t// On mount: if there's an active stream for this user, reattach React state to it\n\tuseEffect(() => {\n\t\tconst { userId } = config;\n\t\tif (!userId) return;\n\t\t// Subscribe first so we don't miss any in-flight updates\n\t\tconst unsubscribe = activeStreamStore.subscribe(userId, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\t// Sync whatever state the stream has accumulated while we were away\n\t\tconst active = activeStreamStore.get(userId);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\t// Save messages to store whenever they change (skip streaming placeholders)\n\tuseEffect(() => {\n\t\tif (!config.userId) return;\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(config.userId, toSave);\n\t\t}\n\t}, [messages, config.userId]);\n\n\t// Handle userId changes: logout clears store, login/switch loads stored messages\n\tuseEffect(() => {\n\t\tconst prevUserId = prevUserIdRef.current;\n\t\tprevUserIdRef.current = config.userId;\n\n\t\tif (prevUserId === config.userId) return;\n\n\t\tif (prevUserId && !config.userId) {\n\t\t\t// Logout: clear store and reset all state\n\t\t\tchatStore.delete(prevUserId);\n\t\t\tsetMessages([]);\n\t\t\tsessionIdRef.current = undefined;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t\t} else if (config.userId) {\n\t\t\t// Login or user switch: restore stored messages for the new user\n\t\t\tconst stored = chatStore.get(config.userId);\n\t\t\tsetMessages(stored);\n\t\t\tsessionIdRef.current = stored.find((m) => m.sessionId)?.sessionId;\n\t\t}\n\t}, [config.userId]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t\t// User action (OTP) state and methods\n\t\tuserActionState,\n\t\tapproveUserAction,\n\t\trejectUserAction,\n\t\tresendOtp,\n\t};\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\nimport { extractResponseContent, getEventMessage, workingPhaseDetailForDisplay } from \"./eventProcessor\";\n\nexport type V2EventProcessorState = {\n\tformattedThinkingText: string;\n\tfinalResponse: string;\n\tcurrentWorker: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction shouldShowIntentHeader(event: StreamEvent): boolean {\n\tconst workerName = getEventText(event, \"workerName\");\n\tconst intentId = getEventText(event, \"intentId\");\n\treturn Boolean(workerName && intentId && workerName === intentId);\n}\n\nfunction addThinkingHeader(state: V2EventProcessorState, header: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header;\n}\n\nfunction addThinkingDetail(state: V2EventProcessorState, detail: string) {\n\tconst trimmed = detail.trim();\n\tif (!trimmed) return;\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + trimmed;\n}\n\nfunction addThinkingLine(state: V2EventProcessorState, header: string, detail: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header + \"\\n\" + detail;\n}\n\nfunction appendThinkingText(state: V2EventProcessorState, text: string) {\n\tstate.formattedThinkingText += text;\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tformattedThinkingText: \"\",\n\t\tfinalResponse: \"\",\n\t\tcurrentWorker: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActionRequest: undefined,\n\t\tuserActionPending: false,\n\t\tuserActionResult: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\nexport function processStreamEventV2(\n\tevent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst eventType = event.eventType;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\tcase \"STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_THINKING\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Thinking...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\n\t\t\tif (worker !== state.currentWorker) {\n\t\t\t\tstate.currentWorker = worker;\n\t\t\t\tif (showHeader && msg && msg !== worker) {\n\t\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t\t} else if (showHeader) {\n\t\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t\t} else if (msg && msg !== \"Thinking...\") {\n\t\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t\t}\n\t\t\t} else if (msg && (showHeader || msg !== \"Thinking...\")) {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t}\n\n\t\t\t// Backward-compat step tracking\n\t\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\t\tif (lastInProgress) {\n\t\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\t\tlastInProgress.isThinking = true;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_THINKING_CONT\": {\n\t\t\tconst msg = (event.message as string) || \"\";\n\t\t\tif (!msg) break;\n\n\t\t\tif (state.lastEventType === \"INTENT_THINKING\") {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t} else {\n\t\t\t\tappendThinkingText(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = [...state.steps].reverse().find(s => s.isThinking);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.thinkingText = (thinkingStep.thinkingText || \"\") + msg;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING_CONT\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Planning**\", (event.message as string) || \"Understanding your request...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_COMPLETED\": {\n\t\t\tconst workingDetail = workingPhaseDetailForDisplay(message);\n\t\t\tif (workingDetail) {\n\t\t\t\taddThinkingLine(state, \"**Working**\", workingDetail);\n\t\t\t} else {\n\t\t\t\taddThinkingHeader(state, \"**Working**\");\n\t\t\t}\n\n\t\t\tstate.steps.push({\n\t\t\t\tid: `step-${state.stepCounter++}`,\n\t\t\t\teventType: \"WORKING\",\n\t\t\t\tmessage: workingDetail,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Starting...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\t\t\tstate.currentWorker = worker;\n\n\t\t\tif (showHeader && msg !== worker) {\n\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t} else if (showHeader) {\n\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t} else {\n\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = state.steps.find(s => s.isThinking);\n\t\t\tif (thinkingStep) thinkingStep.isThinking = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Finalizing**\", (event.message as string) || \"Preparing response...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_COMPLETED\": {\n\t\t\tappendThinkingText(state, \"\\n\" + ((event.message as string) || \"Response ready\"));\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\tcase \"COMPLETED\": {\n\t\t\tlet content = extractResponseContent(event.response);\n\t\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\t\tcontent = trace.workflowMsg;\n\t\t\t}\n\t\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\t\telse content = extractResponseContent(agg.response);\n\t\t\t}\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t\tstep.isThinking = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tif (event.userActionRequest) {\n\t\t\t\tstate.userActionRequest = {\n\t\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t\t};\n\t\t\t}\n\t\t\tstate.userActionPending = true;\n\n\t\t\tconst req = event.userActionRequest;\n\t\t\tif (req) {\n\t\t\t\taddThinkingLine(state, \"**Verification Required**\", (req.message as string) || \"Waiting for authorization...\");\n\t\t\t}\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_SUCCESS\": {\n\t\t\tappendThinkingText(state, \"\\n✓ \" + ((event.message as string) || \"Verification successful\"));\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"approved\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_INVALID\": {\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: errorStepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\n\t\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: retryStepId,\n\t\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\t\tmessage: \"Waiting for verification...\",\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = retryStepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REJECTED\": {\n\t\t\tappendThinkingText(state, \"\\n✗ \" + ((event.message as string) || \"Verification rejected\"));\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"rejected\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_EXPIRED\": {\n\t\t\tappendThinkingText(state, \"\\n✗ \" + ((event.message as string) || \"Verification expired\"));\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_RESENT\": {\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_FAILED\": {\n\t\t\tappendThinkingText(state, \"\\n✗ \" + ((event.message as string) || \"Verification failed\"));\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_ERROR\": {\n\t\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"error\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEventV2, createInitialV2State } from \"../utils/v2EventProcessor\";\nimport { getEventMessage } from \"../utils/eventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * V2 stream manager that mirrors the demo's streaming approach:\n * - Builds `formattedThinkingText` incrementally during events (with headers/sections)\n * - Buffers the final response until WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\tif (typeof event.eventType === \"string\" && event.eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\tconst currentMessage = activeStep?.message || lastInProgressStep?.message || getEventMessage(event);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Response is buffered until onComplete — only thinking text updates during streaming\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: \"\",\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\ttracingData: state.finalData,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\tformattedThinkingText: state.hasError ? undefined : state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay, UserActionState } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n} from \"../utils/userActionClient\";\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string) => Promise<void>;\n\tclearMessages: () => void;\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\tuserActionState: UserActionState;\n\tapproveUserAction: (otp: string) => Promise<void>;\n\trejectUserAction: () => Promise<void>;\n\tresendOtp: () => Promise<void>;\n};\n\nexport function useChatV2(config: ChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => {\n\t\tif (config.userId) return chatStore.get(config.userId);\n\t\treturn config.initialMessages ?? [];\n\t});\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(\n\t\tconfig.userId\n\t\t\t? (chatStore.get(config.userId).find((m) => m.sessionId)?.sessionId ?? config.initialSessionId ?? undefined)\n\t\t\t: (config.initialSessionId ?? undefined),\n\t);\n\tconst prevUserIdRef = useRef<string | undefined>(config.userId);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.applyMessages(userId, updater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]));\n\t\t\t}\n\t\t\tsetMessages(updater);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback(\n\t\t(waiting: boolean) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.setWaiting(userId, waiting);\n\t\t\t}\n\t\t\tsetIsWaitingForResponse(waiting);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>({\n\t\trequest: null,\n\t\tresult: null,\n\t\tclearOtpTrigger: 0,\n\t});\n\n\tconst userActionStateRef = useRef(userActionState);\n\tuserActionStateRef.current = userActionState;\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(() => ({\n\t\t...callbacksRef.current,\n\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\tonUserActionRequired: (request) => {\n\t\t\tsetUserActionState((prev) => ({ ...prev, request, result: null }));\n\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t},\n\t\tonUserActionEvent: (eventType, message) => {\n\t\t\tswitch (eventType) {\n\t\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"approved\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"rejected\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, clearOtpTrigger: prev.clearOtpTrigger + 1 }));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, message);\n\t\t},\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}), []);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\tif (!sessionIdRef.current && configRef.current.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId) {\n\t\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\t\tactiveStreamStore.start(userId, abortController, initialMessages);\n\t\t\t}\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tsessionIdRef.current,\n\t\t\t\tabortController,\n\t\t\t);\n\n\t\t\tif (userId) {\n\t\t\t\tactiveStreamStore.complete(userId);\n\t\t\t}\n\n\t\t\tif (!abortController.signal.aborted && newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t}\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: null }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(\n\t\t\t\t\t\t\tmsg.steps || [],\n\t\t\t\t\t\t\tmsg.currentMessage,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, []);\n\n\tconst getSessionId = useCallback(() => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst getMessages = useCallback(() => {\n\t\treturn messages;\n\t}, [messages]);\n\n\tconst approveUserAction = useCallback(\n\t\tasync (otp: string) => {\n\t\t\tconst request = userActionStateRef.current.request;\n\t\t\tif (!request) return;\n\t\t\ttry {\n\t\t\t\tawait submitUserActionApi(configRef.current, request.userActionId, { otp });\n\t\t\t} catch (error) {\n\t\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t\t}));\n\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst rejectUserAction = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tsetMessages((prev) => {\n\t\t\t\tlet lastStreamingIdx = -1;\n\t\t\t\tfor (let i = prev.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (prev[i].role === \"assistant\" && prev[i].isStreaming) {\n\t\t\t\t\t\tlastStreamingIdx = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastStreamingIdx === -1) return prev;\n\t\t\t\treturn prev.map((msg, i) =>\n\t\t\t\t\ti === lastStreamingIdx ? { ...msg, currentMessage: \"Rejecting...\" } : msg,\n\t\t\t\t);\n\t\t\t});\n\t\t\tawait cancelUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst resendOtp = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait resendUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst { userId } = config;\n\t\tif (!userId) return;\n\t\tconst unsubscribe = activeStreamStore.subscribe(userId, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(userId);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!config.userId) return;\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(config.userId, toSave);\n\t\t}\n\t}, [messages, config.userId]);\n\n\tuseEffect(() => {\n\t\tconst prevUserId = prevUserIdRef.current;\n\t\tprevUserIdRef.current = config.userId;\n\n\t\tif (prevUserId === config.userId) return;\n\n\t\tif (prevUserId && !config.userId) {\n\t\t\tchatStore.delete(prevUserId);\n\t\t\tsetMessages([]);\n\t\t\tsessionIdRef.current = undefined;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t\t} else if (config.userId) {\n\t\t\tconst stored = chatStore.get(config.userId);\n\t\t\tsetMessages(stored);\n\t\t\tsessionIdRef.current = stored.find((m) => m.sessionId)?.sessionId;\n\t\t}\n\t}, [config.userId]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t\tuserActionState,\n\t\tapproveUserAction,\n\t\trejectUserAction,\n\t\tresendOtp,\n\t};\n}\n","// ============================================\n// Voice Hook - Web Implementation\n// Uses Web Speech API (SpeechRecognition)\n// ============================================\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n\tVoiceCallbacks,\n\tVoiceConfig,\n\tVoicePermissions,\n\tVoiceState,\n\tUseVoiceReturn,\n} from \"../types/voice\";\n\n// ============================================\n// Web Speech API Types\n// ============================================\n\ninterface SpeechRecognitionEvent extends Event {\n\tresults: SpeechRecognitionResultList;\n\tresultIndex: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n\terror: string;\n\tmessage?: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n\tcontinuous: boolean;\n\tinterimResults: boolean;\n\tlang: string;\n\tmaxAlternatives: number;\n\tstart(): void;\n\tstop(): void;\n\tabort(): void;\n\tonstart: ((this: SpeechRecognition, ev: Event) => any) | null;\n\tonend: ((this: SpeechRecognition, ev: Event) => any) | null;\n\tonresult:\n\t\t| ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => any)\n\t\t| null;\n\tonerror:\n\t\t| ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => any)\n\t\t| null;\n}\n\ninterface SpeechRecognitionConstructor {\n\tnew (): SpeechRecognition;\n}\n\ndeclare global {\n\tinterface Window {\n\t\tSpeechRecognition?: SpeechRecognitionConstructor;\n\t\twebkitSpeechRecognition?: SpeechRecognitionConstructor;\n\t}\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getSpeechRecognition(): SpeechRecognitionConstructor | null {\n\tif (typeof window === \"undefined\") return null;\n\treturn window.SpeechRecognition || window.webkitSpeechRecognition || null;\n}\n\n// ============================================\n// Hook Implementation\n// ============================================\n\nexport function useVoice(\n\tconfig: VoiceConfig = {},\n\tcallbacks: VoiceCallbacks = {}\n): UseVoiceReturn {\n\tconst [voiceState, setVoiceState] = useState<VoiceState>(\"idle\");\n\tconst [transcribedText, setTranscribedText] = useState(\"\");\n\tconst [isAvailable, setIsAvailable] = useState(false);\n\tconst [isRecording, setIsRecording] = useState(false);\n\n\tconst recognitionRef = useRef<SpeechRecognition | null>(null);\n\tconst autoStopTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n\tconst {\n\t\tlang = \"en-US\",\n\t\tinterimResults = true,\n\t\tcontinuous = true,\n\t\tmaxAlternatives = 1,\n\t\tautoStopAfterSilence,\n\t} = config;\n\n\tconst { onStart, onEnd, onResult, onError, onStateChange } = callbacks;\n\n\t// Check speech recognition availability\n\tuseEffect(() => {\n\t\tconst SpeechRecognitionAPI = getSpeechRecognition();\n\t\tsetIsAvailable(SpeechRecognitionAPI !== null);\n\t}, []);\n\n\t// Notify state changes\n\tuseEffect(() => {\n\t\tonStateChange?.(voiceState);\n\t}, [voiceState, onStateChange]);\n\n\t// Request permissions (web prompts automatically on start)\n\tconst requestPermissions = useCallback(async (): Promise<VoicePermissions> => {\n\t\ttry {\n\t\t\tconst result = await navigator.mediaDevices.getUserMedia({\n\t\t\t\taudio: true,\n\t\t\t});\n\t\t\t// Stop the stream immediately, we just wanted to check permissions\n\t\t\tresult.getTracks().forEach((track) => track.stop());\n\n\t\t\treturn {\n\t\t\t\tgranted: true,\n\t\t\t\tstatus: \"granted\",\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"denied\",\n\t\t\t};\n\t\t}\n\t}, []);\n\n\t// Get permissions\n\tconst getPermissions = useCallback(async (): Promise<VoicePermissions> => {\n\t\tif (typeof navigator === \"undefined\" || !navigator.permissions) {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"undetermined\",\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await navigator.permissions.query({\n\t\t\t\tname: \"microphone\" as PermissionName,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tgranted: result.state === \"granted\",\n\t\t\t\tstatus:\n\t\t\t\t\tresult.state === \"granted\"\n\t\t\t\t\t\t? \"granted\"\n\t\t\t\t\t\t: result.state === \"denied\"\n\t\t\t\t\t\t? \"denied\"\n\t\t\t\t\t\t: \"undetermined\",\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"undetermined\",\n\t\t\t};\n\t\t}\n\t}, []);\n\n\t// Clear auto-stop timer\n\tconst clearAutoStopTimer = useCallback(() => {\n\t\tif (autoStopTimerRef.current) {\n\t\t\tclearTimeout(autoStopTimerRef.current);\n\t\t\tautoStopTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\t// Reset auto-stop timer\n\tconst resetAutoStopTimer = useCallback(() => {\n\t\tclearAutoStopTimer();\n\n\t\tif (autoStopAfterSilence && autoStopAfterSilence > 0) {\n\t\t\tautoStopTimerRef.current = setTimeout(() => {\n\t\t\t\tif (recognitionRef.current && isRecording) {\n\t\t\t\t\trecognitionRef.current.stop();\n\t\t\t\t}\n\t\t\t}, autoStopAfterSilence);\n\t\t}\n\t}, [autoStopAfterSilence, clearAutoStopTimer, isRecording]);\n\n\t// Stop recording\n\tconst stopRecording = useCallback(() => {\n\t\tif (recognitionRef.current) {\n\t\t\ttry {\n\t\t\t\trecognitionRef.current.stop();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\"Error stopping speech recognition:\", error);\n\t\t\t}\n\t\t}\n\t\tclearAutoStopTimer();\n\t\tsetIsRecording(false);\n\t\tsetVoiceState(\"idle\");\n\t}, [clearAutoStopTimer]);\n\n\t// Start recording\n\tconst startRecording = useCallback(async () => {\n\t\tconst SpeechRecognitionAPI = getSpeechRecognition();\n\n\t\tif (!SpeechRecognitionAPI) {\n\t\t\tonError?.(\"Speech recognition not supported in this browser\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Request microphone permission first\n\t\t\ttry {\n\t\t\t\tawait navigator.mediaDevices.getUserMedia({ audio: true });\n\t\t\t} catch (permError) {\n\t\t\t\tonError?.(\"Microphone access denied. Please allow microphone access in your browser settings.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create new recognition instance\n\t\t\tconst recognition = new SpeechRecognitionAPI();\n\t\t\trecognition.continuous = continuous;\n\t\t\trecognition.interimResults = interimResults;\n\t\t\trecognition.lang = lang;\n\t\t\trecognition.maxAlternatives = maxAlternatives;\n\n\t\t\t// Event handlers\n\t\t\trecognition.onstart = () => {\n\t\t\t\tsetVoiceState(\"listening\");\n\t\t\t\tsetIsRecording(true);\n\t\t\t\tonStart?.();\n\t\t\t\tresetAutoStopTimer();\n\t\t\t};\n\n\t\t\trecognition.onend = () => {\n\t\t\t\tsetVoiceState(\"idle\");\n\t\t\t\tsetIsRecording(false);\n\t\t\t\tclearAutoStopTimer();\n\t\t\t\tonEnd?.();\n\t\t\t};\n\n\t\t\trecognition.onresult = (event: SpeechRecognitionEvent) => {\n\t\t\t\tconst results = event.results;\n\t\t\t\tlet transcript = \"\";\n\n\t\t\t\t// Combine ALL results from the beginning (not just from resultIndex)\n\t\t\t\t// This ensures continuous speech is properly accumulated\n\t\t\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\t\t\tconst result = results[i];\n\t\t\t\t\tif (result && result[0]) {\n\t\t\t\t\t\tconst text = result[0].transcript;\n\t\t\t\t\t\tif (transcript && !transcript.endsWith(\" \") && !text.startsWith(\" \")) {\n\t\t\t\t\t\t\ttranscript += \" \" + text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttranscript += text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttranscript = transcript.trim();\n\t\t\t\t\n\t\t\t\tif (transcript) {\n\t\t\t\t\tsetTranscribedText(transcript);\n\t\t\t\t\tonResult?.(transcript);\n\t\t\t\t\tresetAutoStopTimer();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\trecognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n\t\t\t\tsetVoiceState(\"error\");\n\t\t\t\tsetIsRecording(false);\n\t\t\t\tclearAutoStopTimer();\n\n\t\t\t\t// Provide more user-friendly error messages\n\t\t\t\tlet errorMessage = event.error;\n\t\t\t\tif (event.error === \"not-allowed\") {\n\t\t\t\t\terrorMessage = \"Microphone access denied. Please allow microphone access in your browser settings.\";\n\t\t\t\t} else if (event.error === \"no-speech\") {\n\t\t\t\t\terrorMessage = \"No speech detected. Please try again.\";\n\t\t\t\t} else if (event.error === \"audio-capture\") {\n\t\t\t\t\terrorMessage = \"No microphone found or microphone is in use.\";\n\t\t\t\t} else if (event.error === \"network\") {\n\t\t\t\t\terrorMessage = \"Network error occurred. Please check your connection.\";\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tonError?.(errorMessage);\n\t\t\t};\n\n\t\t\trecognitionRef.current = recognition;\n\t\t\tsetTranscribedText(\"\");\n\n\t\t\t// Start recognition\n\t\t\trecognition.start();\n\t\t} catch (error) {\n\t\t\tsetVoiceState(\"error\");\n\t\t\tsetIsRecording(false);\n\t\t\tonError?.(\n\t\t\t\terror instanceof Error ? error.message : \"Failed to start recording\"\n\t\t\t);\n\t\t}\n\t}, [\n\t\tlang,\n\t\tinterimResults,\n\t\tcontinuous,\n\t\tmaxAlternatives,\n\t\tonStart,\n\t\tonEnd,\n\t\tonResult,\n\t\tonError,\n\t\tgetPermissions,\n\t\tresetAutoStopTimer,\n\t\tclearAutoStopTimer,\n\t]);\n\n\t// Clear transcript\n\tconst clearTranscript = useCallback(() => {\n\t\tsetTranscribedText(\"\");\n\t}, []);\n\n\t// Reset\n\tconst reset = useCallback(() => {\n\t\tstopRecording();\n\t\tsetTranscribedText(\"\");\n\t\tsetVoiceState(\"idle\");\n\t}, [stopRecording]);\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (recognitionRef.current) {\n\t\t\t\ttry {\n\t\t\t\t\trecognitionRef.current.stop();\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tclearAutoStopTimer();\n\t\t};\n\t}, [clearAutoStopTimer]);\n\n\treturn {\n\t\tvoiceState,\n\t\ttranscribedText,\n\t\tisAvailable,\n\t\tisRecording,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\trequestPermissions,\n\t\tgetPermissions,\n\t\tclearTranscript,\n\t\treset,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/utils/userActionClient.ts","../src/utils/chatStore.ts","../src/utils/activeStreamStore.ts","../src/utils/v2EventProcessor.ts","../src/utils/ragImageResolver.ts","../src/hooks/useStreamManagerV2.ts","../src/utils/workflowUsersClient.ts","../src/hooks/useChatV2.ts","../src/hooks/useVoice.ts"],"names":["events","useRef","useCallback","getStageParamName","useMemo","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Cross-platform UUID v4 generator\n * Works in both browser and React Native environments\n */\nexport function generateId(): string {\n\t// Simple UUID v4 implementation that doesn't rely on crypto API\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\tconst r = (Math.random() * 16) | 0;\n\t\tconst v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n","/**\n * Streaming client for handling SSE (Server-Sent Events) from the API\n */\n\nexport type StreamEvent = {\n\teventType: string;\n\tworkerName?: string;\n\tmessage?: string;\n\terrorMessage?: string;\n\tresponse?: unknown;\n\texecutionId?: string;\n\tsessionId?: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\telapsedMs?: number;\n\tuserActionRequest?: {\n\t\tuserActionId: string;\n\t\tuserActionType?: string;\n\t\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\n\t\tmetadata?: Record<string, string>;\n\t};\n\t[key: string]: unknown;\n};\n\nexport type StreamOptions = {\n\tsignal?: AbortSignal;\n\tonEvent?: (event: StreamEvent) => void;\n\tonError?: (error: Error) => void;\n\tonComplete?: () => void;\n};\n\n/**\n * Parse buffer for complete JSON objects (raw JSON streaming, not SSE format)\n * Handles concatenated JSON objects without newlines between them\n */\nfunction parseJSONBuffer(buffer: string): {\n\tevents: StreamEvent[];\n\tremaining: string;\n} {\n\tconst events: StreamEvent[] = [];\n\tlet braceCount = 0;\n\tlet startIndex = 0;\n\tlet inString = false;\n\tlet escapeNext = false;\n\tlet lastParsedIndex = -1;\n\n\t// Find complete JSON objects in the buffer\n\tfor (let i = 0; i < buffer.length; i++) {\n\t\tconst char = buffer[i];\n\n\t\tif (escapeNext) {\n\t\t\tescapeNext = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tescapeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !escapeNext) {\n\t\t\tinString = !inString;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inString) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"{\") {\n\t\t\tif (braceCount === 0) {\n\t\t\t\tstartIndex = i;\n\t\t\t}\n\t\t\tbraceCount++;\n\t\t} else if (char === \"}\") {\n\t\t\tbraceCount--;\n\t\t\tif (braceCount === 0) {\n\t\t\t\t// Found a complete JSON object\n\t\t\t\tconst jsonStr = buffer.substring(startIndex, i + 1);\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(jsonStr);\n\t\t\t\t\tconst event = parsed as StreamEvent;\n\t\t\t\t\tevents.push(event);\n\t\t\t\t\tlastParsedIndex = i;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to parse JSON event:\", jsonStr, err);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return parsed events and remaining buffer\n\tconst remaining =\n\t\tlastParsedIndex >= 0 ? buffer.substring(lastParsedIndex + 1) : buffer;\n\treturn { events, remaining };\n}\n\n/**\n * Stream workflow events from the API\n */\nexport async function streamWorkflowEvents(\n\turl: string,\n\tbody: Record<string, unknown>,\n\theaders: Record<string, string>,\n\toptions: StreamOptions = {}\n): Promise<void> {\n\tconst { signal, onEvent, onError, onComplete } = options;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\n\n/**\n * Extract a user-friendly message from a streaming event\n */\nexport function getEventMessage(event: StreamEvent): string {\n\tif (event.message?.trim()) {\n\t\treturn event.message.trim();\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage.trim();\n\t}\n\n\tconst eventType = event.eventType;\n\tswitch (eventType) {\n\t\tcase \"STARTED\":\n\t\tcase \"WORKFLOW_STARTED\":\n\t\t\treturn \"Starting workflow...\";\n\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\treturn \"Planning execution strategy...\";\n\t\tcase \"ORCHESTRATOR_COMPLETED\":\n\t\t\treturn \"Planning complete\";\n\t\tcase \"INTENT_STARTED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} started`\n\t\t\t\t: \"Processing intent...\";\n\t\tcase \"INTENT_PROGRESS\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} in progress`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_COMPLETED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} completed`\n\t\t\t\t: \"Intent completed\";\n\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\treturn \"Combining results...\";\n\t\tcase \"AGGREGATOR_COMPLETED\":\n\t\t\treturn \"Results combined\";\n\t\tcase \"COMPLETED\":\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\t\treturn \"Workflow completed successfully\";\n\t\tcase \"ERROR\":\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"INTENT_ERROR\":\n\t\t\treturn event.errorMessage || \"An error occurred\";\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn \"Verification approved\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn \"Verification expired\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn \"Invalid code. Please try again.\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn \"Verification cancelled\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn \"Verification failed\";\n\t\tcase \"INTENT_THINKING\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} thinking...`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_THINKING_CONT\":\n\t\t\treturn event.message || \"\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\treturn \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\nfunction isUserActionPrompt(text: string): boolean {\n\treturn /\\benter\\b.+\\b(code|otp)\\b/i.test(text) ||\n\t\t/\\b(authorization|verification)\\s+code\\b/i.test(text) ||\n\t\t/\\bsent\\s+to\\s+your\\b/i.test(text);\n}\n\n/**\n * User-action events often reuse the original verification prompt as their\n * backend message. Normalize the display copy so the thinking timeline shows\n * the action outcome, not the stale prompt.\n */\nexport function getUserActionDisplayMessage(\n\teventType: string,\n\trawMessage?: string,\n): string {\n\tconst raw = rawMessage?.trim();\n\tconst safeRaw = raw && !isUserActionPrompt(raw) ? raw : \"\";\n\n\tswitch (eventType) {\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn raw || \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn safeRaw || \"Verification approved\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn safeRaw || \"Invalid code. Please try again.\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn safeRaw || \"Verification cancelled\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn safeRaw || \"Verification expired\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn safeRaw || \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn safeRaw || \"Verification failed\";\n\t\tdefault:\n\t\t\treturn safeRaw || raw || eventType;\n\t}\n}\n\n/**\n * Orchestrator completion often includes \"Identified N task(s) to execute\", which is redundant in the UI.\n */\nexport function workingPhaseDetailForDisplay(raw: string): string {\n\tconst t = raw.trim();\n\tif (!t) return \"\";\n\tif (/^Identified\\s+\\d+\\s+tasks?\\s+to\\s+execute\\.?$/i.test(t)) {\n\t\treturn \"\";\n\t}\n\treturn t;\n}\n\n/**\n * Extract final response content from the event\n */\nexport function extractResponseContent(response: unknown): string {\n\t// Handle direct string response (most common from API)\n\tif (typeof response === \"string\") {\n\t\treturn response;\n\t}\n\n\t// Handle object responses with nested content\n\tif (typeof response === \"object\" && response !== null) {\n\t\tconst resp = response as Record<string, unknown>;\n\n\t\t// Try common field names\n\t\tif (\"text\" in resp && typeof resp.text === \"string\") {\n\t\t\treturn resp.text;\n\t\t}\n\t\tif (\"content\" in resp && typeof resp.content === \"string\") {\n\t\t\treturn resp.content;\n\t\t}\n\t\tif (\"message\" in resp && typeof resp.message === \"string\") {\n\t\t\treturn resp.message;\n\t\t}\n\t\tif (\"answer\" in resp && typeof resp.answer === \"string\") {\n\t\t\treturn resp.answer;\n\t\t}\n\n\t\t// Fallback to JSON string\n\t\treturn JSON.stringify(response);\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Complete the last in-progress step (if any) by marking it as completed.\n */\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** State shape used by processStreamEvent */\nexport type EventProcessorState = {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\tcurrentThinkingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\t/** Current thinking block text (resets each INTENT_THINKING) — shown live in bubble */\n\tactiveThinkingText?: string;\n\t/** All thinking accumulated across every block — shown after streaming ends */\n\tallThinkingText: string;\n\t/** True between ORCHESTRATOR_THINKING and ORCHESTRATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinOrchestratorPhase: boolean;\n\t/** True between AGGREGATOR_THINKING and AGGREGATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinAggregatorPhase: boolean;\n};\n\n/**\n * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: EventProcessorState,\n): EventProcessorState {\n\tconst eventType = event.eventType;\n\n\t// Ignore keep-alive events from backend — do not show or process in UI (case-insensitive for robustness)\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\treturn state;\n\t}\n\n\tconst message = getEventMessage(event);\n\n\t// Close any active thinking block when a non-thinking event arrives\n\tif (eventType !== \"INTENT_THINKING\" && eventType !== \"INTENT_THINKING_CONT\") {\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst thinkingStep = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\t\t// Clear live thinking so the bubble can show the current step instead\n\t\tstate.activeThinkingText = undefined;\n\t}\n\n\t// Only extract response content from WORKFLOW_COMPLETED event.\n\t// When the workflow completes with a response (e.g. after INTENT_ERROR), use it as the message and clear intent-level error so we show the agent response, not \"Oops something went wrong\".\n\t// When there is no response/workflowMsg (e.g. preflight failed, aggregator failed), show \"Oops, something went wrong\".\n\tif (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\tlet content = extractResponseContent(event.response);\n\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\tcontent = trace.workflowMsg;\n\t\t}\n\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\telse content = extractResponseContent(agg.response);\n\t\t}\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t// Subintent may have failed (INTENT_ERROR) but workflow still produced a response — show it, not the error.\n\t\t\tstate.hasError = false;\n\t\t\tstate.errorMessage = \"\";\n\t\t} else {\n\t\t\t// No workflow response (e.g. preflight failed, aggregator failed) — show \"Oops, something went wrong\"\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t}\n\t}\n\n\t// Skip WORKFLOW_STARTED - don't show it in UI\n\tif (eventType === \"STARTED\" || eventType === \"WORKFLOW_STARTED\") {\n\t\t// Skip this event, don't add a step\n\t} else if (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\t// Mark all in-progress steps as completed (for final workflow completion)\n\t\tstate.steps.forEach((step) => {\n\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t}\n\t\t});\n\t} else if (eventType === \"INTENT_ERROR\") {\n\t\t// Subintent failed — do NOT set hasError. Workflow may still complete with a response (WORKFLOW_COMPLETED).\n\t\t// Only WORKFLOW_FAILED / ERROR / WORKFLOW_ERROR set hasError. Mark the step as error for UI.\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t// Mark any in-progress intent step as error\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"error\";\n\t\t}\n\t} else if (eventType === \"ERROR\" || eventType === \"WORKFLOW_ERROR\") {\n\t\t// Mark as error and store error message (don't add as step)\n\t\tstate.hasError = true;\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\t} else if (eventType === \"ORCHESTRATOR_COMPLETED\") {\n\t\tstate.inOrchestratorPhase = false;\n\t\t// Complete the ORCHESTRATOR_THINKING step\n\t\tconst orchestratorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (orchestratorStep) {\n\t\t\torchestratorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\torchestratorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (orchestratorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"INTENT_COMPLETED\") {\n\t\t// Complete the INTENT_STARTED step\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\tintentStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (intentStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"AGGREGATOR_COMPLETED\") {\n\t\tstate.inAggregatorPhase = false;\n\t\t// Complete the AGGREGATOR_THINKING step\n\t\tconst aggregatorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (aggregatorStep) {\n\t\t\taggregatorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\taggregatorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (aggregatorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (\n\t\teventType === \"ORCHESTRATOR_THINKING\" ||\n\t\teventType === \"INTENT_STARTED\" ||\n\t\teventType === \"INTENT_PROGRESS\" ||\n\t\teventType === \"AGGREGATOR_THINKING\"\n\t) {\n\t\tif (eventType === \"ORCHESTRATOR_THINKING\") {\n\t\t\tstate.inOrchestratorPhase = true;\n\t\t}\n\t\tif (eventType === \"AGGREGATOR_THINKING\") {\n\t\t\tstate.inAggregatorPhase = true;\n\t\t}\n\t\t// Only add steps for important events\n\t\tif (eventType === \"INTENT_PROGRESS\") {\n\t\t\t// Update existing INTENT_STARTED step message if it exists\n\t\t\tconst intentStep = state.steps.find(\n\t\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t\t);\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.message = message;\n\t\t\t\tstate.currentExecutingStepId = intentStep.id;\n\t\t\t} else {\n\t\t\t\t// No existing intent step, create one\n\t\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\t\tstate.steps.push({\n\t\t\t\t\tid: stepId,\n\t\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t\t});\n\t\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add progress step for THINKING and STARTED events\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t}\n\t}\n\t// ============================================\n\t// USER_ACTION events\n\t// ============================================\n\telse if (eventType === \"USER_ACTION_REQUIRED\") {\n\t\t// Complete any prior in-progress step\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Store the request data from the event\n\t\tif (event.userActionRequest) {\n\t\t\tstate.userActionRequest = {\n\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t};\n\t\t}\n\t\tstate.userActionPending = true;\n\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\teventType,\n\t\t\t(event.userActionRequest?.message as string | undefined) || message,\n\t\t);\n\n\t\t// Add an in_progress step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t\tstate.currentExecutingStepId = stepId;\n\t} else if (eventType === \"USER_ACTION_SUCCESS\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"approved\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_INVALID\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\t// Complete the prior USER_ACTION step (REQUIRED or previous INVALID retry)\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Add as error step (red cross)\n\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: errorStepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\n\t\t// Add a new in_progress step so the spinner stays visible while user retries\n\t\t// and so subsequent events (another INVALID, SUCCESS, etc.) have a step to complete\n\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: retryStepId,\n\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\tmessage: \"Waiting for verification...\",\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\tstate.currentExecutingStepId = retryStepId;\n\t\t// userActionRequest and userActionPending stay set (modal stays open)\n\t} else if (eventType === \"USER_ACTION_EXPIRED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_REJECTED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"rejected\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_RESENT\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\t// Informational only -- don't complete the prior step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_FAILED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message || event.errorMessage);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"INTENT_THINKING\") {\n\t\t// Close previous thinking block if a new one arrives back-to-back\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst prev = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (prev) prev.isThinking = false;\n\t\t}\n\n\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\tif (lastInProgress) {\n\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\tlastInProgress.isThinking = true;\n\t\t\tstate.currentThinkingStepId = lastInProgress.id;\n\t\t} else {\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\n\t\tif (state.allThinkingText) state.allThinkingText += \"\\n\\n\";\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tstate.activeThinkingText = \"\";\n\t\t}\n\t} else if (eventType === \"INTENT_THINKING_CONT\") {\n\t\tconst delta = event.message || \"\";\n\t\tif (!delta) return state;\n\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst step = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (step) {\n\t\t\t\tstep.thinkingText = (step.thinkingText || \"\") + delta;\n\t\t\t}\n\t\t}\n\n\t\tstate.allThinkingText += delta;\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tif (state.activeThinkingText == null) state.activeThinkingText = \"\";\n\t\t\tstate.activeThinkingText += delta;\n\t\t}\n\t}\n\t// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\nimport {\n\tgetUserActionDisplayMessage,\n\tworkingPhaseDetailForDisplay,\n} from \"./eventProcessor\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * Build a richly-formatted thinking string from the SDK's `steps` array\n * and raw `allThinkingText`. This matches the demo's streaming format\n * so both the SDK and demo produce identical thinking output.\n *\n * The SDK's `allThinkingText` only contains raw `INTENT_THINKING_CONT`\n * deltas — no phase headers. This function reconstructs the full format\n * from the steps array, which stores every event the SDK processes.\n */\nexport function buildFormattedThinking(\n\tsteps: StreamingStep[] | undefined,\n\tallThinkingText: string,\n): string {\n\tconst parts: string[] = [];\n\tconst safeSteps = steps ?? [];\n\n\t// Detect orphaned \"preflight\" thinking:\n\t// INTENT_THINKING events that fire before any INTENT_STARTED don't\n\t// create steps, so their text lives only in allThinkingText.\n\tconst cleanAll = allThinkingText.replace(/^\\s+/, \"\");\n\tif (cleanAll) {\n\t\tconst firstStepWithThinking = safeSteps.find(\n\t\t\t(s) => s.thinkingText && s.thinkingText.trim(),\n\t\t);\n\n\t\tif (!firstStepWithThinking) {\n\t\t\tparts.push(\"**Preflight**\");\n\t\t\tparts.push(cleanAll);\n\t\t} else {\n\t\t\tconst stepText = firstStepWithThinking.thinkingText!.trim();\n\t\t\tconst idx = cleanAll.indexOf(stepText);\n\t\t\tif (idx > 0) {\n\t\t\t\tconst orphaned = cleanAll.substring(0, idx).replace(/\\s+$/, \"\");\n\t\t\t\tif (orphaned) {\n\t\t\t\t\tparts.push(\"**Preflight**\");\n\t\t\t\t\tparts.push(orphaned);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build formatted sections from steps\n\tfor (const step of safeSteps) {\n\t\tswitch (step.eventType) {\n\t\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\t\tparts.push(\"**Planning**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"WORKING\": {\n\t\t\t\tconst detail = workingPhaseDetailForDisplay(step.message || \"\");\n\t\t\t\tparts.push(\"**Working**\");\n\t\t\t\tif (detail) parts.push(detail);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_STARTED\": {\n\t\t\t\tlet label = step.message || \"Processing\";\n\t\t\t\tconst started = label.match(/^(.+?)\\s+started$/i);\n\t\t\t\tconst progress = label.match(/^(.+?)\\s+in progress$/i);\n\t\t\t\tif (started) label = started[1];\n\t\t\t\telse if (progress) label = progress[1];\n\t\t\t\tparts.push(`**${label}**`);\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\telse if (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\t\tparts.push(\"**Finalizing**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\t\tparts.push(\"**Verification Required**\");\n\t\t\t\tif (step.message) {\n\t\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\tparts.push(`✓ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_RESENT\":\n\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(\"\\n\") : allThinkingText;\n}\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? FRIENDLY_ERROR_MESSAGE\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : \"\",\n\t\tcurrentMessage: state.hasError ? undefined : state.currentMessage,\n\t\tstreamProgress: state.hasError ? (\"error\" as const) : (\"processing\" as const),\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\tsessionId: state.sessionId,\n\t\tsteps,\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t};\n}\n\n/**\n * Create error message update for abort or error scenarios\n */\nexport function createErrorMessageUpdate(\n\terror: Error,\n\tstate: {\n\t\taccumulatedContent: string;\n\t\tcurrentMessage?: string;\n\t\tsteps: StreamingStep[];\n\t}\n): Partial<MessageDisplay> {\n\tconst isAborted = error.name === \"AbortError\";\n\n\treturn {\n\t\tisStreaming: false,\n\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\tisError: !isAborted,\n\t\tisCancelled: isAborted,\n\t\terrorDetails: isAborted ? undefined : error.message,\n\t\tcontent: isAborted\n\t\t\t? state.accumulatedContent || \"\"\n\t\t\t: state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,\n\t\t// Preserve currentMessage when cancelled so UI can show it\n\t\tcurrentMessage: isAborted ? state.currentMessage || \"Thinking...\" : undefined,\n\t\tsteps: [...state.steps].map((step) => {\n\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t}\n\t\t\treturn step;\n\t\t}),\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Create final completed message\n */\nexport function createFinalMessage(\n\tstreamingId: string,\n\tstate: {\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t\taccumulatedContent: string;\n\t\tsessionId?: string;\n\t\texecutionId?: string;\n\t\tfinalData?: unknown;\n\t\tsteps: StreamingStep[];\n\t\tuserActionResult?: UserActionResult;\n\t\tallThinkingText?: string;\n\t\tisResolvingImages?: boolean;\n\t}\n): MessageDisplay {\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || \"\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tisStreaming: false,\n\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\ttracingData: state.finalData,\n\t\tsteps,\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: undefined,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t\tisResolvingImages: state.hasError ? undefined : state.isResolvingImages,\n\t};\n}\n\n/**\n * Create cancelled message update\n */\nexport function createCancelledMessageUpdate(\n\tsteps: StreamingStep[],\n\tcurrentMessage?: string\n): Partial<MessageDisplay> {\n\tconst updatedSteps = steps.map((step) => {\n\t\tif (step.status === \"in_progress\") {\n\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t}\n\t\treturn step;\n\t});\n\n\treturn {\n\t\tisStreaming: false,\n\t\tisCancelled: true,\n\t\tsteps: updatedSteps,\n\t\tcurrentExecutingStepId: undefined,\n\t\t// Preserve currentMessage so UI can show it with X icon\n\t\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\n}\n","import type { BaseChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: BaseChatConfig,\n\tuserMessage: string,\n\tsessionId?: string,\n): Record<string, unknown> {\n\tconst owner = config.session?.owner;\n\tconst sessionAttributes =\n\t\towner?.attributes && Object.keys(owner.attributes).length > 0\n\t\t\t? owner.attributes\n\t\t\t: undefined;\n\n\treturn {\n\t\tworkflowName: config.workflow.name,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: owner?.id || \"\",\n\t\tsessionOwnerLabel: owner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\nfunction getStageParamName(config: BaseChatConfig): string {\n\treturn config.api.stageQueryParam ?? \"stage\";\n}\n\nfunction getStage(config: BaseChatConfig): string {\n\treturn config.workflow.stage ?? \"DEV\";\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: BaseChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst queryParams = new URLSearchParams({\n\t\t[getStageParamName(config)]: getStage(config),\n\t});\n\n\tif (config.workflow.version !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflow.version));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\n}\n\nfunction deriveBasePath(config: BaseChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalized = endpointPath.replace(/\\/+$/, \"\");\n\treturn normalized.endsWith(\"/stream\")\n\t\t? normalized.slice(0, -\"/stream\".length)\n\t\t: normalized;\n}\n\n/**\n * Build user action URL (submit / cancel / resend)\n */\nexport function buildUserActionUrl(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n): string {\n\tconst basePath = deriveBasePath(config);\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n */\nexport function buildResolveImagesUrl(config: BaseChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\treturn `${config.api.baseUrl}${deriveBasePath(config)}/resolve-image-urls`;\n}\n\n/**\n * Build request headers\n */\nexport function buildRequestHeaders(config: BaseChatConfig): Record<string, string> {\n\tconst headers: Record<string, string> = { ...config.api.headers };\n\tif (config.api.authToken) {\n\t\theaders.Authorization = `Bearer ${config.api.authToken}`;\n\t}\n\treturn headers;\n}\n\n/**\n * Composite scope key for chatStore / activeStreamStore.\n * Same (userId, workflow id, version, stage) → same state across unmount/remount.\n */\nexport function buildScopeKey(config: BaseChatConfig): string {\n\treturn [\n\t\tconfig.session?.userId ?? \"\",\n\t\tconfig.workflow.id ?? \"\",\n\t\tconfig.workflow.version ?? \"\",\n\t\tconfig.workflow.stage ?? \"\",\n\t].join(\"|\");\n}\n","import type { BaseChatConfig } from \"../types\";\nimport { buildUserActionUrl, buildRequestHeaders } from \"./requestBuilder\";\n\ntype UserActionResponse = {\n\tsuccess: boolean;\n\tmessage: string;\n};\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws on non-2xx status or JSON parse failure.\n */\nasync function sendUserActionRequest(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\tconst url = buildUserActionUrl(config, userActionId, action);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst hasBody = data !== undefined;\n\tconst headers = hasBody\n\t\t? { \"Content-Type\": \"application/json\", ...baseHeaders }\n\t\t: baseHeaders;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: hasBody ? JSON.stringify(data) : undefined,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn await response.json();\n}\n\n/**\n * Submit a user action (e.g. OTP verification)\n */\nexport async function submitUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", data);\n}\n\n/**\n * Cancel / reject a user action\n */\nexport async function cancelUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"cancel\");\n}\n\n/**\n * Resend a user action (e.g. request a new OTP)\n */\nexport async function resendUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"resend\");\n}\n","import type { MessageDisplay } from \"../types\";\n\nconst memoryStore = new Map<string, MessageDisplay[]>();\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\treturn memoryStore.get(key) ?? [];\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tmemoryStore.set(key, messages);\n\t},\n\tdelete(key: string): void {\n\t\tmemoryStore.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\nimport {\n\textractResponseContent,\n\tgetEventMessage,\n\tgetUserActionDisplayMessage,\n\tworkingPhaseDetailForDisplay,\n} from \"./eventProcessor\";\n\nexport type V2EventProcessorState = {\n\tformattedThinkingText: string;\n\tfinalResponse: string;\n\tcurrentWorker: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction shouldShowIntentHeader(event: StreamEvent): boolean {\n\tconst workerName = getEventText(event, \"workerName\");\n\tconst intentId = getEventText(event, \"intentId\");\n\treturn Boolean(workerName && intentId && workerName === intentId);\n}\n\nfunction addThinkingHeader(state: V2EventProcessorState, header: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header;\n}\n\nfunction addThinkingDetail(state: V2EventProcessorState, detail: string) {\n\tconst trimmed = detail.trim();\n\tif (!trimmed) return;\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + trimmed;\n}\n\nfunction addThinkingLine(state: V2EventProcessorState, header: string, detail: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header + \"\\n\" + detail;\n}\n\nfunction appendThinkingText(state: V2EventProcessorState, text: string) {\n\tstate.formattedThinkingText += text;\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tformattedThinkingText: \"\",\n\t\tfinalResponse: \"\",\n\t\tcurrentWorker: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActionRequest: undefined,\n\t\tuserActionPending: false,\n\t\tuserActionResult: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\nexport function processStreamEventV2(\n\tevent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst eventType = event.eventType;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\tcase \"STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_THINKING\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Thinking...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\n\t\t\tif (worker !== state.currentWorker) {\n\t\t\t\tstate.currentWorker = worker;\n\t\t\t\tif (showHeader && msg && msg !== worker) {\n\t\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t\t} else if (showHeader) {\n\t\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t\t} else if (msg && msg !== \"Thinking...\") {\n\t\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t\t}\n\t\t\t} else if (msg && (showHeader || msg !== \"Thinking...\")) {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t}\n\n\t\t\t// Backward-compat step tracking\n\t\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\t\tif (lastInProgress) {\n\t\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\t\tlastInProgress.isThinking = true;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_THINKING_CONT\": {\n\t\t\tconst msg = (event.message as string) || \"\";\n\t\t\tif (!msg) break;\n\n\t\t\tif (state.lastEventType === \"INTENT_THINKING\") {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t} else {\n\t\t\t\tappendThinkingText(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = [...state.steps].reverse().find(s => s.isThinking);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.thinkingText = (thinkingStep.thinkingText || \"\") + msg;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING_CONT\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Planning**\", (event.message as string) || \"Understanding your request...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_COMPLETED\": {\n\t\t\tconst workingDetail = workingPhaseDetailForDisplay(message);\n\t\t\tif (workingDetail) {\n\t\t\t\taddThinkingLine(state, \"**Working**\", workingDetail);\n\t\t\t} else {\n\t\t\t\taddThinkingHeader(state, \"**Working**\");\n\t\t\t}\n\n\t\t\tstate.steps.push({\n\t\t\t\tid: `step-${state.stepCounter++}`,\n\t\t\t\teventType: \"WORKING\",\n\t\t\t\tmessage: workingDetail,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Starting...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\t\t\tstate.currentWorker = worker;\n\n\t\t\tif (showHeader && msg !== worker) {\n\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t} else if (showHeader) {\n\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t} else {\n\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = state.steps.find(s => s.isThinking);\n\t\t\tif (thinkingStep) thinkingStep.isThinking = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Finalizing**\", (event.message as string) || \"Preparing response...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_COMPLETED\": {\n\t\t\tappendThinkingText(state, \"\\n\" + ((event.message as string) || \"Response ready\"));\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\tcase \"COMPLETED\": {\n\t\t\tlet content = extractResponseContent(event.response);\n\t\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\t\tcontent = trace.workflowMsg;\n\t\t\t}\n\t\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\t\telse content = extractResponseContent(agg.response);\n\t\t\t}\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t\tstep.isThinking = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tif (event.userActionRequest) {\n\t\t\t\tstate.userActionRequest = {\n\t\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t\t};\n\t\t\t}\n\t\t\tstate.userActionPending = true;\n\n\t\t\tconst req = event.userActionRequest;\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(req?.message as string | undefined) || message,\n\t\t\t);\n\t\t\tif (req) {\n\t\t\t\taddThinkingLine(state, \"**Verification Required**\", displayMessage);\n\t\t\t}\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_SUCCESS\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✓ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"approved\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_INVALID\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: errorStepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\n\t\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: retryStepId,\n\t\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\t\tmessage: \"Waiting for verification...\",\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = retryStepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REJECTED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"rejected\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_EXPIRED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_RESENT\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_FAILED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(event.message as string | undefined) || (event.errorMessage as string | undefined),\n\t\t\t);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_ERROR\": {\n\t\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"error\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import type { BaseChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: BaseChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { BaseChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEventV2, createInitialV2State } from \"../utils/v2EventProcessor\";\nimport { getEventMessage, getUserActionDisplayMessage } from \"../utils/eventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * V2 stream manager that mirrors the demo's streaming approach:\n * - Builds `formattedThinkingText` incrementally during events (with headers/sections)\n * - Buffers the final response until WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: BaseChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\tif (typeof event.eventType === \"string\" && event.eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg = getUserActionDisplayMessage(\n\t\t\t\t\t\t\t\teventType,\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\t\tgetEventMessage(event),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\tconst currentMessage = activeStep?.message || lastInProgressStep?.message || getEventMessage(event);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Response is buffered until onComplete — only thinking text updates during streaming\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: \"\",\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\ttracingData: state.finalData,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\tformattedThinkingText: state.hasError ? undefined : state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import type {\n\tBaseChatConfig,\n\tSessionListResponse,\n\tConversationListResponse,\n} from \"../types\";\nimport { buildRequestHeaders } from \"./requestBuilder\";\n\nconst DEFAULT_SESSION_PAGE_SIZE = 20;\nconst DEFAULT_CONVERSATION_PAGE_SIZE = 50;\n\ntype ListSessionsOptions = {\n\tpage?: number;\n\tsize?: number;\n\tsignal?: AbortSignal;\n};\n\ntype ListConversationsOptions = {\n\tsessionId: string;\n\tpage?: number;\n\tsize?: number;\n\tsignal?: AbortSignal;\n};\n\nfunction getStageParamName(config: BaseChatConfig): string {\n\treturn config.api.stageQueryParam ?? \"stage\";\n}\n\nfunction requireOwnerId(config: BaseChatConfig): string {\n\tconst ownerId = config.session?.owner?.id;\n\tif (!ownerId) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: session.owner.id is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn ownerId;\n}\n\nfunction requireWorkflowName(config: BaseChatConfig): string {\n\tconst workflowName = config.workflow.name;\n\tif (!workflowName) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: workflow.name is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn workflowName;\n}\n\nfunction requireWorkflowId(config: BaseChatConfig): string {\n\tconst workflowId = config.workflow.id;\n\tif (!workflowId) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: workflow.id is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn workflowId;\n}\n\n/**\n * Playground-style auth: no authToken, but a yaak-api-key header is present.\n * In that case we must hit the workflow-scoped endpoint instead of the\n * workflow-user-scoped endpoint, since the caller isn't authenticated as a\n * Payman user.\n */\nfunction isPlaygroundYaakAuth(config: BaseChatConfig): boolean {\n\tif (config.api.authToken) return false;\n\tconst headers = config.api.headers;\n\tif (!headers) return false;\n\tfor (const key of Object.keys(headers)) {\n\t\tconst lower = key.toLowerCase();\n\t\tif (lower === \"yaak-api-key\" || lower === \"x-yaak-api-key\") return true;\n\t}\n\treturn false;\n}\n\nasync function fetchJson<T>(\n\turl: string,\n\theaders: Record<string, string>,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn (await response.json()) as T;\n}\n\n/**\n * List the recent sessions for the current `session.owner.id` within a workflow.\n *\n * Two variants, selected by auth mode:\n *\n * 1. Authenticated user (api.authToken present, or any auth mode that isn't\n * yaak-api-key playground):\n * GET {baseUrl}/api/workflow-users/{ownerId}/sessions\n * ?workflowId={workflow.id}&{stageParam}={stage}&page=&size=\n *\n * 2. Playground / yaak-api-key (no authToken, yaak-api-key header present):\n * GET {baseUrl}/api/workflows/ask/sessions\n * ?workflowUserId={ownerId}&workflowName={workflow.name}&{stageParam}={stage}&page=&size=\n */\nexport async function listSessions(\n\tconfig: BaseChatConfig,\n\topts: ListSessionsOptions = {},\n): Promise<SessionListResponse> {\n\tconst ownerId = requireOwnerId(config);\n\n\tconst useYaakEndpoint = isPlaygroundYaakAuth(config);\n\n\tconst params = new URLSearchParams({\n\t\tpage: String(opts.page ?? 0),\n\t\tsize: String(opts.size ?? DEFAULT_SESSION_PAGE_SIZE),\n\t});\n\tif (useYaakEndpoint) {\n\t\tparams.set(\"workflowUserId\", ownerId);\n\t\tparams.set(\"workflowName\", requireWorkflowName(config));\n\t} else {\n\t\tparams.set(\"workflowId\", requireWorkflowId(config));\n\t}\n\tif (config.workflow.stage) {\n\t\tparams.set(getStageParamName(config), config.workflow.stage);\n\t}\n\n\tconst url = useYaakEndpoint\n\t\t? `${config.api.baseUrl}/api/workflows/ask/sessions?${params.toString()}`\n\t\t: `${config.api.baseUrl}/api/workflow-users/${encodeURIComponent(\n\t\t\t\townerId,\n\t\t\t)}/sessions?${params.toString()}`;\n\n\treturn fetchJson<SessionListResponse>(\n\t\turl,\n\t\tbuildRequestHeaders(config),\n\t\topts.signal,\n\t);\n}\n\n/**\n * List the conversation history for a single session.\n *\n * Two variants, selected by auth mode (mirrors `listSessions`):\n *\n * 1. Authenticated user (api.authToken present, or no yaak-api-key header):\n * GET {baseUrl}/api/workflow-users/{ownerId}/conversations\n * ?sessionId={sessionId}&{stageParam}={stage}&page=&size=\n *\n * 2. Playground / yaak-api-key (no authToken, x-yaak-api-key header present):\n * GET {baseUrl}/api/workflows/ask/conversations\n * ?workflowUserId={ownerId}&workflowName={workflow.name}&sessionId={sessionId}\n * &{stageParam}={stage}&page=&size=\n */\nexport async function listConversations(\n\tconfig: BaseChatConfig,\n\topts: ListConversationsOptions,\n): Promise<ConversationListResponse> {\n\tconst ownerId = requireOwnerId(config);\n\n\tconst useYaakEndpoint = isPlaygroundYaakAuth(config);\n\n\tconst params = new URLSearchParams({\n\t\tsessionId: opts.sessionId,\n\t\tpage: String(opts.page ?? 0),\n\t\tsize: String(opts.size ?? DEFAULT_CONVERSATION_PAGE_SIZE),\n\t});\n\tif (useYaakEndpoint) {\n\t\tparams.set(\"workflowUserId\", ownerId);\n\t\tparams.set(\"workflowName\", requireWorkflowName(config));\n\t}\n\tif (config.workflow.stage) {\n\t\tparams.set(getStageParamName(config), config.workflow.stage);\n\t}\n\n\tconst url = useYaakEndpoint\n\t\t? `${config.api.baseUrl}/api/workflows/ask/conversations?${params.toString()}`\n\t\t: `${config.api.baseUrl}/api/workflow-users/${encodeURIComponent(\n\t\t\t\townerId,\n\t\t\t)}/conversations?${params.toString()}`;\n\n\treturn fetchJson<ConversationListResponse>(\n\t\turl,\n\t\tbuildRequestHeaders(config),\n\t\topts.signal,\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n\tBaseChatConfig,\n\tChatCallbacks,\n\tConversationEntry,\n\tMessageDisplay,\n\tUserActionState,\n} from \"../types\";\nimport { generateId } from \"../utils\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n} from \"../utils/userActionClient\";\nimport { listConversations } from \"../utils/workflowUsersClient\";\nimport { buildScopeKey } from \"../utils/requestBuilder\";\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string) => Promise<void>;\n\tclearMessages: () => void;\n\t/** Prepend older messages (e.g. loaded from history pagination). */\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\tuserActionState: UserActionState;\n\tapproveUserAction: (otp: string) => Promise<void>;\n\trejectUserAction: () => Promise<void>;\n\tresendOtp: () => Promise<void>;\n\t/**\n\t * Replace the active chat with a prior session's conversation history.\n\t * Cancels any in-flight stream, clears current messages, fetches page 0 of\n\t * conversations for `sessionId`, and renders them as historical rows.\n\t */\n\tloadSession: (sessionId: string) => Promise<void>;\n\t/**\n\t * The session id whose conversation history is currently being fetched\n\t * via `loadSession`. `undefined` while idle. Use to render an activity\n\t * indicator in the messages area / on the matching sidebar row.\n\t */\n\tloadingSessionId: string | undefined;\n};\n\n/** Expand one conversation entry into a user + assistant pair of historical rows. */\nfunction conversationEntryToMessages(entry: ConversationEntry, sessionId: string): MessageDisplay[] {\n\treturn [\n\t\t{\n\t\t\tid: `history-user-${entry.executionId}`,\n\t\t\tsessionId,\n\t\t\trole: \"user\",\n\t\t\tcontent: entry.query,\n\t\t\ttimestamp: entry.createdAt,\n\t\t\tisHistorical: true,\n\t\t},\n\t\t{\n\t\t\tid: `history-assistant-${entry.executionId}`,\n\t\t\tsessionId,\n\t\t\trole: \"assistant\",\n\t\t\tcontent: entry.response,\n\t\t\ttimestamp: entry.createdAt,\n\t\t\texecutionId: entry.executionId,\n\t\t\tisHistorical: true,\n\t\t},\n\t];\n}\n\n/**\n * activeStreamStore is keyed per (scope, sessionId) so that an in-flight\n * stream for session A survives the user switching to session B and back.\n */\nfunction streamKeyFor(scopeKey: string, sessionId: string | undefined): string {\n\treturn `${scopeKey}|sid:${sessionId ?? \"\"}`;\n}\n\nexport function useChatV2(config: BaseChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst scopeKey = useMemo(() => buildScopeKey(config), [\n\t\tconfig.session?.userId,\n\t\tconfig.workflow.id,\n\t\tconfig.workflow.version,\n\t\tconfig.workflow.stage,\n\t]);\n\n\tconst initialSessionId =\n\t\t(chatStore.get(scopeKey).find((m) => m.sessionId)?.sessionId) ??\n\t\tconfig.session?.initialId ??\n\t\tundefined;\n\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => {\n\t\tconst stored = chatStore.get(scopeKey);\n\t\tif (stored.length > 0) return stored;\n\t\treturn config.session?.initialMessages ?? [];\n\t});\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst [loadingSessionId, setLoadingSessionId] = useState<string | undefined>(undefined);\n\t// Currently-viewed session id. Drives the subscription to activeStreamStore\n\t// so that switching sessions switches which live stream we mirror.\n\tconst [currentSessionId, setCurrentSessionId] = useState<string | undefined>(initialSessionId);\n\n\tconst sessionIdRef = useRef<string | undefined>(initialSessionId);\n\tconst prevScopeKeyRef = useRef<string>(scopeKey);\n\t// The session id that any in-flight stream belongs to. May differ from the\n\t// currently-viewed session while the user is browsing other sessions.\n\tconst activeStreamSessionRef = useRef<string | undefined>(undefined);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst scopeKeyRef = useRef(scopeKey);\n\tscopeKeyRef.current = scopeKey;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tconst streamSid = activeStreamSessionRef.current;\n\t\t\tif (streamSid !== undefined) {\n\t\t\t\tconst streamKey = streamKeyFor(scope, streamSid);\n\t\t\t\tif (activeStreamStore.has(streamKey)) {\n\t\t\t\t\tactiveStreamStore.applyMessages(\n\t\t\t\t\t\tstreamKey,\n\t\t\t\t\t\tupdater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Only reflect into React state when we're still viewing the\n\t\t\t\t// session the stream belongs to. Otherwise the user is on a\n\t\t\t\t// different session and must not see the in-flight updates.\n\t\t\t\tif (sessionIdRef.current === streamSid) {\n\t\t\t\t\tsetMessages(updater);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetMessages(updater);\n\t\t},\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback((waiting: boolean) => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst streamSid = activeStreamSessionRef.current;\n\t\tif (streamSid !== undefined) {\n\t\t\tconst streamKey = streamKeyFor(scope, streamSid);\n\t\t\tif (activeStreamStore.has(streamKey)) {\n\t\t\t\tactiveStreamStore.setWaiting(streamKey, waiting);\n\t\t\t}\n\t\t\tif (sessionIdRef.current === streamSid) {\n\t\t\t\tsetIsWaitingForResponse(waiting);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsetIsWaitingForResponse(waiting);\n\t}, []);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>({\n\t\trequest: null,\n\t\tresult: null,\n\t\tclearOtpTrigger: 0,\n\t});\n\n\tconst userActionStateRef = useRef(userActionState);\n\tuserActionStateRef.current = userActionState;\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(\n\t\t() => ({\n\t\t\t...callbacksRef.current,\n\t\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\t\tonUserActionRequired: (request) => {\n\t\t\t\tsetUserActionState((prev) => ({ ...prev, request, result: null }));\n\t\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t\t},\n\t\t\tonUserActionEvent: (eventType, message) => {\n\t\t\t\tswitch (eventType) {\n\t\t\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"approved\" }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"rejected\" }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, message);\n\t\t\t},\n\t\t}),\n\t\t[],\n\t);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\tconst autoGen = configRef.current.session?.autoGenerateId;\n\t\t\tif (!sessionIdRef.current && autoGen !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tsetCurrentSessionId(sessionIdRef.current);\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tconst streamSessionId = sessionIdRef.current;\n\t\t\tconst streamKey = streamKeyFor(scope, streamSessionId);\n\t\t\tactiveStreamSessionRef.current = streamSessionId;\n\n\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\tactiveStreamStore.start(streamKey, abortController, initialMessages);\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tstreamSessionId,\n\t\t\t\tabortController,\n\t\t\t);\n\n\t\t\tactiveStreamStore.complete(streamKey);\n\t\t\tactiveStreamSessionRef.current = undefined;\n\n\t\t\t// Only update sessionIdRef / currentSessionId from the server if the\n\t\t\t// user is still viewing the stream's session; otherwise leave their\n\t\t\t// current selection alone.\n\t\t\tif (\n\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\tnewSessionId &&\n\t\t\t\tnewSessionId !== streamSessionId &&\n\t\t\t\tsessionIdRef.current === streamSessionId\n\t\t\t) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t\tsetCurrentSessionId(newSessionId);\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tchatStore.delete(scopeKeyRef.current);\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst viewSid = sessionIdRef.current;\n\t\tconst viewStreamKey = streamKeyFor(scope, viewSid);\n\t\tif (activeStreamStore.has(viewStreamKey)) {\n\t\t\tactiveStreamStore.abort(viewStreamKey);\n\t\t}\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: null }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(msg.steps || [], msg.currentMessage),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst viewSid = sessionIdRef.current;\n\t\tconst viewStreamKey = streamKeyFor(scope, viewSid);\n\t\tif (activeStreamStore.has(viewStreamKey)) {\n\t\t\tactiveStreamStore.abort(viewStreamKey);\n\t\t}\n\t\tchatStore.delete(scope);\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tsetCurrentSessionId(undefined);\n\t\tactiveStreamSessionRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, []);\n\n\tconst getSessionId = useCallback(() => sessionIdRef.current, []);\n\tconst getMessages = useCallback(() => messages, [messages]);\n\n\tconst approveUserAction = useCallback(async (otp: string) => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait submitUserActionApi(configRef.current, request.userActionId, { otp });\n\t\t} catch (error) {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t}));\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst rejectUserAction = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tsetMessages((prev) => {\n\t\t\t\tlet lastStreamingIdx = -1;\n\t\t\t\tfor (let i = prev.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (prev[i].role === \"assistant\" && prev[i].isStreaming) {\n\t\t\t\t\t\tlastStreamingIdx = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastStreamingIdx === -1) return prev;\n\t\t\t\treturn prev.map((msg, i) =>\n\t\t\t\t\ti === lastStreamingIdx ? { ...msg, currentMessage: \"Rejecting...\" } : msg,\n\t\t\t\t);\n\t\t\t});\n\t\t\tawait cancelUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst resendOtp = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait resendUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst inFlightLoadRef = useRef<{\n\t\tsessionId: string;\n\t\tpromise: Promise<void>;\n\t} | null>(null);\n\tconst loadingSessionIdRef = useRef<string | undefined>(undefined);\n\tloadingSessionIdRef.current = loadingSessionId;\n\n\tconst loadSession = useCallback(async (sessionId: string) => {\n\t\t// Dedupe: if this exact session is already being loaded, return the\n\t\t// in-flight promise instead of firing another conversations request.\n\t\tconst inFlight = inFlightLoadRef.current;\n\t\tif (inFlight && inFlight.sessionId === sessionId) {\n\t\t\treturn inFlight.promise;\n\t\t}\n\t\t// If the user is already viewing this session and nothing is loading\n\t\t// (or being loaded for it), it's a no-op — no need to wipe state and\n\t\t// re-fetch the conversations.\n\t\tif (\n\t\t\tsessionIdRef.current === sessionId &&\n\t\t\tloadingSessionIdRef.current !== sessionId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst run = async () => {\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\n\t\t\tsessionIdRef.current = sessionId;\n\t\t\tsetCurrentSessionId(sessionId);\n\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionId);\n\n\t\t\t// If an in-flight stream exists for the selected session, restore\n\t\t\t// it live instead of wiping state or re-fetching history. The\n\t\t\t// subscription effect (below) will continue mirroring further\n\t\t\t// updates into state.\n\t\t\tconst streamKey = streamKeyFor(scope, sessionId);\n\t\t\tconst active = activeStreamStore.get(streamKey);\n\t\t\tif (active) {\n\t\t\t\tsetMessages(active.messages);\n\t\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t\t\tsetLoadingSessionId(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetMessages([]);\n\t\t\tchatStore.delete(scope);\n\t\t\tsetLoadingSessionId(sessionId);\n\n\t\t\ttry {\n\t\t\t\tconst response = await listConversations(configRef.current, { sessionId });\n\t\t\t\tconst entries = response.data ?? [];\n\t\t\t\tconst historical = entries.flatMap((entry) => conversationEntryToMessages(entry, sessionId));\n\t\t\t\t// Only apply if the user is still on this session (they may\n\t\t\t\t// have switched away while the request was in flight).\n\t\t\t\tif (sessionIdRef.current === sessionId) {\n\t\t\t\t\tsetMessages(historical);\n\t\t\t\t}\n\t\t\t\tif (historical.length > 0) {\n\t\t\t\t\tchatStore.set(scope, historical);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tsetLoadingSessionId((current) => (current === sessionId ? undefined : current));\n\t\t\t}\n\t\t};\n\n\t\tconst promise = run().finally(() => {\n\t\t\tif (inFlightLoadRef.current?.sessionId === sessionId) {\n\t\t\t\tinFlightLoadRef.current = null;\n\t\t\t}\n\t\t});\n\t\tinFlightLoadRef.current = { sessionId, promise };\n\t\treturn promise;\n\t}, []);\n\n\t// Subscribe to the live stream store for the currently-viewed session.\n\t// Re-runs when either scope or the viewed session changes so that\n\t// switching sessions switches which in-flight stream (if any) we mirror.\n\tuseEffect(() => {\n\t\tconst key = streamKeyFor(scopeKey, currentSessionId);\n\t\tconst unsubscribe = activeStreamStore.subscribe(key, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(key);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t}, [scopeKey, currentSessionId]);\n\n\tuseEffect(() => {\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(scopeKey, toSave);\n\t\t}\n\t}, [messages, scopeKey]);\n\n\t// Scope-key change (e.g. user logged out, workflow/version/stage switched):\n\t// rehydrate from the new scope's stored messages and session.\n\tuseEffect(() => {\n\t\tconst prevKey = prevScopeKeyRef.current;\n\t\tprevScopeKeyRef.current = scopeKey;\n\t\tif (prevKey === scopeKey) return;\n\n\t\tconst stored = chatStore.get(scopeKey);\n\t\tsetMessages(stored);\n\t\tconst restoredSessionId =\n\t\t\tstored.find((m) => m.sessionId)?.sessionId ??\n\t\t\tconfigRef.current.session?.initialId ??\n\t\t\tundefined;\n\t\tsessionIdRef.current = restoredSessionId;\n\t\tsetCurrentSessionId(restoredSessionId);\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, [scopeKey]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: currentSessionId,\n\t\tuserActionState,\n\t\tapproveUserAction,\n\t\trejectUserAction,\n\t\tresendOtp,\n\t\tloadSession,\n\t\tloadingSessionId,\n\t};\n}\n","// ============================================\n// Voice Hook - Web Implementation\n// Uses Web Speech API (SpeechRecognition)\n// ============================================\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type {\n\tVoiceCallbacks,\n\tVoiceConfig,\n\tVoicePermissions,\n\tVoiceState,\n\tUseVoiceReturn,\n} from \"../types/voice\";\n\n// ============================================\n// Web Speech API Types\n// ============================================\n\ninterface SpeechRecognitionEvent extends Event {\n\tresults: SpeechRecognitionResultList;\n\tresultIndex: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n\terror: string;\n\tmessage?: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n\tcontinuous: boolean;\n\tinterimResults: boolean;\n\tlang: string;\n\tmaxAlternatives: number;\n\tstart(): void;\n\tstop(): void;\n\tabort(): void;\n\tonstart: ((this: SpeechRecognition, ev: Event) => any) | null;\n\tonend: ((this: SpeechRecognition, ev: Event) => any) | null;\n\tonresult:\n\t\t| ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => any)\n\t\t| null;\n\tonerror:\n\t\t| ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => any)\n\t\t| null;\n}\n\ninterface SpeechRecognitionConstructor {\n\tnew (): SpeechRecognition;\n}\n\ndeclare global {\n\tinterface Window {\n\t\tSpeechRecognition?: SpeechRecognitionConstructor;\n\t\twebkitSpeechRecognition?: SpeechRecognitionConstructor;\n\t}\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction getSpeechRecognition(): SpeechRecognitionConstructor | null {\n\tif (typeof window === \"undefined\") return null;\n\treturn window.SpeechRecognition || window.webkitSpeechRecognition || null;\n}\n\n// ============================================\n// Hook Implementation\n// ============================================\n\nexport function useVoice(\n\tconfig: VoiceConfig = {},\n\tcallbacks: VoiceCallbacks = {}\n): UseVoiceReturn {\n\tconst [voiceState, setVoiceState] = useState<VoiceState>(\"idle\");\n\tconst [transcribedText, setTranscribedText] = useState(\"\");\n\tconst [isAvailable, setIsAvailable] = useState(false);\n\tconst [isRecording, setIsRecording] = useState(false);\n\n\tconst recognitionRef = useRef<SpeechRecognition | null>(null);\n\tconst autoStopTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n\tconst {\n\t\tlang = \"en-US\",\n\t\tinterimResults = true,\n\t\tcontinuous = true,\n\t\tmaxAlternatives = 1,\n\t\tautoStopAfterSilence,\n\t} = config;\n\n\tconst { onStart, onEnd, onResult, onError, onStateChange } = callbacks;\n\n\t// Check speech recognition availability\n\tuseEffect(() => {\n\t\tconst SpeechRecognitionAPI = getSpeechRecognition();\n\t\tsetIsAvailable(SpeechRecognitionAPI !== null);\n\t}, []);\n\n\t// Notify state changes\n\tuseEffect(() => {\n\t\tonStateChange?.(voiceState);\n\t}, [voiceState, onStateChange]);\n\n\t// Request permissions (web prompts automatically on start)\n\tconst requestPermissions = useCallback(async (): Promise<VoicePermissions> => {\n\t\ttry {\n\t\t\tconst result = await navigator.mediaDevices.getUserMedia({\n\t\t\t\taudio: true,\n\t\t\t});\n\t\t\t// Stop the stream immediately, we just wanted to check permissions\n\t\t\tresult.getTracks().forEach((track) => track.stop());\n\n\t\t\treturn {\n\t\t\t\tgranted: true,\n\t\t\t\tstatus: \"granted\",\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"denied\",\n\t\t\t};\n\t\t}\n\t}, []);\n\n\t// Get permissions\n\tconst getPermissions = useCallback(async (): Promise<VoicePermissions> => {\n\t\tif (typeof navigator === \"undefined\" || !navigator.permissions) {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"undetermined\",\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await navigator.permissions.query({\n\t\t\t\tname: \"microphone\" as PermissionName,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tgranted: result.state === \"granted\",\n\t\t\t\tstatus:\n\t\t\t\t\tresult.state === \"granted\"\n\t\t\t\t\t\t? \"granted\"\n\t\t\t\t\t\t: result.state === \"denied\"\n\t\t\t\t\t\t? \"denied\"\n\t\t\t\t\t\t: \"undetermined\",\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tgranted: false,\n\t\t\t\tstatus: \"undetermined\",\n\t\t\t};\n\t\t}\n\t}, []);\n\n\t// Clear auto-stop timer\n\tconst clearAutoStopTimer = useCallback(() => {\n\t\tif (autoStopTimerRef.current) {\n\t\t\tclearTimeout(autoStopTimerRef.current);\n\t\t\tautoStopTimerRef.current = null;\n\t\t}\n\t}, []);\n\n\t// Reset auto-stop timer\n\tconst resetAutoStopTimer = useCallback(() => {\n\t\tclearAutoStopTimer();\n\n\t\tif (autoStopAfterSilence && autoStopAfterSilence > 0) {\n\t\t\tautoStopTimerRef.current = setTimeout(() => {\n\t\t\t\tif (recognitionRef.current && isRecording) {\n\t\t\t\t\trecognitionRef.current.stop();\n\t\t\t\t}\n\t\t\t}, autoStopAfterSilence);\n\t\t}\n\t}, [autoStopAfterSilence, clearAutoStopTimer, isRecording]);\n\n\t// Stop recording\n\tconst stopRecording = useCallback(() => {\n\t\tif (recognitionRef.current) {\n\t\t\ttry {\n\t\t\t\trecognitionRef.current.stop();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\"Error stopping speech recognition:\", error);\n\t\t\t}\n\t\t}\n\t\tclearAutoStopTimer();\n\t\tsetIsRecording(false);\n\t\tsetVoiceState(\"idle\");\n\t}, [clearAutoStopTimer]);\n\n\t// Start recording\n\tconst startRecording = useCallback(async () => {\n\t\tconst SpeechRecognitionAPI = getSpeechRecognition();\n\n\t\tif (!SpeechRecognitionAPI) {\n\t\t\tonError?.(\"Speech recognition not supported in this browser\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Request microphone permission first\n\t\t\ttry {\n\t\t\t\tawait navigator.mediaDevices.getUserMedia({ audio: true });\n\t\t\t} catch (permError) {\n\t\t\t\tonError?.(\"Microphone access denied. Please allow microphone access in your browser settings.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create new recognition instance\n\t\t\tconst recognition = new SpeechRecognitionAPI();\n\t\t\trecognition.continuous = continuous;\n\t\t\trecognition.interimResults = interimResults;\n\t\t\trecognition.lang = lang;\n\t\t\trecognition.maxAlternatives = maxAlternatives;\n\n\t\t\t// Event handlers\n\t\t\trecognition.onstart = () => {\n\t\t\t\tsetVoiceState(\"listening\");\n\t\t\t\tsetIsRecording(true);\n\t\t\t\tonStart?.();\n\t\t\t\tresetAutoStopTimer();\n\t\t\t};\n\n\t\t\trecognition.onend = () => {\n\t\t\t\tsetVoiceState(\"idle\");\n\t\t\t\tsetIsRecording(false);\n\t\t\t\tclearAutoStopTimer();\n\t\t\t\tonEnd?.();\n\t\t\t};\n\n\t\t\trecognition.onresult = (event: SpeechRecognitionEvent) => {\n\t\t\t\tconst results = event.results;\n\t\t\t\tlet transcript = \"\";\n\n\t\t\t\t// Combine ALL results from the beginning (not just from resultIndex)\n\t\t\t\t// This ensures continuous speech is properly accumulated\n\t\t\t\tfor (let i = 0; i < results.length; i++) {\n\t\t\t\t\tconst result = results[i];\n\t\t\t\t\tif (result && result[0]) {\n\t\t\t\t\t\tconst text = result[0].transcript;\n\t\t\t\t\t\tif (transcript && !transcript.endsWith(\" \") && !text.startsWith(\" \")) {\n\t\t\t\t\t\t\ttranscript += \" \" + text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttranscript += text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttranscript = transcript.trim();\n\t\t\t\t\n\t\t\t\tif (transcript) {\n\t\t\t\t\tsetTranscribedText(transcript);\n\t\t\t\t\tonResult?.(transcript);\n\t\t\t\t\tresetAutoStopTimer();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\trecognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n\t\t\t\tsetVoiceState(\"error\");\n\t\t\t\tsetIsRecording(false);\n\t\t\t\tclearAutoStopTimer();\n\n\t\t\t\t// Provide more user-friendly error messages\n\t\t\t\tlet errorMessage = event.error;\n\t\t\t\tif (event.error === \"not-allowed\") {\n\t\t\t\t\terrorMessage = \"Microphone access denied. Please allow microphone access in your browser settings.\";\n\t\t\t\t} else if (event.error === \"no-speech\") {\n\t\t\t\t\terrorMessage = \"No speech detected. Please try again.\";\n\t\t\t\t} else if (event.error === \"audio-capture\") {\n\t\t\t\t\terrorMessage = \"No microphone found or microphone is in use.\";\n\t\t\t\t} else if (event.error === \"network\") {\n\t\t\t\t\terrorMessage = \"Network error occurred. Please check your connection.\";\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tonError?.(errorMessage);\n\t\t\t};\n\n\t\t\trecognitionRef.current = recognition;\n\t\t\tsetTranscribedText(\"\");\n\n\t\t\t// Start recognition\n\t\t\trecognition.start();\n\t\t} catch (error) {\n\t\t\tsetVoiceState(\"error\");\n\t\t\tsetIsRecording(false);\n\t\t\tonError?.(\n\t\t\t\terror instanceof Error ? error.message : \"Failed to start recording\"\n\t\t\t);\n\t\t}\n\t}, [\n\t\tlang,\n\t\tinterimResults,\n\t\tcontinuous,\n\t\tmaxAlternatives,\n\t\tonStart,\n\t\tonEnd,\n\t\tonResult,\n\t\tonError,\n\t\tgetPermissions,\n\t\tresetAutoStopTimer,\n\t\tclearAutoStopTimer,\n\t]);\n\n\t// Clear transcript\n\tconst clearTranscript = useCallback(() => {\n\t\tsetTranscribedText(\"\");\n\t}, []);\n\n\t// Reset\n\tconst reset = useCallback(() => {\n\t\tstopRecording();\n\t\tsetTranscribedText(\"\");\n\t\tsetVoiceState(\"idle\");\n\t}, [stopRecording]);\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (recognitionRef.current) {\n\t\t\t\ttry {\n\t\t\t\t\trecognitionRef.current.stop();\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tclearAutoStopTimer();\n\t\t};\n\t}, [clearAutoStopTimer]);\n\n\treturn {\n\t\tvoiceState,\n\t\ttranscribedText,\n\t\tisAvailable,\n\t\tisRecording,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\trequestPermissions,\n\t\tgetPermissions,\n\t\tclearTranscript,\n\t\treset,\n\t};\n}\n"]}
|