@paymanai/payman-typescript-ask-sdk 1.2.3 → 1.2.4

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
@@ -209,11 +209,25 @@ function processStreamEvent(event, state) {
209
209
  }
210
210
  state.activeThinkingText = void 0;
211
211
  }
212
- if ((eventType === "COMPLETED" || eventType === "WORKFLOW_COMPLETED") && event.response !== void 0) {
213
- const content = extractResponseContent(event.response);
212
+ if (eventType === "COMPLETED" || eventType === "WORKFLOW_COMPLETED") {
213
+ let content = extractResponseContent(event.response);
214
+ const trace = event.trace && typeof event.trace === "object" ? event.trace : null;
215
+ if (!content && trace?.workflowMsg && typeof trace.workflowMsg === "string") {
216
+ content = trace.workflowMsg;
217
+ }
218
+ if (!content && trace?.aggregator && typeof trace.aggregator === "object") {
219
+ const agg = trace.aggregator;
220
+ if (typeof agg.response === "string") content = agg.response;
221
+ else content = extractResponseContent(agg.response);
222
+ }
214
223
  if (content) {
215
224
  state.accumulatedContent = content;
216
- state.finalData = event.response;
225
+ state.finalData = event.response ?? event.trace;
226
+ state.hasError = false;
227
+ state.errorMessage = "";
228
+ } else {
229
+ state.hasError = true;
230
+ state.errorMessage = "WORKFLOW_FAILED";
217
231
  }
218
232
  }
219
233
  if (eventType === "STARTED" || eventType === "WORKFLOW_STARTED") ; else if (eventType === "COMPLETED" || eventType === "WORKFLOW_COMPLETED") {
@@ -223,7 +237,6 @@ function processStreamEvent(event, state) {
223
237
  }
224
238
  });
225
239
  } else if (eventType === "INTENT_ERROR") {
226
- state.hasError = true;
227
240
  state.errorMessage = message || event.errorMessage || "An error occurred";
228
241
  const intentStep = state.steps.find(
229
242
  (s) => s.eventType === "INTENT_STARTED" && s.status === "in_progress"
@@ -453,15 +466,12 @@ function processStreamEvent(event, state) {
453
466
  }
454
467
 
455
468
  // src/utils/messageStateManager.ts
469
+ var FRIENDLY_ERROR_MESSAGE = "Oops, something went wrong. Please try again.";
456
470
  function createStreamingMessageUpdate(state) {
457
471
  const hasCompletedContent = state.accumulatedContent && state.finalData !== void 0;
458
472
  return {
459
- streamingContent: state.hasError ? `Oops, something went wrong. Please try again.
460
-
461
- ${state.errorMessage}` : hasCompletedContent ? state.accumulatedContent : "",
462
- content: state.hasError ? `Oops, something went wrong. Please try again.
463
-
464
- ${state.errorMessage}` : "",
473
+ streamingContent: state.hasError ? FRIENDLY_ERROR_MESSAGE : hasCompletedContent ? state.accumulatedContent : "",
474
+ content: state.hasError ? FRIENDLY_ERROR_MESSAGE : "",
465
475
  currentMessage: state.hasError ? void 0 : state.currentMessage,
466
476
  streamProgress: state.hasError ? "error" : "processing",
467
477
  isError: state.hasError,
@@ -484,9 +494,7 @@ function createErrorMessageUpdate(error, state) {
484
494
  isError: !isAborted,
485
495
  isCancelled: isAborted,
486
496
  errorDetails: isAborted ? void 0 : error.message,
487
- content: isAborted ? state.accumulatedContent || "" : state.accumulatedContent || `Oops, something went wrong. Please try again.
488
-
489
- ${error.message}`,
497
+ content: isAborted ? state.accumulatedContent || "" : state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,
490
498
  // Preserve currentMessage when cancelled so UI can show it
491
499
  currentMessage: isAborted ? state.currentMessage || "Thinking..." : void 0,
492
500
  steps: [...state.steps].map((step) => {
@@ -503,9 +511,7 @@ function createFinalMessage(streamingId, state) {
503
511
  id: streamingId,
504
512
  sessionId: state.sessionId,
505
513
  role: "assistant",
506
- content: state.hasError ? `Oops, something went wrong. Please try again.
507
-
508
- ${state.errorMessage}` : state.accumulatedContent || "",
514
+ content: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || "",
509
515
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
510
516
  isStreaming: false,
511
517
  streamProgress: state.hasError ? "error" : "completed",
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\tcase \"INTENT_THINKING\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} thinking...`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_THINKING_CONT\":\n\t\t\treturn event.message || \"\";\n\t\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\tcurrentThinkingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\t/** Current thinking block text (resets each INTENT_THINKING) — shown live in bubble */\n\tactiveThinkingText?: string;\n\t/** All thinking accumulated across every block — shown after streaming ends */\n\tallThinkingText: string;\n\t/** True between ORCHESTRATOR_THINKING and ORCHESTRATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinOrchestratorPhase: boolean;\n\t/** True between AGGREGATOR_THINKING and AGGREGATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinAggregatorPhase: boolean;\n};\n\n/**\n * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: EventProcessorState,\n): EventProcessorState {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Close any active thinking block when a non-thinking event arrives\n\tif (eventType !== \"INTENT_THINKING\" && eventType !== \"INTENT_THINKING_CONT\") {\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst thinkingStep = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\t\t// Clear live thinking so the bubble can show the current step instead\n\t\tstate.activeThinkingText = undefined;\n\t}\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\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\tstate.inOrchestratorPhase = false;\n\t\t// Complete the ORCHESTRATOR_THINKING step\n\t\tconst orchestratorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (orchestratorStep) {\n\t\t\torchestratorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\torchestratorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (orchestratorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"INTENT_COMPLETED\") {\n\t\t// Complete the INTENT_STARTED step\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\tintentStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (intentStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"AGGREGATOR_COMPLETED\") {\n\t\tstate.inAggregatorPhase = false;\n\t\t// Complete the AGGREGATOR_THINKING step\n\t\tconst aggregatorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (aggregatorStep) {\n\t\t\taggregatorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\taggregatorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (aggregatorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (\n\t\teventType === \"ORCHESTRATOR_THINKING\" ||\n\t\teventType === \"INTENT_STARTED\" ||\n\t\teventType === \"INTENT_PROGRESS\" ||\n\t\teventType === \"AGGREGATOR_THINKING\"\n\t) {\n\t\tif (eventType === \"ORCHESTRATOR_THINKING\") {\n\t\t\tstate.inOrchestratorPhase = true;\n\t\t}\n\t\tif (eventType === \"AGGREGATOR_THINKING\") {\n\t\t\tstate.inAggregatorPhase = true;\n\t\t}\n\t\t// Only add steps for important events\n\t\tif (eventType === \"INTENT_PROGRESS\") {\n\t\t\t// Update existing INTENT_STARTED step message if it exists\n\t\t\tconst intentStep = state.steps.find(\n\t\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t\t);\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.message = message;\n\t\t\t\tstate.currentExecutingStepId = intentStep.id;\n\t\t\t} else {\n\t\t\t\t// No existing intent step, create one\n\t\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\t\tstate.steps.push({\n\t\t\t\t\tid: stepId,\n\t\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t\t});\n\t\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add progress step for THINKING and STARTED events\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t}\n\t}\n\t// ============================================\n\t// USER_ACTION events\n\t// ============================================\n\telse if (eventType === \"USER_ACTION_REQUIRED\") {\n\t\t// Complete any prior in-progress step\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Store the request data from the event\n\t\tif (event.userActionRequest) {\n\t\t\tstate.userActionRequest = {\n\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\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} else if (eventType === \"INTENT_THINKING\") {\n\t\t// Close previous thinking block if a new one arrives back-to-back\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst prev = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (prev) prev.isThinking = false;\n\t\t}\n\n\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\tif (lastInProgress) {\n\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\tlastInProgress.isThinking = true;\n\t\t\tstate.currentThinkingStepId = lastInProgress.id;\n\t\t} else {\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\n\t\tif (state.allThinkingText) state.allThinkingText += \"\\n\\n\";\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tstate.activeThinkingText = \"\";\n\t\t}\n\t} else if (eventType === \"INTENT_THINKING_CONT\") {\n\t\tconst delta = event.message || \"\";\n\t\tif (!delta) return state;\n\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst step = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (step) {\n\t\t\t\tstep.thinkingText = (step.thinkingText || \"\") + delta;\n\t\t\t}\n\t\t}\n\n\t\tstate.allThinkingText += delta;\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tif (state.activeThinkingText == null) state.activeThinkingText = \"\";\n\t\t\tstate.activeThinkingText += delta;\n\t\t}\n\t}\n\t// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\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\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: state.hasError ? undefined : state.allThinkingText,\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\tallThinkingText?: string;\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\tactiveThinkingText: undefined,\n\t\tallThinkingText: state.hasError ? undefined : state.allThinkingText,\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\tcurrentThinkingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText: string;\n\tinOrchestratorPhase: boolean;\n\tinAggregatorPhase: boolean;\n};\n\nexport function useStreamManager(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\t// Keep latest values in refs so the startStream callback never goes stale\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): 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\tcurrentThinkingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t\tuserActionRequest: undefined,\n\t\t\t\tuserActionPending: false,\n\t\t\t\tuserActionResult: undefined,\n\t\t\t\tallThinkingText: \"\",\n\t\t\t\tinOrchestratorPhase: false,\n\t\t\t\tinAggregatorPhase: false,\n\t\t\t};\n\n\t\t\t// Throttle thinking display: show prefix that catches up at readable pace\n\t\t\tconst THROTTLE_MS = 120;\n\t\t\tconst CHARS_PER_TICK = 10;\n\t\t\tconst displayedLengthRef = { current: 0 };\n\t\t\tlet throttleIntervalId: ReturnType<typeof setInterval> | null = null;\n\n\t\t\tconst getActiveStepMessage = () =>\n\t\t\t\tstate.steps.find((s) => s.id === state.currentExecutingStepId)?.message ||\n\t\t\t\t[...state.steps].reverse().find((s) => s.status === \"in_progress\")?.message;\n\n\t\t\tconst advanceDisplayLength = (full: string) => {\n\t\t\t\tlet newLen = Math.min(displayedLengthRef.current + CHARS_PER_TICK, full.length);\n\t\t\t\tif (newLen > 0 && newLen < full.length) {\n\t\t\t\t\tconst code = full.charCodeAt(newLen - 1);\n\t\t\t\t\tif (code >= 0xD800 && code <= 0xDBFF) {\n\t\t\t\t\t\tnewLen = Math.min(newLen + 1, full.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdisplayedLengthRef.current = newLen;\n\t\t\t};\n\n\t\t\tconst clearThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) {\n\t\t\t\t\tclearInterval(throttleIntervalId);\n\t\t\t\t\tthrottleIntervalId = null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Clear throttle on abort (e.g. cancelStream or new stream replacing this one) so the interval\n\t\t\t// doesn’t keep ticking after unmount or cancel and call setMessages on unmounted component.\n\t\t\tabortController.signal.addEventListener(\"abort\", clearThrottle, { once: true });\n\n\t\t\t// Throttle callback intentionally reads the mutable `state` object so it always sees\n\t\t\t// the latest activeThinkingText/steps from processStreamEvent. Do not replace state\n\t\t\t// with an immutable copy or the interval will show stale data.\n\t\t\tconst ensureThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) return;\n\t\t\t\tthrottleIntervalId = setInterval(() => {\n\t\t\t\t\tif (abortController.signal.aborted) { clearThrottle(); return; }\n\t\t\t\t\tconst full = state.activeThinkingText ?? \"\";\n\t\t\t\t\tif (displayedLengthRef.current < full.length) {\n\t\t\t\t\t\tadvanceDisplayLength(full);\n\t\t\t\t\t\tconst displayText = full.slice(0, displayedLengthRef.current);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayText,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: getActiveStepMessage() || \"Thinking...\",\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}, THROTTLE_MS);\n\t\t\t};\n\n\t\t\t// Build request (read config from ref for latest value)\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Capture activeThinkingText length before processStreamEvent (it clears it on non-thinking events)\n\t\t\t\t\t\tconst activeThinkingLengthBeforeProcess = state.activeThinkingText?.length ?? 0;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Throttle thinking display: start/stop lazily; reset on new block, flush when leaving\n\t\t\t\t\t\tif (eventType === \"INTENT_THINKING\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = 0;\n\t\t\t\t\t\t\tensureThrottle();\n\t\t\t\t\t\t} else if (eventType !== \"INTENT_THINKING_CONT\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = activeThinkingLengthBeforeProcess;\n\t\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isIntentThinkingEvent =\n\t\t\t\t\t\t\teventType === \"INTENT_THINKING\" || eventType === \"INTENT_THINKING_CONT\";\n\n\t\t\t\t\t\t// Get current message from event (fallback to step message or event-type message)\n\t\t\t\t\t\tconst rawMessage = event.message?.trim() || event.errorMessage?.trim();\n\t\t\t\t\t\tconst currentMessage = isIntentThinkingEvent\n\t\t\t\t\t\t\t? (getActiveStepMessage() || \"Thinking...\")\n\t\t\t\t\t\t\t: rawMessage ||\n\t\t\t\t\t\t\t\t(event.eventType?.startsWith(\"USER_ACTION_\")\n\t\t\t\t\t\t\t\t\t? getEventMessage(event)\n\t\t\t\t\t\t\t\t\t: getActiveStepMessage() || getEventMessage(event));\n\n\t\t\t\t\t\t// Use throttled thinking prefix for display; state keeps full text for allThinkingText\n\t\t\t\t\t\tconst displayThinking =\n\t\t\t\t\t\t\tstate.activeThinkingText != null\n\t\t\t\t\t\t\t\t? state.activeThinkingText.slice(0, displayedLengthRef.current)\n\t\t\t\t\t\t\t\t: state.activeThinkingText;\n\n\t\t\t\t\t\t// Update streaming message\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayThinking,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error, state),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// If the OTP modal is still open when the stream ends, close it\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst 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\t// Clear throttle on success path too: on abort, streamWorkflowEvents returns without throwing,\n\t\t\t\t// so we'd skip the catch block and the interval would only self-clear on next tick.\n\t\t\t\tclearThrottle();\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tclearThrottle();\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error as Error, state),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import { useCallback, 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"]}
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\tcase \"INTENT_THINKING\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} thinking...`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_THINKING_CONT\":\n\t\t\treturn event.message || \"\";\n\t\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\tcurrentThinkingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\t/** Current thinking block text (resets each INTENT_THINKING) — shown live in bubble */\n\tactiveThinkingText?: string;\n\t/** All thinking accumulated across every block — shown after streaming ends */\n\tallThinkingText: string;\n\t/** True between ORCHESTRATOR_THINKING and ORCHESTRATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinOrchestratorPhase: boolean;\n\t/** True between AGGREGATOR_THINKING and AGGREGATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinAggregatorPhase: boolean;\n};\n\n/**\n * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: EventProcessorState,\n): EventProcessorState {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Close any active thinking block when a non-thinking event arrives\n\tif (eventType !== \"INTENT_THINKING\" && eventType !== \"INTENT_THINKING_CONT\") {\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst thinkingStep = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\t\t// Clear live thinking so the bubble can show the current step instead\n\t\tstate.activeThinkingText = undefined;\n\t}\n\n\t// Only extract response content from WORKFLOW_COMPLETED event.\n\t// When the workflow completes with a response (e.g. after INTENT_ERROR), use it as the message and clear intent-level error so we show the agent response, not \"Oops something went wrong\".\n\t// When there is no response/workflowMsg (e.g. preflight failed, aggregator failed), show \"Oops, something went wrong\".\n\tif (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\tlet content = extractResponseContent(event.response);\n\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\tcontent = trace.workflowMsg;\n\t\t}\n\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\telse content = extractResponseContent(agg.response);\n\t\t}\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t// Subintent may have failed (INTENT_ERROR) but workflow still produced a response — show it, not the error.\n\t\t\tstate.hasError = false;\n\t\t\tstate.errorMessage = \"\";\n\t\t} else {\n\t\t\t// No workflow response (e.g. preflight failed, aggregator failed) — show \"Oops, something went wrong\"\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t}\n\t}\n\n\t// Skip WORKFLOW_STARTED - don't show it in UI\n\tif (eventType === \"STARTED\" || eventType === \"WORKFLOW_STARTED\") {\n\t\t// Skip this event, don't add a step\n\t} else if (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\t// Mark all in-progress steps as completed (for final workflow completion)\n\t\tstate.steps.forEach((step) => {\n\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t}\n\t\t});\n\t} else if (eventType === \"INTENT_ERROR\") {\n\t\t// Subintent failed — do NOT set hasError. Workflow may still complete with a response (WORKFLOW_COMPLETED).\n\t\t// Only WORKFLOW_FAILED / ERROR / WORKFLOW_ERROR set hasError. Mark the step as error for UI.\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t// Mark any in-progress intent step as error\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"error\";\n\t\t}\n\t} else if (eventType === \"ERROR\" || eventType === \"WORKFLOW_ERROR\") {\n\t\t// Mark as error and store error message (don't add as step)\n\t\tstate.hasError = true;\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\t} else if (eventType === \"ORCHESTRATOR_COMPLETED\") {\n\t\tstate.inOrchestratorPhase = false;\n\t\t// Complete the ORCHESTRATOR_THINKING step\n\t\tconst orchestratorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (orchestratorStep) {\n\t\t\torchestratorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\torchestratorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (orchestratorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"INTENT_COMPLETED\") {\n\t\t// Complete the INTENT_STARTED step\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\tintentStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (intentStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"AGGREGATOR_COMPLETED\") {\n\t\tstate.inAggregatorPhase = false;\n\t\t// Complete the AGGREGATOR_THINKING step\n\t\tconst aggregatorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (aggregatorStep) {\n\t\t\taggregatorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\taggregatorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (aggregatorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (\n\t\teventType === \"ORCHESTRATOR_THINKING\" ||\n\t\teventType === \"INTENT_STARTED\" ||\n\t\teventType === \"INTENT_PROGRESS\" ||\n\t\teventType === \"AGGREGATOR_THINKING\"\n\t) {\n\t\tif (eventType === \"ORCHESTRATOR_THINKING\") {\n\t\t\tstate.inOrchestratorPhase = true;\n\t\t}\n\t\tif (eventType === \"AGGREGATOR_THINKING\") {\n\t\t\tstate.inAggregatorPhase = true;\n\t\t}\n\t\t// Only add steps for important events\n\t\tif (eventType === \"INTENT_PROGRESS\") {\n\t\t\t// Update existing INTENT_STARTED step message if it exists\n\t\t\tconst intentStep = state.steps.find(\n\t\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t\t);\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.message = message;\n\t\t\t\tstate.currentExecutingStepId = intentStep.id;\n\t\t\t} else {\n\t\t\t\t// No existing intent step, create one\n\t\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\t\tstate.steps.push({\n\t\t\t\t\tid: stepId,\n\t\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t\t});\n\t\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add progress step for THINKING and STARTED events\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t}\n\t}\n\t// ============================================\n\t// USER_ACTION events\n\t// ============================================\n\telse if (eventType === \"USER_ACTION_REQUIRED\") {\n\t\t// Complete any prior in-progress step\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Store the request data from the event\n\t\tif (event.userActionRequest) {\n\t\t\tstate.userActionRequest = {\n\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\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} else if (eventType === \"INTENT_THINKING\") {\n\t\t// Close previous thinking block if a new one arrives back-to-back\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst prev = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (prev) prev.isThinking = false;\n\t\t}\n\n\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\tif (lastInProgress) {\n\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\tlastInProgress.isThinking = true;\n\t\t\tstate.currentThinkingStepId = lastInProgress.id;\n\t\t} else {\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\n\t\tif (state.allThinkingText) state.allThinkingText += \"\\n\\n\";\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tstate.activeThinkingText = \"\";\n\t\t}\n\t} else if (eventType === \"INTENT_THINKING_CONT\") {\n\t\tconst delta = event.message || \"\";\n\t\tif (!delta) return state;\n\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst step = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (step) {\n\t\t\t\tstep.thinkingText = (step.thinkingText || \"\") + delta;\n\t\t\t}\n\t\t}\n\n\t\tstate.allThinkingText += delta;\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tif (state.activeThinkingText == null) state.activeThinkingText = \"\";\n\t\t\tstate.activeThinkingText += delta;\n\t\t}\n\t}\n\t// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? FRIENDLY_ERROR_MESSAGE\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : \"\",\n\t\tcurrentMessage: state.hasError ? undefined : state.currentMessage,\n\t\tstreamProgress: state.hasError ? (\"error\" as const) : (\"processing\" as const),\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\tsessionId: state.sessionId,\n\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: state.hasError ? undefined : state.allThinkingText,\n\t};\n}\n\n/**\n * Create error message update for abort or error scenarios\n */\nexport function createErrorMessageUpdate(\n\terror: Error,\n\tstate: {\n\t\taccumulatedContent: string;\n\t\tcurrentMessage?: string;\n\t\tsteps: StreamingStep[];\n\t}\n): Partial<MessageDisplay> {\n\tconst isAborted = error.name === \"AbortError\";\n\n\treturn {\n\t\tisStreaming: false,\n\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\tisError: !isAborted,\n\t\tisCancelled: isAborted,\n\t\terrorDetails: isAborted ? undefined : error.message,\n\t\tcontent: isAborted\n\t\t\t? state.accumulatedContent || \"\"\n\t\t\t: state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,\n\t\t// Preserve currentMessage when cancelled so UI can show it\n\t\tcurrentMessage: isAborted ? state.currentMessage || \"Thinking...\" : undefined,\n\t\tsteps: [...state.steps].map((step) => {\n\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t}\n\t\t\treturn step;\n\t\t}),\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Create final completed message\n */\nexport function createFinalMessage(\n\tstreamingId: string,\n\tstate: {\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t\taccumulatedContent: string;\n\t\tsessionId?: string;\n\t\texecutionId?: string;\n\t\tfinalData?: unknown;\n\t\tsteps: StreamingStep[];\n\t\tuserActionResult?: UserActionResult;\n\t\tallThinkingText?: string;\n\t}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || \"\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tisStreaming: false,\n\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\ttracingData: state.finalData,\n\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: undefined,\n\t\tallThinkingText: state.hasError ? undefined : state.allThinkingText,\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\tcurrentThinkingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText: string;\n\tinOrchestratorPhase: boolean;\n\tinAggregatorPhase: boolean;\n};\n\nexport function useStreamManager(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\t// Keep latest values in refs so the startStream callback never goes stale\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): 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\tcurrentThinkingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t\tuserActionRequest: undefined,\n\t\t\t\tuserActionPending: false,\n\t\t\t\tuserActionResult: undefined,\n\t\t\t\tallThinkingText: \"\",\n\t\t\t\tinOrchestratorPhase: false,\n\t\t\t\tinAggregatorPhase: false,\n\t\t\t};\n\n\t\t\t// Throttle thinking display: show prefix that catches up at readable pace\n\t\t\tconst THROTTLE_MS = 120;\n\t\t\tconst CHARS_PER_TICK = 10;\n\t\t\tconst displayedLengthRef = { current: 0 };\n\t\t\tlet throttleIntervalId: ReturnType<typeof setInterval> | null = null;\n\n\t\t\tconst getActiveStepMessage = () =>\n\t\t\t\tstate.steps.find((s) => s.id === state.currentExecutingStepId)?.message ||\n\t\t\t\t[...state.steps].reverse().find((s) => s.status === \"in_progress\")?.message;\n\n\t\t\tconst advanceDisplayLength = (full: string) => {\n\t\t\t\tlet newLen = Math.min(displayedLengthRef.current + CHARS_PER_TICK, full.length);\n\t\t\t\tif (newLen > 0 && newLen < full.length) {\n\t\t\t\t\tconst code = full.charCodeAt(newLen - 1);\n\t\t\t\t\tif (code >= 0xD800 && code <= 0xDBFF) {\n\t\t\t\t\t\tnewLen = Math.min(newLen + 1, full.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdisplayedLengthRef.current = newLen;\n\t\t\t};\n\n\t\t\tconst clearThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) {\n\t\t\t\t\tclearInterval(throttleIntervalId);\n\t\t\t\t\tthrottleIntervalId = null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Clear throttle on abort (e.g. cancelStream or new stream replacing this one) so the interval\n\t\t\t// doesn’t keep ticking after unmount or cancel and call setMessages on unmounted component.\n\t\t\tabortController.signal.addEventListener(\"abort\", clearThrottle, { once: true });\n\n\t\t\t// Throttle callback intentionally reads the mutable `state` object so it always sees\n\t\t\t// the latest activeThinkingText/steps from processStreamEvent. Do not replace state\n\t\t\t// with an immutable copy or the interval will show stale data.\n\t\t\tconst ensureThrottle = () => {\n\t\t\t\tif (throttleIntervalId != null) return;\n\t\t\t\tthrottleIntervalId = setInterval(() => {\n\t\t\t\t\tif (abortController.signal.aborted) { clearThrottle(); return; }\n\t\t\t\t\tconst full = state.activeThinkingText ?? \"\";\n\t\t\t\t\tif (displayedLengthRef.current < full.length) {\n\t\t\t\t\t\tadvanceDisplayLength(full);\n\t\t\t\t\t\tconst displayText = full.slice(0, displayedLengthRef.current);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayText,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: getActiveStepMessage() || \"Thinking...\",\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}, THROTTLE_MS);\n\t\t\t};\n\n\t\t\t// Build request (read config from ref for latest value)\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Capture activeThinkingText length before processStreamEvent (it clears it on non-thinking events)\n\t\t\t\t\t\tconst activeThinkingLengthBeforeProcess = state.activeThinkingText?.length ?? 0;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Throttle thinking display: start/stop lazily; reset on new block, flush when leaving\n\t\t\t\t\t\tif (eventType === \"INTENT_THINKING\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = 0;\n\t\t\t\t\t\t\tensureThrottle();\n\t\t\t\t\t\t} else if (eventType !== \"INTENT_THINKING_CONT\") {\n\t\t\t\t\t\t\tdisplayedLengthRef.current = activeThinkingLengthBeforeProcess;\n\t\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isIntentThinkingEvent =\n\t\t\t\t\t\t\teventType === \"INTENT_THINKING\" || eventType === \"INTENT_THINKING_CONT\";\n\n\t\t\t\t\t\t// Get current message from event (fallback to step message or event-type message)\n\t\t\t\t\t\tconst rawMessage = event.message?.trim() || event.errorMessage?.trim();\n\t\t\t\t\t\tconst currentMessage = isIntentThinkingEvent\n\t\t\t\t\t\t\t? (getActiveStepMessage() || \"Thinking...\")\n\t\t\t\t\t\t\t: rawMessage ||\n\t\t\t\t\t\t\t\t(event.eventType?.startsWith(\"USER_ACTION_\")\n\t\t\t\t\t\t\t\t\t? getEventMessage(event)\n\t\t\t\t\t\t\t\t\t: getActiveStepMessage() || getEventMessage(event));\n\n\t\t\t\t\t\t// Use throttled thinking prefix for display; state keeps full text for allThinkingText\n\t\t\t\t\t\tconst displayThinking =\n\t\t\t\t\t\t\tstate.activeThinkingText != null\n\t\t\t\t\t\t\t\t? state.activeThinkingText.slice(0, displayedLengthRef.current)\n\t\t\t\t\t\t\t\t: state.activeThinkingText;\n\n\t\t\t\t\t\t// Update streaming message\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tactiveThinkingText: displayThinking,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error, state),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tclearThrottle();\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// If the OTP modal is still open when the stream ends, close it\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst 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\t// Clear throttle on success path too: on abort, streamWorkflowEvents returns without throwing,\n\t\t\t\t// so we'd skip the catch block and the interval would only self-clear on next tick.\n\t\t\t\tclearThrottle();\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tclearThrottle();\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// If the OTP modal is open, close it on network error\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t...createErrorMessageUpdate(error as Error, state),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import { useCallback, 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"]}