@paymanai/payman-typescript-ask-sdk 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -616,6 +616,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
616
616
  if (error.name !== "AbortError") {
617
617
  callbacksRef.current.onError?.(error);
618
618
  }
619
+ if (state.userActionPending) {
620
+ state.userActionPending = false;
621
+ state.userActionRequest = void 0;
622
+ callbacksRef.current.onUserActionEvent?.(
623
+ "USER_ACTION_FAILED",
624
+ "Connection lost. Please try again."
625
+ );
626
+ }
619
627
  setMessages(
620
628
  (prev) => prev.map(
621
629
  (msg) => msg.id === streamingId ? {
@@ -627,6 +635,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
627
635
  },
628
636
  onComplete: () => {
629
637
  setIsWaitingForResponse(false);
638
+ if (state.userActionPending) {
639
+ state.userActionPending = false;
640
+ state.userActionRequest = void 0;
641
+ callbacksRef.current.onUserActionEvent?.(
642
+ "USER_ACTION_FAILED",
643
+ "Verification could not be completed."
644
+ );
645
+ }
630
646
  if (state.currentSessionId && state.currentSessionId !== sessionId) {
631
647
  callbacksRef.current.onSessionIdChange?.(state.currentSessionId);
632
648
  }
@@ -648,6 +664,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
648
664
  if (error.name !== "AbortError") {
649
665
  callbacksRef.current.onError?.(error);
650
666
  }
667
+ if (state.userActionPending) {
668
+ state.userActionPending = false;
669
+ state.userActionRequest = void 0;
670
+ callbacksRef.current.onUserActionEvent?.(
671
+ "USER_ACTION_FAILED",
672
+ "Connection lost. Please try again."
673
+ );
674
+ }
651
675
  setMessages(
652
676
  (prev) => prev.map(
653
677
  (msg) => msg.id === streamingId ? {
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/hooks/useStreamManager.ts","../src/hooks/useChat.ts","../src/hooks/useVoice.ts"],"names":["events","useRef","useCallback","useState","useMemo","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\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\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 } 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\tdefault:\n\t\t\treturn eventType;\n\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\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\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\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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\tmessage: event.userActionRequest.message,\n\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\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}\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\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps],\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps],\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\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 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 { 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\";\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\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\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): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = 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\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};\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// 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// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tconst eventType = event.eventType;\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\t// Get current message from event (fallback to event-type message for user actions)\n\t\t\t\t\t\tconst rawMessage = event.message?.trim() || event.errorMessage?.trim();\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\trawMessage ||\n\t\t\t\t\t\t\t(event.eventType?.startsWith(\"USER_ACTION_\") ? getEventMessage(event) : undefined);\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\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\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// 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\tsetIsWaitingForResponse(false);\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 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});\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\treturn state.currentSessionId;\n\t\t\t} catch (error) {\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// 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, useMemo, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay, UserActionState } from \"../types\";\nimport { generateId } from \"../utils\";\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\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\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\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\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\tsetMessages,\n\t\tsetIsWaitingForResponse\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// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (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\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\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\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 — no stream event coming. Reset for retry.\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/cancel action\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\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","// ============================================\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/hooks/useStreamManager.ts","../src/hooks/useChat.ts","../src/hooks/useVoice.ts"],"names":["events","useRef","useCallback","useState","useMemo","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\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\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 } 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\tdefault:\n\t\t\treturn eventType;\n\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\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\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\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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\tmessage: event.userActionRequest.message,\n\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\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}\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\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps],\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps],\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\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 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 { 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\";\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\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\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): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = 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\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};\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// 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// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tconst eventType = event.eventType;\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\t// Get current message from event (fallback to event-type message for user actions)\n\t\t\t\t\t\tconst rawMessage = event.message?.trim() || event.errorMessage?.trim();\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\trawMessage ||\n\t\t\t\t\t\t\t(event.eventType?.startsWith(\"USER_ACTION_\") ? getEventMessage(event) : undefined);\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\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\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\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 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});\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\treturn state.currentSessionId;\n\t\t\t} catch (error) {\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, useMemo, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay, UserActionState } from \"../types\";\nimport { generateId } from \"../utils\";\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\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\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\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\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\tsetMessages,\n\t\tsetIsWaitingForResponse\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// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (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\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\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\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\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","// ============================================\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"]}
package/dist/index.mjs CHANGED
@@ -614,6 +614,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
614
614
  if (error.name !== "AbortError") {
615
615
  callbacksRef.current.onError?.(error);
616
616
  }
617
+ if (state.userActionPending) {
618
+ state.userActionPending = false;
619
+ state.userActionRequest = void 0;
620
+ callbacksRef.current.onUserActionEvent?.(
621
+ "USER_ACTION_FAILED",
622
+ "Connection lost. Please try again."
623
+ );
624
+ }
617
625
  setMessages(
618
626
  (prev) => prev.map(
619
627
  (msg) => msg.id === streamingId ? {
@@ -625,6 +633,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
625
633
  },
626
634
  onComplete: () => {
627
635
  setIsWaitingForResponse(false);
636
+ if (state.userActionPending) {
637
+ state.userActionPending = false;
638
+ state.userActionRequest = void 0;
639
+ callbacksRef.current.onUserActionEvent?.(
640
+ "USER_ACTION_FAILED",
641
+ "Verification could not be completed."
642
+ );
643
+ }
628
644
  if (state.currentSessionId && state.currentSessionId !== sessionId) {
629
645
  callbacksRef.current.onSessionIdChange?.(state.currentSessionId);
630
646
  }
@@ -646,6 +662,14 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
646
662
  if (error.name !== "AbortError") {
647
663
  callbacksRef.current.onError?.(error);
648
664
  }
665
+ if (state.userActionPending) {
666
+ state.userActionPending = false;
667
+ state.userActionRequest = void 0;
668
+ callbacksRef.current.onUserActionEvent?.(
669
+ "USER_ACTION_FAILED",
670
+ "Connection lost. Please try again."
671
+ );
672
+ }
649
673
  setMessages(
650
674
  (prev) => prev.map(
651
675
  (msg) => msg.id === streamingId ? {