@paymanai/payman-ask-sdk 4.0.18 → 4.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +93 -25
- package/dist/index.d.ts +93 -25
- package/dist/index.js +1757 -381
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1749 -384
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +484 -25
- package/dist/styles.css.map +1 -1
- package/package.json +2 -2
- package/dist/index.native.js +0 -3675
- package/dist/index.native.js.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../payman-sdk-typescript/src/utils/generateId.ts","../../payman-sdk-typescript/src/utils/chatStore.ts","../../payman-sdk-typescript/src/utils/activeStreamStore.ts","../../payman-sdk-typescript/src/utils/streamingClient.ts","../../payman-sdk-typescript/src/utils/stageLabels.ts","../../payman-sdk-typescript/src/utils/v2EventProcessor.ts","../../payman-sdk-typescript/src/utils/requestBuilder.ts","../../payman-sdk-typescript/src/utils/ragImageResolver.ts","../../payman-sdk-typescript/src/hooks/useStreamManagerV2.ts","../../payman-sdk-typescript/src/utils/messageStateManager.ts","../../payman-sdk-typescript/src/utils/userActionClient.ts","../../payman-sdk-typescript/src/hooks/useChatV2.ts","../../payman-sdk-typescript/src/hooks/useVoice.ts","../../payman-sdk-typescript/src/utils/jsonSchemaForm.ts","../src/contexts/PaymanChatContext.tsx","../src/utils/cn.ts","../src/utils/formatDate.ts","../src/utils/sentryContext.ts","../src/utils/slashCommands.ts","../src/utils/errorMessages.ts","../src/utils/sentry.ts","../src/utils/feedbackClient.ts","../src/components/AgentMessage/ImageLightbox.tsx","../src/components/AgentMessage/MarkdownImage.tsx","../src/components/AgentMessage/markdownComponents.tsx","../src/components/AgentMessage/index.tsx","../src/components/UserMessage/index.tsx","../src/components/MessageRow/index.tsx","../src/components/MessageRowSkeleton/index.tsx","../src/components/MessageList/index.tsx","../src/components/ResetSessionConfirmModal/index.tsx","../src/components/v2/ActionTooltipV2.tsx","../src/components/v2/UserMessageV2.tsx","../src/components/v2/MarkdownImageV2.tsx","../src/components/v2/MarkdownRendererV2.tsx","../src/components/v2/ThinkingBlockV2.tsx","../src/components/v2/FeedbackReasonModal.tsx","../src/components/v2/useTypingEffect.ts","../src/components/v2/AssistantMessageV2.tsx","../src/components/v2/OtpInputV2.tsx","../src/components/v2/VerificationInline.tsx","../src/components/v2/SchemaFormInline.tsx","../src/components/v2/NotificationInline.tsx","../src/components/v2/UserActionInline.tsx","../src/components/v2/MessageListV2.tsx","../src/components/v2/ChatInputV2.tsx","../src/components/v2/StreamingIndicatorV2.tsx","../src/components/v2/ImageLightboxV2.tsx","../src/components/v2/TraceTimelineModal.tsx","../src/components/PaymanChat/index.tsx"],"names":["events","useRef","useCallback","submitUserAction","cancelUserAction","resendUserAction","useState","useEffect","init","Sentry2","DEFAULT_STREAM_ENDPOINT","frameStyle","jsxs","jsx","Loader2","useMemo","FRIENDLY_ERROR_MESSAGE","X","AnimatePresence","motion","Fragment","createPortal","Check","RAG_IMAGE_PATH_REGEX","isUnresolvedRagImageSource","ReactMarkdown","remarkGfm","AlertCircle","Copy","Binoculars","Pencil","SCROLL_THRESHOLD","MessageListV2","ArrowDown","forwardRef","ChatInputV2","useImperativeHandle","RotateCcw","PaymanChatInner","isEmpty","PaymanChat"],"mappings":"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","file":"index.mjs","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","import type { MessageDisplay } from \"../types\";\n\nconst memoryStore = new Map<string, MessageDisplay[]>();\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\treturn memoryStore.get(key) ?? [];\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tmemoryStore.set(key, messages);\n\t},\n\tdelete(key: string): void {\n\t\tmemoryStore.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Rename an entry — used when the server assigns a new session ID mid-stream\n\trename(oldKey: string, newKey: string): void {\n\t\tconst entry = streams.get(oldKey);\n\t\tif (!entry) return;\n\t\tstreams.set(newKey, entry);\n\t\tstreams.delete(oldKey);\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","/**\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\t/**\n\t * Server-computed wall-clock duration from RunStarted to RunCompleted.\n\t * Carried on RUN_COMPLETED only — prefer this over client-side\n\t * step-span heuristics when present.\n\t */\n\ttotalTimeMs?: number;\n\t/**\n\t * User-facing progress label. Attached to:\n\t * - TOOL_CALL_STARTED / TOOL_CALL_COMPLETED — derived from the tool\n\t * name and (on completion) the row-count of the result, e.g.\n\t * \"Pulling your transactions\" / \"Got 437 transactions\".\n\t * - LLM_CALL_STARTED — an in-voice \"what's about to happen\" line.\n\t * - KEEP_ALIVE — a rotating phrase the server sends during silent-\n\t * think gaps so the chat-bubble status changes every few seconds\n\t * instead of staying frozen on \"Thinking…\".\n\t *\n\t * Clients should prefer this over raw type identifiers when\n\t * rendering a progress row.\n\t */\n\tdescription?: string;\n\t/**\n\t * Carried on `THINKING_DELTA` events — Anthropic extended-thinking\n\t * content streamed live from the upstream model. Distinct from\n\t * `partialText` (the user-facing answer); routes into a separate\n\t * \"Thinking…\" panel rather than the chat bubble.\n\t */\n\ttext?: string;\n\t/**\n\t * User-action / elicitation fields, carried at the TOP LEVEL of a\n\t * `USER_ACTION_REQUIRED` event (and `userActionId`/`message` on\n\t * `USER_NOTIFICATION`). The MCP `_meta.action` kind is forwarded\n\t * here as `action`; `requestedSchema` is standard JSON Schema.\n\t */\n\tuserActionId?: string;\n\taction?: string;\n\tsubAction?: string;\n\tverificationType?: string;\n\texpirySeconds?: number;\n\trequestedSchema?: Record<string, unknown>;\n\tmetadata?: Record<string, string>;\n\ttoolCallId?: string;\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 * Yield to the macrotask queue after a streaming-text delta so React can\n * commit a render before the next delta lands. No-op for non-delta events\n * (STAGE_*, TOOL_CALL_*) which don't drive the typing animation.\n *\n * Uses setTimeout(0) rather than queueMicrotask: microtasks execute before\n * React's render commit, so they don't break the batch.\n */\nfunction yieldAfterProgressEvent(event: StreamEvent): Promise<void> {\n\tconst t = event.eventType;\n\tif (\n\t\tt === \"RUN_IN_PROGRESS\" ||\n\t\tt === \"INTENT_PROGRESS\" ||\n\t\tt === \"THINKING_DELTA\"\n\t) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, 0));\n\t}\n\treturn Promise.resolve();\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\tawait yieldAfterProgressEvent(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\t// Yield after progress deltas so React commits a render between\n\t\t\t// them. Without this, multiple deltas batched into one TCP chunk\n\t\t\t// dispatch all setState calls in the same microtask, React 18\n\t\t\t// batches them, and the user sees the response appear at once\n\t\t\t// instead of streaming in.\n\t\t\tawait yieldAfterProgressEvent(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","/**\n * User-facing labels for the K2 pipeline stages, used by the event\n * processor to turn machine `stage` keys on STAGE_* events into the\n * text the UI shows in its \"Thought\" / streaming-step list.\n *\n * One label per stage — no completed / failed variants. The previous\n * version had three strings per stage (\"Checking your request\" →\n * \"Request OK\" → \"Couldn't process that request\") and flashed the\n * completed label for a few milliseconds between stages, which read\n * as noise rather than signal (\"Request OK\" and \"Got it\" don't\n * inspire trust in a banking product). The simpler model:\n *\n * - When a stage starts, the cursor shows the stage label.\n * - When the stage completes, the cursor moves on to the NEXT\n * stage's label (via a new STAGE_STARTED event). There is no\n * in-between \"completed\" flash.\n * - When the stage fails, the step is marked status=error but the\n * label stays — the expanded Thought view renders failed steps\n * differently via CSS, not by rewriting the text.\n *\n * The mapping lives in the SDK (not on the server) so copy changes\n * don't require a k2-server deploy. Future i18n replaces this table\n * with a lookup by key + locale without touching the server.\n *\n * Stage keys come from k2-server's `Pipeline.toStepKey()`:\n * sanitizer | analyzer | prefetcher | planner | execution | formatter\n */\n\nconst STAGE_LABELS: Record<string, string> = {\n\tsanitizer: \"Checking your request\",\n\tanalyzer: \"Understanding what you're asking\",\n\tprefetcher: \"Gathering context\",\n\tplanner: \"Planning how to handle this\",\n\texecution: \"Working on it\",\n\tformatter: \"Writing the response\",\n};\n\n/**\n * Map a pipeline stage key to a user-facing label. Returns a\n * sensible generic fallback (\"Running <stage>\") if the stage key is\n * unknown — a future k2-server stage that the SDK doesn't know\n * about yet still renders something in the UI instead of breaking\n * the stream.\n */\nexport function stageLabel(stage: string): string {\n\tconst label = STAGE_LABELS[stage];\n\tif (label) return label;\n\tconst pretty = stage.replace(/[_-]/g, \" \");\n\treturn `Running ${pretty}`;\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type {\n\tStreamingStep,\n\tUserActionRequest,\n\tUserActionKind,\n\tActiveUserAction,\n\tUserNotification,\n\tRequestedSchema,\n} from \"../types\";\nimport { stageLabel } from \"./stageLabels\";\n\n// ============================================================\n// Shared stream-event utilities\n// ============================================================\n//\n// These used to live in a separate `eventProcessor.ts` (the legacy\n// v1 processor file). The v1 processor + its stream manager + its\n// useChat hook have all been deleted — the v2 processor below is\n// the only one the SDK ships now — so the utilities moved here\n// rather than into a standalone shared file. They're exported\n// because `useStreamManagerV2` also imports `getEventMessage`.\n\n/**\n * Bland default-start labels every pipeline stage emits as\n * `defaultStartMessage` on the server when nothing more specific\n * has happened yet — `\"Executing…\"`, `\"Working on it…\"`, etc. The\n * stream manager filters these out of the chat-bubble status so\n * they don't replace useful messages (Analyzer's dynamic\n * \"Pulling those up for you now.\", a tool call's \"Got 437\n * transactions\") with a generic placeholder for the brief moment\n * between a stage starting and its first interesting event.\n *\n * Comparison is case-insensitive and trailing punctuation\n * (ellipsis `…` / `...` / period) is stripped so the same label\n * matches whether the server emits it with or without the\n * trailing dots.\n */\nexport function isBlandStatus(message: string | undefined | null): boolean {\n\tif (!message) return true;\n\tconst normalized = message\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[…\\.]+$/, \"\")\n\t\t.trim();\n\treturn BLAND_STATUS_LABELS.has(normalized);\n}\n\nconst BLAND_STATUS_LABELS: Set<string> = new Set([\n\t\"executing\",\n\t\"working on it\",\n\t\"thinking\",\n\t\"processing\",\n\t\"reviewing your request\",\n\t\"composing response\",\n\t\"checking your request\",\n\t\"polishing the response\",\n]);\n\n/**\n * Extract a user-friendly message string from a raw stream event.\n * Used by `useStreamManagerV2` when the streaming client needs a\n * label to attach to an intermediate event (e.g. for logging).\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 \"RUN_STARTED\":\n\t\t\treturn \"Starting agent run...\";\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\t// Prefer the server's human-readable `description` (e.g.\n\t\t\t// \"Pulling your transactions\") over the raw snake_case\n\t\t\t// tool identifier. Older k2-server builds don't populate\n\t\t\t// it, so we fall back to the tool name.\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `Calling ${toolName}...` : \"Calling tool...\";\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `${toolName} completed` : \"Tool call completed\";\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn (event.partialText as string) || \"Thinking...\";\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn \"Agent run completed\";\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn (event.errorMessage as string) || \"Agent run failed\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\t// k2-server attaches a rotating K2-voice phrase as `description`\n\t\t\t// during silent-think gaps so the chat-bubble status line has\n\t\t\t// something visibly changing instead of a frozen \"Thinking\".\n\t\t\t// Empty when the heartbeat is generic (legacy server builds).\n\t\t\treturn (event.description as string) || \"\";\n\t\tcase \"THINKING_DELTA\":\n\t\t\t// Anthropic extended-thinking content. Routed into the thinking\n\t\t\t// panel via processStreamEventV2; here we just contribute the\n\t\t\t// text to the bubble fallback in case the host UI doesn't\n\t\t\t// render the dedicated panel yet.\n\t\t\treturn (event.text as string) || \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\n/**\n * Pull the final assistant reply out of whatever shape the server\n * decided to send it in. Handles the common cases (direct string,\n * nested object with `text`/`content`/`message`/`answer`) and falls\n * back to a JSON stringification for anything else.\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 * Translate the clean K2 playground event types (RUN_STARTED,\n * TOOL_CALL_*, RUN_IN_PROGRESS, RUN_COMPLETED, RUN_FAILED) to the\n * internal event names the state machine below handles\n * (WORKFLOW_STARTED, INTENT_STARTED, INTENT_COMPLETED,\n * INTENT_PROGRESS, WORKFLOW_COMPLETED, WORKFLOW_ERROR).\n *\n * STAGE_* events pass through unchanged — they're handled directly\n * by the processor as K2 pipeline stage lifecycle events.\n *\n * Unknown event types pass through unchanged so the state machine\n * can ignore them safely.\n */\nexport function normalizeEvent(event: StreamEvent): StreamEvent {\n\tconst type = event.eventType;\n\tswitch (type) {\n\t\tcase \"RUN_STARTED\":\n\t\t\treturn { ...event, eventType: \"WORKFLOW_STARTED\" };\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\t// The server now ships a human-readable `description`\n\t\t\t// (\"Pulling your transactions\") on tool events. Surface it\n\t\t\t// as the normalized `message` so the INTENT_STARTED\n\t\t\t// handler below renders it in the thinking-block label\n\t\t\t// instead of the raw tool identifier. Falls back to the\n\t\t\t// existing `message` field when description is absent\n\t\t\t// (older k2-server builds).\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_COMPLETED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_PROGRESS\",\n\t\t\t\tmessage: (event.partialText as string | undefined) ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_COMPLETED\",\n\t\t\t\t// state machine reads event.response for the final content\n\t\t\t\tresponse: event.response ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_ERROR\",\n\t\t\t\terrorMessage: (event.errorMessage as string | undefined) ?? (event.message as string | undefined),\n\t\t\t};\n\t\tdefault:\n\t\t\treturn event;\n\t}\n}\n\n/**\n * A `requestedSchema` whose only field is `verificationCode` is the MCP\n * verification (one-time-code) shape, regardless of the declared\n * `action`. Used to refine classification.\n */\nfunction isVerificationSchema(schema: RequestedSchema | undefined): boolean {\n\tconst props = schema?.properties;\n\tif (!props) return false;\n\tconst keys = Object.keys(props);\n\treturn keys.length === 1 && keys[0] === \"verificationCode\";\n}\n\n/**\n * Classify a `USER_ACTION_REQUIRED` event into a render kind. Primary\n * discriminator is the MCP elicitation `action`; we fall back to the\n * schema shape so unknown/legacy `action` tags still route correctly.\n */\nexport function classifyUserActionKind(\n\taction: string | undefined,\n\tschema: RequestedSchema | undefined,\n): UserActionKind {\n\tswitch ((action || \"\").toLowerCase()) {\n\t\tcase \"userverificationrequest\":\n\t\t\treturn \"verification\";\n\t\tcase \"usernotificationrequest\":\n\t\t\treturn \"notification\";\n\t\tcase \"userformrequest\":\n\t\t\treturn isVerificationSchema(schema) ? \"verification\" : \"form\";\n\t\tdefault:\n\t\t\treturn isVerificationSchema(schema) ? \"verification\" : \"form\";\n\t}\n}\n\nexport type V2EventProcessorState = {\n\tfinalResponse: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\t/**\n\t * Active user-action prompts, an ordered collection keyed by\n\t * `toolCallId` (fallback `userActionId`). Usually 0–1 for serial\n\t * runs; multiple when parallel tool calls each elicit.\n\t */\n\tuserActions: ActiveUserAction[];\n\t/** One-way notifications surfaced this run (`USER_NOTIFICATION`). */\n\tnotifications: UserNotification[];\n\t/**\n\t * Transient: the prompt upserted by the most recent\n\t * `USER_ACTION_REQUIRED` event, so the stream manager can fire\n\t * `onUserActionRequired` for exactly that prompt. Reset each event.\n\t */\n\tlastUserAction?: UserActionRequest;\n\t/** Transient: the notification pushed by the most recent event. */\n\tlastNotification?: UserNotification;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\t/** Server-computed wall-clock duration captured from RUN_COMPLETED's `totalTimeMs`. */\n\ttotalElapsedMs?: number;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/**\n * Mirror the current tool-call START label onto the enclosing\n * in-progress STAGE_STARTED(\"execution\") step.\n *\n * Called on INTENT_STARTED only (not INTENT_COMPLETED). AGENTIC runs\n * fire many back-to-back tools (especially long query_engine chains),\n * so alternating start→end labels on every call produced a rapid\n * flicker of \"Crunching the numbers\" → \"Got 20 rows\" → \"Crunching\n * the numbers\" → \"Got 16 rows\" during a 60-120s run. Mirroring only\n * the start label means back-to-back same-type calls read as one\n * stable label (\"Crunching the numbers\" throughout the chain), with\n * transitions only when the tool *kind* actually changes.\n *\n * Why the mirror is needed at all: the chat-bubble label picker\n * walks steps in reverse and returns the most recent in-progress\n * step's message. Between tool calls the tool-level INTENT_STARTED\n * step is completed, so the picker falls back to the still-in-progress\n * execution-stage step — whose message is the static \"Executing…\"\n * default from the server. Mirroring the tool label onto that stage\n * step keeps the fallback dynamic and meaningful.\n *\n * No-op when `msg` is empty (older k2-server builds without\n * descriptions) or when no execution-stage step is in progress (run\n * hasn't reached the execution stage yet).\n */\nfunction updateExecutionStageMessage(state: V2EventProcessorState, msg: string): void {\n\tif (!msg) return;\n\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\tconst s = state.steps[i];\n\t\t// Match BOTH \"executor\" (current k2-server) and \"execution\"\n\t\t// (legacy ExecutionEngine). Without the \"executor\" match, the\n\t\t// tool-label mirror never landed on modern server builds and\n\t\t// the chat bubble was stuck on bland \"Executing…\" while the\n\t\t// pipeline panel showed live \"Crunching the numbers\"-style\n\t\t// labels — visible chat/pipeline desync.\n\t\tif (\n\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t(s.stage === \"executor\" || s.stage === \"execution\") &&\n\t\t\ts.status === \"in_progress\"\n\t\t) {\n\t\t\ts.message = msg;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tfinalResponse: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActions: [],\n\t\tnotifications: [],\n\t\tlastUserAction: undefined,\n\t\tlastNotification: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Upsert a prompt into `state.userActions`, applying the supersede rule:\n * a new event with a matching `toolCallId` (a `SubmissionInvalid` retry\n * or `RequestResent`, even with a new `userActionId`) REPLACES that slot\n * in place; otherwise it's appended as a new (parallel) prompt.\n */\nfunction upsertUserAction(state: V2EventProcessorState, req: UserActionRequest): void {\n\tconst active: ActiveUserAction = { ...req, status: \"pending\" };\n\tconst matchIdx = state.userActions.findIndex((p) =>\n\t\treq.toolCallId\n\t\t\t? p.toolCallId === req.toolCallId\n\t\t\t: p.userActionId === req.userActionId,\n\t);\n\tif (matchIdx >= 0) {\n\t\tstate.userActions[matchIdx] = active;\n\t} else {\n\t\tstate.userActions.push(active);\n\t}\n}\n\nexport function processStreamEventV2(\n\trawEvent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst event = normalizeEvent(rawEvent);\n\tconst eventType = event.eventType;\n\n\t// Transient per-event dispatch signals — cleared every call so the\n\t// stream manager only fires callbacks for the current event.\n\tstate.lastUserAction = undefined;\n\tstate.lastNotification = undefined;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t// k2-server attaches a rotating K2-voice phrase as `description` so\n\t\t// the chat-bubble status line changes during silent-think gaps\n\t\t// instead of staying pinned to \"Thinking\" for tens of seconds.\n\t\t// Mirror it onto the most-recent in-progress step's message so the\n\t\t// stream manager's `currentMessage` picker (which walks\n\t\t// state.steps for the latest substantive label) surfaces it.\n\t\tconst description = typeof event.description === \"string\" ? event.description : \"\";\n\t\tif (description) {\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tif (state.steps[i].status === \"in_progress\") {\n\t\t\t\t\tstate.steps[i].message = description;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t}\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"THINKING_DELTA\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\tstate.lastEventType = \"THINKING_DELTA\";\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t// Streaming delta from the Formatter stage — each event\n\t\t\t// carries `partialText` (the new chunk) which normalizeEvent\n\t\t\t// surfaces as `event.message`. Accumulate into\n\t\t\t// state.finalResponse so the stream manager can mirror it\n\t\t\t// into streamingContent in real time. The WORKFLOW_COMPLETED\n\t\t\t// event at the end still lands with the authoritative full\n\t\t\t// text; this just lets us show the answer building up.\n\t\t\t//\n\t\t\t// IMPORTANT: read raw values, do NOT `getEventText()` here.\n\t\t\t// getEventText() calls .trim(), which strips the leading\n\t\t\t// and trailing whitespace that providers include in each\n\t\t\t// token delta (\" bank\", \"accounts \", \"with\"). Trimming at\n\t\t\t// this layer destroys inter-word spacing and produces\n\t\t\t// \"Hereareallyourbankaccounts\" once deltas are concatenated.\n\t\t\tconst rawMessage = typeof event.message === \"string\" ? event.message : \"\";\n\t\t\tconst rawPartial = typeof event.partialText === \"string\" ? event.partialText : \"\";\n\t\t\tconst delta = rawMessage || rawPartial;\n\t\t\tif (delta.length > 0) {\n\t\t\t\tstate.finalResponse += delta;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst 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\t// Keep the enclosing execution stage step in sync with the\n\t\t\t// current tool label so the UI never flashes back to\n\t\t\t// \"Executing…\" between tool calls. See helper docs.\n\t\t\tupdateExecutionStageMessage(state, message);\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\t// DO NOT update the enclosing execution-stage message\n\t\t\t// here. AGENTIC runs fire many back-to-back tools\n\t\t\t// (especially query_engine chains) and surfacing the\n\t\t\t// per-tool completion label (\"Got 20 rows\" → \"Got 16\n\t\t\t// rows\" → …) caused a rapid flicker between start/end\n\t\t\t// labels during the 60-120s loop. Keeping the stage step\n\t\t\t// pinned to the CURRENT tool's start description means\n\t\t\t// back-to-back same-type tool calls all read as the same\n\t\t\t// stable label (\"Crunching the numbers\" throughout the\n\t\t\t// query_engine chain). The detail per tool still lives\n\t\t\t// on the tool's own step for expanded / trace views.\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\": {\n\t\t\t// Capture server-computed wall-clock duration. Authoritative.\n\t\t\tconst totalTime = Number(event.totalTimeMs);\n\t\t\tif (Number.isFinite(totalTime) && totalTime > 0) {\n\t\t\t\tstate.totalElapsedMs = totalTime;\n\t\t\t}\n\n\t\t\tconst content = extractResponseContent(event.response);\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\t// K2 playground runs emit the answer on `event.response`.\n\t\t\t\t// The full execution trace is fetched on demand via\n\t\t\t\t// GET /api/playground/executions/{id}/trace using\n\t\t\t\t// `executionId` on the final message.\n\t\t\t\tif (event.trace && typeof event.trace === \"object\") {\n\t\t\t\t\tstate.finalData = event.trace;\n\t\t\t\t}\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tconst rawAction = typeof event.action === \"string\" ? event.action : undefined;\n\t\t\tconst schema = event.requestedSchema as RequestedSchema | undefined;\n\t\t\tconst kind = classifyUserActionKind(rawAction, schema);\n\t\t\tconst promptMessage =\n\t\t\t\t(typeof event.message === \"string\" && event.message.trim()) || message || \"\";\n\t\t\tconst userActionId =\n\t\t\t\ttypeof event.userActionId === \"string\" ? event.userActionId : \"\";\n\n\t\t\t// A UserNotificationRequest is display-only — surface it as a\n\t\t\t// notification, not an interactive prompt.\n\t\t\tif (kind === \"notification\") {\n\t\t\t\tconst notification: UserNotification = {\n\t\t\t\t\tid: userActionId || `note-${state.stepCounter++}`,\n\t\t\t\t\tmessage: promptMessage,\n\t\t\t\t};\n\t\t\t\tstate.notifications.push(notification);\n\t\t\t\tstate.lastNotification = notification;\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Without an id we can't route a resolution back — skip.\n\t\t\tif (!userActionId) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst verificationType =\n\t\t\t\tevent.verificationType === \"ALPHANUMERIC_CODE\" ||\n\t\t\t\tevent.verificationType === \"NUMERIC_CODE\"\n\t\t\t\t\t? event.verificationType\n\t\t\t\t\t: undefined;\n\n\t\t\tconst request: UserActionRequest = {\n\t\t\t\tuserActionId,\n\t\t\t\tkind,\n\t\t\t\trawAction,\n\t\t\t\tsubAction: typeof event.subAction === \"string\" ? event.subAction : undefined,\n\t\t\t\tverificationType,\n\t\t\t\texpirySeconds:\n\t\t\t\t\ttypeof event.expirySeconds === \"number\" ? event.expirySeconds : undefined,\n\t\t\t\tmessage: promptMessage || undefined,\n\t\t\t\trequestedSchema: schema,\n\t\t\t\tmetadata: event.metadata as Record<string, string> | undefined,\n\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\texecutionId: state.executionId,\n\t\t\t\tsessionId: state.sessionId,\n\t\t\t};\n\n\t\t\tupsertUserAction(state, request);\n\t\t\tstate.lastUserAction = request;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage:\n\t\t\t\t\tpromptMessage ||\n\t\t\t\t\t(kind === \"verification\"\n\t\t\t\t\t\t? \"Waiting for verification...\"\n\t\t\t\t\t\t: \"Waiting for your input...\"),\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_NOTIFICATION\": {\n\t\t\tconst noteMessage =\n\t\t\t\t(typeof event.message === \"string\" && event.message.trim()) || message || \"\";\n\t\t\tconst userActionId =\n\t\t\t\ttypeof event.userActionId === \"string\" ? event.userActionId : \"\";\n\t\t\tif (noteMessage || userActionId) {\n\t\t\t\tconst notification: UserNotification = {\n\t\t\t\t\tid: userActionId || `note-${state.stepCounter++}`,\n\t\t\t\t\tmessage: noteMessage,\n\t\t\t\t};\n\t\t\t\tstate.notifications.push(notification);\n\t\t\t\tstate.lastNotification = notification;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\t// ---- K2 pipeline stage lifecycle events ----\n\t\t//\n\t\t// The k2-server playground streaming API emits\n\t\t// STAGE_STARTED / STAGE_COMPLETED / STAGE_FAILED /\n\t\t// STAGE_SKIPPED around each pipeline stage so the UI can\n\t\t// show real progress (sanitizer → analyzer → planner → …)\n\t\t// instead of a static placeholder. Each STAGE_STARTED\n\t\t// pushes an in-progress step with a user-facing label; the\n\t\t// matching STAGE_COMPLETED/FAILED closes it WITHOUT\n\t\t// rewriting the label — a terse \"completed\" flash between\n\t\t// stages was more noise than signal. STAGE_SKIPPED removes\n\t\t// the just-opened step entirely (skipping is expected on\n\t\t// DIRECT_RESPONSE short-circuits).\n\t\t//\n\t\t// Finding the matching step uses `stepId` directly rather\n\t\t// than comparing labels — the processor remembers which id\n\t\t// it minted for the latest open STAGE_STARTED and the\n\t\t// closing events look it up from state.currentExecutingStepId.\n\n\t\tcase \"STAGE_STARTED\": {\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Prefer the server-provided `message` — each K2 pipeline\n\t\t\t// stage now ships its own user-facing label on StageStarted\n\t\t\t// (Analyzer: \"Thinking…\", Prefetcher: \"Gathering context…\",\n\t\t\t// etc.). Fall back to the SDK's static stageLabel() table\n\t\t\t// only if the server didn't send one, which keeps this\n\t\t\t// processor compatible with older k2-server builds.\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tlet initialMessage = serverMessage || stageLabel(stage);\n\n\t\t\t// Execution-stage special case: the server's default label\n\t\t\t// is a bare \"Executing…\" which would show for the 5-10s\n\t\t\t// between STAGE_STARTED(\"executor\") and the first\n\t\t\t// TOOL_CALL_STARTED in an AGENTIC run. Prefer the\n\t\t\t// Analyzer's LLM-generated status (\"Pulling those up for\n\t\t\t// you now.\") — it's request-specific and bridges the gap\n\t\t\t// to the first tool event. Tool events subsequently mutate\n\t\t\t// this step's message via updateExecutionStageMessage().\n\t\t\t//\n\t\t\t// Match BOTH \"executor\" (current k2-server stage key) and\n\t\t\t// \"execution\" (legacy ExecutionEngine stage). Without the\n\t\t\t// \"executor\" match, the special case never fired against\n\t\t\t// modern server builds — observed in production: the chat\n\t\t\t// bubble showed bland \"Executing…\" for the entire agentic\n\t\t\t// run despite the analyzer having shipped a useful narrative\n\t\t\t// status that should have been inherited.\n\t\t\tif (stage === \"executor\" || stage === \"execution\") {\n\t\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst s = state.steps[i];\n\t\t\t\t\tif (\n\t\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\t\ts.stage === \"analyzer\" &&\n\t\t\t\t\t\ts.status === \"completed\" &&\n\t\t\t\t\t\ts.message\n\t\t\t\t\t) {\n\t\t\t\t\t\tinitialMessage = s.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stepId = `stage-${stage}-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: initialMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstage,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_COMPLETED\": {\n\t\t\t// Close the most recent in-progress step for this stage.\n\t\t\t// If the server provides a new `message` (the Analyzer's\n\t\t\t// LLM-generated \"Pulling those up for you now.\"), OVERWRITE\n\t\t\t// the step's label before marking completed — the UI's\n\t\t\t// currentStepLabel fallback shows the most recent step's\n\t\t\t// label during the gap between stages, so updating here\n\t\t\t// means the user sees the dynamic status instead of the\n\t\t\t// generic start-label until the next STAGE_STARTED lands.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"completed\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_FAILED\": {\n\t\t\t// Same as STAGE_COMPLETED but the step's status becomes\n\t\t\t// \"error\". If the server provides a specific failure\n\t\t\t// message we surface it; otherwise the label stays so the\n\t\t\t// user at least sees which stage was running. Expanded\n\t\t\t// Thought view renders errored steps differently via CSS.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"error\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_SKIPPED\": {\n\t\t\t// Mark the matching in-progress step as \"skipped\" rather\n\t\t\t// than removing it. The chat-bubble thinking animation\n\t\t\t// only reads in-progress steps so marking skipped doesn't\n\t\t\t// affect it. But pipeline-sidebar UIs need the step\n\t\t\t// retained (with the \"skipped\" status) so they can render\n\t\t\t// a visual indicator (e.g. a MinusCircle icon) for stages\n\t\t\t// the pipeline intentionally bypassed.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\ts.status = \"skipped\" as typeof s.status;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import type { ChatConfig } from \"../types\";\n\nconst DEFAULT_STREAM_ENDPOINT = \"/api/playground/ask/stream\";\n\n/**\n * Latency-vs-precision toggle surfaced in the chat widget. \"fast\"\n * (default) lets the server cap list-tool fetches and answer\n * quickly; \"deep\" runs a full analytical pass. The value is\n * forwarded verbatim to the server, which normalizes it — any\n * other string collapses to \"fast\" server-side. See\n * `ExecutionRequest.analysisMode` on the k2 backend for the\n * authoritative semantics.\n */\nexport type AnalysisMode = \"fast\" | \"deep\";\n\n/**\n * Build request body for the k2 playground ask endpoint.\n *\n * Shape matches PlaygroundAskRequest on the server:\n * { agentId, userInput, sessionId?, sessionOwnerId, sessionOwnerLabel?,\n * sessionAttributes?, analysisMode?, locale, timezone? }\n *\n * `analysisMode` is omitted from the body when undefined so older\n * SDK versions that don't pass it produce the exact same wire\n * shape they did before — the server defaults missing values to\n * \"fast\" anyway, so including the field is purely informational\n * when the caller hasn't opted in.\n *\n * `locale` is REQUIRED by the server's PlaygroundAskRequest. We resolve\n * it from `config.locale` first, then `navigator.language` (browser),\n * then fall back to \"en-US\". Without this the server returns 400 with\n * a serialization error.\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string,\n\toptions?: { analysisMode?: AnalysisMode },\n): Record<string, unknown> {\n\tconst sessionOwner = config.sessionParams;\n\tconst sessionOwnerId = sessionOwner?.id?.trim();\n\tif (!sessionOwnerId) {\n\t\tthrow new Error(\"ChatConfig.sessionParams.id is required to send ask requests.\");\n\t}\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\tagentId: config.agentId,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId,\n\t\tsessionOwnerLabel: sessionOwner?.name || undefined,\n\t\tsessionAttributes,\n\t\tanalysisMode: options?.analysisMode,\n\t\tlocale: resolveLocale(config.locale),\n\t\ttimezone: resolveTimezone(config.timezone),\n\t};\n}\n\n/**\n * Resolve the BCP-47 locale to send with ask requests. Tries explicit\n * config first, then the browser's `navigator.language`, then a safe\n * \"en-US\" fallback. The server requires this field on the playground\n * endpoint — never returns undefined.\n */\nfunction resolveLocale(configured?: string): string {\n\tif (configured && configured.trim().length > 0) return configured.trim();\n\tif (typeof navigator !== \"undefined\") {\n\t\tconst navLocale = (navigator as { language?: string }).language;\n\t\tif (navLocale && navLocale.length > 0) return navLocale;\n\t}\n\treturn \"en-US\";\n}\n\n/**\n * Resolve the IANA timezone to send with ask requests. Tries explicit\n * config first, then `Intl.DateTimeFormat().resolvedOptions().timeZone`,\n * then \"UTC\" as a last resort. Optional on the server, but sending\n * something useful means agents can localize date prose without a\n * follow-up clarification.\n */\nfunction resolveTimezone(configured?: string): string {\n\tif (configured && configured.trim().length > 0) return configured.trim();\n\ttry {\n\t\tconst zone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\t\tif (zone && zone.length > 0) return zone;\n\t} catch {\n\t\t// Intl missing or unhappy — fall through to the UTC default.\n\t}\n\treturn \"UTC\";\n}\n\n/**\n * Build streaming URL. Defaults to the k2 playground stream endpoint.\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\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 || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n * Derives the base path from the stream endpoint (same pattern as buildUserActionUrl)\n * so that playground URLs stay on the playground path and workflow URLs stay on the\n * workflows path. An explicit resolveImagesEndpoint in config always wins.\n */\nexport function buildResolveImagesUrl(config: ChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\tconst streamEndpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = streamEndpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\treturn `${config.api.baseUrl}${basePath}/resolve-image-urls`;\n}\n\n/**\n * Build request headers\n */\nexport function buildRequestHeaders(config: ChatConfig): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t...config.api.headers,\n\t};\n\tif (config.api.authToken) {\n\t\theaders.Authorization = `Bearer ${config.api.authToken}`;\n\t}\n\treturn headers;\n}\n","import type { ChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: ChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport {\n\tprocessStreamEventV2,\n\tcreateInitialV2State,\n\tgetEventMessage,\n\tisBlandStatus,\n} from \"../utils/v2EventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n\ttype AnalysisMode,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * K2 stream manager:\n * - Mirrors answer tokens into `streamingContent` during RUN_IN_PROGRESS\n * - Buffers the final response until RUN_COMPLETED / WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t\toptions?: { analysisMode?: AnalysisMode },\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst currentConfig = configRef.current;\n\t\t\t\tconst requestBody = buildRequestBody(\n\t\t\t\t\tcurrentConfig,\n\t\t\t\t\tuserMessage,\n\t\t\t\t\tsessionId,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\t// ── DIAGNOSTIC: print every streaming event ──────────────\n\t\t\t\t\t\t// Token deltas are noisy, so collapse RUN_IN_PROGRESS to a\n\t\t\t\t\t\t// length; everything else prints in full.\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst et = (event as any)?.eventType;\n\t\t\t\t\t\t\tif (et === \"RUN_IN_PROGRESS\" || et === \"INTENT_PROGRESS\" || et === \"THINKING_DELTA\") {\n\t\t\t\t\t\t\t\tconst len = ((event as any).partialText ?? (event as any).text ?? \"\").length;\n\t\t\t\t\t\t\t\tconsole.log(`[stream] ${et} (+${len} chars)`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.log(`[stream] ${et ?? \"?\"}:`, JSON.stringify(event));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tconsole.log(\"[stream] (unserializable event)\", (event as any)?.eventType);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// KEEP_ALIVE used to early-return here as a no-op\n\t\t\t\t\t\t// liveness tick. Server now attaches a rotating\n\t\t\t\t\t\t// `description` phrase during silent-think gaps so\n\t\t\t\t\t\t// the chat bubble status line changes instead of\n\t\t\t\t\t\t// freezing on \"Thinking…\". processStreamEventV2 owns\n\t\t\t\t\t\t// that mirroring; we fall through to updateMessage\n\t\t\t\t\t\t// so the new phrase actually reaches the UI.\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\t// Dispatch user-action callbacks from the transient\n\t\t\t\t\t\t// signals the processor set for THIS event. A\n\t\t\t\t\t\t// `USER_ACTION_REQUIRED` whose action is a notification\n\t\t\t\t\t\t// surfaces via `lastNotification` instead of\n\t\t\t\t\t\t// `lastUserAction`.\n\t\t\t\t\t\tif (state.lastUserAction) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.lastUserAction);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (state.lastNotification) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserNotification?.(state.lastNotification);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\t// Bland default-start labels like \"Executing…\" / \"Working\n\t\t\t\t\t\t// on it…\" come from each pipeline stage's\n\t\t\t\t\t\t// defaultStartMessage on the server. They flicker into the\n\t\t\t\t\t\t// chat bubble for the moment between an analyzer's dynamic\n\t\t\t\t\t\t// \"Pulling those up…\" status and the first tool call's\n\t\t\t\t\t\t// real \"Got 437 transactions\" — replacing useful info\n\t\t\t\t\t\t// with placeholder noise. Filter them out so the user\n\t\t\t\t\t\t// sees the most-recent SUBSTANTIVE message instead.\n\t\t\t\t\t\tconst useful = (m: string | undefined): string | undefined =>\n\t\t\t\t\t\t\tm && !isBlandStatus(m) ? m : undefined;\n\t\t\t\t\t\t// Walk backwards for the most recent USEFUL step message.\n\t\t\t\t\t\t// If executor just started with bland \"Executing…\" and\n\t\t\t\t\t\t// analyzer is done with \"Pulling those up for you now\",\n\t\t\t\t\t\t// we want analyzer's — bland on the latest step must\n\t\t\t\t\t\t// NOT shadow useful older ones. Previously latestWithMessage\n\t\t\t\t\t\t// returned the bland top-of-stack step and the candidate\n\t\t\t\t\t\t// chain fell through to the last-resort bland fallback even\n\t\t\t\t\t\t// though useful messages existed deeper in the stack.\n\t\t\t\t\t\tconst latestUsefulStep = [...state.steps].reverse().find(\n\t\t\t\t\t\t\t(s) => s.message && !isBlandStatus(s.message),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tuseful(activeStep?.message) ??\n\t\t\t\t\t\t\tuseful(lastInProgressStep?.message) ??\n\t\t\t\t\t\t\tlatestUsefulStep?.message ??\n\t\t\t\t\t\t\tuseful(getEventMessage(event)) ??\n\t\t\t\t\t\t\t// Last-resort: every candidate is bland (very first event,\n\t\t\t\t\t\t\t// nothing useful seen yet). Render the bland label so the\n\t\t\t\t\t\t\t// bubble isn't blank.\n\t\t\t\t\t\t\tactiveStep?.message ??\n\t\t\t\t\t\t\tlastInProgressStep?.message ??\n\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t// Notify consumers of every status-message change so a\n\t\t\t\t\t\t// surface outside the chat bubble (pipeline sidebar,\n\t\t\t\t\t\t// agent-avatar label) can mirror it without re-parsing\n\t\t\t\t\t\t// the event stream. Debounced implicitly by React\n\t\t\t\t\t\t// reconciliation — the callback fires every event but\n\t\t\t\t\t\t// consumers typically setState against it and React\n\t\t\t\t\t\t// dedups.\n\t\t\t\t\t\tif (currentMessage) {\n\t\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(currentMessage);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Give the host app the full steps snapshot so\n\t\t\t\t\t\t// pipeline-sidebar UIs can derive per-stage status\n\t\t\t\t\t\t// without reverse-mapping labels. Only fire when\n\t\t\t\t\t\t// steps actually changed (every STAGE_* event).\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([...state.steps]);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Mirror state.finalResponse into streamingContent\n\t\t\t\t\t\t\t// as it builds up from INTENT_PROGRESS deltas.\n\t\t\t\t\t\t\t// The k2 Formatter streams its LLM output chunk-\n\t\t\t\t\t\t\t// by-chunk; this is how the user sees the answer\n\t\t\t\t\t\t\t// build in real time instead of staring at a\n\t\t\t\t\t\t\t// blank screen for the ~2-3s the LLM takes.\n\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t// Pre-streaming servers never emit partial text,\n\t\t\t\t\t\t\t// so state.finalResponse stays \"\" until\n\t\t\t\t\t\t\t// WORKFLOW_COMPLETED — rendering \"\" here matches\n\t\t\t\t\t\t\t// the old behavior exactly for that case.\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: state.finalResponse,\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Clear any status-message consumers are mirroring —\n\t\t\t\t\t\t// the run is over, whatever was last showing is\n\t\t\t\t\t\t// stale now.\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Run is over — consumers tracking the status\n\t\t\t\t\t\t// message should clear their label / revert to\n\t\t\t\t\t\t// whatever default (agent name, blank).\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\t\t\t\t\t\t// Reset the steps snapshot so pipeline-sidebar\n\t\t\t\t\t\t// UIs can revert all stages back to idle.\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([]);\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t// Defensive: tracingData must be an object (or undefined)\n\t\t\t\t\t\t\t// so the JSON viewer doesn't char-iterate a string. The\n\t\t\t\t\t\t\t// event processor already drops bare strings; this is\n\t\t\t\t\t\t\t// the last stop before the message leaves the SDK.\n\t\t\t\t\t\t\ttracingData:\n\t\t\t\t\t\t\t\tstate.finalData != null && typeof state.finalData === \"object\"\n\t\t\t\t\t\t\t\t\t? state.finalData\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t\ttotalElapsedMs: state.hasError ? undefined : state.totalElapsedMs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\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 * Thrown when a resolution endpoint returns `404`\n * (`user_action_not_found`): the prompt already resolved, expired, or\n * the id is unknown. Callers should treat the prompt as no longer\n * actionable — stop any countdown and clear the form — rather than\n * surfacing this as a hard error.\n */\nexport class UserActionStaleError extends Error {\n\treadonly userActionId: string;\n\tconstructor(userActionId: string, message = \"User action is no longer actionable\") {\n\t\tsuper(message);\n\t\tthis.name = \"UserActionStaleError\";\n\t\tthis.userActionId = userActionId;\n\t}\n}\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws `UserActionStaleError` on 404 and a\n * generic error on other non-2xx status / 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.status === 404) {\n\t\tthrow new UserActionStaleError(userActionId);\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. `content` is the schema-typed form payload sent\n * straight through to the agent (its keys should match the prompt's\n * `requestedSchema.properties`) — e.g. `{ otp: \"123456\" }` for a\n * verification prompt or `{ amount: 50, confirm: true }` for a form.\n */\nexport async function submitUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\tcontent?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", content ?? {});\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, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n\tActiveUserAction,\n\tChatCallbacks,\n\tChatConfig,\n\tMessageDisplay,\n\tUserActionRequest,\n\tUserActionState,\n} from \"../types\";\nimport { generateId } from \"../utils/generateId\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport type { AnalysisMode } from \"../utils/requestBuilder\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n\tUserActionStaleError,\n} from \"../utils/userActionClient\";\n\nconst EMPTY_USER_ACTION_STATE: UserActionState = { prompts: [], notifications: [] };\n\n/**\n * Upsert a prompt applying the supersede rule: a request matching an\n * existing slot's `toolCallId` (a retry/resend, possibly with a new\n * `userActionId`) REPLACES that slot in place; otherwise it's appended\n * as a new (parallel) prompt.\n */\nfunction upsertPrompt(\n\tprompts: ActiveUserAction[],\n\treq: UserActionRequest,\n): ActiveUserAction[] {\n\tconst active: ActiveUserAction = { ...req, status: \"pending\" };\n\tconst idx = prompts.findIndex((p) =>\n\t\treq.toolCallId\n\t\t\t? p.toolCallId === req.toolCallId\n\t\t\t: p.userActionId === req.userActionId,\n\t);\n\tif (idx >= 0) {\n\t\tconst next = prompts.slice();\n\t\tnext[idx] = active;\n\t\treturn next;\n\t}\n\treturn [...prompts, active];\n}\n\nexport type SendMessageOptions = {\n\t/**\n\t * Latency-vs-precision toggle surfaced in the chat widget.\n\t * `\"fast\"` (default) — the server caps list-tool fetches and\n\t * returns a quick, directionally correct answer with a sampling\n\t * caveat. `\"deep\"` — the server runs a full analytical pass,\n\t * no row caps, full rankings.\n\t *\n\t * Undefined / omitted means \"don't set — let the server use its\n\t * default\", which is `\"fast\"` today. Callers that want explicit\n\t * control should always pass this; callers that don't care can\n\t * skip it and inherit the server default.\n\t */\n\tanalysisMode?: AnalysisMode;\n};\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string, options?: SendMessageOptions) => Promise<void>;\n\tclearMessages: () => void;\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\t/** Active user-action prompts + one-way notifications for this chat. */\n\tuserActionState: UserActionState;\n\t/**\n\t * Submit a prompt's form payload. `content` keys should match the\n\t * prompt's `requestedSchema.properties` (e.g. `{ otp: \"123456\" }`).\n\t */\n\tsubmitUserAction: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\t/** Cancel / decline a prompt. */\n\tcancelUserAction: (userActionId: string) => Promise<void>;\n\t/** Ask the agent to re-send a prompt (e.g. resend a verification code). */\n\tresendUserAction: (userActionId: string) => Promise<void>;\n\t/** Dismiss a one-way notification from local state. */\n\tdismissNotification: (id: string) => void;\n};\n\nfunction getStoredOrInitialMessages(config: ChatConfig): MessageDisplay[] {\n\tif (!config.userId) return config.initialMessages ?? [];\n\n\t// Active stream takes highest priority — avoids flash when restoring a streaming session\n\tconst activeStream = activeStreamStore.get(config.userId);\n\tif (activeStream) return activeStream.messages;\n\n\tconst stored = chatStore.get(config.userId);\n\tif (stored.length > 0) return stored;\n\n\tif (config.initialMessages?.length) {\n\t\tchatStore.set(config.userId, config.initialMessages);\n\t\treturn config.initialMessages;\n\t}\n\n\treturn [];\n}\n\nfunction getSessionIdFromMessages(messages: MessageDisplay[]): string | undefined {\n\treturn messages.find((message) => message.sessionId)?.sessionId;\n}\n\nexport function useChatV2(config: ChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => getStoredOrInitialMessages(config));\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(() => {\n\t\tif (!config.userId) return false;\n\t\treturn activeStreamStore.get(config.userId)?.isWaiting ?? false;\n\t});\n\tconst sessionIdRef = useRef<string | undefined>(\n\t\tgetSessionIdFromMessages(getStoredOrInitialMessages(config)) ?? config.initialSessionId ?? undefined,\n\t);\n\tconst prevUserIdRef = useRef<string | undefined>(config.userId);\n\t// Tracks the userId that was active when sendMessage was called — locked for the stream's lifetime\n\tconst streamUserIdRef = useRef<string | undefined>(undefined);\n\t// Tracks the previous userId seen by the subscription effect — used to detect renames\n\tconst subscriptionPrevUserIdRef = useRef<string | undefined>(config.userId);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\t// Use the locked stream userId (set at sendMessage time) so background stream\n\t\t\t// updates go to the right store key even if the user switches sessions.\n\t\t\tconst streamUserId = streamUserIdRef.current;\n\t\t\tconst currentUserId = configRef.current.userId;\n\t\t\tconst storeKey = streamUserId ?? currentUserId;\n\t\t\tif (storeKey && activeStreamStore.has(storeKey)) {\n\t\t\t\tactiveStreamStore.applyMessages(storeKey, updater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]));\n\t\t\t}\n\t\t\t// Only update React state when on the same session as the running stream\n\t\t\tif (!streamUserId || streamUserId === currentUserId) {\n\t\t\t\tsetMessages(updater);\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback(\n\t\t(waiting: boolean) => {\n\t\t\tconst streamUserId = streamUserIdRef.current;\n\t\t\tconst currentUserId = configRef.current.userId;\n\t\t\tconst storeKey = streamUserId ?? currentUserId;\n\t\t\tif (storeKey && activeStreamStore.has(storeKey)) {\n\t\t\t\tactiveStreamStore.setWaiting(storeKey, waiting);\n\t\t\t}\n\t\t\tif (!streamUserId || streamUserId === currentUserId) {\n\t\t\t\tsetIsWaitingForResponse(waiting);\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>(EMPTY_USER_ACTION_STATE);\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(() => ({\n\t\t...callbacksRef.current,\n\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\tonUserActionRequired: (request) => {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tprompts: upsertPrompt(prev.prompts, request),\n\t\t\t}));\n\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t},\n\t\tonUserNotification: (notification) => {\n\t\t\tsetUserActionState((prev) =>\n\t\t\t\tprev.notifications.some((n) => n.id === notification.id)\n\t\t\t\t\t? prev\n\t\t\t\t\t: { ...prev, notifications: [...prev.notifications, notification] },\n\t\t\t);\n\t\t\tcallbacksRef.current.onUserNotification?.(notification);\n\t\t},\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}), []);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string, options?: SendMessageOptions) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\tif (!sessionIdRef.current && configRef.current.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId) {\n\t\t\t\tstreamUserIdRef.current = userId;\n\t\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\t\tactiveStreamStore.start(userId, abortController, initialMessages);\n\t\t\t}\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tsessionIdRef.current,\n\t\t\t\tabortController,\n\t\t\t\toptions,\n\t\t\t);\n\n\t\t\t// Use streamUserIdRef in case it was updated by a rename (onSessionIdChange)\n\t\t\tconst finalStreamUserId = streamUserIdRef.current ?? userId;\n\t\t\tif (finalStreamUserId) {\n\t\t\t\tactiveStreamStore.complete(finalStreamUserId);\n\t\t\t}\n\t\t\tstreamUserIdRef.current = undefined;\n\n\t\t\tif (!abortController.signal.aborted && newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tconst streamUserId = streamUserIdRef.current ?? configRef.current.userId;\n\t\tif (streamUserId) {\n\t\t\tactiveStreamStore.abort(streamUserId);\n\t\t}\n\t\tstreamUserIdRef.current = undefined;\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, prompts: [] }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(\n\t\t\t\t\t\t\tmsg.steps || [],\n\t\t\t\t\t\t\tmsg.currentMessage,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tconst streamUserId = streamUserIdRef.current ?? configRef.current.userId;\n\t\tif (streamUserId) {\n\t\t\tactiveStreamStore.abort(streamUserId);\n\t\t}\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tstreamUserIdRef.current = undefined;\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState(EMPTY_USER_ACTION_STATE);\n\t}, []);\n\n\tconst getSessionId = useCallback(() => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst getMessages = useCallback(() => {\n\t\treturn messages;\n\t}, [messages]);\n\n\tconst setPromptStatus = useCallback(\n\t\t(userActionId: string, status: ActiveUserAction[\"status\"]) => {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tprompts: prev.prompts.map((p) =>\n\t\t\t\t\tp.userActionId === userActionId ? { ...p, status } : p,\n\t\t\t\t),\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\tconst removePrompt = useCallback((userActionId: string) => {\n\t\tsetUserActionState((prev) => ({\n\t\t\t...prev,\n\t\t\tprompts: prev.prompts.filter((p) => p.userActionId !== userActionId),\n\t\t}));\n\t}, []);\n\n\tconst submitUserAction = useCallback(\n\t\tasync (userActionId: string, content: Record<string, unknown>) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait submitUserActionApi(configRef.current, userActionId, content);\n\t\t\t\t// Endpoint accepted the resolution: the run resumes on the\n\t\t\t\t// open stream. Drop the slot — if the input was invalid the\n\t\t\t\t// server emits a fresh USER_ACTION_REQUIRED (subAction\n\t\t\t\t// \"SubmissionInvalid\") that re-adds it.\n\t\t\t\tremovePrompt(userActionId);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tsetPromptStatus(userActionId, \"stale\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Recoverable failure — let the user retry the same prompt.\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[removePrompt, setPromptStatus],\n\t);\n\n\tconst cancelUserAction = useCallback(\n\t\tasync (userActionId: string) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait cancelUserActionApi(configRef.current, userActionId);\n\t\t\t\tremovePrompt(userActionId);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tremovePrompt(userActionId);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[removePrompt, setPromptStatus],\n\t);\n\n\tconst resendUserAction = useCallback(\n\t\tasync (userActionId: string) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait resendUserActionApi(configRef.current, userActionId);\n\t\t\t\t// Keep the slot open; the server pushes a new\n\t\t\t\t// USER_ACTION_REQUIRED (\"RequestResent\") that supersedes it.\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tsetPromptStatus(userActionId, \"stale\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[setPromptStatus],\n\t);\n\n\tconst dismissNotification = useCallback((id: string) => {\n\t\tsetUserActionState((prev) => ({\n\t\t\t...prev,\n\t\t\tnotifications: prev.notifications.filter((n) => n.id !== id),\n\t\t}));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst prevSubscriptionUserId = subscriptionPrevUserIdRef.current;\n\t\tsubscriptionPrevUserIdRef.current = config.userId;\n\t\tconst { userId } = config;\n\t\tif (!userId) return;\n\n\t\t// Detect when the stream was renamed (e.g. server assigned a new session ID via\n\t\t// migrateActiveStream in the app): old key is gone, new key has the stream,\n\t\t// and streamUserIdRef still points to the old key.\n\t\tif (\n\t\t\tprevSubscriptionUserId &&\n\t\t\tprevSubscriptionUserId !== userId &&\n\t\t\tstreamUserIdRef.current === prevSubscriptionUserId &&\n\t\t\t!activeStreamStore.has(prevSubscriptionUserId) &&\n\t\t\tactiveStreamStore.has(userId)\n\t\t) {\n\t\t\tstreamUserIdRef.current = userId;\n\t\t}\n\n\t\tconst unsubscribe = activeStreamStore.subscribe(userId, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(userId);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t}, [config.userId]);\n\n\tuseEffect(() => {\n\t\tif (!config.userId) return;\n\t\t// prevUserIdRef is updated in the userId-change effect which runs *after* this one.\n\t\t// If they differ here, userId just changed and messages still belong to the previous\n\t\t// session — skip so we don't corrupt the new session's chatStore entry.\n\t\tif (prevUserIdRef.current !== config.userId) return;\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(config.userId, toSave);\n\t\t}\n\t}, [messages, config.userId]);\n\n\tuseEffect(() => {\n\t\tif (!config.userId || activeStreamStore.has(config.userId)) return;\n\t\tif (!config.initialMessages?.length || messagesRef.current.length > 0) return;\n\n\t\tchatStore.set(config.userId, config.initialMessages);\n\t\tsetMessages(config.initialMessages);\n\t\tsessionIdRef.current = getSessionIdFromMessages(config.initialMessages) ?? config.initialSessionId;\n\t}, [config.initialMessages, config.initialSessionId, config.userId]);\n\n\tuseEffect(() => {\n\t\tconst prevUserId = prevUserIdRef.current;\n\t\tprevUserIdRef.current = config.userId;\n\n\t\tif (prevUserId === config.userId) return;\n\n\t\tif (prevUserId && !config.userId) {\n\t\t\tchatStore.delete(prevUserId);\n\t\t\tsetMessages([]);\n\t\t\tsessionIdRef.current = undefined;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetUserActionState(EMPTY_USER_ACTION_STATE);\n\t\t} else if (config.userId) {\n\t\t\tconst active = activeStreamStore.get(config.userId);\n\t\t\tif (active) {\n\t\t\t\tsetMessages(active.messages);\n\t\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t\t\tsessionIdRef.current = getSessionIdFromMessages(active.messages) ?? config.initialSessionId;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextMessages = getStoredOrInitialMessages(config);\n\t\t\tsetMessages(nextMessages);\n\t\t\tsessionIdRef.current = getSessionIdFromMessages(nextMessages) ?? config.initialSessionId;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t}\n\t}, [config]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t\tuserActionState,\n\t\tsubmitUserAction,\n\t\tcancelUserAction,\n\t\tresendUserAction,\n\t\tdismissNotification,\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","// ============================================================\n// JSON Schema form helper (zero-dependency, platform-agnostic)\n// ============================================================\n//\n// MCP elicitation uses standard JSON Schema to describe the form a\n// prompt wants filled. The server emits a small, flat subset today\n// (a `properties` map of primitives + `oneOf` single-selects). These\n// pure helpers classify fields, coerce submitted values to the right\n// JSON type, and validate against the declared constraints.\n//\n// Design rules:\n// - No React, no DOM, no deps — usable by web and React Native UIs.\n// - Forward-compatible: unknown `type`s fall back to text, unknown\n// keywords are ignored, and nested objects/arrays are flagged as\n// unsupported (so the UI can skip them) rather than crashing.\n\nimport type {\n\tJsonSchemaField,\n\tJsonSchemaOption,\n\tRequestedSchema,\n} from \"../types\";\n\n/** The widget kinds the renderer knows how to draw. */\nexport type FieldWidget = \"text\" | \"integer\" | \"decimal\" | \"boolean\" | \"select\";\n\n/**\n * Classify a schema field into a widget kind. `oneOf` always wins\n * (titled single-select), then `type`. Anything unrecognized — or a\n * missing type — degrades to a plain text input.\n */\nexport function classifyField(field: JsonSchemaField | undefined): FieldWidget {\n\tif (!field) return \"text\";\n\tif (Array.isArray(field.oneOf) && field.oneOf.length > 0) return \"select\";\n\tswitch (field.type) {\n\t\tcase \"boolean\":\n\t\t\treturn \"boolean\";\n\t\tcase \"integer\":\n\t\t\treturn \"integer\";\n\t\tcase \"number\":\n\t\t\treturn \"decimal\";\n\t\tcase \"string\":\n\t\t\treturn \"text\";\n\t\tdefault:\n\t\t\treturn \"text\";\n\t}\n}\n\n/**\n * Fields we can't render as a flat primitive (nested objects, arrays,\n * tuple/composite schemas). The renderer should skip these rather than\n * attempt a best-effort input. `oneOf` is NOT considered unsupported —\n * it's our single-select shape.\n */\nexport function isNestedOrUnsupported(field: JsonSchemaField | undefined): boolean {\n\tif (!field) return false;\n\tif (field.type === \"object\" || field.type === \"array\") return true;\n\tif (\"properties\" in field && field.properties != null) return true;\n\tif (\"items\" in field && field.items != null) return true;\n\treturn false;\n}\n\n/** Normalize a field's `oneOf` into a clean option list (drops malformed entries). */\nexport function getOptions(field: JsonSchemaField | undefined): JsonSchemaOption[] {\n\tif (!field || !Array.isArray(field.oneOf)) return [];\n\treturn field.oneOf.filter(\n\t\t(o): o is JsonSchemaOption =>\n\t\t\t!!o && typeof o === \"object\" && typeof o.const === \"string\",\n\t);\n}\n\n/** Is `key` required per the schema's `required` array? */\nexport function isRequired(schema: RequestedSchema | undefined, key: string): boolean {\n\treturn Array.isArray(schema?.required) && schema!.required!.includes(key);\n}\n\n/**\n * Coerce a raw widget value into the JSON type the schema declares, so\n * the submitted `content` round-trips cleanly. Empty/blank values become\n * `undefined` (the field is simply omitted from the payload). The server\n * is tolerant of strings, but matching types keeps things clean.\n */\nexport function coerceValue(field: JsonSchemaField | undefined, raw: unknown): unknown {\n\tconst widget = classifyField(field);\n\n\tif (widget === \"boolean\") {\n\t\tif (typeof raw === \"boolean\") return raw;\n\t\tif (raw === \"true\") return true;\n\t\tif (raw === \"false\") return false;\n\t\treturn Boolean(raw);\n\t}\n\n\tif (widget === \"integer\" || widget === \"decimal\") {\n\t\tif (raw === \"\" || raw == null) return undefined;\n\t\tconst num = typeof raw === \"number\" ? raw : Number(String(raw).trim());\n\t\tif (Number.isNaN(num)) return undefined;\n\t\treturn widget === \"integer\" ? Math.trunc(num) : num;\n\t}\n\n\t// text + select → string\n\tif (raw == null) return undefined;\n\tconst str = String(raw);\n\treturn str === \"\" ? undefined : str;\n}\n\n/** Pre-fill value for a field's widget, from `default` (typed loosely for inputs). */\nexport function defaultValueFor(field: JsonSchemaField | undefined): unknown {\n\tif (!field || field.default === undefined) {\n\t\treturn classifyField(field) === \"boolean\" ? false : \"\";\n\t}\n\treturn field.default;\n}\n\n/**\n * Validate a single field's coerced value. Returns an error string or\n * `null` when valid. Only the documented keywords are enforced; unknown\n * keywords are ignored.\n */\nexport function validateField(\n\tfield: JsonSchemaField | undefined,\n\tvalue: unknown,\n\trequired: boolean,\n): string | null {\n\tconst widget = classifyField(field);\n\tconst label = field?.title || \"This field\";\n\n\tconst isEmpty =\n\t\tvalue === undefined ||\n\t\tvalue === null ||\n\t\t(typeof value === \"string\" && value.trim() === \"\");\n\n\tif (isEmpty) {\n\t\t// Booleans are never \"empty\" in a way that fails required.\n\t\tif (required && widget !== \"boolean\") return `${label} is required.`;\n\t\treturn null;\n\t}\n\n\tif (widget === \"integer\" || widget === \"decimal\") {\n\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\tif (Number.isNaN(num)) return `${label} must be a number.`;\n\t\tif (widget === \"integer\" && !Number.isInteger(num)) {\n\t\t\treturn `${label} must be a whole number.`;\n\t\t}\n\t\tif (typeof field?.minimum === \"number\" && num < field.minimum) {\n\t\t\treturn `${label} must be at least ${field.minimum}.`;\n\t\t}\n\t\tif (typeof field?.maximum === \"number\" && num > field.maximum) {\n\t\t\treturn `${label} must be at most ${field.maximum}.`;\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (widget === \"select\") {\n\t\tconst allowed = getOptions(field).map((o) => o.const);\n\t\tif (allowed.length > 0 && !allowed.includes(String(value))) {\n\t\t\treturn `${label} has an invalid selection.`;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// text\n\tconst str = String(value);\n\tif (typeof field?.minLength === \"number\" && str.length < field.minLength) {\n\t\treturn `${label} must be at least ${field.minLength} characters.`;\n\t}\n\tif (typeof field?.maxLength === \"number\" && str.length > field.maxLength) {\n\t\treturn `${label} must be at most ${field.maxLength} characters.`;\n\t}\n\treturn null;\n}\n\n/** Ordered list of renderable [key, field] pairs (skips unsupported fields). */\nexport function renderableFields(\n\tschema: RequestedSchema | undefined,\n): Array<[string, JsonSchemaField]> {\n\tconst props = schema?.properties;\n\tif (!props) return [];\n\treturn Object.entries(props).filter(([, field]) => !isNestedOrUnsupported(field));\n}\n\n/**\n * Validate a full form. `values` is the raw widget-value map (pre-coercion).\n * Returns a `{ key: error }` map (empty when the form is valid).\n */\nexport function validateForm(\n\tschema: RequestedSchema | undefined,\n\tvalues: Record<string, unknown>,\n): Record<string, string> {\n\tconst errors: Record<string, string> = {};\n\tfor (const [key, field] of renderableFields(schema)) {\n\t\tconst coerced = coerceValue(field, values[key]);\n\t\tconst err = validateField(field, coerced, isRequired(schema, key));\n\t\tif (err) errors[key] = err;\n\t}\n\treturn errors;\n}\n\n/**\n * Build the schema-typed `content` object to POST on submit. Only fields\n * present in the schema are included; blank/undefined values are omitted.\n */\nexport function buildContent(\n\tschema: RequestedSchema | undefined,\n\tvalues: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst content: Record<string, unknown> = {};\n\tfor (const [key, field] of renderableFields(schema)) {\n\t\tconst coerced = coerceValue(field, values[key]);\n\t\tif (coerced !== undefined) content[key] = coerced;\n\t}\n\treturn content;\n}\n","import { createContext, useContext } from \"react\";\nimport type { MessageDisplay } from \"../types\";\n\nexport interface PaymanChatContextValue {\n\t/**\n\t * Clear all messages and reset the chat\n\t */\n\tresetSession: () => void;\n\n\t/**\n\t * Clear all messages without resetting session ID\n\t */\n\tclearMessages: () => void;\n\n\t/**\n\t * Prepend older messages to the top of the list (e.g. from history pagination)\n\t */\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\n\t/**\n\t * Cancel current streaming operation\n\t */\n\tcancelStream: () => void;\n\n\t/**\n\t * Get current session ID\n\t */\n\tgetSessionId: () => string | undefined;\n\n\t/**\n\t * Get all messages\n\t */\n\tgetMessages: () => MessageDisplay[];\n\n\t/**\n\t * Check if currently waiting for response\n\t */\n\tisWaitingForResponse: boolean;\n}\n\nexport const PaymanChatContext = createContext<\n\tPaymanChatContextValue | undefined\n>(undefined);\n\n/**\n * Hook to access PaymanChat controls from parent components\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const chat = usePaymanChat();\n * \n * return (\n * <>\n * <button onClick={chat.resetSession}>Reset</button>\n * <button onClick={chat.clearMessages}>Clear</button>\n * </>\n * );\n * }\n * ```\n */\nexport function usePaymanChat(): PaymanChatContextValue {\n\tconst context = useContext(PaymanChatContext);\n\tif (!context) {\n\t\tthrow new Error(\"usePaymanChat must be used within a PaymanChat component\");\n\t}\n\treturn context;\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes\n */\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","/**\n * Format a timestamp to a readable date/time string\n */\nexport function formatDate(timestamp: string | Date): string {\n\tconst date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n\n\tconst now = new Date();\n\tconst diffMs = now.getTime() - date.getTime();\n\tconst diffMins = Math.floor(diffMs / 60000);\n\tconst diffHours = Math.floor(diffMs / 3600000);\n\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t// Less than a minute\n\tif (diffMins < 1) {\n\t\treturn \"Just now\";\n\t}\n\n\t// Less than an hour\n\tif (diffMins < 60) {\n\t\treturn `${diffMins}m ago`;\n\t}\n\n\t// Less than a day\n\tif (diffHours < 24) {\n\t\treturn `${diffHours}h ago`;\n\t}\n\n\t// Less than a week\n\tif (diffDays < 7) {\n\t\treturn `${diffDays}d ago`;\n\t}\n\n\t// Format as date\n\treturn date.toLocaleDateString(\"en-US\", {\n\t\tmonth: \"short\",\n\t\tday: \"numeric\",\n\t\tyear: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n\t});\n}\n\nexport function formatElapsedTime(ms?: number): string {\n\tif (!ms) return \"\";\n\tif (ms < 1000) return `${ms}ms`;\n\treturn `${(ms / 1000).toFixed(1)}s`;\n}\n","import * as Sentry from \"@sentry/react\";\n\nexport interface ChatSessionContext {\n\tsessionId?: string;\n\tsessionOwnerId?: string;\n\tagentId?: string;\n\texecutionId?: string;\n\tcfRay?: string;\n\troute?: string;\n\tcustomerId?: string;\n\tcustomerEmail?: string;\n}\n\n/**\n * Reports an error to Sentry enriched with chat session context.\n * Tags and context are scoped to this event so they don't leak\n * to unrelated errors.\n *\n * No-op when Sentry is not initialised.\n */\nexport function captureSentryError(\n\terror: Error | string,\n\tcontext: ChatSessionContext\n): void {\n\tif (!Sentry.getClient()) return;\n\n\tconst tags: Record<string, string> = {};\n\tif (context.executionId) tags.executionId = context.executionId;\n\tif (context.sessionId) tags.sessionId = context.sessionId;\n\tif (context.route) tags.route = context.route;\n\tif (context.cfRay) tags.cfRay = context.cfRay;\n\n\tif (context.customerId) tags.customerId = context.customerId;\n\tif (context.customerEmail) tags.customerEmail = context.customerEmail;\n\n\tconst contexts = {\n\t\tchat_session: {\n\t\t\tsessionId: context.sessionId ?? null,\n\t\t\tsessionOwnerId: context.sessionOwnerId ?? null,\n\t\t\texecutionId: context.executionId ?? null,\n\t\t\tagentId: context.agentId ?? null,\n\t\t\tcfRay: context.cfRay ?? null,\n\t\t\tcustomerId: context.customerId ?? null,\n\t\t\tcustomerEmail: context.customerEmail ?? null,\n\t\t},\n\t};\n\n\tif (typeof error === \"string\") {\n\t\tSentry.captureMessage(error, { level: \"error\", tags, contexts });\n\t} else {\n\t\tSentry.captureException(error, { tags, contexts });\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Targeted fetch interceptor for capturing cf-ray headers\n// ---------------------------------------------------------------------------\n\ntype CfRayListener = (cfRay: string) => void;\n\ninterface InterceptorEntry {\n\turlPattern: string;\n\tlistener: CfRayListener;\n}\n\nconst interceptors: Set<InterceptorEntry> = new Set();\nlet originalFetch: typeof globalThis.fetch | null = null;\n\nfunction patchFetch(): void {\n\tif (originalFetch !== null) return;\n\tif (typeof globalThis === \"undefined\" || typeof globalThis.fetch !== \"function\")\n\t\treturn;\n\n\toriginalFetch = globalThis.fetch;\n\n\tglobalThis.fetch = async function (\n\t\tthis: typeof globalThis,\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit\n\t): Promise<Response> {\n\t\tconst response = await originalFetch!.call(this, input, init);\n\n\t\tif (interceptors.size > 0) {\n\t\t\tconst url =\n\t\t\t\ttypeof input === \"string\"\n\t\t\t\t\t? input\n\t\t\t\t\t: input instanceof URL\n\t\t\t\t\t\t? input.href\n\t\t\t\t\t\t: (input as Request).url;\n\n\t\t\ttry {\n\t\t\t\tconst cfRay = response.headers.get(\"cf-ray\");\n\t\t\t\tif (cfRay) {\n\t\t\t\t\tfor (const entry of interceptors) {\n\t\t\t\t\t\tif (url.includes(entry.urlPattern)) {\n\t\t\t\t\t\t\tentry.listener(cfRay);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// headers may be inaccessible on opaque responses\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t};\n}\n\nfunction maybeUnpatchFetch(): void {\n\tif (interceptors.size > 0 || originalFetch === null) return;\n\tglobalThis.fetch = originalFetch;\n\toriginalFetch = null;\n}\n\n/**\n * Registers a listener that receives the `cf-ray` header value whenever a\n * fetch response URL contains `urlPattern`.\n *\n * Returns an unsubscribe function (call on unmount).\n */\nexport function subscribeToCfRay(\n\turlPattern: string,\n\tlistener: CfRayListener\n): () => void {\n\tconst entry: InterceptorEntry = { urlPattern, listener };\n\tpatchFetch();\n\tinterceptors.add(entry);\n\treturn () => {\n\t\tinterceptors.delete(entry);\n\t\tmaybeUnpatchFetch();\n\t};\n}\n","import type { SlashCommandConfig } from \"../types\";\n\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandConfig[] = [\n\t{\n\t\tname: \"/draft-knowledge\",\n\t\tdescription: \"Create a Knowledge Vault draft for admin review\",\n\t\trequiredAnyPermissions: [\"vault:author\", \"vault:publish\"],\n\t},\n];\n\nfunction hasCommandPermission(\n\tgranted: Set<string>,\n\trequiredPermission: string,\n): boolean {\n\tif (granted.has(\"*\") || granted.has(requiredPermission)) return true;\n\tif (!requiredPermission.includes(\".\")) return false;\n\tconst wildcard =\n\t\trequiredPermission.substring(0, requiredPermission.lastIndexOf(\".\")) + \".*\";\n\treturn granted.has(wildcard);\n}\n\nexport function filterSlashCommands(\n\tcommands: SlashCommandConfig[],\n\tpermissions: string[] | undefined,\n): SlashCommandConfig[] {\n\tconst granted = new Set(permissions ?? []);\n\treturn commands.filter((command) => {\n\t\tconst required = command.requiredAnyPermissions ?? [];\n\t\treturn (\n\t\t\trequired.length === 0 ||\n\t\t\trequired.some((permission) => hasCommandPermission(granted, permission))\n\t\t);\n\t});\n}\n\nexport function parseSlashCommand(content: string): {\n\tcommand: string;\n\tbody: string;\n} | null {\n\tconst trimmedStart = content.trimStart();\n\tif (!trimmedStart.startsWith(\"/\")) return null;\n\tconst match = trimmedStart.match(/^(\\/[a-z][a-z0-9-]*)(?:\\s+([\\s\\S]*))?$/i);\n\tif (!match) return null;\n\treturn {\n\t\tcommand: match[1],\n\t\tbody: match[2] ?? \"\",\n\t};\n}\n\nexport function getSlashCommandValidationHint(content: string): string | null {\n\tconst parsed = parseSlashCommand(content);\n\tif (parsed?.command !== \"/draft-knowledge\") return null;\n\n\tconst lines = parsed.body.split(/\\r?\\n/);\n\tconst title = lines[0]?.trim() ?? \"\";\n\tconst markdownContent = lines.slice(1).join(\"\\n\").trim();\n\n\tif (!title) {\n\t\treturn \"Add a title after /draft-knowledge, then add markdown content on the next line.\";\n\t}\n\tif (!markdownContent) {\n\t\treturn \"Add markdown content on a new line below the title.\";\n\t}\n\treturn null;\n}\n","const WORKFLOW_FAILED = \"WORKFLOW_FAILED\";\nconst STREAM_NOT_STARTED = \"STREAM_NOT_STARTED\";\nconst HTTP_ERROR_PREFIX = /^HTTP\\s+(\\d+)\\s*:\\s*([\\s\\S]+)$/;\n\ntype ErrorPayload = {\n\tstatus?: number;\n\tmessage?: string;\n};\n\nexport function isFriendlyWorkflowError(errorDetails?: string): boolean {\n\tif (!errorDetails) return false;\n\n\treturn (\n\t\terrorDetails === WORKFLOW_FAILED ||\n\t\terrorDetails === STREAM_NOT_STARTED ||\n\t\terrorDetails.includes(WORKFLOW_FAILED)\n\t);\n}\n\nfunction parseErrorPayload(payload: string): ErrorPayload {\n\ttry {\n\t\tconst parsed = JSON.parse(payload) as unknown;\n\n\t\tif (typeof parsed === \"string\") {\n\t\t\treturn { message: parsed.trim() || undefined };\n\t\t}\n\n\t\tif (typeof parsed === \"object\" && parsed !== null) {\n\t\t\tconst record = parsed as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\ttypeof record.status === \"number\" ? record.status : undefined,\n\t\t\t\tmessage:\n\t\t\t\t\ttypeof record.message === \"string\" && record.message.trim()\n\t\t\t\t\t\t? record.message.trim()\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// Ignore invalid JSON payloads and fall back to plain-text handling.\n\t}\n\n\treturn {};\n}\n\nexport function getConflictErrorMessage(errorDetails?: string): string | undefined {\n\tif (!errorDetails) return undefined;\n\n\tconst trimmedError = errorDetails.trim();\n\tconst httpMatch = trimmedError.match(HTTP_ERROR_PREFIX);\n\tconst httpStatus = httpMatch ? Number(httpMatch[1]) : undefined;\n\tconst rawPayload = (httpMatch ? httpMatch[2] : trimmedError).trim();\n\tconst payload = parseErrorPayload(rawPayload);\n\tconst status = payload.status ?? httpStatus;\n\n\tif (status !== 409) {\n\t\treturn undefined;\n\t}\n\n\tif (payload.message) {\n\t\treturn payload.message;\n\t}\n\n\treturn rawPayload || undefined;\n}\n","import * as Sentry from \"@sentry/react\";\n\n/**\n * Initialise Sentry inside the SDK.\n * Only runs when a DSN is provided and Sentry has not already been initialised\n * by the host application, so it is safe to call even if the host also calls\n * Sentry.init().\n */\nexport function initSentryIfNeeded(dsn: string): void {\n\tif (!dsn) return;\n\n\t// getClient() returns undefined when Sentry has not been initialised yet\n\tif (Sentry.getClient()) return;\n\n\tSentry.init({\n\t\tdsn,\n\t\tsendDefaultPii: true,\n\t\tinitialScope: {\n\t\t\ttags: { source: \"payman-ask-sdk\" },\n\t\t},\n\t});\n}\n","// Feedback persistence for assistant responses. A thumbs-up is `POSITIVE`;\n// a thumbs-down resolves to one specific negative reason. The values mirror\n// the backend `Feedback` enum exactly — do not rename without changing the\n// k2-server enum (cloud.yaak.core.model.enums.Feedback).\n\nexport const NEGATIVE_FEEDBACK_REASONS = [\n\t{ value: \"NOT_FACTUALLY_CORRECT\", label: \"Not factually correct\" },\n\t{ value: \"INCOMPLETE_RESPONSE\", label: \"Incomplete response\" },\n\t{ value: \"DID_NOT_FOLLOW_REQUEST\", label: \"Did not follow my request\" },\n\t{ value: \"OVERACTIVE_REFUSAL\", label: \"Refused unnecessarily\" },\n\t{ value: \"ISSUE_WITH_THOUGHT_PROCESS\", label: \"Issue with reasoning\" },\n\t{ value: \"REPORT_CONTENT\", label: \"Report content\" },\n\t{ value: \"OTHER\", label: \"Other\" },\n] as const;\n\nexport type NegativeFeedbackReason =\n\t(typeof NEGATIVE_FEEDBACK_REASONS)[number][\"value\"];\n\n/** The full feedback value sent to the backend. */\nexport type FeedbackValue = \"POSITIVE\" | NegativeFeedbackReason;\n\nconst DEFAULT_STREAM_ENDPOINT = \"/api/playground/ask/stream\";\n\n/**\n * Handler threaded down to the message components. Resolves when the\n * feedback is durably saved and rejects when the POST fails, so the UI can\n * revert its optimistic state or surface an error.\n */\nexport type SubmitFeedbackHandler = (data: {\n\tmessageId: string;\n\texecutionId?: string;\n\tfeedback: FeedbackValue;\n\tdetails?: string;\n}) => Promise<void>;\n\nexport type SubmitFeedbackArgs = {\n\tbaseUrl: string;\n\t/**\n\t * The chat's streamEndpoint. The feedback path is derived from it the same\n\t * way the SDK derives other sub-resources (strip the trailing `/stream`,\n\t * append `/executions/{id}/feedback`) so it lands on the matching surface:\n\t * /api/playground/ask/stream → /api/playground/ask/executions/{id}/feedback (JWT)\n\t * /api/ask/stream → /api/ask/executions/{id}/feedback (api key)\n\t */\n\tstreamEndpoint?: string;\n\t/** Auth — mirrors buildRequestHeaders: custom headers + optional Bearer. */\n\theaders?: Record<string, string>;\n\tauthToken?: string;\n\t/** Deployment stage, forwarded as a query param like the stream call. */\n\tstage?: string;\n\tstageQueryParam?: string;\n\texecutionId: string;\n\tfeedback: FeedbackValue;\n\tdetails?: string;\n\tsignal?: AbortSignal;\n};\n\n/**\n * POST feedback for one execution. Resolves the URL and auth from the same\n * config the chat stream uses, so it works on both the JWT playground surface\n * and the API-key /api/ask surface. Throws on a non-2xx response.\n */\nexport async function submitFeedback({\n\tbaseUrl,\n\tstreamEndpoint,\n\theaders,\n\tauthToken,\n\tstage,\n\tstageQueryParam,\n\texecutionId,\n\tfeedback,\n\tdetails,\n\tsignal,\n}: SubmitFeedbackArgs): Promise<void> {\n\tconst base = baseUrl.replace(/\\/+$/, \"\");\n\tconst endpointPath = (streamEndpoint || DEFAULT_STREAM_ENDPOINT)\n\t\t.split(\"?\")[0]\n\t\t.replace(/\\/+$/, \"\");\n\tconst basePath = endpointPath.endsWith(\"/stream\")\n\t\t? endpointPath.slice(0, -\"/stream\".length)\n\t\t: endpointPath;\n\n\tconst query = new URLSearchParams();\n\tif (stage) query.set(stageQueryParam ?? \"stage\", stage);\n\tconst qs = query.toString() ? `?${query.toString()}` : \"\";\n\n\tconst url = `${base}${basePath}/executions/${encodeURIComponent(executionId)}/feedback${qs}`;\n\n\tconst requestHeaders: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\tAccept: \"application/json\",\n\t\t...(headers ?? {}),\n\t};\n\tif (authToken) requestHeaders.Authorization = `Bearer ${authToken}`;\n\n\tconst resp = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: requestHeaders,\n\t\tbody: JSON.stringify(details ? { feedback, details } : { feedback }),\n\t\tsignal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Feedback failed: ${resp.status} ${resp.statusText}`);\n\t}\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { Loader2, X } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype ImageLightboxProps = {\n\tsrc: string;\n\talt?: string;\n\tonClose: () => void;\n};\n\nexport function ImageLightbox({\n\tsrc,\n\talt = \"\",\n\tonClose,\n}: ImageLightboxProps) {\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst [isImageLoaded, setIsImageLoaded] = useState(false);\n\tconst overlayStyle: CSSProperties = {\n\t\tposition: \"fixed\",\n\t\tinset: 0,\n\t\tzIndex: 2147483647,\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tpadding: 16,\n\t\tbackground: \"rgba(2, 6, 23, 0.92)\",\n\t\tisolation: \"isolate\",\n\t};\n\tconst frameStyle: CSSProperties = {\n\t\tposition: \"relative\",\n\t\twidth: \"min(92vw, 1280px)\",\n\t\theight: \"min(88vh, 920px)\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\toverflow: \"hidden\",\n\t};\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t\treturn () => setIsMounted(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetIsImageLoaded(false);\n\t}, [src]);\n\n\tuseEffect(() => {\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t};\n\t}, [onClose]);\n\n\tif (!isMounted || typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t<motion.div\n\t\t\t\tstyle={overlayStyle}\n\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\tonClick={onClose}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tclassName=\"absolute top-4 right-4 z-[1] flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white/90 transition-colors hover:bg-black/75\"\n\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<div style={frameStyle} onClick={(event) => event.stopPropagation()}>\n\t\t\t\t\t{!isImageLoaded ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2\">\n\t\t\t\t\t\t\t<Loader2 className=\"h-5 w-5 animate-spin text-white/80\" />\n\t\t\t\t\t\t\t<p className=\"text-sm font-medium text-white/90\">\n\t\t\t\t\t\t\t\tLoading image\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-xs text-white/60\">Reference image</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t<div className=\"flex h-full w-full items-center justify-center p-3 sm:p-4\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\tonLoad={() => setIsImageLoaded(true)}\n\t\t\t\t\t\t\tclassName={`block h-full w-full rounded-xl object-contain shadow-2xl transition-opacity duration-200 ${\n\t\t\t\t\t\t\t\tisImageLoaded ? \"opacity-100\" : \"opacity-0\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</AnimatePresence>,\n\t\tdocument.body,\n\t);\n}\n","import { Loader2 } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ImageLightbox } from \"./ImageLightbox\";\n\nconst RAG_IMAGE_PATH_REGEX =\n\t/^(?:https?:\\/\\/[^/\\s]+)?\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image(?:[?#][^\"'\\s]*)?$/;\n\nfunction isUnresolvedRagImageSource(src: string) {\n\treturn RAG_IMAGE_PATH_REGEX.test(src);\n}\n\nfunction LoadingImageCard({\n\tlabel,\n\tdescription,\n}: {\n\tlabel: string;\n\tdescription: string;\n}) {\n\treturn (\n\t\t<span className=\"my-3 flex min-h-36 w-full flex-col items-center justify-center gap-2 px-4 py-5 text-center\">\n\t\t\t<Loader2 className=\"h-5 w-5 animate-spin text-slate-500 dark:text-slate-300\" />\n\t\t\t<span className=\"text-xs font-medium text-slate-600 dark:text-slate-200\">\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span className=\"text-[11px] leading-relaxed text-slate-500/90 dark:text-slate-300/80\">\n\t\t\t\t{description}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nfunction BrokenImageCard({ alt }: { alt?: string }) {\n\treturn (\n\t\t<span className=\"my-3 flex min-h-44 w-full flex-col items-center justify-center gap-2 rounded-xl border border-dashed border-red-200 bg-red-50/60 px-4 py-5 text-center dark:border-red-900/40 dark:bg-red-950/20\">\n\t\t\t<span className=\"text-xs font-medium text-red-600 dark:text-red-300\">\n\t\t\t\tUnable to load image\n\t\t\t</span>\n\t\t\t{alt ? (\n\t\t\t\t<span className=\"max-w-sm text-[11px] leading-relaxed text-red-500/80 dark:text-red-200/80\">\n\t\t\t\t\t{alt}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n\ntype MarkdownImageProps = {\n\tsrc?: string;\n\talt?: string;\n\tisResolving?: boolean;\n};\n\nexport function MarkdownImage({\n\tsrc,\n\talt,\n\tisResolving = false,\n}: MarkdownImageProps) {\n\tconst imageFrameStyle: CSSProperties = {\n\t\twidth: \"min(100%, 32rem)\",\n\t\tmaxWidth: \"100%\",\n\t};\n\tconst imageStyle: CSSProperties = {\n\t\tdisplay: \"block\",\n\t\twidth: \"100%\",\n\t\theight: \"auto\",\n\t\tmaxWidth: \"100%\",\n\t\tmaxHeight: \"18rem\",\n\t\tobjectFit: \"contain\",\n\t};\n\tconst [isLoaded, setIsLoaded] = useState(false);\n\tconst [hasError, setHasError] = useState(false);\n\tconst [isLightboxOpen, setIsLightboxOpen] = useState(false);\n\tconst isUnresolvedRagImage = useMemo(\n\t\t() => (src ? isUnresolvedRagImageSource(src) : false),\n\t\t[src]\n\t);\n\tconst isResolvingRagImage = isResolving && isUnresolvedRagImage;\n\n\tuseEffect(() => {\n\t\tsetIsLoaded(false);\n\t\tsetHasError(false);\n\t\tsetIsLightboxOpen(false);\n\t}, [src]);\n\n\tif (!src) {\n\t\treturn null;\n\t}\n\n\tif (isResolvingRagImage) {\n\t\treturn (\n\t\t\t<LoadingImageCard label=\"Loading image\" description=\"Reference image\" />\n\t\t);\n\t}\n\n\tif (hasError) {\n\t\treturn <BrokenImageCard alt={alt} />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<span className=\"my-3 block w-full\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\t\tsetIsLightboxOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!isLoaded}\n\t\t\t\t\taria-busy={!isLoaded}\n\t\t\t\t\tclassName=\"group relative mx-auto flex w-full items-center justify-center overflow-hidden rounded-xl bg-black/[0.03] px-3 py-3 text-left transition-colors hover:bg-black/[0.05] disabled:cursor-wait disabled:hover:bg-black/[0.03] dark:bg-white/[0.03] dark:hover:bg-white/[0.05] dark:disabled:hover:bg-white/[0.03]\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...imageFrameStyle,\n\t\t\t\t\t\t...(!isLoaded ? { minHeight: \"9rem\" } : {}),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\talt={alt || \"\"}\n\t\t\t\t\t\tclassName={`relative z-[1] block h-auto max-h-[22rem] w-full max-w-full rounded-lg object-contain transition-opacity duration-200 ${\n\t\t\t\t\t\t\tisLoaded ? \"opacity-100\" : \"opacity-0\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t\tstyle={imageStyle}\n\t\t\t\t\t\tonLoad={() => {\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetIsLoaded(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonError={() => {\n\t\t\t\t\t\t\tsetIsLoaded(false);\n\t\t\t\t\t\t\tsetHasError(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t</span>\n\n\t\t\t{isLightboxOpen && isLoaded ? (\n\t\t\t\t<ImageLightbox\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\tonClose={() => setIsLightboxOpen(false)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n","import type { Components } from \"react-markdown\";\nimport { MarkdownImage } from \"./MarkdownImage\";\n\ntype CreateMarkdownComponentsOptions = {\n\tisResolvingImages?: boolean;\n};\n\nexport function createMarkdownComponents(\n\toptions: CreateMarkdownComponentsOptions = {},\n): Components {\n\treturn {\n\t\tp: ({ children }) => (\n\t\t\t<p className=\"mb-3 last:mb-0 text-sm leading-relaxed\">{children}</p>\n\t\t),\n\t\tcode: ({ className: codeClassName, children }) => {\n\t\t\tconst isInline = !codeClassName;\n\n\t\t\treturn isInline ? (\n\t\t\t\t<code className=\"payman-agent-code-inline rounded-md px-1.5 py-0.5 font-mono text-xs break-all\">\n\t\t\t\t\t{children}\n\t\t\t\t</code>\n\t\t\t) : (\n\t\t\t\t<code className=\"payman-agent-code-block my-2 block overflow-x-auto rounded-lg p-3 font-mono text-xs whitespace-pre\">\n\t\t\t\t\t{children}\n\t\t\t\t</code>\n\t\t\t);\n\t\t},\n\t\tpre: ({ children }) => (\n\t\t\t<pre className=\"my-2 max-w-full overflow-x-auto rounded-lg\">\n\t\t\t\t{children}\n\t\t\t</pre>\n\t\t),\n\t\tul: ({ children }) => (\n\t\t\t<ul className=\"mb-3 ml-4 list-disc space-y-1 text-sm\">{children}</ul>\n\t\t),\n\t\tol: ({ children }) => (\n\t\t\t<ol className=\"mb-3 ml-4 list-decimal space-y-1 text-sm\">{children}</ol>\n\t\t),\n\t\tli: ({ children }) => <li className=\"text-sm leading-relaxed\">{children}</li>,\n\t\th1: ({ children }) => (\n\t\t\t<h1 className=\"mt-4 mb-2 text-lg font-semibold first:mt-0\">{children}</h1>\n\t\t),\n\t\th2: ({ children }) => (\n\t\t\t<h2 className=\"mt-3 mb-2 text-base font-semibold first:mt-0\">\n\t\t\t\t{children}\n\t\t\t</h2>\n\t\t),\n\t\th3: ({ children }) => (\n\t\t\t<h3 className=\"mt-2 mb-1 text-sm font-semibold first:mt-0\">{children}</h3>\n\t\t),\n\t\tstrong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n\t\tem: ({ children }) => <em className=\"italic\">{children}</em>,\n\t\tblockquote: ({ children }) => (\n\t\t\t<blockquote className=\"payman-agent-blockquote my-2 pl-4 italic\">\n\t\t\t\t{children}\n\t\t\t</blockquote>\n\t\t),\n\t\thr: () => <hr className=\"payman-agent-hr my-4\" />,\n\t\ta: ({ href, children }) => (\n\t\t\t<a\n\t\t\t\thref={href}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tclassName=\"payman-agent-link underline decoration-1 underline-offset-2\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t),\n\t\timg: ({ src, alt }) => (\n\t\t\t<MarkdownImage\n\t\t\t\tsrc={typeof src === \"string\" ? src : undefined}\n\t\t\t\talt={typeof alt === \"string\" ? alt : undefined}\n\t\t\t\tisResolving={options.isResolvingImages}\n\t\t\t/>\n\t\t),\n\t\ttable: ({ children }) => (\n\t\t\t<div className=\"relative my-4 -mx-1 w-full overflow-x-auto\">\n\t\t\t\t<table className=\"payman-agent-table min-w-full caption-bottom overflow-hidden rounded-lg text-sm\">\n\t\t\t\t\t{children}\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t),\n\t\tthead: ({ children }) => (\n\t\t\t<thead className=\"payman-agent-thead [&_tr]:border-b\">{children}</thead>\n\t\t),\n\t\ttbody: ({ children }) => (\n\t\t\t<tbody className=\"[&_tr:last-child]:border-0\">{children}</tbody>\n\t\t),\n\t\ttr: ({ children }) => (\n\t\t\t<tr className=\"payman-agent-tr border-b transition-colors\">{children}</tr>\n\t\t),\n\t\tth: ({ children }) => (\n\t\t\t<th className=\"h-10 px-3 text-left align-middle text-xs font-medium whitespace-nowrap\">\n\t\t\t\t{children}\n\t\t\t</th>\n\t\t),\n\t\ttd: ({ children }) => (\n\t\t\t<td className=\"p-3 align-middle text-sm whitespace-nowrap\">{children}</td>\n\t\t),\n\t};\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tBinoculars,\n\tCheck,\n\tChevronRight,\n\tClock,\n\tLoader2,\n\tSparkles,\n\tX,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport type { AgentMessageProps, StreamingStep } from \"../../types\";\nimport { cn } from \"../../utils\";\nimport { createMarkdownComponents } from \"./markdownComponents\";\nimport {\n\tgetConflictErrorMessage,\n\tisFriendlyWorkflowError,\n} from \"../../utils/errorMessages\";\nimport { formatElapsedTime } from \"../../utils/formatDate\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/** Content that looks like a raw error (INTENT_ERROR message) rather than a user-facing workflow response */\nfunction looksLikeRawError(text: string): boolean {\n\tif (!text || text.length < 10) return false;\n\treturn text.includes(\"errorType=\") || /failed:\\s*\\{/.test(text);\n}\n\nexport function AgentMessage({\n\tmessage,\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatar = false,\n\tlayout = \"full-width\",\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n}: AgentMessageProps) {\n\tconst isStreaming = message.isStreaming ?? false;\n\tconst hasSteps = message.steps && message.steps.length > 0;\n\tconst hasTraceData =\n\t\t!!(message.tracingData || message.executionId) && !isStreaming;\n\tconst isCancelled = message.isCancelled ?? false;\n\tconst currentExecutingStepId = message.currentExecutingStepId;\n\n\tconst [isStepsExpanded, setIsStepsExpanded] = useState(false);\n\tconst wasStreamingRef = useRef(isStreaming);\n\n\tuseEffect(() => {\n\t\tif (isStreaming && hasSteps) {\n\t\t\tsetIsStepsExpanded(true);\n\t\t}\n\t\tif (wasStreamingRef.current && !isStreaming) {\n\t\t\tsetIsStepsExpanded(false);\n\t\t}\n\t\twasStreamingRef.current = isStreaming;\n\t}, [isStreaming, hasSteps]);\n\n\tconst totalElapsedMs = hasSteps\n\t\t? message.steps!.reduce((sum, step) => sum + (step.elapsedMs || 0), 0)\n\t\t: 0;\n\n\tconst currentMessage = message.currentMessage;\n\tconst rawContent = message.streamingContent || message.content || \"\";\n\tconst content = rawContent.replace(/\\\\n/g, \"\\n\");\n\t// When workflow completes with a response (e.g. after INTENT_ERROR), prefer that over error UI. Only show friendly error when there's no meaningful response or when content is raw error dump.\n\tconst hasMeaningfulContent =\n\t\tcontent.length > 0 && !looksLikeRawError(content);\n\t// Also show friendly error when workflow completed with no content (e.g. preflight failed, no workflowMsg)\n\tconst completedWithNoContent =\n\t\t!isStreaming &&\n\t\t!isCancelled &&\n\t\tcontent.length === 0 &&\n\t\t(message.streamProgress === \"completed\" || message.streamProgress === \"error\");\n\tconst conflictErrorMessage = getConflictErrorMessage(message.errorDetails);\n\tconst isError =\n\t\t!!conflictErrorMessage ||\n\t\t((isFriendlyWorkflowError(message.errorDetails) ||\n\t\t\tlooksLikeRawError(content)) &&\n\t\t\t!hasMeaningfulContent) ||\n\t\tcompletedWithNoContent;\n\tconst currentStep = useMemo(\n\t\t() =>\n\t\t\tmessage.steps?.find(\n\t\t\t\t(s) => s.id === currentExecutingStepId && s.status === \"in_progress\"\n\t\t\t),\n\t\t[message.steps, currentExecutingStepId]\n\t);\n\tconst markdownRenderers = useMemo(\n\t\t() =>\n\t\t\tcreateMarkdownComponents({\n\t\t\t\tisResolvingImages: message.isResolvingImages,\n\t\t\t}),\n\t\t[message.isResolvingImages],\n\t);\n\n\tconst getStepsLabel = (streaming: boolean) => {\n\t\tconst count = message.steps!.length;\n\t\tconst stepWord = count === 1 ? \"step\" : \"steps\";\n\t\tif (streaming) {\n\t\t\tif (streamingStepsText)\n\t\t\t\treturn streamingStepsText.replace(\"{count}\", count.toString());\n\t\t\treturn `${count} ${stepWord} in progress`;\n\t\t}\n\t\tif (completedStepsText) {\n\t\t\treturn completedStepsText\n\t\t\t\t.replace(\"{count}\", count.toString())\n\t\t\t\t.replace(\"{time}\", (totalElapsedMs / 1000).toFixed(1));\n\t\t}\n\t\treturn `${count} ${stepWord} completed`;\n\t};\n\n\t// All icons in a fixed 4x4 wrapper for alignment\n\tconst renderStepIcon = (\n\t\tstep: StreamingStep,\n\t\tisCurrentlyExecuting: boolean\n\t) => {\n\t\tconst wrapper = \"h-4 w-4 flex items-center justify-center shrink-0\";\n\t\tif (isCurrentlyExecuting)\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Loader2 className=\"h-3.5 w-3.5 payman-agent-step-icon--active animate-spin\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"pending\" && isCancelled)\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<div className=\"h-1.5 w-1.5 rounded-full payman-agent-step-icon--pending\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"pending\" || step.status === \"in_progress\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Loader2 className=\"h-3.5 w-3.5 payman-agent-step-icon--in-progress-dim animate-spin\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"completed\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Check\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-3.5 w-3.5\",\n\t\t\t\t\t\t\tstep.eventType === \"USER_ACTION_SUCCESS\"\n\t\t\t\t\t\t\t\t? \"payman-agent-step-icon--success\"\n\t\t\t\t\t\t\t\t: \"payman-agent-step-icon--success-dim\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"error\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<X className=\"h-3.5 w-3.5 payman-agent-step-icon--error\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\treturn (\n\t\t\t<div className={wrapper}>\n\t\t\t\t<div className=\"h-1.5 w-1.5 rounded-full payman-agent-step-icon--pending-dim\" />\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst stepsListContent = hasSteps && (\n\t\t<AnimatePresence initial={false}>\n\t\t\t{isStepsExpanded && (\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ height: 0, opacity: 0 }}\n\t\t\t\t\tanimate={{ height: \"auto\", opacity: 1 }}\n\t\t\t\t\texit={{ height: 0, opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeInOut\" }}\n\t\t\t\t\tclassName=\"overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"pt-1.5\">\n\t\t\t\t\t\t{message.steps!.map((step) => {\n\t\t\t\t\t\t\tconst isCurrentlyExecuting =\n\t\t\t\t\t\t\t\tstep.id === currentExecutingStepId &&\n\t\t\t\t\t\t\t\tstep.status === \"in_progress\" &&\n\t\t\t\t\t\t\t\tisStreaming &&\n\t\t\t\t\t\t\t\t!isCancelled;\n\t\t\t\t\t\t\tconst hasTime = step.elapsedMs != null && step.elapsedMs > 0;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div key={step.id} className=\"mb-1.5\">\n\t\t\t\t\t\t\t\t\t{/* Step row: icon + message */}\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-px\">\n\t\t\t\t\t\t\t\t\t\t\t{renderStepIcon(step, isCurrentlyExecuting)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"text-xs leading-relaxed min-w-0 break-words\",\n\t\t\t\t\t\t\t\t\t\t\t\tisCurrentlyExecuting && \"shimmer-text font-medium\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"error\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--error\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.eventType === \"USER_ACTION_SUCCESS\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--success\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"completed\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--completed\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"pending\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--pending\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"in_progress\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--in-progress\"\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\t\t{step.message}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Time badge — indented to align with step text (16px icon + 6px gap = 22px) */}\n\t\t\t\t\t\t\t\t\t{hasTime && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"pl-[22px] mt-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded-md payman-agent-step-time leading-none\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Clock className=\"h-2.5 w-2.5 shrink-0 payman-agent-step-time-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] font-mono payman-agent-step-time-text\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{formatElapsedTime(step.elapsedMs!)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n\n\tconst stepsToggleRef = useRef<HTMLButtonElement>(null);\n\n\tconst handleStepsToggle = useCallback(() => {\n\t\tsetIsStepsExpanded((prev) => {\n\t\t\tconst next = !prev;\n\t\t\t// Dispatch event so MessageList can scroll to show expanded steps\n\t\t\tif (next) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tstepsToggleRef.current\n\t\t\t\t\t\t?.closest(\".payman-scrollbar\")\n\t\t\t\t\t\t?.dispatchEvent(new CustomEvent(\"payman-steps-toggle\"));\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst stepsToggle = (streaming: boolean) => (\n\t\t<button\n\t\t\tref={stepsToggleRef}\n\t\t\tonClick={handleStepsToggle}\n\t\t\tclassName=\"inline-flex items-center gap-1.5 text-xs payman-agent-step-toggle transition-colors\"\n\t\t>\n\t\t\t<motion.div\n\t\t\t\tanimate={{ rotate: isStepsExpanded ? 90 : 0 }}\n\t\t\t\ttransition={{ duration: 0.15 }}\n\t\t\t\tclassName=\"shrink-0\"\n\t\t\t>\n\t\t\t\t<ChevronRight className=\"h-3 w-3\" />\n\t\t\t</motion.div>\n\t\t\t<span>{getStepsLabel(streaming)}</span>\n\t\t</button>\n\t);\n\n\t// Below-bubble steps section: only after streaming (thinking lives in bubble during stream)\n\tconst showSteps = showExecutionSteps && hasSteps && !isStreaming && !isError;\n\n\tconst messageContent = (\n\t\t<div className=\"w-full\">\n\t\t\t{/* Row: avatar + bubble. Trace button used to live as a\n\t\t\t sibling of the bubble at top-right, but on long markdown\n\t\t\t tables the table extended to the right edge and was\n\t\t\t overlapped by the icon — making the rightmost data\n\t\t\t column unreadable. Now rendered below the bubble next\n\t\t\t to the consumer-supplied timestamp. */}\n\t\t\t<div className=\"flex gap-3 justify-start items-start w-full\">\n\t\t\t\t{/* Avatar */}\n\t\t\t\t{showAvatar && (\n\t\t\t\t\t<div className=\"shrink-0 mt-0.5\">\n\t\t\t\t\t\t{isStreaming && showStreamingDot ? (\n\t\t\t\t\t\t\t<div className=\"h-8 w-8 flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t<div className=\"h-2.5 w-2.5 rounded-full payman-agent-avatar-dot animate-pulse\" />\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 h-2.5 w-2.5 rounded-full payman-agent-avatar-dot-ping animate-ping\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"h-8 w-8 rounded-full payman-agent-avatar flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<Sparkles className=\"h-3.5 w-3.5 payman-agent-avatar-icon\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Bubble — constrained width */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"min-w-0\",\n\t\t\t\t\t\tlayout === \"centered\"\n\t\t\t\t\t\t\t? \"max-w-[85%]\"\n\t\t\t\t\t\t\t: showAvatar\n\t\t\t\t\t\t\t? \"max-w-[85%]\"\n\t\t\t\t\t\t\t: \"max-w-[80%]\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"overflow-hidden w-full min-w-0 px-4 py-3 rounded-2xl rounded-tl-md transition-all duration-200\",\n\t\t\t\t\t\t\tlayout === \"centered\"\n\t\t\t\t\t\t\t\t? cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-agent-bubble payman-agent-bubble--centered\",\n\t\t\t\t\t\t\t\t\t\tisStreaming && \"streaming\",\n\t\t\t\t\t\t\t\t\t\tisError && \"error\"\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-agent-bubble\",\n\t\t\t\t\t\t\t\t\t\tisError && \"payman-agent-bubble--error\"\n\t\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\t\t{showAgentName && (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-sm font-semibold mb-1 leading-none payman-agent-name\",\n\t\t\t\t\t\t\t\t\tisStreaming && !content && \"animate-pulse\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isStreaming && !content ? \"Thought Process\" : agentName}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-sm leading-relaxed min-w-0 w-full break-words overflow-wrap-anywhere\",\n\t\t\t\t\t\t\t\tshowAgentName && \"mt-1\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isStreaming && !content ? (\n\t\t\t\t\t\t\t\tcurrentStep ? (\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t{renderStepIcon(currentStep, true)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm leading-relaxed min-w-0 break-words shimmer-text font-medium flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t{currentStep.message}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-2.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 mt-0.5 payman-agent-thinking-spinner animate-spin shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm payman-agent-thinking-text flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t{currentMessage || \"Thinking...\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) : isCancelled && !content ? (\n\t\t\t\t\t\t\t\t<div className=\"flex gap-2.5 items-start\">\n\t\t\t\t\t\t\t\t\t<X className=\"w-4 h-4 mt-0.5 payman-agent-cancelled-icon shrink-0\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm payman-agent-cancelled-text italic flex-1\">\n\t\t\t\t\t\t\t\t\t\t{currentMessage || \"Request was stopped.\"}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-markdown payman-agent-markdown prose prose-sm dark:prose-invert max-w-none min-w-0 w-full break-words overflow-wrap-anywhere\",\n\t\t\t\t\t\t\t\t\t\tisError && \"payman-agent-markdown--error\",\n\t\t\t\t\t\t\t\t\t\tisStreaming && content && \"streaming-cursor\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ReactMarkdown\n\t\t\t\t\t\t\t\t\t\tremarkPlugins={[remarkGfm]}\n\t\t\t\t\t\t\t\t\t\tcomponents={markdownRenderers}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isError\n\t\t\t\t\t\t\t\t\t\t\t? conflictErrorMessage ?? FRIENDLY_ERROR_MESSAGE\n\t\t\t\t\t\t\t\t\t\t\t: content ||\n\t\t\t\t\t\t\t\t\t\t\t (isStreaming\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Thinking...\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: isCancelled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Request was stopped.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\")}\n\t\t\t\t\t\t\t\t\t</ReactMarkdown>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\n\t\t\t{/* Trace button — positioned below the bubble in the same\n\t\t\t column the consumer renders the timestamp in. Avoids\n\t\t\t overlapping wide markdown content (tables, code blocks)\n\t\t\t that previously got clipped by the top-right icon. */}\n\t\t\t{hasTraceData && onExecutionTraceClick && (\n\t\t\t\t<div className={cn(\"mt-1\", showAvatar ? \"ml-11\" : \"ml-0\")}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tonExecutionTraceClick({\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\ttracingData: message.tracingData,\n\t\t\t\t\t\t\t\texecutionId: message.executionId,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"p-1.5 rounded-md inline-flex items-center justify-center payman-agent-trace\",\n\t\t\t\t\t\t\t\"active:scale-95 transition-all duration-150\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle=\"View execution trace\"\n\t\t\t\t\t\taria-label=\"View execution trace\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Binoculars className=\"w-3.5 h-3.5 payman-agent-trace-icon\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Steps — outside the flex row (only when not streaming) */}\n\t\t\t{showSteps && (\n\t\t\t\t<div className={cn(\"mt-1.5\", showAvatar ? \"ml-11\" : \"ml-0\")}>\n\t\t\t\t\t{showExecutionSteps &&\n\t\t\t\t\t\thasSteps &&\n\t\t\t\t\t\t!isStreaming &&\n\t\t\t\t\t\t!isError &&\n\t\t\t\t\t\tstepsToggle(false)}\n\t\t\t\t\t{stepsListContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\tif (animated) {\n\t\treturn (\n\t\t\t<motion.div\n\t\t\t\tinitial={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\ttransition={{ duration: 0.25, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t>\n\t\t\t\t{messageContent}\n\t\t\t</motion.div>\n\t\t);\n\t}\n\n\treturn messageContent;\n}\n","import { motion } from \"framer-motion\";\nimport { User } from \"lucide-react\";\nimport type { UserMessageProps } from \"../../types\";\nimport { parseSlashCommand } from \"../../utils/slashCommands\";\nimport { cn, formatDate } from \"../../utils\";\n\nexport function UserMessage({\n\tmessage,\n\tanimated = false,\n\tshowAvatar = false,\n}: UserMessageProps) {\n\tconst parsedCommand = parseSlashCommand(message.content);\n\tconst content = (\n\t\t<div className=\"flex gap-3 justify-end w-full\">\n\t\t\t{/* Message Container */}\n\t\t\t<div className=\"max-w-[80%] min-w-0 flex flex-col items-end\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-2xl rounded-br-md px-4 py-3\",\n\t\t\t\t\t\t\"bg-primary text-primary-foreground\",\n\t\t\t\t\t\t\"shadow-sm\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{parsedCommand ? (\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<span className=\"inline-flex rounded-md bg-black/15 px-2 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{parsedCommand.command}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{parsedCommand.body.trim() ? (\n\t\t\t\t\t\t\t\t<p className=\"text-sm leading-relaxed whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t\t\t{parsedCommand.body}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm leading-relaxed whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t{message.content}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<span className=\"text-[10px] mt-1.5 mr-1 text-muted-foreground/70 select-none\">\n\t\t\t\t\t{formatDate(message.timestamp)}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{/* Avatar */}\n\t\t\t{showAvatar && (\n\t\t\t\t<div className=\"shrink-0 mt-0.5\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-8 w-8 rounded-full\",\n\t\t\t\t\t\t\t\"bg-primary/10 border border-primary/20\",\n\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<User className=\"h-3.5 w-3.5 text-primary\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\tif (animated) {\n\t\treturn (\n\t\t\t<motion.div\n\t\t\t\tinitial={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\ttransition={{ duration: 0.25, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</motion.div>\n\t\t);\n\t}\n\n\treturn content;\n}\n","import type { MessageRowProps } from \"../../types\";\nimport { AgentMessage } from \"../AgentMessage\";\nimport { UserMessage } from \"../UserMessage\";\n\nexport function MessageRow({\n\tmessage,\n\tstage = \"DEVELOPMENT\",\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatars = false,\n\tshowUserAvatar,\n\tshowAssistantAvatar,\n\tlayout = \"full-width\",\n\tshowTimestamps = false,\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n}: MessageRowProps) {\n\tconst actualShowUserAvatar =\n\t\tshowUserAvatar !== undefined ? showUserAvatar : showAvatars;\n\tconst actualShowAssistantAvatar =\n\t\tshowAssistantAvatar !== undefined ? showAssistantAvatar : showAvatars;\n\n\tif (message.role === \"user\") {\n\t\treturn (\n\t\t\t<UserMessage\n\t\t\t\tmessage={message}\n\t\t\t\tanimated={animated}\n\t\t\t\tshowAvatar={actualShowUserAvatar}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AgentMessage\n\t\t\tmessage={message}\n\t\t\tstage={stage}\n\t\t\tanimated={animated}\n\t\t\tshowAgentName={showAgentName}\n\t\t\tagentName={agentName}\n\t\t\tshowAvatar={actualShowAssistantAvatar}\n\t\t\tlayout={layout}\n\t\t\tshowTimestamp={showTimestamps}\n\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\tcompletedStepsText={completedStepsText}\n\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t/>\n\t);\n}\n","import { cn } from \"../../utils\";\n\ninterface MessageRowSkeletonProps {\n\tisRightAligned?: boolean;\n}\n\nexport function MessageRowSkeleton({\n\tisRightAligned = false,\n}: MessageRowSkeletonProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full\",\n\t\t\t\tisRightAligned ? \"justify-end\" : \"justify-start\"\n\t\t\t)}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col gap-2 w-full\",\n\t\t\t\t\tisRightAligned ? \"items-end max-w-[70%]\" : \"items-start max-w-[80%]\"\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-2xl p-4 w-full\",\n\t\t\t\t\t\tisRightAligned\n\t\t\t\t\t\t\t? \"bg-primary/8 rounded-br-md\"\n\t\t\t\t\t\t\t: \"bg-muted/70 rounded-bl-md\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"space-y-2.5\">\n\t\t\t\t\t\t<div className=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-[85%]\" />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-full\"\n\t\t\t\t\t\t\tstyle={{ animationDelay: \"0.1s\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!isRightAligned && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-[60%]\"\n\t\t\t\t\t\t\t\tstyle={{ animationDelay: \"0.2s\" }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2 skeleton-pulse rounded-full bg-muted-foreground/8 w-12 mx-1\"\n\t\t\t\t\tstyle={{ animationDelay: \"0.3s\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { motion } from \"framer-motion\";\nimport { ArrowDown } from \"lucide-react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { MessageListProps } from \"../../types\";\nimport { cn } from \"../../utils\";\nimport { MessageRow } from \"../MessageRow\";\nimport { MessageRowSkeleton } from \"../MessageRowSkeleton\";\n\nconst SCROLL_THRESHOLD = 150;\nconst LOAD_MORE_THRESHOLD = 80;\n\nexport function MessageList({\n\tmessages,\n\tisLoading = false,\n\temptyStateText = \"What can I help with?\",\n\tshowEmptyStateIcon: _showEmptyStateIcon = true,\n\temptyStateComponent,\n\tlayout = \"full-width\",\n\tshowTimestamps = false,\n\tstage = \"DEVELOPMENT\",\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatars = false,\n\tshowUserAvatar,\n\tshowAssistantAvatar,\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n\tclassName,\n\tonLoadMoreMessages,\n\tisLoadingMoreMessages = false,\n\thasMoreMessages = false,\n}: MessageListProps) {\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst isNearBottomRef = useRef(true);\n\tconst [showScrollBtn, setShowScrollBtn] = useState(false);\n\tconst prevMessageCountRef = useRef(messages.length);\n\n\t// Track scroll height before prepend so we can restore position\n\tconst scrollHeightBeforePrependRef = useRef<number | null>(null);\n\tconst firstMessageIdRef = useRef<string | undefined>(messages[0]?.id);\n\n\tconst getDistanceFromBottom = useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return 0;\n\t\treturn el.scrollHeight - el.scrollTop - el.clientHeight;\n\t}, []);\n\n\tconst scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tel.scrollTo({ top: el.scrollHeight, behavior });\n\t}, []);\n\n\tconst handleScroll = useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\n\t\tconst distance = getDistanceFromBottom();\n\t\tconst nearBottom = distance <= SCROLL_THRESHOLD;\n\t\tisNearBottomRef.current = nearBottom;\n\t\tsetShowScrollBtn(!nearBottom);\n\n\t\t// Trigger load-more when scrolled near the top\n\t\tif (\n\t\t\tel.scrollTop <= LOAD_MORE_THRESHOLD &&\n\t\t\thasMoreMessages &&\n\t\t\t!isLoadingMoreMessages &&\n\t\t\tonLoadMoreMessages\n\t\t) {\n\t\t\t// Snapshot scroll height before the state update so we can restore position\n\t\t\tscrollHeightBeforePrependRef.current = el.scrollHeight;\n\t\t\tonLoadMoreMessages();\n\t\t}\n\t}, [getDistanceFromBottom, hasMoreMessages, isLoadingMoreMessages, onLoadMoreMessages]);\n\n\t// After messages are prepended, restore scroll position so the view doesn't jump\n\tuseLayoutEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tconst prevHeight = scrollHeightBeforePrependRef.current;\n\t\tconst newFirstId = messages[0]?.id;\n\n\t\tif (el && prevHeight !== null && newFirstId !== firstMessageIdRef.current) {\n\t\t\tel.scrollTop = el.scrollHeight - prevHeight;\n\t\t\tscrollHeightBeforePrependRef.current = null;\n\t\t}\n\t\tfirstMessageIdRef.current = newFirstId;\n\t}, [messages]);\n\n\t// Auto-scroll when new messages arrive\n\tuseEffect(() => {\n\t\tconst prevCount = prevMessageCountRef.current;\n\t\tprevMessageCountRef.current = messages.length;\n\n\t\tif (messages.length > prevCount && isNearBottomRef.current) {\n\t\t\trequestAnimationFrame(() => scrollToBottom());\n\t\t}\n\t}, [messages.length, scrollToBottom]);\n\n\t// Auto-scroll during streaming\n\tuseEffect(() => {\n\t\tconst lastMsg = messages[messages.length - 1];\n\t\tif (!lastMsg?.isStreaming) return;\n\t\tif (!isNearBottomRef.current) return;\n\n\t\trequestAnimationFrame(() => scrollToBottom());\n\t});\n\n\t// Instant scroll on mount\n\tuseEffect(() => {\n\t\tif (messages.length > 0) {\n\t\t\tsetTimeout(() => scrollToBottom(\"instant\"), 50);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\t// Listen for steps toggle events from AgentMessage\n\t// When steps expand, scroll down a bit so they're visible\n\tuseEffect(() => {\n\t\tconst handleStepsToggle = () => {\n\t\t\t// After steps expand/collapse, if we're near the bottom, scroll to show them\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tconst distance = getDistanceFromBottom();\n\t\t\t\t\tif (distance > 0 && distance < 600) {\n\t\t\t\t\t\tscrollToBottom();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tconst el = scrollRef.current;\n\t\tif (el) {\n\t\t\tel.addEventListener(\"payman-steps-toggle\", handleStepsToggle);\n\t\t\treturn () =>\n\t\t\t\tel.removeEventListener(\"payman-steps-toggle\", handleStepsToggle);\n\t\t}\n\t}, [getDistanceFromBottom, scrollToBottom]);\n\n\tconst handleScrollToBottom = useCallback(() => {\n\t\tscrollToBottom();\n\t}, [scrollToBottom]);\n\n\t/* Loading */\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 overflow-y-auto min-h-0 payman-scrollbar\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"space-y-5\",\n\t\t\t\t\t\tlayout === \"centered\" ? \"max-w-2xl mx-auto px-4 py-6\" : \"p-4\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{Array.from({ length: 5 }).map((_, i) => (\n\t\t\t\t\t\t<MessageRowSkeleton\n\t\t\t\t\t\t\tkey={`skel-${i}`}\n\t\t\t\t\t\t\tisRightAligned={i % 3 === 0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/* Empty state */\n\tif (messages.length === 0) {\n\t\tconst lines = emptyStateText.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n\t\treturn (\n\t\t\t<div className={cn(\"payman-empty-root\", className)}>\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.5, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\tclassName=\"payman-empty-content\"\n\t\t\t\t>\n\t\t\t\t\t{/* Custom component (e.g. logo/illustration) from integrator */}\n\t\t\t\t\t{emptyStateComponent && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ scale: 0.9, opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ scale: 1, opacity: 1 }}\n\t\t\t\t\t\t\ttransition={{ delay: 0.05, duration: 0.45, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\t\t\tclassName=\"payman-empty-custom-component\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{emptyStateComponent}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"payman-empty-text-group\">\n\t\t\t\t\t\t{lines.map((line, i) => (\n\t\t\t\t\t\t\t<motion.p\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\ttransition={{ delay: 0.12 + i * 0.06, duration: 0.4 }}\n\t\t\t\t\t\t\t\tclassName={i === 0 ? \"payman-empty-title\" : \"payman-empty-subtitle\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</motion.p>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/* Messages */\n\treturn (\n\t\t<>\n\t\t\t{/* Scrollable message list — takes full flex space */}\n\t\t\t<div\n\t\t\t\tref={scrollRef}\n\t\t\t\tonScroll={handleScroll}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 min-h-0 overflow-y-auto payman-scrollbar relative\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"space-y-4\",\n\t\t\t\t\t\tlayout === \"centered\" ? \"max-w-2xl mx-auto px-4 py-6\" : \"p-4\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Load-more spinner shown at top while fetching older messages */}\n\t\t\t\t\t{isLoadingMoreMessages && (\n\t\t\t\t\t\t<div className=\"flex justify-center py-2\">\n\t\t\t\t\t\t\t<div className=\"w-5 h-5 rounded-full border-2 border-muted-foreground/30 border-t-muted-foreground animate-spin\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{messages.map((message) => (\n\t\t\t\t\t\t<MessageRow\n\t\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\tstage={stage}\n\t\t\t\t\t\t\tanimated={animated}\n\t\t\t\t\t\t\tshowAgentName={showAgentName}\n\t\t\t\t\t\t\tagentName={agentName}\n\t\t\t\t\t\t\tshowAvatars={showAvatars}\n\t\t\t\t\t\t\tshowUserAvatar={showUserAvatar}\n\t\t\t\t\t\t\tshowAssistantAvatar={showAssistantAvatar}\n\t\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\t\tshowTimestamps={showTimestamps}\n\t\t\t\t\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\t\t\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\t\t\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\t\t\t\t\tcompletedStepsText={completedStepsText}\n\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Scroll-to-bottom button */}\n\t\t\t\t{showScrollBtn && (\n\t\t\t\t\t<div className=\"sticky bottom-0 z-20 flex justify-center pb-3 -mt-11\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={handleScrollToBottom}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-8 h-8 rounded-full\",\n\t\t\t\t\t\t\t\t\"bg-card border border-border shadow-lg\",\n\t\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\"hover:bg-muted active:scale-95\",\n\t\t\t\t\t\t\t\t\"transition-all duration-150\",\n\t\t\t\t\t\t\t\t\"cursor-pointer\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-label=\"Scroll to bottom\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ArrowDown className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useCallback, useEffect } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\n\nexport type ResetSessionConfirmModalProps = {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: () => void;\n};\n\nexport function ResetSessionConfirmModal({\n\tisOpen,\n\tonClose,\n\tonConfirm,\n}: ResetSessionConfirmModalProps) {\n\tconst handleKeyDown = useCallback(\n\t\t(event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t},\n\t\t[onClose],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || typeof document === \"undefined\") return;\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [handleKeyDown, isOpen]);\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{isOpen ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName=\"payman-reset-session-modal-backdrop\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-reset-session-modal-overlay\" />\n\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 12, scale: 0.98 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n\t\t\t\t\t\tclassName=\"payman-reset-session-modal-dialog\"\n\t\t\t\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-labelledby=\"payman-reset-session-title\"\n\t\t\t\t\t\taria-describedby=\"payman-reset-session-description\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"payman-reset-session-modal-copy\">\n\t\t\t\t\t\t\t<p className=\"payman-reset-session-modal-eyebrow\">\n\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<h2\n\t\t\t\t\t\t\t\tid=\"payman-reset-session-title\"\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-title\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tStart a new session?\n\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tid=\"payman-reset-session-description\"\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-description\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tThis will clear the current conversation and start fresh.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"payman-reset-session-modal-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-btn payman-reset-session-modal-btn-secondary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onConfirm}\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-btn payman-reset-session-modal-btn-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\ntype ActionTooltipV2Props = {\n\tlabel: string;\n\tchildren: ReactNode;\n};\n\nexport function ActionTooltipV2({ label, children }: ActionTooltipV2Props) {\n\treturn (\n\t\t<div className=\"payman-v2-tooltip\">\n\t\t\t{children}\n\t\t\t<div aria-hidden=\"true\" className=\"payman-v2-tooltip-content\">\n\t\t\t\t<div className=\"payman-v2-tooltip-text\">\n\t\t\t\t\t{label}\n\t\t\t\t\t<div className=\"payman-v2-tooltip-arrow\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n\tAlertCircle,\n\tCheck,\n\tCopy,\n\tPencil,\n\tRotateCcw,\n} from \"lucide-react\";\nimport { ActionTooltipV2 } from \"./ActionTooltipV2\";\nimport { cn } from \"../../utils/cn\";\nimport { getConflictErrorMessage } from \"../../utils/errorMessages\";\nimport { parseSlashCommand } from \"../../utils/slashCommands\";\nimport type { MessageDisplay, UserMessageActionsConfig } from \"../../types\";\n\nexport type UserMessageV2Props = {\n\tmessage: MessageDisplay;\n\tonEdit?: (messageId: string) => void;\n\tonRetry?: (messageId: string) => void;\n\tretryDisabled?: boolean;\n\tactions?: UserMessageActionsConfig;\n};\n\ntype ToastState = {\n\tlabel: string;\n\ttone: \"success\" | \"error\";\n} | null;\n\nfunction formatMessageTime(timestamp: string): string {\n\tconst value = new Date(timestamp);\n\tif (Number.isNaN(value.getTime())) return \"\";\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\thour: \"numeric\",\n\t\tminute: \"2-digit\",\n\t}).format(value);\n}\n\nexport function UserMessageV2({\n\tmessage,\n\tonEdit,\n\tonRetry,\n\tretryDisabled = false,\n\tactions,\n}: UserMessageV2Props) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [toast, setToast] = useState<ToastState>(null);\n\tconst copyResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst showCopyAction = actions?.copy ?? true;\n\tconst showEditAction = actions?.edit ?? false;\n\tconst showRetryAction = actions?.retry ?? false;\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\t};\n\t}, []);\n\n\tconst showToast = (label: string, tone: \"success\" | \"error\") => {\n\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\tsetToast({ label, tone });\n\t\ttoastTimerRef.current = setTimeout(() => setToast(null), 1800);\n\t};\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tif (!navigator.clipboard?.writeText) {\n\t\t\t\tthrow new Error(\"Clipboard unavailable\");\n\t\t\t}\n\t\t\tawait navigator.clipboard.writeText(message.content);\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tsetCopied(true);\n\t\t\tcopyResetTimerRef.current = setTimeout(() => setCopied(false), 1800);\n\t\t\tshowToast(\"Copied to clipboard\", \"success\");\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t\tshowToast(\"Could not copy\", \"error\");\n\t\t}\n\t};\n\n\tconst timestamp = formatMessageTime(message.timestamp);\n\tconst parsedCommand = parseSlashCommand(message.content);\n\tconst hasVisibleActions =\n\t\tshowCopyAction || (showEditAction && !!onEdit) || (showRetryAction && !!onRetry);\n\n\tconst toastPortal =\n\t\ttypeof document !== \"undefined\"\n\t\t\t? createPortal(\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{toast && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -18, scale: 0.96 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -12, scale: 0.96 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\ttype: \"spring\",\n\t\t\t\t\t\t\t\t\tstiffness: 360,\n\t\t\t\t\t\t\t\t\tdamping: 26,\n\t\t\t\t\t\t\t\t\tmass: 0.7,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-toast\"\n\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-toast-inner\",\n\t\t\t\t\t\t\t\t\t\ttoast.tone === \"success\"\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-toast-success\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-toast-error\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{toast.tone === \"success\" ? (\n\t\t\t\t\t\t\t\t\t<Check className=\"h-3.5 w-3.5\" style={{ color: \"#059669\" }} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#ef4444\" }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span>{toast.label}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<>\n\t\t\t{toastPortal}\n\n\t\t\t<div className=\"payman-v2-user-msg payman-v2-fade-in\">\n\t\t\t\t<div className=\"payman-v2-user-msg-group\">\n\t\t\t\t\t<div className=\"payman-v2-user-msg-bubble\">\n\t\t\t\t\t\t{parsedCommand ? (\n\t\t\t\t\t\t\t<div className=\"payman-v2-user-msg-command\">\n\t\t\t\t\t\t\t\t<span className=\"payman-v2-user-msg-command-chip\">\n\t\t\t\t\t\t\t\t\t{parsedCommand.command}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{parsedCommand.body.trim() ? (\n\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-text\">\n\t\t\t\t\t\t\t\t\t\t{parsedCommand.body}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-text\">{message.content}</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{message.isError && message.errorDetails && (() => {\n\t\t\t\t\t\tconst resolvedError =\n\t\t\t\t\t\t\tgetConflictErrorMessage(message.errorDetails) ??\n\t\t\t\t\t\t\tmessage.errorDetails;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div className=\"payman-v2-user-msg-error\">\n\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5 shrink-0\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: \"rgba(239, 68, 68, 0.7)\", marginTop: \"2px\" }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-error-text\">\n\t\t\t\t\t\t\t\t\t{resolvedError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})()}\n\n\t\t\t\t\t{(timestamp || hasVisibleActions) && (\n\t\t\t\t\t\t<div className=\"payman-v2-user-msg-actions\">\n\t\t\t\t\t\t\t{timestamp ? (\n\t\t\t\t\t\t\t\t<span className=\"payman-v2-user-msg-timestamp\">{timestamp}</span>\n\t\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t\t{showCopyAction && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Copy\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => void handleCopy()}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Copy message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#059669\" }}\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\t\t<Copy className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showEditAction && onEdit && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Edit\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onEdit(message.id)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Edit message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Pencil className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showRetryAction && onRetry && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Retry\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRetry(message.id)}\n\t\t\t\t\t\t\t\t\t\tdisabled={retryDisabled}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Retry message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RotateCcw className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import {\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype CSSProperties,\n} from \"react\";\nimport { Loader2, ImageOff, Eye } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\nconst RAG_IMAGE_PATH_REGEX =\n\t/^(?:https?:\\/\\/[^/\\s]+)?\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image(?:[?#][^\"'\\s]*)?$/;\n\nfunction isUnresolvedRagImageSource(src: string) {\n\treturn RAG_IMAGE_PATH_REGEX.test(src);\n}\n\n// Module-level cache of image URLs that have successfully loaded.\n// Survives component remounts caused by ReactMarkdown re-rendering\n// the tree on every typed character, so a remounted image with the\n// same src skips the loading state and doesn't flash.\nconst loadedImageCache = new Set<string>();\n\nexport type MarkdownImageV2Props = {\n\tsrc?: string;\n\talt?: string;\n\tisResolving?: boolean;\n\tonImageClick?: (src: string, alt: string) => void;\n};\n\nconst frameStyle: CSSProperties = {\n\twidth: \"min(100%, 32rem)\",\n\tmaxWidth: \"100%\",\n};\n\nconst imgStyle: CSSProperties = {\n\tdisplay: \"block\",\n\twidth: \"100%\",\n\theight: \"auto\",\n\tmaxWidth: \"100%\",\n\tmaxHeight: \"22rem\",\n\tobjectFit: \"contain\",\n};\n\nexport function MarkdownImageV2({\n\tsrc,\n\talt,\n\tisResolving = false,\n\tonImageClick,\n}: MarkdownImageV2Props) {\n\tconst cachedAlready = src ? loadedImageCache.has(src) : false;\n\tconst [isVisible, setIsVisible] = useState(cachedAlready);\n\tconst [isLoaded, setIsLoaded] = useState(cachedAlready);\n\tconst [hasError, setHasError] = useState(false);\n\tconst [retryCount, setRetryCount] = useState(0);\n\tconst sentinelRef = useRef<HTMLSpanElement>(null);\n\tconst prevLoadedRef = useRef(cachedAlready);\n\n\tconst isUnresolvedRag = useMemo(\n\t\t() => (src ? isUnresolvedRagImageSource(src) : false),\n\t\t[src],\n\t);\n\tconst isResolvingRag = Boolean(isResolving && isUnresolvedRag);\n\n\tuseEffect(() => {\n\t\tif (src && loadedImageCache.has(src)) {\n\t\t\tsetIsLoaded(true);\n\t\t\tsetIsVisible(true);\n\t\t\tprevLoadedRef.current = true;\n\t\t}\n\t\t// Don't reset isLoaded when src changes if any image was already\n\t\t// showing — keep it visible while the new URL loads (same visual\n\t\t// content, different URL during RAG → blob swap). onLoad/onError\n\t\t// will update the state once the new image finishes.\n\t\tsetHasError(false);\n\t\tsetRetryCount(0);\n\t}, [src]);\n\n\tuseEffect(() => {\n\t\tconst el = sentinelRef.current;\n\t\tif (!el || !src) return;\n\n\t\t// If the element is already in or near the viewport (e.g. remount\n\t\t// during streaming), set visible immediately to avoid a flash.\n\t\tconst rect = el.getBoundingClientRect();\n\t\tconst alreadyNear =\n\t\t\trect.bottom >= -200 &&\n\t\t\trect.top <= (window.innerHeight || document.documentElement.clientHeight) + 200;\n\t\tif (alreadyNear) {\n\t\t\tsetIsVisible(true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"200px\" },\n\t\t);\n\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, [src]);\n\n\tif (!src) return null;\n\n\tif (isResolvingRag && !isLoaded) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={cn(\"payman-v2-md-image\", \"payman-v2-md-image-resolving\")}\n\t\t\t>\n\t\t\t\t<span className=\"payman-v2-md-image-resolving-inner\">\n\t\t\t\t\t<Loader2\n\t\t\t\t\t\tstyle={{ animation: \"payman-v2-spin 0.7s linear infinite\" }}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t/>\n\t\t\t\t\t<span>Loading image</span>\n\t\t\t\t\t<span>Reference image</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t);\n\t}\n\n\tif (hasError) {\n\t\treturn (\n\t\t\t<span className={cn(\"payman-v2-md-image\", \"payman-v2-md-image-error\")}>\n\t\t\t\t<ImageOff aria-hidden />\n\t\t\t\t<span>Unable to load image</span>\n\t\t\t\t{alt ? <span>{alt}</span> : null}\n\t\t\t\t{retryCount < 3 ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-md-image-error-retry\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetRetryCount((c) => c + 1);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tRetry\n\t\t\t\t\t</button>\n\t\t\t\t) : null}\n\t\t\t</span>\n\t\t);\n\t}\n\n\tconst imgSrc =\n\t\tretryCount > 0\n\t\t\t? `${src}${src.includes(\"?\") ? \"&\" : \"?\"}_r=${retryCount}`\n\t\t\t: src;\n\n\treturn (\n\t\t<span ref={sentinelRef} className=\"payman-v2-md-image\">\n\t\t\t{isVisible ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"payman-v2-md-image-button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (isLoaded && src) onImageClick?.(src, alt || \"Image\");\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!isLoaded}\n\t\t\t\t\taria-busy={!isLoaded}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...frameStyle,\n\t\t\t\t\t\tminHeight: isLoaded ? 0 : \"10rem\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{!isLoaded && (\n\t\t\t\t\t\t<span className=\"payman-v2-md-image-loading\">\n\t\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\t\tstyle={{ animation: \"payman-v2-spin 0.7s linear infinite\" }}\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span>Loading image…</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={imgSrc}\n\t\t\t\t\t\talt={alt || \"\"}\n\t\t\t\t\t\tclassName=\"payman-v2-md-image-img\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...imgStyle,\n\t\t\t\t\t\t\topacity: isLoaded ? 1 : 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonLoad={() => {\n\t\t\t\t\t\t\tif (src) loadedImageCache.add(src);\n\t\t\t\t\t\t\tprevLoadedRef.current = true;\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetIsLoaded(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonError={() => {\n\t\t\t\t\t\t\tprevLoadedRef.current = false;\n\t\t\t\t\t\t\tsetIsLoaded(false);\n\t\t\t\t\t\t\tsetHasError(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{isLoaded ? (\n\t\t\t\t\t\t<span className=\"payman-v2-md-image-overlay\" aria-hidden>\n\t\t\t\t\t\t\t<span className=\"payman-v2-md-image-overlay-icon\">\n\t\t\t\t\t\t\t\t<Eye />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"payman-v2-md-image-placeholder\"\n\t\t\t\t\tstyle={{ ...frameStyle, minHeight: \"10rem\" }}\n\t\t\t\t>\n\t\t\t\t\t<span>Image</span>\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n","import ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkBreaks from \"remark-breaks\";\nimport type { Components } from \"react-markdown\";\nimport { useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { MarkdownImageV2 } from \"./MarkdownImageV2\";\n\nexport type MarkdownRendererV2Props = {\n\tcontent: string;\n\tisStreaming?: boolean;\n\tisResolvingImages?: boolean;\n\tonImageClick?: (src: string, alt: string) => void;\n};\n\nfunction buildComponents(\n\tonImageClick?: (src: string, alt: string) => void,\n\tisResolvingRef?: React.RefObject<boolean | undefined>,\n): Components {\n\treturn {\n\t\tp: ({ children }) => <p>{children}</p>,\n\t\tcode: ({ children }) => <code>{children}</code>,\n\t\tpre: ({ children }) => (\n\t\t\t<div className=\"payman-v2-markdown-pre\">\n\t\t\t\t<pre>{children}</pre>\n\t\t\t</div>\n\t\t),\n\t\tul: ({ children }) => <ul>{children}</ul>,\n\t\tol: ({ children }) => <ol>{children}</ol>,\n\t\tli: ({ children }) => <li>{children}</li>,\n\t\th1: ({ children }) => <h1>{children}</h1>,\n\t\th2: ({ children }) => <h2>{children}</h2>,\n\t\th3: ({ children }) => <h3>{children}</h3>,\n\t\tstrong: ({ children }) => <strong>{children}</strong>,\n\t\tem: ({ children }) => <em>{children}</em>,\n\t\tblockquote: ({ children }) => <blockquote>{children}</blockquote>,\n\t\thr: () => <hr />,\n\t\ta: ({ href, children }) => (\n\t\t\t<a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t),\n\t\timg: ({ src, alt }) => (\n\t\t\t<MarkdownImageV2\n\t\t\t\tsrc={typeof src === \"string\" ? src : undefined}\n\t\t\t\talt={typeof alt === \"string\" ? alt : undefined}\n\t\t\t\tisResolving={isResolvingRef?.current}\n\t\t\t\tonImageClick={onImageClick}\n\t\t\t/>\n\t\t),\n\t\ttable: ({ children }) => (\n\t\t\t<div className=\"payman-v2-markdown-table-wrapper\">\n\t\t\t\t<table className=\"payman-v2-markdown-table\">{children}</table>\n\t\t\t</div>\n\t\t),\n\t\tthead: ({ children }) => (\n\t\t\t<thead className=\"payman-v2-markdown-thead\">{children}</thead>\n\t\t),\n\t\ttbody: ({ children }) => (\n\t\t\t<tbody className=\"payman-v2-markdown-tbody\">{children}</tbody>\n\t\t),\n\t\tth: ({ children }) => (\n\t\t\t<th className=\"payman-v2-markdown-th\">{children}</th>\n\t\t),\n\t\ttd: ({ children }) => (\n\t\t\t<td className=\"payman-v2-markdown-td\">{children}</td>\n\t\t),\n\t};\n}\n\nexport function MarkdownRendererV2({\n\tcontent,\n\tisStreaming,\n\tisResolvingImages,\n\tonImageClick,\n}: MarkdownRendererV2Props) {\n\t// Use a ref so changes to isResolvingImages don't recreate the\n\t// components object — that would make ReactMarkdown unmount/remount\n\t// every custom component (including images), killing their state.\n\tconst isResolvingRef = useRef(isResolvingImages);\n\tisResolvingRef.current = isResolvingImages;\n\n\tconst components = useMemo(\n\t\t() => buildComponents(onImageClick, isResolvingRef),\n\t\t[onImageClick],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"payman-v2-markdown\",\n\t\t\t\tisStreaming && \"payman-v2-streaming-cursor\",\n\t\t\t)}\n\t\t>\n\t\t\t{/*\n\t\t\t remark-breaks converts every single `\\n` in the source\n\t\t\t into a hard line break (<br>) in the output. Without it,\n\t\t\t standard markdown collapses single newlines — so an LLM\n\t\t\t that emits \"Item A\\nItem B\\nItem C\" (one item per line in\n\t\t\t the source) renders as one paragraph of run-on text. With\n\t\t\t remark-breaks the user sees exactly the line layout the\n\t\t\t LLM wrote.\n\t\t\t*/}\n\t\t\t<ReactMarkdown remarkPlugins={[remarkGfm, remarkBreaks]} components={components}>\n\t\t\t\t{content}\n\t\t\t</ReactMarkdown>\n\t\t</div>\n\t);\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\n\n/**\n * Label shown when streaming is in progress but no real step has\n * been recorded yet — the ~50ms window before the first\n * STAGE_STARTED event arrives. Single honest label, no rotating\n * made-up text.\n */\nexport const PENDING_LABEL = \"Thinking\";\n\nexport type ThinkingBlockV2Props = {\n\t/**\n\t * True while the stream is still producing events. The parent\n\t * (`AssistantMessageV2`) unmounts this component entirely when\n\t * this flips to false, wrapped in an outer AnimatePresence for\n\t * the exit fade, so this prop is effectively always true at\n\t * render time today — kept as a prop for future flexibility.\n\t */\n\tisStreaming: boolean;\n\t/**\n\t * Optional sticky header line — the Analyzer's plan narrative\n\t * (\"I'll pull your Q1 transactions and compare them against\n\t * April…\"). Rendered ABOVE the flipping cursor and stays put\n\t * for the duration of the run, so the user can keep the\n\t * strategy in view while the tactical [currentStepLabel] ticks\n\t * by below. Null during the Analyzer's own window — two-line\n\t * layout collapses to one line until the plan lands.\n\t */\n\tstickyLabel?: string;\n\t/**\n\t * The currently-running stage's label — computed from the\n\t * `message.steps` array in the parent. Rendered as a single\n\t * flipping line: when the label changes (next stage starts),\n\t * the old label slides up and fades while the new one slides\n\t * in from below (\"digital-clock flip\" style). Parent owns the\n\t * \"which step is current\" logic, so this component stays\n\t * dumb and just renders whatever it's given.\n\t */\n\tcurrentStepLabel?: string;\n};\n\n/**\n * Live streaming indicator rendered above the assistant response\n * while a playground/chat run is in flight. Just the current\n * stage's friendly label on a single line — \"Checking your\n * request…\", \"Pulling those up for you now.\", \"Executing…\" — with\n * framer-motion flipping between labels as stages advance.\n *\n * The \"time is passing\" signal used to live here as a spinning\n * asterisk glyph next to the label. That was moved to a dedicated\n * `StreamingIndicatorV2` component rendered above the chat input\n * (Claude-style), so the text area stays clean and the motion\n * lands where the user's eye naturally rests between reads.\n *\n * After streaming ends, the parent unmounts this component entirely\n * (inside its own AnimatePresence), so there is no post-streaming\n * \"Thought\" label, no expand/collapse history view, no duration\n * pill. Users who need to review the steps that ran can click the\n * trace icon in the action row.\n */\nexport function ThinkingBlockV2({\n\tisStreaming: _isStreaming,\n\tstickyLabel,\n\tcurrentStepLabel,\n}: ThinkingBlockV2Props) {\n\tconst displayedCursorLabel = currentStepLabel || PENDING_LABEL;\n\n\treturn (\n\t\t<div className=\"payman-v2-thinking\">\n\t\t\t{/*\n\t\t\t Sticky plan header — the Analyzer's LLM-generated\n\t\t\t narrative of how the agent plans to handle the request.\n\t\t\t Rendered with a gentle fade-in when it first arrives\n\t\t\t (usually 2-3s into the run), then stays put. No\n\t\t\t flipping animation: the whole point is stability.\n\t\t\t*/}\n\t\t\t<AnimatePresence>\n\t\t\t\t{stickyLabel && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tkey=\"sticky\"\n\t\t\t\t\t\tclassName=\"payman-v2-thinking-sticky\"\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 4 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{stickyLabel}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t\t<div className=\"payman-v2-thinking-cursor\">\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t<motion.span\n\t\t\t\t\t\tkey={displayedCursorLabel}\n\t\t\t\t\t\tclassName=\"payman-v2-thinking-cursor-label payman-v2-thinking-shimmer\"\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: -6 }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 0.34,\n\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{displayedCursorLabel}\n\t\t\t\t\t</motion.span>\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\nimport {\n\tNEGATIVE_FEEDBACK_REASONS,\n\ttype NegativeFeedbackReason,\n} from \"../../utils/feedbackClient\";\n\nconst MAX_DETAILS_CHARS = 2000;\n\nexport type FeedbackReasonModalProps = {\n\topen: boolean;\n\tonClose: () => void;\n\t/**\n\t * Persist the chosen reason + optional details. Should reject if the save\n\t * fails — the modal stays open and surfaces the error instead of closing.\n\t */\n\tonSubmit: (reason: NegativeFeedbackReason, details?: string) => Promise<void>;\n};\n\n/**\n * Thumbs-down reason picker. A negative rating always carries one reason\n * (matching the backend's required category) plus optional free-text detail.\n */\nexport function FeedbackReasonModal({\n\topen,\n\tonClose,\n\tonSubmit,\n}: FeedbackReasonModalProps) {\n\tconst [reason, setReason] = useState<NegativeFeedbackReason>(\n\t\tNEGATIVE_FEEDBACK_REASONS[0].value,\n\t);\n\tconst [details, setDetails] = useState(\"\");\n\tconst [submitting, setSubmitting] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [reasonOpen, setReasonOpen] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tsetReason(NEGATIVE_FEEDBACK_REASONS[0].value);\n\t\t\tsetDetails(\"\");\n\t\t\tsetError(null);\n\t\t\tsetSubmitting(false);\n\t\t\tsetReasonOpen(false);\n\t\t}\n\t}, [open]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\") return;\n\t\t\tif (reasonOpen) {\n\t\t\t\tsetReasonOpen(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClose();\n\t\t},\n\t\t[onClose, reasonOpen],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!open || typeof document === \"undefined\") return;\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [handleKeyDown, open]);\n\n\tconst handleSubmit = async () => {\n\t\tsetSubmitting(true);\n\t\tsetError(null);\n\t\tsetReasonOpen(false);\n\t\ttry {\n\t\t\tawait onSubmit(reason, details.trim() ? details.trim() : undefined);\n\t\t\tonClose();\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : \"Could not send feedback\");\n\t\t\tsetSubmitting(false);\n\t\t}\n\t};\n\n\tconst selectedReason =\n\t\tNEGATIVE_FEEDBACK_REASONS.find((item) => item.value === reason) ??\n\t\tNEGATIVE_FEEDBACK_REASONS[0];\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName=\"payman-v2-feedback-modal-backdrop\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 12, scale: 0.98 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-dialog\"\n\t\t\t\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-labelledby=\"payman-v2-feedback-title\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-close\"\n\t\t\t\t\t\t\taria-label=\"Close feedback modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X size={18} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<h2\n\t\t\t\t\t\t\tid=\"payman-v2-feedback-title\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-title\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tTell us what went wrong\n\t\t\t\t\t\t</h2>\n\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-label\"\n\t\t\t\t\t\t\thtmlFor=\"payman-v2-feedback-reason\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tWhat was the issue?\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"payman-v2-feedback-reason\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason\"\n\t\t\t\t\t\t\tonBlur={(event) => {\n\t\t\t\t\t\t\t\tconst nextTarget = event.relatedTarget as Node | null;\n\t\t\t\t\t\t\t\tif (!nextTarget || !event.currentTarget.contains(nextTarget)) {\n\t\t\t\t\t\t\t\t\tsetReasonOpen(false);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason-trigger\"\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={reasonOpen}\n\t\t\t\t\t\t\t\taria-controls=\"payman-v2-feedback-reason-options\"\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tonClick={() => setReasonOpen((current) => !current)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{selectedReason.label}</span>\n\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\tsize={17}\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\treasonOpen\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-feedback-modal-reason-chevron payman-v2-feedback-modal-reason-chevron-open\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-feedback-modal-reason-chevron\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{reasonOpen ? (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tid=\"payman-v2-feedback-reason-options\"\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason-menu\"\n\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\taria-label=\"Feedback issue\"\n\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{NEGATIVE_FEEDBACK_REASONS.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = item.value === reason;\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-feedback-modal-reason-option payman-v2-feedback-modal-reason-option-selected\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-feedback-modal-reason-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetReason(item.value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetReasonOpen(false);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{isSelected ? <Check size={16} strokeWidth={2} /> : null}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-textarea\"\n\t\t\t\t\t\t\tplaceholder=\"Add details (optional)\"\n\t\t\t\t\t\t\tvalue={details}\n\t\t\t\t\t\t\tmaxLength={MAX_DETAILS_CHARS}\n\t\t\t\t\t\t\tonChange={(e) => setDetails(e.target.value)}\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{error ? (\n\t\t\t\t\t\t\t<p className=\"payman-v2-feedback-modal-error\">{error}</p>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t<div className=\"payman-v2-feedback-modal-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-btn payman-v2-feedback-modal-btn-secondary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-btn payman-v2-feedback-modal-btn-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{submitting ? \"Sending…\" : \"Submit\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>\n\t);\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Progressively reveals `targetText` char-by-char, matching the demo's\n * typing-loop feel for both thinking content and the final response.\n *\n * - While `enabled` is true the hook keeps a \"displayed\" buffer and\n * advances it toward the current `targetText` one character at a time.\n * - If new text is appended to `targetText` mid-animation, the loop\n * picks up from where it left off.\n * - When `enabled` becomes false the remaining text is flushed instantly\n * (e.g. when thinking ends and we auto-collapse).\n *\n * ### Speed multiplier\n *\n * Each character's per-char delay is divided by `speedMultiplier` so\n * larger values mean faster typing:\n * 1 → default pace (unchanged)\n * 2 → twice as fast\n * 0.5 → half speed\n * 0 → instant reveal (skip the animation entirely)\n *\n * Non-zero values are clamped to a minimum of 0.1 to avoid divide-by-zero\n * or absurdly slow playback from accidental tiny values.\n */\n\ntype SpeedProfile = {\n\tnormal: [number, number];\n\tfast: number;\n\tpunctuation: [number, number];\n\tnewline: [number, number];\n\tidle: number;\n};\n\nexport const THINKING_SPEED: SpeedProfile = {\n\tnormal: [6, 8],\n\tfast: 1,\n\tpunctuation: [20, 30],\n\tnewline: [12, 18],\n\tidle: 30,\n};\n\nexport const RESPONSE_SPEED: SpeedProfile = {\n\tnormal: [2, 4],\n\tfast: 1,\n\tpunctuation: [8, 12],\n\tnewline: [4, 6],\n\tidle: 15,\n};\n\n// Matches a complete markdown image token: \nconst MARKDOWN_IMAGE_REGEX = /^!\\[[^\\]]*\\]\\([^)]*\\)/;\n\nfunction charDelay(char: string, speed: SpeedProfile, multiplier: number): number {\n\tconst raw = (() => {\n\t\tif (char === \"*\") return speed.fast;\n\t\tif (char === \"\\n\")\n\t\t\treturn speed.newline[0] + Math.random() * speed.newline[1];\n\t\tif (\".!?,;:\".includes(char))\n\t\t\treturn speed.punctuation[0] + Math.random() * speed.punctuation[1];\n\t\treturn speed.normal[0] + Math.random() * speed.normal[1];\n\t})();\n\treturn raw / multiplier;\n}\n\nexport function useTypingEffect(\n\ttargetText: string,\n\tenabled: boolean,\n\tspeed: SpeedProfile = RESPONSE_SPEED,\n\tinitialDisplayedText?: string,\n\tspeedMultiplier: number = 1,\n): { displayedText: string; isTyping: boolean } {\n\t// speedMultiplier === 0 is a hard kill-switch: render instantly, no animation.\n\t// Any non-zero value is clamped to a sensible minimum.\n\tconst instant = speedMultiplier === 0;\n\tconst multiplier = instant ? 1 : Math.max(speedMultiplier, 0.1);\n\n\tconst [displayedText, setDisplayedText] = useState(\"\");\n\tconst displayedRef = useRef(\"\");\n\tconst targetRef = useRef(targetText);\n\tconst enabledRef = useRef(enabled);\n\tconst initialDisplayedRef = useRef(initialDisplayedText);\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst runningRef = useRef(false);\n\n\ttargetRef.current = targetText;\n\tenabledRef.current = enabled;\n\tinitialDisplayedRef.current = initialDisplayedText;\n\n\tuseEffect(() => {\n\t\tif (!enabled || instant) {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t\ttimerRef.current = null;\n\t\t\t}\n\t\t\trunningRef.current = false;\n\t\t\tdisplayedRef.current = targetText;\n\t\t\tsetDisplayedText(targetText);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tdisplayedRef.current.length === 0 &&\n\t\t\tinitialDisplayedRef.current &&\n\t\t\ttargetRef.current.startsWith(initialDisplayedRef.current)\n\t\t) {\n\t\t\tdisplayedRef.current = initialDisplayedRef.current;\n\t\t\tsetDisplayedText(initialDisplayedRef.current);\n\t\t}\n\n\t\t// If the target changed incompatibly (displayed is no longer a\n\t\t// prefix), flush instantly to the new target. This happens when\n\t\t// RAG image URLs are swapped to resolved blob URLs — the text is\n\t\t// visually identical so the jump is imperceptible.\n\t\tif (displayedRef.current && !targetRef.current.startsWith(displayedRef.current)) {\n\t\t\tdisplayedRef.current = targetRef.current;\n\t\t\tsetDisplayedText(targetRef.current);\n\t\t}\n\n\t\tif (runningRef.current) return;\n\t\trunningRef.current = true;\n\n\t\tconst tick = () => {\n\t\t\tif (!enabledRef.current) {\n\t\t\t\trunningRef.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Target changed incompatibly mid-tick (e.g. RAG URL swap).\n\t\t\t// Flush to the new content instantly rather than restarting.\n\t\t\tif (displayedRef.current && !targetRef.current.startsWith(displayedRef.current)) {\n\t\t\t\tdisplayedRef.current = targetRef.current;\n\t\t\t\tsetDisplayedText(targetRef.current);\n\t\t\t\ttimerRef.current = setTimeout(tick, speed.idle / multiplier);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (displayedRef.current.length < targetRef.current.length) {\n\t\t\t\tconst remaining = targetRef.current.slice(displayedRef.current.length);\n\n\t\t\t\t// Skip any complete markdown image token `` in one\n\t\t\t\t// step so the raw syntax never appears as typed text.\n\t\t\t\tconst imgMatch = MARKDOWN_IMAGE_REGEX.exec(remaining);\n\t\t\t\tif (imgMatch) {\n\t\t\t\t\tdisplayedRef.current += imgMatch[0];\n\t\t\t\t\tsetDisplayedText(displayedRef.current);\n\t\t\t\t\ttimerRef.current = setTimeout(tick, 0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst nextChar = remaining[0];\n\t\t\t\tdisplayedRef.current += nextChar;\n\t\t\t\tsetDisplayedText(displayedRef.current);\n\t\t\t\tconst delay = charDelay(nextChar, speed, multiplier);\n\t\t\t\ttimerRef.current = setTimeout(tick, delay);\n\t\t\t} else {\n\t\t\t\ttimerRef.current = setTimeout(tick, speed.idle / multiplier);\n\t\t\t}\n\t\t};\n\n\t\ttick();\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t\ttimerRef.current = null;\n\t\t\t}\n\t\t\trunningRef.current = false;\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [enabled, instant]);\n\n\tconst isTyping =\n\t\tenabled && !instant && displayedRef.current.length < targetRef.current.length;\n\n\treturn {\n\t\tdisplayedText: enabled || instant ? displayedText : targetText,\n\t\tisTyping,\n\t};\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tCopy,\n\tCheck,\n\tAlertCircle,\n\tWifiOff,\n\tBinoculars,\n\tThumbsUp,\n\tThumbsDown,\n} from \"lucide-react\";\nimport type {\n\tAssistantMessageActionsConfig,\n\tMessageDisplay,\n} from \"../../types\";\nimport { MarkdownRendererV2 } from \"./MarkdownRendererV2\";\nimport { ThinkingBlockV2 } from \"./ThinkingBlockV2\";\nimport { ActionTooltipV2 } from \"./ActionTooltipV2\";\nimport { FeedbackReasonModal } from \"./FeedbackReasonModal\";\nimport { cn } from \"../../utils/cn\";\nimport type { SubmitFeedbackHandler } from \"../../utils/feedbackClient\";\nimport { useTypingEffect, RESPONSE_SPEED } from \"./useTypingEffect\";\n\n// Strips a trailing incomplete markdown image token from streaming content\n// so ReactMarkdown doesn't render raw URL text. Matches any of:\n// ![ — just opened\n// ![alt — alt text building\n// ![alt] — closed alt, no URL yet\n// \n// Does NOT match a complete token like .\nfunction stripIncompleteImageToken(text: string): string {\n\tconst lastBang = text.lastIndexOf(\" — keep it\n\tif (/^!\\[[^\\]]*\\]\\([^)]*\\)/.test(after)) return text;\n\t// Incomplete — strip from the `![` onward\n\treturn text.slice(0, lastBang);\n}\n\nexport type AssistantMessageV2Props = {\n\tmessage: MessageDisplay;\n\tonImageClick?: (src: string, alt: string) => void;\n\tonExecutionTraceClick?: (data: {\n\t\tmessage: MessageDisplay;\n\t\ttracingData?: unknown;\n\t\texecutionId?: string;\n\t}) => void;\n\t/**\n\t * Persist thumbs-up/down feedback. Resolves on a durable save and rejects\n\t * on failure so the optimistic UI can revert / the reason modal can show\n\t * an error.\n\t */\n\tonSubmitFeedback?: SubmitFeedbackHandler;\n\tactions?: AssistantMessageActionsConfig;\n\t/**\n\t * Typing-reveal speed multiplier. 1 = default, 2 = 2x faster,\n\t * 0.5 = half speed, 0 = instant reveal (animation disabled).\n\t */\n\ttypingSpeed?: number;\n};\n\ntype ToastState = {\n\tlabel: string;\n\ttone: \"success\" | \"error\";\n} | null;\n\nfunction getFeedbackState(message: MessageDisplay): \"up\" | \"down\" | null {\n\tconst feedback = (message as {\n\t\tfeedback?:\n\t\t\t| \"up\"\n\t\t\t| \"down\"\n\t\t\t| {\n\t\t\t\t\tfeedback?: string | null;\n\t\t\t }\n\t\t\t| null;\n\t}).feedback;\n\n\tif (feedback === \"up\" || feedback === \"down\") return feedback;\n\tif (feedback && typeof feedback === \"object\") {\n\t\tconst value = feedback.feedback;\n\t\tif (!value) return null;\n\t\treturn value === \"POSITIVE\" ? \"up\" : \"down\";\n\t}\n\n\treturn null;\n}\n\nexport function AssistantMessageV2({\n\tmessage,\n\tonImageClick,\n\tonExecutionTraceClick,\n\tonSubmitFeedback,\n\tactions,\n\ttypingSpeed = 4,\n}: AssistantMessageV2Props) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [activeFeedback, setActiveFeedback] = useState<\"up\" | \"down\" | null>(\n\t\t() => getFeedbackState(message),\n\t);\n\tconst [reasonModalOpen, setReasonModalOpen] = useState(false);\n\tconst canSubmitFeedback = !!onSubmitFeedback && !!message.executionId;\n\tconst [toast, setToast] = useState<ToastState>(null);\n\tconst copyResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst showCopyAction = actions?.copy ?? true;\n\tconst showTraceAction =\n\t\t(actions?.trace ?? true) && !!onExecutionTraceClick;\n\tconst showThumbsUp = actions?.thumbsUp ?? true;\n\tconst showThumbsDown = actions?.thumbsDown ?? true;\n\tconst hydratedFeedback = (message as { feedback?: unknown }).feedback;\n\n\tconst hasEverStreamed = useRef(!!message.isStreaming);\n\tif (message.isStreaming) hasEverStreamed.current = true;\n\n\tuseEffect(() => {\n\t\tsetActiveFeedback(getFeedbackState(message));\n\t}, [hydratedFeedback, message.id]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\t};\n\t}, []);\n\n\tconst rawResponseContent = (() => {\n\t\tconst raw = message.isStreaming\n\t\t\t? (message.streamingContent || message.content)\n\t\t\t: message.content;\n\t\tif (!raw) return \"\";\n\t\tconst normalized = raw.replace(/\\\\n/g, \"\\n\");\n\t\t// While streaming, strip any trailing incomplete image token so\n\t\t// ReactMarkdown doesn't flash the raw URL as plain text.\n\t\treturn message.isStreaming ? stripIncompleteImageToken(normalized) : normalized;\n\t})();\n\n\tconst isThinkingStreaming =\n\t\t!!message.isStreaming &&\n\t\t!rawResponseContent &&\n\t\t!message.isError;\n\n\tconst responseTypingEnabled =\n\t\thasEverStreamed.current && Boolean(rawResponseContent) && !message.isError;\n\n\tconst { displayedText: displayContent, isTyping: isResponseTyping } =\n\t\tuseTypingEffect(\n\t\t\trawResponseContent,\n\t\t\tresponseTypingEnabled,\n\t\t\tRESPONSE_SPEED,\n\t\t\tundefined,\n\t\t\ttypingSpeed,\n\t\t);\n\n\t// Two-line live-progress model computed from `message.steps`:\n\t//\n\t// stickyLabel: the Analyzer's LLM-generated plan narrative — e.g.\n\t// \"I'll pull your Q1 transactions and compare them against\n\t// April to spot the biggest recurring charges.\" Rendered as a\n\t// sticky header that never changes for the duration of the\n\t// run, so the user can read the agent's strategy while the\n\t// tactics tick by below. Null until the Analyzer completes.\n\t//\n\t// currentStepLabel: live tactical label — the tool/stage\n\t// currently in flight. Flips between \"Pulling debit\n\t// transactions from Jan 1 to Mar 31\", \"Totaling recurring\n\t// amount by merchant and month\", etc. as events land.\n\t//\n\t// This split matters especially for AGENTIC runs (60-120s with\n\t// 20+ tool events). A single flipping label meant the user saw\n\t// either the strategy OR the current tool, never both — they\n\t// couldn't map the running tools back onto the intent. Two lines\n\t// keep both in view.\n\tconst stickyLabel = (() => {\n\t\tconst steps = message.steps;\n\t\tif (!steps || steps.length === 0) return undefined;\n\t\t// Walk back looking for the most recent completed analyzer\n\t\t// stage with a dynamic server-provided message. The Analyzer\n\t\t// is the only stage today that writes a user-facing plan\n\t\t// narrative; future stages that do the same would match here\n\t\t// too via `stage === \"analyzer\"` (or expand the check).\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (\n\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\ts.stage === \"analyzer\" &&\n\t\t\t\ts.status === \"completed\" &&\n\t\t\t\ts.message\n\t\t\t) {\n\t\t\t\treturn s.message;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t})();\n\n\tconst currentStepLabel = (() => {\n\t\tconst steps = message.steps;\n\t\tif (!steps || steps.length === 0) return undefined;\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (s.status === \"in_progress\" && s.message) {\n\t\t\t\t// If the only in-progress step is the Analyzer itself\n\t\t\t\t// (we're still in the Analyzer's own window before it\n\t\t\t\t// publishes its plan), fall through to the default\n\t\t\t\t// start label — showing nothing would leave a blank\n\t\t\t\t// ticker.\n\t\t\t\tif (s.stage === \"analyzer\" && s.message === stickyLabel) continue;\n\t\t\t\t// Don't echo the sticky header in the ticker.\n\t\t\t\tif (s.message === stickyLabel) continue;\n\t\t\t\treturn s.message;\n\t\t\t}\n\t\t}\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (s.message && s.message !== stickyLabel) return s.message;\n\t\t}\n\t\treturn undefined;\n\t})();\n\n\tif (message.isError && !displayContent && !isThinkingStreaming) {\n\t\treturn (\n\t\t\t<div className=\"payman-v2-assistant-msg payman-v2-fade-in\">\n\t\t\t\t<div className=\"payman-v2-assistant-msg-error\">\n\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-error-icon\"\n\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-error-text\">\n\t\t\t\t\t\t\t{message.errorDetails || \"Something went wrong. Please try again.\"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst showToast = (label: string, tone: \"success\" | \"error\") => {\n\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\tsetToast({ label, tone });\n\t\ttoastTimerRef.current = setTimeout(() => setToast(null), 1800);\n\t};\n\n\tconst handlePositiveFeedback = () => {\n\t\tif (!canSubmitFeedback || activeFeedback === \"up\") return;\n\t\tconst previous = activeFeedback;\n\t\tsetActiveFeedback(\"up\");\n\t\tPromise.resolve(\n\t\t\tonSubmitFeedback?.({\n\t\t\t\tmessageId: message.id,\n\t\t\t\texecutionId: message.executionId,\n\t\t\t\tfeedback: \"POSITIVE\",\n\t\t\t}),\n\t\t)\n\t\t\t.then(() => showToast(\"Thank you for your feedback\", \"success\"))\n\t\t\t.catch(() => {\n\t\t\t\tsetActiveFeedback(previous);\n\t\t\t\tshowToast(\"Could not send feedback\", \"error\");\n\t\t\t});\n\t};\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tif (!navigator.clipboard?.writeText) {\n\t\t\t\tthrow new Error(\"Clipboard unavailable\");\n\t\t\t}\n\t\t\tawait navigator.clipboard.writeText(displayContent);\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tsetCopied(true);\n\t\t\tcopyResetTimerRef.current = setTimeout(() => setCopied(false), 1800);\n\t\t\tshowToast(\"Copied to clipboard\", \"success\");\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t\tshowToast(\"Could not copy\", \"error\");\n\t\t}\n\t};\n\n\tconst handleTrace = () => {\n\t\tonExecutionTraceClick?.({\n\t\t\tmessage,\n\t\t\ttracingData: message.tracingData,\n\t\t\texecutionId: message.executionId,\n\t\t});\n\t};\n\n\tconst hasPartialError = message.isError && displayContent;\n\tconst isDone =\n\t\t!message.isStreaming &&\n\t\tdisplayContent &&\n\t\t!hasPartialError &&\n\t\t!isResponseTyping;\n\tconst hasVisibleDoneActions =\n\t\tshowCopyAction ||\n\t\tshowTraceAction ||\n\t\tshowThumbsUp ||\n\t\tshowThumbsDown;\n\tconst isCancelled = message.isCancelled;\n\n\tconst toastPortal =\n\t\ttypeof document !== \"undefined\"\n\t\t\t? createPortal(\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{toast && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -18, scale: 0.96 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -12, scale: 0.96 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\ttype: \"spring\",\n\t\t\t\t\t\t\t\t\tstiffness: 360,\n\t\t\t\t\t\t\t\t\tdamping: 26,\n\t\t\t\t\t\t\t\t\tmass: 0.7,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-toast\"\n\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-toast-inner\",\n\t\t\t\t\t\t\t\t\t\ttoast.tone === \"success\"\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-toast-success\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-toast-error\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{toast.tone === \"success\" ? (\n\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#059669\" }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#ef4444\" }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span>{toast.label}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<>\n\t\t\t{toastPortal}\n\n\t\t\t<div className=\"payman-v2-assistant-msg payman-v2-fade-in\">\n\t\t\t\t{/*\n\t\t\t\t Thinking block is live-progress only. Wrapped in\n\t\t\t\t AnimatePresence so that when streaming ends the\n\t\t\t\t block smoothly fades out and unmounts rather than\n\t\t\t\t popping off the page. No post-streaming \"Thought\"\n\t\t\t\t header — once the response is visible, the block's\n\t\t\t\t job is done and the user sees just the answer.\n\t\t\t\t Users who need to review what ran can click the\n\t\t\t\t trace icon in the action row.\n\t\t\t\t*/}\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{isThinkingStreaming && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tkey=\"thinking\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, height: \"auto\" }}\n\t\t\t\t\t\t\texit={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tduration: 0.32,\n\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tstyle={{ overflow: \"hidden\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ThinkingBlockV2\n\t\t\t\t\t\t\t\tisStreaming={isThinkingStreaming}\n\t\t\t\t\t\t\t\tstickyLabel={stickyLabel}\n\t\t\t\t\t\t\t\tcurrentStepLabel={currentStepLabel}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<div className=\"payman-v2-assistant-msg-content-area\">\n\t\t\t\t\t{displayContent ? (\n\t\t\t\t\t\t<MarkdownRendererV2\n\t\t\t\t\t\t\tcontent={displayContent}\n\t\t\t\t\t\t\tisStreaming={(message.isStreaming && !isCancelled) || isResponseTyping}\n\t\t\t\t\t\t\tisResolvingImages={message.isResolvingImages}\n\t\t\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : !isThinkingStreaming ? (\n\t\t\t\t\t\t<span className=\"payman-v2-assistant-msg-placeholder\">...</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t{isCancelled && message.isStreaming && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-paused\">\n\t\t\t\t\t\t<WifiOff\n\t\t\t\t\t\t\tstyle={{ width: 14, height: 14, color: \"rgba(217, 119, 6, 0.7)\", flexShrink: 0 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-paused-text\">\n\t\t\t\t\t\t\tConnection slow - resuming…\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{hasPartialError && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-partial-error\">\n\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-error-icon\"\n\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-error-text\">\n\t\t\t\t\t\t\t\t{message.errorDetails || \"The response was interrupted.\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{isDone && hasVisibleDoneActions && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-actions\">\n\t\t\t\t\t\t{showCopyAction && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Copy\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => void handleCopy()}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tcopied && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Copy\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t<Check style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Copy style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showThumbsUp && canSubmitFeedback && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Good response\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={handlePositiveFeedback}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tactiveFeedback === \"up\" && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Good response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThumbsUp\n\t\t\t\t\t\t\t\t\t\tfill={activeFeedback === \"up\" ? \"currentColor\" : \"none\"}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 15, height: 15 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showThumbsDown && canSubmitFeedback && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Bad response\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setReasonModalOpen(true)}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tactiveFeedback === \"down\" && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Bad response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThumbsDown\n\t\t\t\t\t\t\t\t\t\tfill={activeFeedback === \"down\" ? \"currentColor\" : \"none\"}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 15, height: 15 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showTraceAction && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Trace\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={handleTrace}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-action-btn\"\n\t\t\t\t\t\t\t\t\taria-label=\"Trace response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Binoculars style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<FeedbackReasonModal\n\t\t\t\topen={reasonModalOpen}\n\t\t\t\tonClose={() => setReasonModalOpen(false)}\n\t\t\t\tonSubmit={async (reason, details) => {\n\t\t\t\t\tawait onSubmitFeedback?.({\n\t\t\t\t\t\tmessageId: message.id,\n\t\t\t\t\t\texecutionId: message.executionId,\n\t\t\t\t\t\tfeedback: reason,\n\t\t\t\t\t\tdetails,\n\t\t\t\t\t});\n\t\t\t\t\tsetActiveFeedback(\"down\");\n\t\t\t\t\tshowToast(\"Thank you for your feedback\", \"success\");\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t);\n}\n","import { useEffect, useRef, type ClipboardEvent, type KeyboardEvent } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type OtpInputV2Props = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength?: number;\n\tdisabled?: boolean;\n\terror?: boolean;\n};\n\nconst DEFAULT_MAX_LENGTH = 6;\nconst MAX_SUPPORTED_LENGTH = 12;\nconst AUTO_FOCUS_DELAY_MS = 250;\n\nexport function OtpInputV2({\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tdisabled = false,\n\terror = false,\n}: OtpInputV2Props) {\n\tconst inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\tconst safeMaxLength =\n\t\tNumber.isInteger(maxLength) && (maxLength as number) > 0\n\t\t\t? Math.min(maxLength as number, MAX_SUPPORTED_LENGTH)\n\t\t\t: DEFAULT_MAX_LENGTH;\n\n\tconst digits = value\n\t\t.split(\"\")\n\t\t.concat(Array(safeMaxLength).fill(\"\"))\n\t\t.slice(0, safeMaxLength);\n\n\tuseEffect(() => {\n\t\tif (disabled) return;\n\t\tconst timer = window.setTimeout(() => {\n\t\t\tinputRefs.current[0]?.focus();\n\t\t}, AUTO_FOCUS_DELAY_MS);\n\t\treturn () => window.clearTimeout(timer);\n\t}, [disabled]);\n\n\tconst focusInput = (index: number) => {\n\t\tif (index >= 0 && index < safeMaxLength) {\n\t\t\tinputRefs.current[index]?.focus();\n\t\t}\n\t};\n\n\tconst updateValue = (newDigits: string[]) => {\n\t\tonChange(newDigits.join(\"\").slice(0, safeMaxLength));\n\t};\n\n\tconst handleChange = (index: number, char: string) => {\n\t\tif (char && !/^\\d$/.test(char)) return;\n\t\tconst newDigits = [...digits];\n\t\tnewDigits[index] = char;\n\t\tupdateValue(newDigits);\n\t\tif (char && index < safeMaxLength - 1) focusInput(index + 1);\n\t};\n\n\tconst handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (e.key === \"Enter\") {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === \"Backspace\") {\n\t\t\te.preventDefault();\n\t\t\tif (digits[index]) {\n\t\t\t\tconst newDigits = [...digits];\n\t\t\t\tnewDigits[index] = \"\";\n\t\t\t\tupdateValue(newDigits);\n\t\t\t} else if (index > 0) {\n\t\t\t\tconst newDigits = [...digits];\n\t\t\t\tnewDigits[index - 1] = \"\";\n\t\t\t\tupdateValue(newDigits);\n\t\t\t\tfocusInput(index - 1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\tfocusInput(index - 1);\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\tfocusInput(index + 1);\n\t\t}\n\t};\n\n\tconst handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n\t\te.preventDefault();\n\t\tconst pasted = e.clipboardData\n\t\t\t.getData(\"text\")\n\t\t\t.replace(/\\D/g, \"\")\n\t\t\t.slice(0, safeMaxLength);\n\t\tif (!pasted) return;\n\t\tconst newDigits = pasted\n\t\t\t.split(\"\")\n\t\t\t.concat(Array(safeMaxLength).fill(\"\"))\n\t\t\t.slice(0, safeMaxLength);\n\t\tupdateValue(newDigits);\n\t\tfocusInput(Math.min(pasted.length, safeMaxLength - 1));\n\t};\n\n\treturn (\n\t\t<div className={cn(\"payman-v2-otp\", error && \"payman-v2-shake\")}>\n\t\t\t{digits.map((digit, i) => (\n\t\t\t\t<input\n\t\t\t\t\tkey={i}\n\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\tinputRefs.current[i] = el;\n\t\t\t\t\t}}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\tmaxLength={1}\n\t\t\t\t\tvalue={digit}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(e) => handleChange(i, e.target.value.slice(-1))}\n\t\t\t\t\tonKeyDown={(e) => handleKeyDown(i, e)}\n\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\tonFocus={(e) => e.target.select()}\n\t\t\t\t\taria-label={`Digit ${i + 1}`}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"payman-v2-otp-digit\",\n\t\t\t\t\t\tdigit && \"payman-v2-otp-digit-filled\",\n\t\t\t\t\t\terror && \"payman-v2-otp-digit-error\"\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ShieldCheck } from \"lucide-react\";\nimport type { ActiveUserAction } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { cn } from \"../../utils/cn\";\nimport { OtpInputV2 } from \"./OtpInputV2\";\n\nexport type VerificationInlineProps = {\n\tprompt: ActiveUserAction;\n\t/** Seconds left before expiry (undefined = no countdown). */\n\tsecondsLeft?: number;\n\t/** True once the expiry countdown has elapsed. */\n\texpired: boolean;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n\tonResend: (userActionId: string) => Promise<void>;\n};\n\nconst DEFAULT_CODE_LEN = 6;\nconst RESEND_COOLDOWN_S = 30;\n\n/** The verification code field is always keyed `verificationCode`. */\nfunction codeLengthFromSchema(prompt: ActiveUserAction): number {\n\tconst field = prompt.requestedSchema?.properties?.verificationCode;\n\tconst max = typeof field?.maxLength === \"number\" ? field.maxLength : undefined;\n\tconst min = typeof field?.minLength === \"number\" ? field.minLength : undefined;\n\treturn max ?? min ?? DEFAULT_CODE_LEN;\n}\n\n/**\n * Inline one-time-code entry. Numeric codes use the boxed OTP input and\n * auto-submit when full; alphanumeric codes use a single text field.\n * Text-driven: a short label, the input, then plain action links.\n */\nexport function VerificationInline({\n\tprompt,\n\tsecondsLeft,\n\texpired,\n\tonSubmit,\n\tonCancel,\n\tonResend,\n}: VerificationInlineProps) {\n\tconst isNumeric = prompt.verificationType !== \"ALPHANUMERIC_CODE\";\n\tconst codeLen = useMemo(() => codeLengthFromSchema(prompt), [prompt]);\n\n\tconst [code, setCode] = useState(\"\");\n\tconst [errored, setErrored] = useState(false);\n\tconst [resendSec, setResendSec] = useState(0);\n\tconst [hiddenAfterResend, setHiddenAfterResend] = useState(false);\n\tconst lastSubmittedRef = useRef<string | null>(null);\n\tconst resendTimerRef = useRef<number | undefined>(undefined);\n\n\tconst status = prompt.status;\n\tconst busy = status === \"submitting\";\n\tconst stale = status === \"stale\";\n\tconst locked = busy || stale || expired;\n\n\t// A SubmissionInvalid supersede arrives as a fresh prompt object;\n\t// flag the input red so the user sees the prior code was rejected.\n\tuseEffect(() => {\n\t\tif (prompt.subAction === \"SubmissionInvalid\") {\n\t\t\tsetErrored(true);\n\t\t\tsetCode(\"\");\n\t\t\tlastSubmittedRef.current = null;\n\t\t}\n\t}, [prompt.subAction, prompt.userActionId]);\n\n\tuseEffect(() => {\n\t\tsetHiddenAfterResend(false);\n\t}, [prompt.expirySeconds, prompt.message, prompt.subAction, prompt.userActionId]);\n\n\tuseEffect(() => {\n\t\tif (code.length < codeLen) lastSubmittedRef.current = null;\n\t}, [code, codeLen]);\n\n\tconst doSubmit = useCallback(\n\t\t(value: string) => {\n\t\t\tif (locked || !value) return;\n\t\t\tif (lastSubmittedRef.current === value) return;\n\t\t\tlastSubmittedRef.current = value;\n\t\t\tvoid onSubmit(prompt.userActionId, { verificationCode: value }).catch(() => {\n\t\t\t\tlastSubmittedRef.current = null;\n\t\t\t\tsetErrored(true);\n\t\t\t});\n\t\t},\n\t\t[locked, onSubmit, prompt.userActionId],\n\t);\n\n\t// Auto-submit numeric codes once all digits are entered.\n\tuseEffect(() => {\n\t\tif (!isNumeric || locked) return;\n\t\tif (code.length === codeLen && /^\\d+$/.test(code)) {\n\t\t\tdoSubmit(code);\n\t\t}\n\t}, [code, codeLen, doSubmit, isNumeric, locked]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst startResendCooldown = useCallback(() => {\n\t\tsetResendSec(RESEND_COOLDOWN_S);\n\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t}\n\t\tresendTimerRef.current = window.setInterval(() => {\n\t\t\tsetResendSec((s) => {\n\t\t\t\tif (s <= 1) {\n\t\t\t\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\t\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t\t\t\t\tresendTimerRef.current = undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn s - 1;\n\t\t\t});\n\t\t}, 1000);\n\t}, []);\n\n\tconst handleResend = useCallback(async () => {\n\t\tif (locked || resendSec > 0) return;\n\t\tsetErrored(false);\n\t\tsetCode(\"\");\n\t\tsetHiddenAfterResend(true);\n\t\tlastSubmittedRef.current = null;\n\t\ttry {\n\t\t\tawait onResend(prompt.userActionId);\n\t\t\tstartResendCooldown();\n\t\t} catch {\n\t\t\tsetHiddenAfterResend(false);\n\t\t\t/* hook surfaces the error */\n\t\t}\n\t}, [locked, onResend, prompt.userActionId, resendSec, startResendCooldown]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tif (busy) return;\n\t\tvoid onCancel(prompt.userActionId);\n\t}, [busy, onCancel, prompt.userActionId]);\n\n\tconst description =\n\t\tprompt.message?.trim() ||\n\t\t(isNumeric\n\t\t\t? `Enter the ${codeLen}-digit code to continue`\n\t\t\t: \"Enter the verification code to continue\");\n\n\tif (hiddenAfterResend) return null;\n\n\treturn (\n\t\t<div className=\"payman-v2-ua\" role=\"group\" aria-label=\"Verification required\">\n\t\t\t<div className=\"payman-v2-ua-head\">\n\t\t\t\t<ShieldCheck className=\"payman-v2-ua-icon\" size={15} strokeWidth={1.75} aria-hidden />\n\t\t\t\t<span className=\"payman-v2-ua-title\">Verification required</span>\n\t\t\t\t{typeof secondsLeft === \"number\" && !stale && (\n\t\t\t\t\t<span className=\"payman-v2-ua-timer\">\n\t\t\t\t\t\t{expired ? \"Expired\" : `${secondsLeft}s`}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<p className=\"payman-v2-ua-desc\">{description}</p>\n\n\t\t\t{stale ? (\n\t\t\t\t<p className=\"payman-v2-ua-stale\">This request is no longer available.</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{isNumeric ? (\n\t\t\t\t\t\t<div className=\"payman-v2-ua-field\">\n\t\t\t\t\t\t\t<OtpInputV2\n\t\t\t\t\t\t\t\tvalue={code}\n\t\t\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\t\t\tsetErrored(false);\n\t\t\t\t\t\t\t\t\tsetCode(v);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tmaxLength={codeLen}\n\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\terror={errored}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"payman-v2-ua-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", errored && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\tvalue={code}\n\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\tautoComplete=\"one-time-code\"\n\t\t\t\t\t\t\t\tplaceholder=\"Verification code\"\n\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\tsetErrored(false);\n\t\t\t\t\t\t\t\t\tsetCode(e.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tdoSubmit(code.trim());\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"payman-v2-ua-actions\">\n\t\t\t\t\t\t{!isNumeric && (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-ua-btn payman-v2-ua-btn-primary\"\n\t\t\t\t\t\t\t\tdisabled={locked || !code.trim()}\n\t\t\t\t\t\t\t\tonClick={() => doSubmit(code.trim())}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{busy ? \"Submitting…\" : \"Submit\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-ua-link\"\n\t\t\t\t\t\t\tdisabled={locked || resendSec > 0}\n\t\t\t\t\t\t\tonClick={() => void handleResend()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{resendSec > 0 ? `Resend (${resendSec}s)` : \"Resend\"}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-ua-link payman-v2-ua-link-danger\"\n\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useMemo, useState } from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport {\n\ttype ActiveUserAction,\n\tbuildContent,\n\tclassifyField,\n\tdefaultValueFor,\n\tgetOptions,\n\tisRequired,\n\trenderableFields,\n\tvalidateForm,\n} from \"@paymanai/payman-typescript-ask-sdk\";\nimport { cn } from \"../../utils/cn\";\nimport { MarkdownRendererV2 } from \"./MarkdownRendererV2\";\n\nexport type SchemaFormInlineProps = {\n\tprompt: ActiveUserAction;\n\tsecondsLeft?: number;\n\texpired: boolean;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n};\n\n/**\n * Inline form rendered from a prompt's `requestedSchema`. Supports the\n * documented flat subset (text / number / boolean / oneOf single-select)\n * via the core `jsonSchemaForm` helpers; unsupported nested fields are\n * skipped. Text-driven: a label, stacked fields, then plain actions.\n */\nexport function SchemaFormInline({\n\tprompt,\n\tsecondsLeft,\n\texpired,\n\tonSubmit,\n\tonCancel,\n}: SchemaFormInlineProps) {\n\tconst schema = prompt.requestedSchema;\n\tconst fields = useMemo(() => renderableFields(schema), [schema]);\n\n\tconst [values, setValues] = useState<Record<string, unknown>>(() => {\n\t\tconst init: Record<string, unknown> = {};\n\t\tfor (const [key, field] of fields) init[key] = defaultValueFor(field);\n\t\treturn init;\n\t});\n\tconst [errors, setErrors] = useState<Record<string, string>>({});\n\n\tconst status = prompt.status;\n\tconst busy = status === \"submitting\";\n\tconst stale = status === \"stale\";\n\tconst locked = busy || stale || expired;\n\tconst isUserConfirmation = prompt.subAction === \"UserConfirmation\";\n\tconst messageFormat = prompt.metadata?.[\"payman/messageFormat\"];\n\tconst renderMarkdown = messageFormat === \"markdown\";\n\n\tconst setValue = (key: string, value: unknown) => {\n\t\tsetValues((prev) => ({ ...prev, [key]: value }));\n\t\tsetErrors((prev) => {\n\t\t\tif (!prev[key]) return prev;\n\t\t\tconst next = { ...prev };\n\t\t\tdelete next[key];\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst handleSubmit = () => {\n\t\tif (locked) return;\n\t\tconst validation = validateForm(schema, values);\n\t\tif (Object.keys(validation).length > 0) {\n\t\t\tsetErrors(validation);\n\t\t\treturn;\n\t\t}\n\t\tvoid onSubmit(prompt.userActionId, buildContent(schema, values)).catch(() => {\n\t\t\t/* hook surfaces the error and re-opens the prompt */\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"payman-v2-ua\" role=\"group\" aria-label=\"Action required\">\n\t\t\t<div className=\"payman-v2-ua-head\">\n\t\t\t\t<Pencil className=\"payman-v2-ua-icon\" size={14} strokeWidth={1.75} aria-hidden />\n\t\t\t\t<span className=\"payman-v2-ua-title\">Action required</span>\n\t\t\t\t{typeof secondsLeft === \"number\" && !stale && (\n\t\t\t\t\t<span className=\"payman-v2-ua-timer\">{expired ? \"Expired\" : `${secondsLeft}s`}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{prompt.message?.trim() &&\n\t\t\t\t(renderMarkdown ? (\n\t\t\t\t\t<div className=\"payman-v2-ua-markdown\">\n\t\t\t\t\t\t<MarkdownRendererV2 content={prompt.message} />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<p className=\"payman-v2-ua-desc\">{prompt.message}</p>\n\t\t\t\t))}\n\n\t\t\t{stale ? (\n\t\t\t\t<p className=\"payman-v2-ua-stale\">This request is no longer available.</p>\n\t\t\t) : fields.length === 0 ? null : (\n\t\t\t\t<div className=\"payman-v2-ua-form\">\n\t\t\t\t\t{fields.map(([key, field]) => {\n\t\t\t\t\t\tconst widget = classifyField(field);\n\t\t\t\t\t\tconst label = field.title || key;\n\t\t\t\t\t\tconst required = isRequired(schema, key);\n\t\t\t\t\t\tconst err = errors[key];\n\t\t\t\t\t\tconst fieldId = `ua-${prompt.userActionId}-${key}`;\n\n\t\t\t\t\t\tif (widget === \"boolean\") {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<label key={key} className=\"payman-v2-ua-check\">\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\tchecked={Boolean(values[key])}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.checked)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t{required && <span className=\"payman-v2-ua-req\">*</span>}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={key} className=\"payman-v2-ua-row\">\n\t\t\t\t\t\t\t\t<label htmlFor={fieldId} className=\"payman-v2-ua-label\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t{required && <span className=\"payman-v2-ua-req\">*</span>}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t{field.description && (\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-ua-hint\">{field.description}</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{widget === \"select\" ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", err && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\t\t\tvalue={String(values[key] ?? \"\")}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.value)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled>\n\t\t\t\t\t\t\t\t\t\t\tSelect…\n\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t{getOptions(field).map((opt) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={opt.const} value={opt.const}>\n\t\t\t\t\t\t\t\t\t\t\t\t{opt.title || opt.const}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\t\t\ttype={widget === \"integer\" || widget === \"decimal\" ? \"number\" : \"text\"}\n\t\t\t\t\t\t\t\t\t\tinputMode={\n\t\t\t\t\t\t\t\t\t\t\twidget === \"integer\"\n\t\t\t\t\t\t\t\t\t\t\t\t? \"numeric\"\n\t\t\t\t\t\t\t\t\t\t\t\t: widget === \"decimal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"decimal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tstep={widget === \"decimal\" ? \"any\" : widget === \"integer\" ? \"1\" : undefined}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", err && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\t\t\tvalue={String(values[key] ?? \"\")}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tplaceholder={field.description ? undefined : label}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.value)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\thandleSubmit();\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/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{err && <span className=\"payman-v2-ua-error\">{err}</span>}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!stale && (\n\t\t\t\t<div className=\"payman-v2-ua-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-ua-btn payman-v2-ua-btn-primary\"\n\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t>\n\t\t\t\t\t\t{busy ? \"Submitting…\" : isUserConfirmation ? \"Confirm\" : \"Submit\"}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-ua-link payman-v2-ua-link-danger\"\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tonClick={() => void onCancel(prompt.userActionId)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Info, X } from \"lucide-react\";\nimport type { UserNotification } from \"@paymanai/payman-typescript-ask-sdk\";\n\nexport type NotificationInlineProps = {\n\tnotification: UserNotification;\n\tonDismiss?: (id: string) => void;\n};\n\n/** A display-only, inline notification line with an optional dismiss. */\nexport function NotificationInline({ notification, onDismiss }: NotificationInlineProps) {\n\treturn (\n\t\t<div className=\"payman-v2-ua-note\" role=\"status\">\n\t\t\t<Info className=\"payman-v2-ua-note-icon\" size={14} strokeWidth={1.75} aria-hidden />\n\t\t\t<span className=\"payman-v2-ua-note-text\">{notification.message}</span>\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"payman-v2-ua-note-dismiss\"\n\t\t\t\t\taria-label=\"Dismiss notification\"\n\t\t\t\t\tonClick={() => onDismiss(notification.id)}\n\t\t\t\t>\n\t\t\t\t\t<X size={13} strokeWidth={2} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport type { ActiveUserAction, UserNotification } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { VerificationInline } from \"./VerificationInline\";\nimport { SchemaFormInline } from \"./SchemaFormInline\";\nimport { NotificationInline } from \"./NotificationInline\";\n\nexport type UserActionInlineProps = {\n\tprompt: ActiveUserAction;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n\tonResend: (userActionId: string) => Promise<void>;\n\tonExpired?: () => void;\n};\n\n/**\n * Live countdown derived from `prompt.expirySeconds`. Returns `[secondsLeft,\n * expired]`; `secondsLeft` is `undefined` when no expiry was provided. The\n * countdown resets whenever the prompt id changes (a fresh prompt / resend).\n */\nfunction useExpiryCountdown(prompt: ActiveUserAction): [number | undefined, boolean] {\n\tconst initial =\n\t\ttypeof prompt.expirySeconds === \"number\" && prompt.expirySeconds > 0\n\t\t\t? Math.floor(prompt.expirySeconds)\n\t\t\t: undefined;\n\tconst [secondsLeft, setSecondsLeft] = useState<number | undefined>(initial);\n\n\tuseEffect(() => {\n\t\tif (initial === undefined) {\n\t\t\tsetSecondsLeft(undefined);\n\t\t\treturn;\n\t\t}\n\t\tsetSecondsLeft(initial);\n\t\tconst id = window.setInterval(() => {\n\t\t\tsetSecondsLeft((s) => {\n\t\t\t\tif (s === undefined) return s;\n\t\t\t\tif (s <= 1) {\n\t\t\t\t\twindow.clearInterval(id);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn s - 1;\n\t\t\t});\n\t\t}, 1000);\n\t\treturn () => window.clearInterval(id);\n\t\t// Restart the countdown on a new prompt id (resend / supersede).\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [prompt.userActionId, prompt.subAction, initial]);\n\n\tconst expired = initial !== undefined && secondsLeft === 0;\n\treturn [secondsLeft, expired];\n}\n\n/**\n * Dispatcher for a single active user-action prompt. Owns the shared\n * expiry countdown and routes to the verification or form renderer by\n * `prompt.kind`. (Notification-kind prompts are surfaced as\n * notifications upstream, but we handle the kind here defensively.)\n */\nexport function UserActionInline({\n\tprompt,\n\tonSubmit,\n\tonCancel,\n\tonResend,\n\tonExpired,\n}: UserActionInlineProps) {\n\tconst [secondsLeft, expired] = useExpiryCountdown(prompt);\n\n\tuseEffect(() => {\n\t\tif (expired && prompt.kind !== \"notification\") onExpired?.();\n\t}, [expired, onExpired, prompt.kind]);\n\n\tlet body: React.ReactNode;\n\tif (expired && prompt.kind !== \"notification\") {\n\t\tconst note: UserNotification = {\n\t\t\tid: `${prompt.userActionId}-expired`,\n\t\t\tmessage:\n\t\t\t\tprompt.kind === \"verification\" ? \"Verification Request Expired\" : \"User Form Expired\",\n\t\t};\n\t\tbody = <NotificationInline notification={note} />;\n\t} else if (prompt.kind === \"verification\") {\n\t\tbody = (\n\t\t\t<VerificationInline\n\t\t\t\tprompt={prompt}\n\t\t\t\tsecondsLeft={secondsLeft}\n\t\t\t\texpired={expired}\n\t\t\t\tonSubmit={onSubmit}\n\t\t\t\tonCancel={onCancel}\n\t\t\t\tonResend={onResend}\n\t\t\t/>\n\t\t);\n\t} else if (prompt.kind === \"notification\") {\n\t\tconst note: UserNotification = { id: prompt.userActionId, message: prompt.message ?? \"\" };\n\t\tbody = <NotificationInline notification={note} />;\n\t} else {\n\t\tbody = (\n\t\t\t<SchemaFormInline\n\t\t\t\tprompt={prompt}\n\t\t\t\tsecondsLeft={secondsLeft}\n\t\t\t\texpired={expired}\n\t\t\t\tonSubmit={onSubmit}\n\t\t\t\tonCancel={onCancel}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<motion.div\n\t\t\tclassName=\"payman-v2-ua-wrap\"\n\t\t\tinitial={{ opacity: 0, y: 8 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\ttransition={{ type: \"spring\", stiffness: 320, damping: 28 }}\n\t\t>\n\t\t\t{body}\n\t\t</motion.div>\n\t);\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { MessageListV2Props } from \"../../types\";\nimport { UserMessageV2 } from \"./UserMessageV2\";\nimport { AssistantMessageV2 } from \"./AssistantMessageV2\";\nimport { UserActionInline } from \"./UserActionInline\";\nimport { NotificationInline } from \"./NotificationInline\";\n\nexport type { MessageListV2Props } from \"../../types\";\n\nconst SCROLL_THRESHOLD = 100;\n\n// Minimum upward delta (px) in scrollTop we treat as a deliberate user\n// scroll-up. Anything smaller is ignored — browsers occasionally emit\n// 1–2px scroll jitters on content growth that we don't want to\n// misinterpret as \"user wants to read history.\"\nconst USER_SCROLL_UP_EPSILON = 4;\nconst PROMPT_KEY_SEPARATOR = \"\\u001f\";\n\nexport type MessageListV2Handle = {\n\tscrollToBottom: (behavior?: ScrollBehavior) => void;\n};\n\ntype UserActionPrompt = NonNullable<MessageListV2Props[\"userActionPrompts\"]>[number];\n\ntype ExpiredPromptViewState = Record<string, { baseline: string; hidden: boolean }>;\n\nfunction getPromptSlotKey(prompt: UserActionPrompt): string {\n\treturn prompt.toolCallId || prompt.userActionId;\n}\n\nfunction getPromptViewKey(prompt: UserActionPrompt): string {\n\treturn [\n\t\tgetPromptSlotKey(prompt),\n\t\tprompt.userActionId,\n\t\tprompt.subAction ?? \"\",\n\t\tprompt.expirySeconds ?? \"\",\n\t\tprompt.message ?? \"\",\n\t].join(PROMPT_KEY_SEPARATOR);\n}\n\nexport const MessageListV2 = forwardRef<MessageListV2Handle, MessageListV2Props>(\n\tfunction MessageListV2(\n\t\t{\n\t\t\tmessages,\n\t\t\tisStreaming = false,\n\t\t\tonEditUserMessage,\n\t\t\tonRetryUserMessage,\n\t\t\tonImageClick,\n\t\t\tonExecutionTraceClick,\n\t\t\tmessageActions,\n\t\t\tretryDisabled = false,\n\t\t\tuserActionPrompts,\n\t\t\tnotifications,\n\t\t\tonSubmitUserAction,\n\t\t\tonCancelUserAction,\n\t\t\tonResendUserAction,\n\t\t\tonDismissNotification,\n\t\t\tonSubmitFeedback,\n\t\t\ttypingSpeed = 4,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst noop = useCallback(async () => {}, []);\n\t\tconst scrollRef = useRef<HTMLDivElement>(null);\n\t\tconst scrollInnerRef = useRef<HTMLDivElement>(null);\n\t\tconst isNearBottomRef = useRef(true);\n\t\tconst [showScrollBtn, setShowScrollBtn] = useState(false);\n\t\tconst [expiredPromptViewState, setExpiredPromptViewState] =\n\t\t\tuseState<ExpiredPromptViewState>({});\n\t\tconst prevCountRef = useRef(messages.length);\n\t\tconst pauseStickUntilUserMessageRef = useRef(false);\n\t\tconst followingBottomRef = useRef(true);\n\t\t// Timestamp of the most recent programmatic scroll (pin-to-bottom).\n\t\t// `handleScroll` uses this to distinguish its own scrolls from\n\t\t// genuine user gestures. Using a time window rather than a\n\t\t// boolean-and-rAF avoids the race where the scroll event fires\n\t\t// after the rAF has already cleared the flag.\n\t\tconst lastPinAtRef = useRef(0);\n\t\t// Previous scrollTop value — used to detect REAL upward user\n\t\t// scrolls. Content growth at the bottom never decreases\n\t\t// scrollTop, so if scrollTop goes down, the user scrolled up.\n\t\tconst prevScrollTopRef = useRef(0);\n\n\t\tconst getDistanceFromBottom = useCallback(() => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return 0;\n\t\t\treturn el.scrollHeight - el.scrollTop - el.clientHeight;\n\t\t}, []);\n\n\t\tconst messageActivityFingerprint = useMemo(() => {\n\t\t\tconst last = messages[messages.length - 1];\n\t\t\tconst promptFingerprint = (userActionPrompts ?? [])\n\t\t\t\t.map((prompt) => `${getPromptViewKey(prompt)}:${prompt.status}`)\n\t\t\t\t.join(PROMPT_KEY_SEPARATOR);\n\t\t\tconst notificationFingerprint = (notifications ?? [])\n\t\t\t\t.map((notification) => notification.id)\n\t\t\t\t.join(PROMPT_KEY_SEPARATOR);\n\t\t\tif (!last) {\n\t\t\t\treturn [\n\t\t\t\t\t0,\n\t\t\t\t\tisStreaming ? \"streaming\" : \"idle\",\n\t\t\t\t\tpromptFingerprint,\n\t\t\t\t\tnotificationFingerprint,\n\t\t\t\t].join(PROMPT_KEY_SEPARATOR);\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tmessages.length,\n\t\t\t\tisStreaming ? \"streaming\" : \"idle\",\n\t\t\t\tlast.id,\n\t\t\t\tlast.role,\n\t\t\t\tlast.content ?? \"\",\n\t\t\t\tlast.isStreaming ? \"streaming\" : \"done\",\n\t\t\t\tlast.streamProgress ?? \"\",\n\t\t\t\tlast.steps?.length ?? 0,\n\t\t\t\tlast.errorDetails ?? \"\",\n\t\t\t\tpromptFingerprint,\n\t\t\t\tnotificationFingerprint,\n\t\t\t].join(PROMPT_KEY_SEPARATOR);\n\t\t}, [isStreaming, messages, notifications, userActionPrompts]);\n\n\t\tconst handleUserActionExpired = useCallback(\n\t\t\t(promptKey: string) => {\n\t\t\t\tsetExpiredPromptViewState((prev) => {\n\t\t\t\t\tif (prev[promptKey]) return prev;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t[promptKey]: { baseline: messageActivityFingerprint, hidden: false },\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t\t[messageActivityFingerprint],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tsetExpiredPromptViewState((prev) => {\n\t\t\t\tlet changed = false;\n\t\t\t\tconst next: ExpiredPromptViewState = {};\n\t\t\t\tfor (const [key, state] of Object.entries(prev)) {\n\t\t\t\t\tif (!state.hidden && state.baseline !== messageActivityFingerprint) {\n\t\t\t\t\t\tnext[key] = { ...state, hidden: true };\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext[key] = state;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn changed ? next : prev;\n\t\t\t});\n\t\t}, [messageActivityFingerprint]);\n\n\t\tuseEffect(() => {\n\t\t\tconst livePromptKeys = new Set((userActionPrompts ?? []).map(getPromptViewKey));\n\t\t\tsetExpiredPromptViewState((prev) => {\n\t\t\t\tlet changed = false;\n\t\t\t\tconst next: ExpiredPromptViewState = {};\n\t\t\t\tfor (const [key, state] of Object.entries(prev)) {\n\t\t\t\t\tif (livePromptKeys.has(key)) {\n\t\t\t\t\t\tnext[key] = state;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn changed ? next : prev;\n\t\t\t});\n\t\t}, [userActionPrompts]);\n\n\t\tconst visibleUserActionPrompts = useMemo(\n\t\t\t() =>\n\t\t\t\tuserActionPrompts?.filter((prompt) => {\n\t\t\t\t\tconst promptKey = getPromptViewKey(prompt);\n\t\t\t\t\treturn !expiredPromptViewState[promptKey]?.hidden;\n\t\t\t\t}),\n\t\t\t[expiredPromptViewState, userActionPrompts],\n\t\t);\n\n\t\tconst pinToBottom = useCallback((behavior: ScrollBehavior = \"instant\") => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return;\n\t\t\tlastPinAtRef.current = performance.now();\n\t\t\tel.scrollTo({ top: el.scrollHeight, behavior });\n\t\t\tprevScrollTopRef.current = el.scrollHeight;\n\t\t}, []);\n\n\t\tconst scrollToBottom = useCallback(\n\t\t\t(behavior: ScrollBehavior = \"smooth\") => {\n\t\t\t\tconst el = scrollRef.current;\n\t\t\t\tif (!el) return;\n\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\tpinToBottom(behavior);\n\t\t\t},\n\t\t\t[pinToBottom],\n\t\t);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tscrollToBottom: (behavior: ScrollBehavior = \"smooth\") => {\n\t\t\t\t\tisNearBottomRef.current = true;\n\t\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\t\tsetShowScrollBtn(false);\n\t\t\t\t\tscrollToBottom(behavior);\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[scrollToBottom],\n\t\t);\n\n\t\tconst handleScroll = useCallback(() => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst currentScrollTop = el.scrollTop;\n\t\t\tconst prevScrollTop = prevScrollTopRef.current;\n\t\t\tprevScrollTopRef.current = currentScrollTop;\n\n\t\t\tconst distance = getDistanceFromBottom();\n\t\t\tconst nearBottom = distance <= SCROLL_THRESHOLD;\n\t\t\tisNearBottomRef.current = nearBottom;\n\t\t\tsetShowScrollBtn(!nearBottom);\n\n\t\t\t// Ignore scroll events that our own pin-to-bottom call emitted.\n\t\t\t// 250ms covers smooth-scroll animations too; instant scrolls\n\t\t\t// dispatch the event nearly synchronously so this still works.\n\t\t\tconst sincePin = performance.now() - lastPinAtRef.current;\n\t\t\tif (sincePin < 250) return;\n\n\t\t\t// Only treat this as a user scroll-up if scrollTop actually\n\t\t\t// decreased (not just \"we're not at the bottom because content\n\t\t\t// grew underneath us\"). That used to flip followingBottom to\n\t\t\t// false during streaming and break autoscroll completely.\n\t\t\tconst scrolledUp = currentScrollTop < prevScrollTop - USER_SCROLL_UP_EPSILON;\n\t\t\tif (scrolledUp) {\n\t\t\t\tfollowingBottomRef.current = false;\n\t\t\t\tpauseStickUntilUserMessageRef.current = true;\n\t\t\t} else if (nearBottom) {\n\t\t\t\t// User scrolled back down to the bottom themselves —\n\t\t\t\t// resume following.\n\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t}\n\t\t}, [getDistanceFromBottom]);\n\n\t\tuseEffect(() => {\n\t\t\tconst prevCount = prevCountRef.current;\n\t\t\tprevCountRef.current = messages.length;\n\t\t\tif (messages.length > prevCount) {\n\t\t\t\tconst last = messages[messages.length - 1];\n\t\t\t\tif (last?.role === \"user\") {\n\t\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\t\trequestAnimationFrame(() => scrollToBottom());\n\t\t\t\t} else if (\n\t\t\t\t\t!pauseStickUntilUserMessageRef.current &&\n\t\t\t\t\tfollowingBottomRef.current\n\t\t\t\t) {\n\t\t\t\t\trequestAnimationFrame(() => scrollToBottom(\"instant\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}, [messages.length, scrollToBottom]);\n\n\t\t// Belt-and-suspenders: pin to bottom whenever the inner\n\t\t// container's layout *or* text content changes. ResizeObserver\n\t\t// alone is not enough — it only fires on size changes, but the\n\t\t// typing animation can update many characters without wrapping\n\t\t// a new line, and MutationObserver catches those text-node\n\t\t// mutations too. Both observers route through the same\n\t\t// `pinIfFollowing` so the behavior is unified.\n\t\tuseEffect(() => {\n\t\t\tconst inner = scrollInnerRef.current;\n\t\t\tif (!inner) return;\n\n\t\t\tconst pinIfFollowing = () => {\n\t\t\t\tif (pauseStickUntilUserMessageRef.current) return;\n\t\t\t\tif (!followingBottomRef.current) return;\n\t\t\t\tpinToBottom(\"instant\");\n\t\t\t};\n\n\t\t\tconst ro = new ResizeObserver(() => {\n\t\t\t\tpinIfFollowing();\n\t\t\t});\n\t\t\tro.observe(inner);\n\n\t\t\tconst mo = new MutationObserver(() => {\n\t\t\t\tpinIfFollowing();\n\t\t\t});\n\t\t\tmo.observe(inner, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: true,\n\t\t\t\tcharacterData: true,\n\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\tro.disconnect();\n\t\t\t\tmo.disconnect();\n\t\t\t};\n\t\t}, [pinToBottom]);\n\n\t\tuseEffect(() => {\n\t\t\tif (messages.length > 0) {\n\t\t\t\tsetTimeout(() => scrollToBottom(\"instant\"), 50);\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, []);\n\n\t\treturn (\n\t\t\t<div className=\"payman-v2-message-list\">\n\t\t\t\t<div\n\t\t\t\t\tref={scrollRef}\n\t\t\t\t\tonScroll={handleScroll}\n\t\t\t\t\tclassName=\"payman-v2-message-scroll payman-v2-scrollbar\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={scrollInnerRef}\n\t\t\t\t\t\tclassName=\"payman-v2-message-scroll-inner\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{messages.map((message) => (\n\t\t\t\t\t\t\t<div key={message.id}>\n\t\t\t\t\t\t\t\t{message.role === \"user\" ? (\n\t\t\t\t\t\t\t\t\t<UserMessageV2\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tonEdit={onEditUserMessage}\n\t\t\t\t\t\t\t\t\t\tonRetry={onRetryUserMessage}\n\t\t\t\t\t\t\t\t\t\tretryDisabled={retryDisabled}\n\t\t\t\t\t\t\t\t\t\tactions={messageActions?.userMessageActions}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<AssistantMessageV2\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\tonSubmitFeedback={onSubmitFeedback}\n\t\t\t\t\t\t\t\t\t\tactions={messageActions?.assistantMessageActions}\n\t\t\t\t\t\t\t\t\t\ttypingSpeed={typingSpeed}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{notifications?.map((note) => (\n\t\t\t\t\t\t\t<NotificationInline\n\t\t\t\t\t\t\t\tkey={note.id}\n\t\t\t\t\t\t\t\tnotification={note}\n\t\t\t\t\t\t\t\tonDismiss={onDismissNotification}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{visibleUserActionPrompts?.map((prompt) => {\n\t\t\t\t\t\t\tconst promptKey = getPromptViewKey(prompt);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<UserActionInline\n\t\t\t\t\t\t\t\t\tkey={promptKey}\n\t\t\t\t\t\t\t\t\tprompt={prompt}\n\t\t\t\t\t\t\t\t\tonSubmit={onSubmitUserAction ?? noop}\n\t\t\t\t\t\t\t\t\tonCancel={onCancelUserAction ?? noop}\n\t\t\t\t\t\t\t\t\tonResend={onResendUserAction ?? noop}\n\t\t\t\t\t\t\t\t\tonExpired={() => handleUserActionExpired(promptKey)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{showScrollBtn && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\tclassName=\"payman-v2-scroll-to-bottom\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tscrollToBottom();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-scroll-to-bottom-btn\"\n\t\t\t\t\t\t\t\taria-label=\"Scroll to bottom\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowDown style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tArrowUp,\n\tMic,\n\tPlus,\n\tImagePlus,\n\tPaperclip,\n\tPencil,\n\tRotateCcw,\n\tTelescope,\n\tX,\n\tZap,\n} from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { getSlashCommandValidationHint } from \"../../utils/slashCommands\";\nimport type { SlashCommandConfig } from \"../../types\";\n\nexport type ChatInputV2Props = {\n\tonSend: (message: string) => void;\n\tonCancel?: () => void;\n\tdisabled?: boolean;\n\tisStreaming?: boolean;\n\tplaceholder?: string;\n\tenableVoice?: boolean;\n\tvoiceAvailable?: boolean;\n\tisRecording?: boolean;\n\tonVoicePress?: () => void;\n\tonCancelRecording?: () => void;\n\tonConfirmRecording?: () => void;\n\ttranscribedText?: string;\n\tshowResetSession?: boolean;\n\tonResetSession?: () => void;\n\tshowAttachmentButton?: boolean;\n\tshowUploadImageButton?: boolean;\n\tshowAttachFileButton?: boolean;\n\tonUploadImageClick?: () => void;\n\tonAttachFileClick?: () => void;\n\teditingMessageId?: string | null;\n\tonClearEditing?: () => void;\n\t/**\n\t * Latency-vs-precision toggle the user controls inline on the\n\t * input bar. \"fast\" (the widget's default) — server samples and\n\t * answers quickly. \"deep\" — server runs a full analytical pass.\n\t * When both [analysisMode] and [onAnalysisModeChange] are\n\t * provided, the toggle renders alongside the other left-hand\n\t * input controls. Omit either to hide the toggle entirely\n\t * (e.g. widgets whose host app already controls the mode, or\n\t * single-mode deployments).\n\t */\n\tanalysisMode?: \"fast\" | \"deep\";\n\tonAnalysisModeChange?: (next: \"fast\" | \"deep\") => void;\n\tslashCommands?: SlashCommandConfig[];\n};\n\nexport type ChatInputV2Handle = {\n\tsetDraft: (message: string) => void;\n};\n\nexport const ChatInputV2 = forwardRef<ChatInputV2Handle, ChatInputV2Props>(\n\tfunction ChatInputV2(\n\t\t{\n\t\t\tonSend,\n\t\t\tdisabled = false,\n\t\t\tisStreaming = false,\n\t\t\tplaceholder = \"Reply...\",\n\t\t\tenableVoice = false,\n\t\t\tvoiceAvailable = false,\n\t\t\tisRecording = false,\n\t\t\tonVoicePress,\n\t\t\ttranscribedText = \"\",\n\t\t\tshowResetSession = false,\n\t\t\tonResetSession,\n\t\t\tshowAttachmentButton = true,\n\t\t\tshowUploadImageButton = true,\n\t\t\tshowAttachFileButton = true,\n\t\t\tonUploadImageClick,\n\t\t\tonAttachFileClick,\n\t\t\teditingMessageId = null,\n\t\t\tonClearEditing,\n\t\t\tanalysisMode,\n\t\t\tonAnalysisModeChange,\n\t\t\tslashCommands = [],\n\t\t}: ChatInputV2Props,\n\t\tref,\n\t) {\n\t\tconst [value, setValue] = useState(\"\");\n\t\tconst [isFocused, setIsFocused] = useState(false);\n\t\tconst [showActions, setShowActions] = useState(false);\n\t\tconst [showVoiceTooltip, setShowVoiceTooltip] = useState(false);\n\t\tconst [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\t\tconst [inlineHint, setInlineHint] = useState<string | null>(null);\n\t\tconst [commandMenuDismissed, setCommandMenuDismissed] = useState(false);\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst actionsRef = useRef<HTMLDivElement>(null);\n\t\tconst preRecordTextRef = useRef(\"\");\n\t\tconst voiceTooltipTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst voiceDraftSyncActiveRef = useRef(false);\n\n\t\tconst isInputLocked = disabled || isRecording;\n\t\tconst hasAttachmentOptions = showUploadImageButton || showAttachFileButton;\n\t\tconst showAttachmentMenuButton = showAttachmentButton && hasAttachmentOptions;\n\t\tconst showVoiceButton = enableVoice && onVoicePress != null;\n\t\tconst isVoiceButtonDisabled = disabled || !voiceAvailable;\n\t\tconst commandQuery =\n\t\t\tvalue.startsWith(\"/\") && !value.includes(\"\\n\") && !/\\s/.test(value)\n\t\t\t\t? value.toLowerCase()\n\t\t\t\t: null;\n\t\tconst commandSuggestions =\n\t\t\tcommandQuery == null\n\t\t\t\t? []\n\t\t\t\t: slashCommands.filter((command) =>\n\t\t\t\t\t\tcommand.name.toLowerCase().startsWith(commandQuery),\n\t\t\t\t\t);\n\t\tconst showCommandSuggestions =\n\t\t\t!commandMenuDismissed &&\n\t\t\t!isRecording &&\n\t\t\t!disabled &&\n\t\t\tcommandSuggestions.length > 0;\n\n\t\tuseEffect(() => {\n\t\t\tif (textareaRef.current) {\n\t\t\t\ttextareaRef.current.style.height = \"auto\";\n\t\t\t\tconst scrollHeight = textareaRef.current.scrollHeight;\n\t\t\t\ttextareaRef.current.style.height = `${Math.min(scrollHeight, 200)}px`;\n\t\t\t}\n\t\t}, [value]);\n\n\t\tuseEffect(() => {\n\t\t\tif (disabled) {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\tsetShowActions(false);\n\t\t\t\ttextareaRef.current?.blur();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst frameId = requestAnimationFrame(() => textareaRef.current?.focus());\n\t\t\treturn () => cancelAnimationFrame(frameId);\n\t\t}, [disabled]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tsetDraft: (message: string) => {\n\t\t\t\t\tsetShowActions(false);\n\t\t\t\t\tsetValue(message);\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\t\t\tif (!textarea || disabled) return;\n\t\t\t\t\t\ttextarea.focus();\n\t\t\t\t\t\tconst end = message.length;\n\t\t\t\t\t\ttextarea.setSelectionRange(end, end);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[disabled],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (!showActions) return;\n\t\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tactionsRef.current &&\n\t\t\t\t\t!actionsRef.current.contains(e.target as Node)\n\t\t\t\t) {\n\t\t\t\t\tsetShowActions(false);\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\t\treturn () => document.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t}, [showActions]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!showAttachmentMenuButton) {\n\t\t\t\tsetShowActions(false);\n\t\t\t}\n\t\t}, [showAttachmentMenuButton]);\n\n\t\tuseEffect(() => {\n\t\t\tsetSelectedCommandIndex(0);\n\t\t\tsetCommandMenuDismissed(false);\n\t\t}, [commandQuery]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (!voiceDraftSyncActiveRef.current) return;\n\t\t\tconst base = preRecordTextRef.current;\n\t\t\tconst separator = base && !base.endsWith(\" \") && transcribedText ? \" \" : \"\";\n\t\t\tsetValue(`${base}${separator}${transcribedText}`);\n\t\t}, [isRecording, transcribedText]);\n\n\t\tconst handleSend = useCallback(() => {\n\t\t\tif (!value.trim() || disabled) return;\n\t\t\tconst commandHint = getSlashCommandValidationHint(value);\n\t\t\tif (commandHint) {\n\t\t\t\tsetInlineHint(commandHint);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoiceDraftSyncActiveRef.current = false;\n\t\t\tpreRecordTextRef.current = \"\";\n\t\t\tsetInlineHint(null);\n\t\t\tonClearEditing?.();\n\t\t\tonSend(value.trim());\n\t\t\tsetValue(\"\");\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (textareaRef.current) {\n\t\t\t\t\ttextareaRef.current.style.height = \"auto\";\n\t\t\t\t\ttextareaRef.current.focus();\n\t\t\t\t}\n\t\t\t});\n\t\t}, [value, disabled, onClearEditing, onSend]);\n\n\t\tconst selectCommand = useCallback(\n\t\t\t(command: SlashCommandConfig) => {\n\t\t\t\tconst insertText = command.insertText ?? `${command.name} `;\n\t\t\t\tsetValue(insertText);\n\t\t\t\tsetInlineHint(null);\n\t\t\t\tsetShowActions(false);\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\t\tif (!textarea) return;\n\t\t\t\t\ttextarea.focus();\n\t\t\t\t\ttextarea.setSelectionRange(insertText.length, insertText.length);\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\t\tif (showCommandSuggestions) {\n\t\t\t\tif (e.key === \"ArrowDown\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex((current) =>\n\t\t\t\t\t\tMath.min(current + 1, commandSuggestions.length - 1),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"ArrowUp\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex((current) => Math.max(current - 1, 0));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"Enter\" || e.key === \"Tab\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst command = commandSuggestions[selectedCommandIndex];\n\t\t\t\t\tif (command) selectCommand(command);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex(0);\n\t\t\t\t\tsetCommandMenuDismissed(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e.key === \"Enter\" && !e.shiftKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (isStreaming) return;\n\t\t\t\thandleSend();\n\t\t\t}\n\t\t};\n\n\t\tconst handleUploadImageClick = () => {\n\t\t\tonUploadImageClick?.();\n\t\t\tsetShowActions(false);\n\t\t};\n\n\t\tconst handleAttachFileClick = () => {\n\t\t\tonAttachFileClick?.();\n\t\t\tsetShowActions(false);\n\t\t};\n\n\t\tconst hideVoiceTooltip = useCallback(() => {\n\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t\tvoiceTooltipTimerRef.current = null;\n\t\t\t}\n\t\t\tsetShowVoiceTooltip(false);\n\t\t}, []);\n\n\t\tconst startVoiceTooltipTimer = useCallback(() => {\n\t\t\tif (isVoiceButtonDisabled || isRecording) return;\n\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t}\n\t\t\tvoiceTooltipTimerRef.current = setTimeout(() => {\n\t\t\t\tsetShowVoiceTooltip(true);\n\t\t\t\tvoiceTooltipTimerRef.current = null;\n\t\t\t}, 2000);\n\t\t}, [isRecording, isVoiceButtonDisabled]);\n\n\t\tconst handleVoiceToggle = () => {\n\t\t\thideVoiceTooltip();\n\t\t\tsetShowActions(false);\n\t\t\tif (!onVoicePress || isVoiceButtonDisabled) return;\n\t\t\tif (!isRecording) {\n\t\t\t\tpreRecordTextRef.current = value;\n\t\t\t\tvoiceDraftSyncActiveRef.current = true;\n\t\t\t}\n\t\t\tonVoicePress();\n\t\t};\n\n\t\tconst canSend = value.trim().length > 0 && !disabled;\n\t\tconst sendDisabled = !canSend || isStreaming;\n\n\t\treturn (\n\t\t\t<div className=\"payman-v2-input-container\">\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{showCommandSuggestions && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6, scale: 0.98 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: 6, scale: 0.98 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\tclassName=\"payman-v2-command-menu\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{commandSuggestions.map((command, index) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={command.name}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\tselectCommand(command);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-command-option\",\n\t\t\t\t\t\t\t\t\t\tindex === selectedCommandIndex &&\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-command-option-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-command-name\">\n\t\t\t\t\t\t\t\t\t\t{command.name}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-command-description\">\n\t\t\t\t\t\t\t\t\t\t{command.description}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"payman-v2-input-wrapper\",\n\t\t\t\t\t\t(isFocused || isRecording) && \"payman-v2-input-wrapper-focused\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-v2-input-body\">\n\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t{editingMessageId && (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -4 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -4 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.14, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-editing-banner\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-editing-banner-info\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-editing-icon-wrap\">\n\t\t\t\t\t\t\t\t\t\t\t<Pencil style={{ width: 12, height: 12 }} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-input-editing-label\">\n\t\t\t\t\t\t\t\t\t\t\tEditing message\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{onClearEditing && (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={onClearEditing}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-editing-close\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Stop editing message\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<X style={{ width: 14, height: 14 }} />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tref={textareaRef}\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\tif (isRecording) return;\n\t\t\t\t\t\t\t\tconst nextValue = e.target.value;\n\t\t\t\t\t\t\t\tvoiceDraftSyncActiveRef.current = false;\n\t\t\t\t\t\t\t\tsetInlineHint(null);\n\t\t\t\t\t\t\t\tsetCommandMenuDismissed(false);\n\t\t\t\t\t\t\t\tsetValue(nextValue);\n\t\t\t\t\t\t\t\tif (editingMessageId && nextValue.length === 0) {\n\t\t\t\t\t\t\t\t\tonClearEditing?.();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\tif (!disabled) setIsFocused(true);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\tif (disabled) e.preventDefault();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-disabled={disabled}\n\t\t\t\t\t\t\treadOnly={isInputLocked}\n\t\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening…\" : placeholder}\n\t\t\t\t\t\t\tclassName=\"payman-v2-input-textarea\"\n\t\t\t\t\t\t\tdata-disabled={disabled ? \"true\" : \"false\"}\n\t\t\t\t\t\t\trows={1}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"payman-v2-input-controls\">\n\t\t\t\t\t\t<div className=\"payman-v2-input-controls-left\">\n\t\t\t\t\t\t\t{showResetSession && onResetSession && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={onResetSession}\n\t\t\t\t\t\t\t\t\tdisabled={isStreaming || isRecording}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-new-session-btn\"\n\t\t\t\t\t\t\t\t\taria-label=\"New Session\"\n\t\t\t\t\t\t\t\t\ttitle=\"New Session\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<RotateCcw\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-new-session-tooltip\">\n\t\t\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{analysisMode && onAnalysisModeChange && (\n\t\t\t\t\t\t\t\t// Fast/Deep toggle — a single-click button that\n\t\t\t\t\t\t\t\t// flips between modes. \"Fast\" is cheap and quick\n\t\t\t\t\t\t\t\t// (sampled data, sub-30s answers); \"Deep\" opts\n\t\t\t\t\t\t\t\t// the user into the full analytical pass. Shown\n\t\t\t\t\t\t\t\t// as a compact pill so operators can flip it\n\t\t\t\t\t\t\t\t// per-message without leaving the input area.\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange(\n\t\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\" ? \"fast\" : \"deep\",\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdisabled={isStreaming || isRecording}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-new-session-btn\",\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mode-toggle\",\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\" &&\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mode-toggle-deep\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\"\n\t\t\t\t\t\t\t\t\t\t\t? \"Deep analysis (click to switch to Fast)\"\n\t\t\t\t\t\t\t\t\t\t\t: \"Fast analysis (click to switch to Deep)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\"\n\t\t\t\t\t\t\t\t\t\t\t? \"Deep — full analytical pass\"\n\t\t\t\t\t\t\t\t\t\t\t: \"Fast — sampled, quick answer\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdata-mode={analysisMode}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{analysisMode === \"deep\" ? (\n\t\t\t\t\t\t\t\t\t\t<Telescope\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Zap\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-new-session-tooltip\">\n\t\t\t\t\t\t\t\t\t\t{analysisMode === \"deep\" ? \"Deep\" : \"Fast\"}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showAttachmentMenuButton && (\n\t\t\t\t\t\t\t\t<div style={{ position: \"relative\" }} ref={actionsRef}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setShowActions((current) => !current)}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled || isRecording}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-attach-btn\",\n\t\t\t\t\t\t\t\t\t\t\tshowActions && \"payman-v2-input-attach-btn-active\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-label=\"Attach\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Plus\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 20, height: 20, strokeWidth: 2 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t\t\t\t{showActions && (\n\t\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 4, scale: 0.95 }}\n\t\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: 4, scale: 0.95 }}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-menu\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{showUploadImageButton && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ImagePlus\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tUpload image\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showAttachFileButton && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Paperclip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAttach file\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showVoiceButton && (\n\t\t\t\t\t\t\t\t<div style={{ position: \"relative\" }}>\n\t\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t\t{showVoiceTooltip && (\n\t\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 4, scale: 0.98 }}\n\t\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: 4, scale: 0.98 }}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.14, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-voice-tooltip\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-voice-tooltip-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tChat with your voice\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-voice-tooltip-arrow\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleVoiceToggle}\n\t\t\t\t\t\t\t\t\t\tonMouseEnter={startVoiceTooltipTimer}\n\t\t\t\t\t\t\t\t\t\tonMouseLeave={hideVoiceTooltip}\n\t\t\t\t\t\t\t\t\t\tonFocus={startVoiceTooltipTimer}\n\t\t\t\t\t\t\t\t\t\tonBlur={hideVoiceTooltip}\n\t\t\t\t\t\t\t\t\t\tdisabled={isVoiceButtonDisabled}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mic-btn\",\n\t\t\t\t\t\t\t\t\t\t\tisRecording && \"payman-v2-input-mic-recording\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-label={isRecording ? \"Stop recording\" : \"Voice input\"}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Mic style={{ width: 18, height: 18 }} />\n\t\t\t\t\t\t\t\t\t\t{isRecording && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-mic-indicator\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"payman-v2-input-controls-right\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleSend}\n\t\t\t\t\t\t\t\tdisabled={sendDisabled}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"payman-v2-input-send-btn\",\n\t\t\t\t\t\t\t\t\tsendDisabled && \"payman-v2-input-send-btn-disabled\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-label=\"Send message\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowUp\n\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.5 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-send-icon\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{inlineHint && (\n\t\t\t\t\t<p className=\"payman-v2-input-inline-hint\">{inlineHint}</p>\n\t\t\t\t)}\n\n\t\t\t\t<p className=\"payman-v2-input-disclaimer\">\n\t\t\t\t\tAI can make mistakes. Please double-check responses.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { DotLottieReact } from \"@lottiefiles/dotlottie-react\";\nimport { useEffect, useRef, useState } from \"react\";\n// Bundled default loader. tsup's `dataurl` loader (see tsup.config.ts)\n// inlines the .lottie bundle as a base64 data URI at build time so\n// DotLottieReact can load it with zero network round-trip and no\n// dependency on any external CDN being reachable at runtime.\nimport thinkingAtomSrc from \"../../assets/thinking-atom.lottie\";\n\n/**\n * Bottom-of-chat streaming indicator — a small animated glyph shown\n * directly above the chat input while the agent is working, with a\n * live-ticking elapsed-seconds label next to it. Inspired by\n * Claude's spinning-asterisk indicator: the label-and-status lives\n * inside the assistant message bubble, but this tiny bottom indicator\n * signals \"something is happening, the client hasn't hung\" in a spot\n * the user's eye lands on between glances at the answer.\n *\n * The whole block mounts only while streaming is in flight — once\n * the run ends, it fades out entirely. An earlier iteration tried\n * to keep the Lottie on screen in a paused state via the\n * dotLottieRefCallback + .pause() API, but pause() didn't reliably\n * freeze the animation in practice. Unmounting is simpler and\n * predictable: the user sees motion only when there's actually\n * motion to indicate.\n */\n\nexport type StreamingIndicatorV2Props = {\n\t/**\n\t * Whether to show the indicator. Parent (`PaymanChat`) flips this\n\t * with `isWaitingForResponse`. When this flips false the whole\n\t * block unmounts — DotLottieReact with it — so no extra wiring is\n\t * needed to stop the Lottie animation on run end.\n\t */\n\tisStreaming: boolean;\n\t/**\n\t * Optional consumer-supplied Lottie override. Accepts any\n\t * `.lottie` or Lottie `.json` URL — see `ChatConfig.loadingAnimation`.\n\t * When unset the bundled default (`thinking-atom.lottie`) is used.\n\t */\n\tloadingAnimation?: {\n\t\tsrc: string;\n\t\tsize?: number;\n\t};\n};\n\nconst DEFAULT_SIZE = 36;\n\n/**\n * Tiny hook that returns the number of whole seconds since the\n * indicator's most recent `isStreaming=true` transition. Updates\n * every 100ms while running so the label feels live. Resets to 0\n * when streaming ends (the block unmounts anyway, so the stale\n * value never renders).\n *\n * Why 100ms, not 1000ms: at 1Hz the counter \"jumps\" — the user sees\n * a visible pause at each integer. At 10Hz the counter feels\n * smooth, and we still only update the DOM text when the rounded\n * value changes (React reconciles to a no-op).\n */\nfunction useElapsedSeconds(isStreaming: boolean): number {\n\tconst [elapsed, setElapsed] = useState(0);\n\tconst startRef = useRef<number | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!isStreaming) {\n\t\t\tstartRef.current = null;\n\t\t\tsetElapsed(0);\n\t\t\treturn;\n\t\t}\n\t\tstartRef.current = performance.now();\n\t\tsetElapsed(0);\n\t\tconst id = setInterval(() => {\n\t\t\tif (startRef.current == null) return;\n\t\t\tconst secs = Math.floor((performance.now() - startRef.current) / 1000);\n\t\t\tsetElapsed(secs);\n\t\t}, 100);\n\t\treturn () => clearInterval(id);\n\t}, [isStreaming]);\n\n\treturn elapsed;\n}\n\nexport function StreamingIndicatorV2({\n\tisStreaming,\n\tloadingAnimation,\n}: StreamingIndicatorV2Props) {\n\tconst size = loadingAnimation?.size ?? DEFAULT_SIZE;\n\tconst elapsed = useElapsedSeconds(isStreaming);\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{isStreaming && (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey=\"streaming-indicator\"\n\t\t\t\t\tclassName=\"payman-v2-streaming-indicator\"\n\t\t\t\t\tinitial={{ opacity: 0, y: 4 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={{ opacity: 0, y: 4 }}\n\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"payman-v2-streaming-indicator-glyph\"\n\t\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/*\n\t\t\t\t\t\t One render path for both cases: DotLottieReact's\n\t\t\t\t\t\t `src` prop accepts both a regular URL (consumer\n\t\t\t\t\t\t override) and a base64 data URI (bundled default).\n\t\t\t\t\t\t The bundled asset is inlined by esbuild's dataurl\n\t\t\t\t\t\t loader — no network round-trip for the default\n\t\t\t\t\t\t case.\n\t\t\t\t\t\t*/}\n\t\t\t\t\t\t<DotLottieReact\n\t\t\t\t\t\t\tsrc={loadingAnimation?.src ?? thinkingAtomSrc}\n\t\t\t\t\t\t\tloop\n\t\t\t\t\t\t\tautoplay\n\t\t\t\t\t\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t{/*\n\t\t\t\t\t Live-ticking elapsed time next to the glyph. Hidden\n\t\t\t\t\t for the first tick so sub-second responses don't\n\t\t\t\t\t flash \"0s\" before the whole block exits.\n\t\t\t\t\t*/}\n\t\t\t\t\t{elapsed > 0 && (\n\t\t\t\t\t\t<span className=\"payman-v2-streaming-indicator-elapsed\">\n\t\t\t\t\t\t\t{elapsed}s\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Download, Loader2, X } from \"lucide-react\";\n\nexport type ImageLightboxV2Props = {\n\tsrc: string | null;\n\talt: string;\n\tonClose: () => void;\n};\n\nexport function ImageLightboxV2({ src, alt, onClose }: ImageLightboxV2Props) {\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst [isImageLoaded, setIsImageLoaded] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t\treturn () => setIsMounted(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetIsImageLoaded(false);\n\t}, [src]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t},\n\t\t[onClose]\n\t);\n\n\tuseEffect(() => {\n\t\tif (!src || typeof document === \"undefined\") return;\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [src, handleKeyDown]);\n\n\tconst handleDownload = () => {\n\t\tif (!src || typeof document === \"undefined\") return;\n\t\tconst a = document.createElement(\"a\");\n\t\ta.href = src;\n\t\ta.download = alt.trim() ? alt : \"image\";\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\ta.remove();\n\t};\n\n\tif (!isMounted || typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t{src ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={src}\n\t\t\t\t\tclassName=\"payman-v2-lightbox\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-v2-lightbox-controls\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-btn\"\n\t\t\t\t\t\t\taria-label=\"Download\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\thandleDownload();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Download size={20} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-btn\"\n\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X size={20} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"payman-v2-lightbox-content\"\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-label={alt || \"Image preview\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!isImageLoaded ? (\n\t\t\t\t\t\t\t<div className=\"payman-v2-lightbox-loading\">\n\t\t\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\t\t\tsize={24}\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tcolor: \"rgba(255, 255, 255, 0.8)\",\n\t\t\t\t\t\t\t\t\t\tanimation: \"payman-v2-spin 0.6s linear infinite\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"payman-v2-lightbox-loading-text\">\n\t\t\t\t\t\t\t\t\tLoading image\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t<div className=\"payman-v2-lightbox-img-wrapper\">\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ scale: 0.92, opacity: 0 }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tscale: isImageLoaded ? 1 : 0.92,\n\t\t\t\t\t\t\t\t\topacity: isImageLoaded ? 1 : 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\texit={{ scale: 0.92, opacity: 0 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-img\"\n\t\t\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\tonLoad={() => setIsImageLoaded(true)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>,\n\t\tdocument.body\n\t);\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { X } from \"lucide-react\";\n\n/**\n * Diagnostic-mode latency timeline. Renders one horizontal bar per\n * pipeline step in proportion to its wall-clock duration so it's\n * obvious at a glance which phase ate the turn's budget.\n *\n * Bars are styled inline (no Tailwind, no chart lib) so the modal\n * looks the same regardless of how the consuming app has its CSS\n * configured.\n */\n\ntype PipelineStep = {\n\tstep: string;\n\tstatus: string;\n\tstartTime: number;\n\tendTime?: number | null;\n\tdurationMs?: number | null;\n\terror?: string | null;\n\tllmCall?: {\n\t\tmodel?: string;\n\t\tdurationMs?: number | null;\n\t\tinputTokens?: number | null;\n\t\toutputTokens?: number | null;\n\t} | null;\n};\n\ntype ExecutionTrace = {\n\texecutionId: string;\n\tpipelineSteps: PipelineStep[];\n\trunMetadata?: {\n\t\tstartTime?: number | null;\n\t\tendTime?: number | null;\n\t\ttotalTimeMs?: number | null;\n\t} | null;\n\tstatus?: string;\n};\n\nexport type TraceTimelineModalProps = {\n\topen: boolean;\n\tonClose: () => void;\n\texecutionId: string | null;\n\tapiBaseUrl: string;\n\tapiHeaders?: Record<string, string>;\n};\n\n// Categories: phases that happen before sanitizer = pre-pipeline (orange),\n// pipeline stages = blue, anything else = grey.\nconst PRE_PIPELINE_STEPS = new Set([\n\t\"record_execution\",\n\t\"resolve_provider\",\n\t\"resolve_mcp_servers\",\n\t\"build_pipeline\",\n\t\"load_skill_index\",\n]);\n\nfunction stepColor(step: PipelineStep): string {\n\tif (step.status === \"failed\") return \"#ef4444\";\n\tif (PRE_PIPELINE_STEPS.has(step.step)) return \"#f59e0b\";\n\treturn \"#3b82f6\";\n}\n\nfunction formatMs(ms: number | null | undefined): string {\n\tif (ms == null) return \"—\";\n\tif (ms < 1000) return `${ms} ms`;\n\treturn `${(ms / 1000).toFixed(2)} s`;\n}\n\nexport function TraceTimelineModal({\n\topen,\n\tonClose,\n\texecutionId,\n\tapiBaseUrl,\n\tapiHeaders,\n}: TraceTimelineModalProps) {\n\tconst [trace, setTrace] = useState<ExecutionTrace | null>(null);\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!open || !executionId) return;\n\t\tconst ctrl = new AbortController();\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\tsetTrace(null);\n\t\tconst base = apiBaseUrl.replace(/\\/+$/, \"\");\n\t\tfetch(`${base}/api/ask/executions/${encodeURIComponent(executionId)}/trace`, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: { Accept: \"application/json\", ...apiHeaders },\n\t\t\tsignal: ctrl.signal,\n\t\t})\n\t\t\t.then(async (resp) => {\n\t\t\t\tif (!resp.ok) {\n\t\t\t\t\tthrow new Error(`Trace fetch failed: ${resp.status} ${resp.statusText}`);\n\t\t\t\t}\n\t\t\t\treturn resp.json() as Promise<ExecutionTrace>;\n\t\t\t})\n\t\t\t.then((data) => setTrace(data))\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tif ((e as { name?: string }).name === \"AbortError\") return;\n\t\t\t\tsetError(e instanceof Error ? e.message : \"Trace fetch failed\");\n\t\t\t})\n\t\t\t.finally(() => setLoading(false));\n\t\treturn () => ctrl.abort();\n\t}, [open, executionId, apiBaseUrl, apiHeaders]);\n\n\tconst totalMs = useMemo<number>(() => {\n\t\tif (!trace) return 0;\n\t\tconst meta = trace.runMetadata?.totalTimeMs;\n\t\tif (typeof meta === \"number\" && meta > 0) return meta;\n\t\t// Fall back to span of step timestamps if runMetadata is absent.\n\t\tconst starts = trace.pipelineSteps.map((s) => s.startTime);\n\t\tconst ends = trace.pipelineSteps\n\t\t\t.map((s) => s.endTime ?? s.startTime)\n\t\t\t.filter((t): t is number => typeof t === \"number\");\n\t\tif (starts.length === 0 || ends.length === 0) return 0;\n\t\treturn Math.max(...ends) - Math.min(...starts);\n\t}, [trace]);\n\n\tconst accountedMs = useMemo<number>(\n\t\t() =>\n\t\t\t(trace?.pipelineSteps ?? []).reduce(\n\t\t\t\t(sum, s) => sum + (s.durationMs ?? 0),\n\t\t\t\t0,\n\t\t\t),\n\t\t[trace],\n\t);\n\n\tconst unaccountedMs = Math.max(totalMs - accountedMs, 0);\n\n\tif (typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.15 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\tbackground: \"rgba(0,0,0,0.45)\",\n\t\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tpadding: 24,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ y: 12, opacity: 0 }}\n\t\t\t\t\t\tanimate={{ y: 0, opacity: 1 }}\n\t\t\t\t\t\texit={{ y: 12, opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: \"#0b1220\",\n\t\t\t\t\t\t\tcolor: \"#e5e7eb\",\n\t\t\t\t\t\t\tborderRadius: 12,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\tmaxWidth: 760,\n\t\t\t\t\t\t\tmaxHeight: \"85vh\",\n\t\t\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\t\t\tboxShadow: \"0 20px 60px rgba(0,0,0,0.45)\",\n\t\t\t\t\t\t\tfontFamily:\n\t\t\t\t\t\t\t\t\"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<header\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\t\tpadding: \"14px 18px\",\n\t\t\t\t\t\t\t\tborderBottom: \"1px solid rgba(255,255,255,0.08)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div style={{ fontSize: 14, fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t\tExecution trace\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\t\topacity: 0.6,\n\t\t\t\t\t\t\t\t\t\tmarginTop: 2,\n\t\t\t\t\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{executionId ?? \"\"}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\tcolor: \"#e5e7eb\",\n\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\tpadding: 6,\n\t\t\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X style={{ width: 18, height: 18 }} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</header>\n\n\t\t\t\t\t\t<div style={{ padding: 18 }}>\n\t\t\t\t\t\t\t{loading && (\n\t\t\t\t\t\t\t\t<div style={{ opacity: 0.7, fontSize: 13 }}>\n\t\t\t\t\t\t\t\t\tLoading trace…\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{error && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tcolor: \"#fca5a5\",\n\t\t\t\t\t\t\t\t\t\tfontSize: 13,\n\t\t\t\t\t\t\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{trace && !loading && !error && (\n\t\t\t\t\t\t\t\t<TimelineBars\n\t\t\t\t\t\t\t\t\ttrace={trace}\n\t\t\t\t\t\t\t\t\ttotalMs={totalMs}\n\t\t\t\t\t\t\t\t\tunaccountedMs={unaccountedMs}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>,\n\t\tdocument.body,\n\t);\n}\n\nfunction TimelineBars({\n\ttrace,\n\ttotalMs,\n\tunaccountedMs,\n}: {\n\ttrace: ExecutionTrace;\n\ttotalMs: number;\n\tunaccountedMs: number;\n}) {\n\tconst bars = trace.pipelineSteps.map((step) => {\n\t\tconst duration = step.durationMs ?? 0;\n\t\tconst widthPct = totalMs > 0 ? (duration / totalMs) * 100 : 0;\n\t\tconst llmMs = step.llmCall?.durationMs ?? null;\n\t\treturn (\n\t\t\t<div key={`${step.step}-${step.startTime}`} style={{ marginBottom: 8 }}>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{step.step}\n\t\t\t\t\t\t{step.status === \"failed\" && (\n\t\t\t\t\t\t\t<span style={{ color: \"#fca5a5\", marginLeft: 6 }}>\n\t\t\t\t\t\t\t\t(failed)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span style={{ opacity: 0.75 }}>\n\t\t\t\t\t\t{formatMs(duration)}\n\t\t\t\t\t\t{llmMs != null && (\n\t\t\t\t\t\t\t<span style={{ marginLeft: 8, opacity: 0.6 }}>\n\t\t\t\t\t\t\t\t(LLM {formatMs(llmMs)})\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\tbackground: \"rgba(255,255,255,0.06)\",\n\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\twidth: `${Math.max(widthPct, 0.3)}%`,\n\t\t\t\t\t\t\tbackground: stepColor(step),\n\t\t\t\t\t\t\ttransition: \"width 0.2s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t{bars}\n\t\t\t{unaccountedMs > 0 && (\n\t\t\t\t<div style={{ marginBottom: 8 }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t\t\topacity: 0.7,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>(unaccounted)</span>\n\t\t\t\t\t\t<span>{formatMs(unaccountedMs)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\tbackground: \"rgba(255,255,255,0.06)\",\n\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\twidth: `${(unaccountedMs / Math.max(totalMs, 1)) * 100}%`,\n\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\"repeating-linear-gradient(45deg, rgba(255,255,255,0.18) 0 4px, transparent 4px 8px)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tmarginTop: 14,\n\t\t\t\t\tpaddingTop: 12,\n\t\t\t\t\tborderTop: \"1px solid rgba(255,255,255,0.08)\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\topacity: 0.85,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span>\n\t\t\t\t\t{trace.pipelineSteps.length} step\n\t\t\t\t\t{trace.pipelineSteps.length === 1 ? \"\" : \"s\"}\n\t\t\t\t</span>\n\t\t\t\t<span style={{ fontFamily: \"ui-monospace, SFMono-Regular, monospace\" }}>\n\t\t\t\t\ttotal: {formatMs(totalMs)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useChatV2, useVoice } from \"@paymanai/payman-typescript-ask-sdk\";\nimport type { UseChatV2Return } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from \"react\";\nimport { PaymanChatContext } from \"../../contexts\";\nimport type {\n\tChatCallbacks,\n\tChatConfig,\n\tMessageActionsConfig,\n\tMessageDisplay,\n\tPaymanChatProps,\n\tPaymanChatRef,\n\tUserActionState,\n} from \"../../types\";\nimport { cn } from \"../../utils\";\nimport {\n\tisFriendlyWorkflowError,\n\tgetConflictErrorMessage,\n} from \"../../utils/errorMessages\";\nimport {\n\tDEFAULT_SLASH_COMMANDS,\n\tfilterSlashCommands,\n} from \"../../utils/slashCommands\";\nimport { initSentryIfNeeded } from \"../../utils/sentry\";\nimport { submitFeedback } from \"../../utils/feedbackClient\";\nimport type { SubmitFeedbackHandler } from \"../../utils/feedbackClient\";\nimport {\n\tcaptureSentryError,\n\tsubscribeToCfRay,\n\ttype ChatSessionContext,\n} from \"../../utils/sentryContext\";\nimport { MessageList } from \"../MessageList\";\nimport { ResetSessionConfirmModal } from \"../ResetSessionConfirmModal\";\nimport { MessageListV2 } from \"../v2/MessageListV2\";\nimport type { MessageListV2Handle } from \"../v2/MessageListV2\";\nimport { ChatInputV2 } from \"../v2/ChatInputV2\";\nimport type { ChatInputV2Handle } from \"../v2/ChatInputV2\";\nimport { StreamingIndicatorV2 } from \"../v2/StreamingIndicatorV2\";\nimport { ImageLightboxV2 } from \"../v2/ImageLightboxV2\";\nimport { TraceTimelineModal } from \"../v2/TraceTimelineModal\";\n\nconst DEFAULT_USER_ACTION_STATE: UserActionState = {\n\tprompts: [],\n\tnotifications: [],\n};\n\nconst NOOP_ASYNC = async () => {};\nconst NOOP = () => {};\n\nfunction useSentryChatCallbacks(\n\tcallbacks: ChatCallbacks | undefined,\n\tconfig: ChatConfig,\n): ChatCallbacks {\n\tconst sentryCtxRef = useRef<ChatSessionContext>({});\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst initialSessionId = config.initialSessionId;\n\tconst apiHeaders = config.api.headers;\n\n\tuseEffect(() => {\n\t\tsentryCtxRef.current.agentId = config.agentId;\n\t\tsentryCtxRef.current.sessionOwnerId = config.sessionParams?.id;\n\t\tif (initialSessionId) {\n\t\t\tsentryCtxRef.current.sessionId = initialSessionId;\n\t\t}\n\t\tif (apiHeaders) {\n\t\t\tsentryCtxRef.current.customerId =\n\t\t\t\tapiHeaders[\"x-paygent-wf-mcp-customer-id\"] ?? sentryCtxRef.current.customerId;\n\t\t\tsentryCtxRef.current.customerEmail =\n\t\t\t\tapiHeaders[\"x-paygent-wf-mcp-customer-email\"] ?? sentryCtxRef.current.customerEmail;\n\t\t}\n\t}, [\n\t\tconfig.agentId,\n\t\tconfig.sessionParams?.id,\n\t\tinitialSessionId,\n\t\tapiHeaders,\n\t]);\n\n\tuseEffect(() => {\n\t\tconst endpoint = config.api.streamEndpoint || \"/api/playground/ask/stream\";\n\t\treturn subscribeToCfRay(endpoint, (cfRay) => {\n\t\t\tsentryCtxRef.current.cfRay = cfRay;\n\t\t});\n\t}, [config.api.streamEndpoint]);\n\n\treturn useMemo<ChatCallbacks>(\n\t\t() => ({\n\t\t\tonMessageSent: (msg) => callbacksRef.current?.onMessageSent?.(msg),\n\t\t\tonStreamStart: () => callbacksRef.current?.onStreamStart?.(),\n\t\t\tonStreamComplete: (message: MessageDisplay) => {\n\t\t\t\tif (message.executionId) {\n\t\t\t\t\tsentryCtxRef.current.executionId = message.executionId;\n\t\t\t\t}\n\t\t\t\tif (message.sessionId) {\n\t\t\t\t\tsentryCtxRef.current.sessionId = message.sessionId;\n\t\t\t\t}\n\n\t\t\t\tconst content = message.content ?? \"\";\n\t\t\t\tconst looksLikeRawErr =\n\t\t\t\t\tcontent.length >= 10 &&\n\t\t\t\t\t(content.includes(\"errorType=\") || /failed:\\s*\\{/.test(content));\n\t\t\t\tconst completedEmpty =\n\t\t\t\t\t!message.isStreaming &&\n\t\t\t\t\t!message.isCancelled &&\n\t\t\t\t\tcontent.length === 0 &&\n\t\t\t\t\t(message.streamProgress === \"completed\" || message.streamProgress === \"error\");\n\t\t\t\tconst hasConflict = !!getConflictErrorMessage(message.errorDetails);\n\t\t\t\tconst hasFriendlyErr = isFriendlyWorkflowError(message.errorDetails);\n\n\t\t\t\tconst shouldCapture =\n\t\t\t\t\tmessage.isError ||\n\t\t\t\t\thasConflict ||\n\t\t\t\t\thasFriendlyErr ||\n\t\t\t\t\tlooksLikeRawErr ||\n\t\t\t\t\tcompletedEmpty;\n\n\t\t\t\tif (shouldCapture) {\n\t\t\t\t\tsentryCtxRef.current.route =\n\t\t\t\t\t\ttypeof window !== \"undefined\"\n\t\t\t\t\t\t\t? window.location.pathname\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tcaptureSentryError(\n\t\t\t\t\t\t`Workflow error: ${message.errorDetails || content || \"Unknown error\"}`,\n\t\t\t\t\t\t{ ...sentryCtxRef.current },\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcallbacksRef.current?.onStreamComplete?.(message);\n\t\t\t},\n\t\t\tonError: (error: Error) => {\n\t\t\t\tsentryCtxRef.current.route =\n\t\t\t\t\ttypeof window !== \"undefined\" ? window.location.pathname : undefined;\n\t\t\t\tcaptureSentryError(error, { ...sentryCtxRef.current });\n\t\t\t\tcallbacksRef.current?.onError?.(error);\n\t\t\t},\n\t\t\tonSessionIdChange: (sessionId: string) => {\n\t\t\t\tsentryCtxRef.current.sessionId = sessionId;\n\t\t\t\tcallbacksRef.current?.onSessionIdChange?.(sessionId);\n\t\t\t},\n\t\t\tonExecutionTraceClick: (data) =>\n\t\t\t\tcallbacksRef.current?.onExecutionTraceClick?.(data),\n\t\t\tonResetSession: () => callbacksRef.current?.onResetSession?.(),\n\t\tonUploadImageClick: () => callbacksRef.current?.onUploadImageClick?.(),\n\t\tonAttachFileClick: () => callbacksRef.current?.onAttachFileClick?.(),\n\t\tonMessageFeedback: (data: { messageId: string; feedback: \"up\" | \"down\" }) =>\n\t\t\tcallbacksRef.current?.onMessageFeedback?.(data),\n\t\t\tonUserActionRequired: (req) =>\n\t\t\t\tcallbacksRef.current?.onUserActionRequired?.(req),\n\t\t\tonUserNotification: (note) =>\n\t\t\t\tcallbacksRef.current?.onUserNotification?.(note),\n\t\t\tonStatusMessage: (msg) =>\n\t\t\t\tcallbacksRef.current?.onStatusMessage?.(msg),\n\t\t\tonStepsUpdate: (steps) =>\n\t\t\t\tcallbacksRef.current?.onStepsUpdate?.(steps),\n\t\t}),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n}\n\ntype PaymanChatInnerProps = PaymanChatProps & { chat: UseChatV2Return };\n\nconst PaymanChatInner = forwardRef<PaymanChatRef, PaymanChatInnerProps>(function PaymanChatInner({\n\tconfig,\n\tcallbacks = {},\n\tclassName,\n\tstyle,\n\tchildren,\n\tonLoadMoreMessages,\n\tisLoadingMoreMessages = false,\n\thasMoreMessages = false,\n\tchat,\n}, ref) {\n\tconst [inputValue, setInputValue] = useState(\"\");\n\tconst prevInputValueRef = useRef(inputValue);\n\tconst [hasEverSentMessage, setHasEverSentMessage] = useState(false);\n\tconst [lightboxSrc, setLightboxSrc] = useState<string | null>(null);\n\tconst [lightboxAlt, setLightboxAlt] = useState(\"\");\n\tconst [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n\tconst [isResetSessionConfirmOpen, setIsResetSessionConfirmOpen] =\n\t\tuseState(false);\n\t// Latency/precision toggle the user flips on the input bar.\n\t// Fast = sampled, quick answer; Deep = full analytical pass.\n\t// Default \"fast\" — the server also defaults to fast when the\n\t// field is omitted, so leaving this unset on old SDK versions\n\t// yields the same behavior. Hosts can hide the toggle with\n\t// `enableDeepModeToggle={false}`; sends then stay pinned to fast.\n\tconst [analysisMode, setAnalysisMode] = useState<\"fast\" | \"deep\">(\"fast\");\n\tconst chatInputV2Ref = useRef<ChatInputV2Handle>(null);\n\tconst messageListV2Ref = useRef<MessageListV2Handle>(null);\n\tconst resetToEmptyStateRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (config.sentryDsn) {\n\t\t\tinitSentryIfNeeded(config.sentryDsn);\n\t\t}\n\t}, [config.sentryDsn]);\n\n\tconst {\n\t\tmessages,\n\t\tsendMessage,\n\t\tisWaitingForResponse,\n\t\tresetSession,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t} = chat;\n\n\t// Track when messages first appear (for animation)\n\tuseEffect(() => {\n\t\tif (resetToEmptyStateRef.current) {\n\t\t\tif (messages.length === 0) {\n\t\t\t\tsetHasEverSentMessage(false);\n\t\t\t\tresetToEmptyStateRef.current = false;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (messages.length > 0 && !hasEverSentMessage) {\n\t\t\tsetHasEverSentMessage(true);\n\t\t}\n\t}, [messages.length, hasEverSentMessage]);\n\n\tuseEffect(() => {\n\t\tif (!editingMessageId) return;\n\t\tconst editingMessageStillExists = messages.some(\n\t\t\t(message) => message.id === editingMessageId && message.role === \"user\"\n\t\t);\n\t\tif (!editingMessageStillExists) {\n\t\t\tsetEditingMessageId(null);\n\t\t}\n\t}, [editingMessageId, messages]);\n\n\t// Keep user-action features backward-safe if the hook returns an\n\t// older shape without the collection-based API.\n\tconst userActionState = chat.userActionState ?? DEFAULT_USER_ACTION_STATE;\n\tconst submitUserAction = chat.submitUserAction ?? NOOP_ASYNC;\n\tconst cancelUserAction = chat.cancelUserAction ?? NOOP_ASYNC;\n\tconst resendUserAction = chat.resendUserAction ?? NOOP_ASYNC;\n\tconst dismissNotification = chat.dismissNotification ?? NOOP;\n\tconst isUserActionSupported =\n\t\ttypeof chat.submitUserAction === \"function\" &&\n\t\ttypeof chat.cancelUserAction === \"function\" &&\n\t\ttypeof chat.resendUserAction === \"function\";\n\n\t// Voice support\n\tconst {\n\t\ttranscribedText,\n\t\tisAvailable: voiceAvailable,\n\t\tisRecording,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\tclearTranscript,\n\t} = useVoice(\n\t\t{\n\t\t\tlang: config.voiceLang || \"en-US\",\n\t\t\tinterimResults: config.voiceInterimResults !== false,\n\t\t\tcontinuous: config.voiceContinuous !== false,\n\t\t},\n\t\t{\n\t\t\tonResult: () => {\n\t\t\t\t// V2 input element handles voice transcription internally\n\t\t\t\t// via the recording modal; the host component no longer\n\t\t\t\t// needs to sync the textarea value. (Previously guarded\n\t\t\t\t// by `if (!isV2)` — v1 is gone.)\n\t\t\t},\n\t\t\tonEnd: () => {},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error(\"Voice error:\", error);\n\t\t\t},\n\t\t}\n\t);\n\n\t// Create context value with control methods\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tresetSession,\n\t\t\tclearMessages,\n\t\t\tprependMessages,\n\t\t\tcancelStream,\n\t\t\tgetSessionId,\n\t\t\tgetMessages,\n\t\t\tisWaitingForResponse,\n\t\t}),\n\t\t[\n\t\t\tresetSession,\n\t\t\tclearMessages,\n\t\t\tprependMessages,\n\t\t\tcancelStream,\n\t\t\tgetSessionId,\n\t\t\tgetMessages,\n\t\t\tisWaitingForResponse,\n\t\t]\n\t);\n\n\t// Extract callbacks\n\tconst {\n\t\tonExecutionTraceClick: rawOnExecutionTraceClick,\n\t\tonResetSession,\n\t\tonUploadImageClick,\n\t\tonAttachFileClick,\n\t\tonMessageFeedback,\n\t} = callbacks;\n\n\t// Debug-mode trace viewer state. Holds the executionId currently\n\t// being inspected; null while the modal is closed.\n\tconst [debugTraceExecutionId, setDebugTraceExecutionId] = useState<\n\t\tstring | null\n\t>(null);\n\n\t// Persist thumbs-up/down to /api/ask/executions/{id}/feedback using the\n\t// same api key the chat already authenticates with. Resolves on a durable\n\t// save (so the message UI keeps its active state) and rejects on failure\n\t// (so it reverts / the reason modal shows an error). The consumer's\n\t// onMessageFeedback callback fires only after a successful save.\n\tconst handleSubmitFeedback = useCallback<SubmitFeedbackHandler>(\n\t\tasync ({ messageId, executionId, feedback, details }) => {\n\t\t\tif (!executionId) {\n\t\t\t\tthrow new Error(\"Cannot submit feedback before the response completes\");\n\t\t\t}\n\t\t\tawait submitFeedback({\n\t\t\t\tbaseUrl: config.api.baseUrl,\n\t\t\t\tstreamEndpoint: config.api.streamEndpoint,\n\t\t\t\theaders: config.api.headers,\n\t\t\t\tauthToken: config.api.authToken,\n\t\t\t\tstage: config.stage,\n\t\t\t\tstageQueryParam: config.stageQueryParam,\n\t\t\t\texecutionId,\n\t\t\t\tfeedback,\n\t\t\t\tdetails,\n\t\t\t});\n\t\t\tonMessageFeedback?.({\n\t\t\t\tmessageId,\n\t\t\t\tfeedback: feedback === \"POSITIVE\" ? \"up\" : \"down\",\n\t\t\t});\n\t\t},\n\t\t[\n\t\t\tconfig.api.baseUrl,\n\t\t\tconfig.api.streamEndpoint,\n\t\t\tconfig.api.headers,\n\t\t\tconfig.api.authToken,\n\t\t\tconfig.stage,\n\t\t\tconfig.stageQueryParam,\n\t\t\tonMessageFeedback,\n\t\t],\n\t);\n\n\t// In debug mode we intercept the trace click to open the built-in\n\t// latency timeline. Any consumer-provided handler still fires so\n\t// existing telemetry / overrides aren't silently disabled.\n\tconst onExecutionTraceClick = useMemo(() => {\n\t\tif (!config.debug) return rawOnExecutionTraceClick;\n\t\treturn (data: {\n\t\t\tmessage: MessageDisplay;\n\t\t\ttracingData?: unknown;\n\t\t\texecutionId?: string;\n\t\t}) => {\n\t\t\trawOnExecutionTraceClick?.(data);\n\t\t\tif (data.executionId) setDebugTraceExecutionId(data.executionId);\n\t\t};\n\t}, [config.debug, rawOnExecutionTraceClick]);\n\n\tconst performResetSession = useCallback(() => {\n\t\tresetToEmptyStateRef.current = true;\n\t\tsetEditingMessageId(null);\n\t\tsetIsResetSessionConfirmOpen(false);\n\t\tsetInputValue(\"\");\n\t\tsetLightboxSrc(null);\n\t\tsetLightboxAlt(\"\");\n\t\tchatInputV2Ref.current?.setDraft(\"\");\n\t\tclearTranscript();\n\t\tif (isRecording) {\n\t\t\tstopRecording();\n\t\t}\n\t\tresetSession();\n\t\tonResetSession?.();\n\t}, [\n\t\tclearTranscript,\n\t\tisRecording,\n\t\tonResetSession,\n\t\tresetSession,\n\t\tstopRecording,\n\t]);\n\n\tconst requestResetSession = useCallback(() => {\n\t\tsetIsResetSessionConfirmOpen(true);\n\t}, []);\n\n\tconst closeResetSessionConfirm = useCallback(() => {\n\t\tsetIsResetSessionConfirmOpen(false);\n\t}, []);\n\n\t// Expose control methods via ref\n\tuseImperativeHandle(ref, () => ({\n\t\tresetSession: performResetSession,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t}), [performResetSession, clearMessages, cancelStream, getSessionId, getMessages]);\n\n\t// Extract config with hardcoded UI defaults\n\tconst {\n\t\tplaceholder = \"Type your message...\",\n\t\temptyStateText = \"What can I help with?\",\n\t\tsessionParams,\n\t\tdisableInput = false,\n\t\thasAskPermission = true,\n\t\tstreamingStepsText,\n\t\tcompletedStepsText,\n\t\tshowAvatars = false,\n\t\tshowUserAvatar,\n\t\tshowAssistantAvatar,\n\t\tshowAgentName = true,\n\t\tagentName = \"Assistant\",\n\t\tshowExecutionSteps = true,\n\t\tshowStreamingDot = true,\n\t\tlayout = \"full-width\",\n\t\tshowTimestamps = false,\n\t\tanimated = true,\n\t\tisChatDisabled = false,\n\t\tdisabledComponent,\n\t\tshowEmptyStateIcon = true,\n\t\temptyStateComponent,\n\t\tshowResetSession = false,\n\t\tenableDeepModeToggle = true,\n\t\tshowAttachmentButton = true,\n\t\tshowUploadImageButton = true,\n\t\tshowAttachFileButton = true,\n\t\tmessageActions: messageActionsConfig,\n\t\tenableSlashCommands = true,\n\t\tslashCommands: slashCommandsConfig,\n\t\tcommandPermissions,\n\t} = config;\n\n\tconst messageActions = useMemo<Required<MessageActionsConfig>>(\n\t\t() => ({\n\t\t\tuserMessageActions: {\n\t\t\t\tcopy: messageActionsConfig?.userMessageActions?.copy ?? true,\n\t\t\t\tedit: messageActionsConfig?.userMessageActions?.edit ?? false,\n\t\t\t\tretry: messageActionsConfig?.userMessageActions?.retry ?? false,\n\t\t\t},\n\t\tassistantMessageActions: {\n\t\t\tcopy: messageActionsConfig?.assistantMessageActions?.copy ?? true,\n\t\t\ttrace: messageActionsConfig?.assistantMessageActions?.trace ?? true,\n\t\t\tthumbsUp: messageActionsConfig?.assistantMessageActions?.thumbsUp ?? true,\n\t\t\tthumbsDown: messageActionsConfig?.assistantMessageActions?.thumbsDown ?? true,\n\t\t},\n\t\t}),\n\t\t[messageActionsConfig]\n\t);\n\tconst slashCommands = useMemo(\n\t\t() =>\n\t\t\tenableSlashCommands\n\t\t\t\t? filterSlashCommands(\n\t\t\t\t\t\tslashCommandsConfig ?? DEFAULT_SLASH_COMMANDS,\n\t\t\t\t\t\tcommandPermissions,\n\t\t\t\t\t)\n\t\t\t\t: [],\n\t\t[commandPermissions, enableSlashCommands, slashCommandsConfig],\n\t);\n\n\t// Check if session params are configured\n\tconst isSessionParamsConfigured = useMemo(() => {\n\t\tif (!sessionParams) return false;\n\t\treturn !!(sessionParams.id?.trim() && sessionParams.name?.trim());\n\t}, [sessionParams?.id, sessionParams?.name]);\n\n\t// Reset voice recognition only when user clears the input (not on initial empty state)\n\tuseEffect(() => {\n\t\tconst wasEmpty = prevInputValueRef.current.trim() === \"\";\n\t\tconst isEmpty = inputValue.trim() === \"\";\n\t\tprevInputValueRef.current = inputValue;\n\t\tif (!wasEmpty && isEmpty) {\n\t\t\tclearTranscript();\n\t\t\tif (isRecording) {\n\t\t\t\tstopRecording();\n\t\t\t}\n\t\t}\n\t}, [inputValue, clearTranscript, isRecording, stopRecording]);\n\n\tconst handleCancelRecording = () => {\n\t\tstopRecording();\n\t\tclearTranscript();\n\t\tsetInputValue(\"\");\n\t};\n\n\tconst handleConfirmRecording = () => {\n\t\tstopRecording();\n\t\t// Keep the transcribed text in the input for user to review/send\n\t};\n\n\tconst isV2InputDisabled = !isSessionParamsConfigured || disableInput;\n\tconst effectiveAnalysisMode = enableDeepModeToggle ? analysisMode : \"fast\";\n\n\tconst isEmpty = messages.length === 0;\n\n\t// If chat is disabled, show custom component or default disabled UI\n\tif (isChatDisabled) {\n\t\tif (disabledComponent) {\n\t\t\treturn (\n\t\t\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"bg-background overflow-hidden flex flex-col flex-[4]\",\n\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t{disabledComponent}\n\t\t\t\t\t</div>\n\t\t\t\t</PaymanChatContext.Provider>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-background overflow-hidden flex flex-col flex-[4]\",\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={style}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"flex-1 flex items-center justify-center p-4\">\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\tChat is currently disabled\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</PaymanChatContext.Provider>\n\t\t);\n\t}\n\n\t// --- V2 helpers ---\n\tconst handleImageClick = (src: string, alt: string) => {\n\t\tsetLightboxSrc(src);\n\t\tsetLightboxAlt(alt);\n\t};\n\n\tconst userActionPrompts = isUserActionSupported ? userActionState.prompts : undefined;\n\tconst notifications = userActionState.notifications;\n\n\tconst handleV2Send = (text: string) => {\n\t\tif (isRecording) stopRecording();\n\t\tif (text.trim() && !disableInput && isSessionParamsConfigured) {\n\t\t\tsetEditingMessageId(null);\n\t\t\t// Pass the current analysis mode so the server picks the\n\t\t\t// right latency/precision mode for THIS message. The\n\t\t\t// toggle is per-send, not per-session, so users can mix\n\t\t\t// quick lookups and deep dives in the same conversation.\n\t\t\t// When the toggle is hidden, mode is still explicit fast.\n\t\t\tvoid sendMessage(text.trim(), { analysisMode: effectiveAnalysisMode });\n\t\t}\n\t};\n\n\tconst handleVoicePress = useCallback(async () => {\n\t\tif (!voiceAvailable) return;\n\t\tif (isRecording) {\n\t\t\tstopRecording();\n\t\t\treturn;\n\t\t}\n\t\tclearTranscript();\n\t\tawait startRecording();\n\t}, [clearTranscript, isRecording, startRecording, stopRecording, voiceAvailable]);\n\n\tconst handleEditMessageDraft = useCallback((messageId: string) => {\n\t\tconst targetMessage = messages.find((message) => message.id === messageId);\n\t\tif (!targetMessage?.content.trim()) return;\n\t\tsetEditingMessageId(messageId);\n\t\tchatInputV2Ref.current?.setDraft(targetMessage.content);\n\t\trequestAnimationFrame(() => {\n\t\t\tmessageListV2Ref.current?.scrollToBottom(\"smooth\");\n\t\t});\n\t}, [messages]);\n\n\tconst handleRetryUserMessage = useCallback((messageId: string) => {\n\t\tif (isWaitingForResponse) return;\n\t\tconst targetMessage = messages.find(\n\t\t\t(message) => message.id === messageId && message.role === \"user\"\n\t\t);\n\t\tif (!targetMessage?.content.trim()) return;\n\t\t// Retry inherits the current mode — if the user flipped to\n\t\t// Deep after seeing an unsatisfying Fast answer, retrying\n\t\t// sends in Deep. Matches how users intuitively expect\n\t\t// \"retry with more depth\" to behave.\n\t\tvoid sendMessage(targetMessage.content.trim(), {\n\t\t\tanalysisMode: effectiveAnalysisMode,\n\t\t});\n\t\tconst bump = () => messageListV2Ref.current?.scrollToBottom(\"instant\");\n\t\trequestAnimationFrame(() => {\n\t\t\tbump();\n\t\t\tqueueMicrotask(() => {\n\t\t\t\twindow.setTimeout(bump, 120);\n\t\t\t});\n\t\t});\n\t}, [isWaitingForResponse, messages, sendMessage, effectiveAnalysisMode]);\n\n\tconst handleClearEditing = useCallback(() => {\n\t\tsetEditingMessageId(null);\n\t}, []);\n\n\treturn (\n\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\"payman-v2-root\", className)}\n\t\t\t\tstyle={style}\n\t\t\t>\n\t\t\t\t{children}\n\n\t\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t\t\t{isEmpty && !hasEverSentMessage ? (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tkey=\"v2-empty\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-chat-layout\"\n\t\t\t\t\t\t\t\t\tstyle={{ justifyContent: \"center\", alignItems: \"center\" }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", flex: 1, width: \"100%\" }}>\n\t\t\t\t\t\t\t\t\t\t<MessageList\n\t\t\t\t\t\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\t\t\t\t\t\tisLoading={false}\n\t\t\t\t\t\t\t\t\t\t\temptyStateText={emptyStateText}\n\t\t\t\t\t\t\t\t\t\t\tshowEmptyStateIcon={showEmptyStateIcon}\n\t\t\t\t\t\t\t\t\t\t\temptyStateComponent={emptyStateComponent}\n\t\t\t\t\t\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\t\t\t\t\t\tshowTimestamps={showTimestamps}\n\t\t\t\t\t\t\t\t\t\t\tstage={config.stage || \"DEVELOPMENT\"}\n\t\t\t\t\t\t\t\t\t\t\tanimated={animated}\n\t\t\t\t\t\t\t\t\t\t\tshowAgentName={showAgentName}\n\t\t\t\t\t\t\t\t\t\t\tagentName={agentName}\n\t\t\t\t\t\t\t\t\t\t\tshowAvatars={showAvatars}\n\t\t\t\t\t\t\t\t\t\t\tshowUserAvatar={showUserAvatar}\n\t\t\t\t\t\t\t\t\t\t\tshowAssistantAvatar={showAssistantAvatar}\n\t\t\t\t\t\t\t\t\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\t\t\t\t\t\t\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\t\t\t\t\t\t\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\t\t\t\t\t\t\t\t\tcompletedStepsText={completedStepsText}\n\t\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\t\tonLoadMoreMessages={onLoadMoreMessages}\n\t\t\t\t\t\t\t\t\t\t\tisLoadingMoreMessages={isLoadingMoreMessages}\n\t\t\t\t\t\t\t\t\t\t\thasMoreMessages={hasMoreMessages}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 12 }}\n\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\t\t\t\ttransition={{ delay: 0.2, duration: 0.4, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: \"100%\" }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{hasAskPermission && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ChatInputV2\n\t\t\t\t\t\t\t\t\t\t\t\t\tref={chatInputV2Ref}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSend={handleV2Send}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCancel={cancelStream}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isV2InputDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening...\" : placeholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\tenableVoice={config.enableVoice === true}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttranscribedText={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true ? transcribedText : \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoiceAvailable={config.enableVoice === true && voiceAvailable}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisRecording={isRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonVoicePress={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? handleVoicePress\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCancelRecording={handleCancelRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonConfirmRecording={handleConfirmRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowResetSession={showResetSession}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonResetSession={requestResetSession}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowAttachmentButton={showAttachmentButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowUploadImageButton={showUploadImageButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowAttachFileButton={showAttachFileButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonUploadImageClick={onUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAttachFileClick={onAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\teditingMessageId={editingMessageId}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClearEditing={handleClearEditing}\n\t\t\t\t\t\t\t\t\t\t\t\t\tanalysisMode={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? analysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? setAnalysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tslashCommands={slashCommands}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tkey=\"v2-chat\"\n\t\t\t\t\t\t\t\t\tinitial={hasEverSentMessage ? { opacity: 0 } : false}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-chat-layout\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<MessageListV2\n\t\t\t\t\t\t\t\t\t\tref={messageListV2Ref}\n\t\t\t\t\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\tonEditUserMessage={handleEditMessageDraft}\n\t\t\t\t\t\t\t\t\t\tonRetryUserMessage={handleRetryUserMessage}\n\t\t\t\t\t\t\t\t\t\tonImageClick={handleImageClick}\n\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\tmessageActions={messageActions}\n\t\t\t\t\t\t\t\t\t\tretryDisabled={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\ttypingSpeed={config.typingSpeed ?? 4}\n\t\t\t\t\t\t\t\t\t\tuserActionPrompts={userActionPrompts}\n\t\t\t\t\t\t\t\t\t\tnotifications={notifications}\n\t\t\t\t\t\t\t\t\t\tonSubmitUserAction={isUserActionSupported ? submitUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonCancelUserAction={isUserActionSupported ? cancelUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonResendUserAction={isUserActionSupported ? resendUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonDismissNotification={dismissNotification}\n\t\t\t\t\t\t\t\t\t\tonSubmitFeedback={handleSubmitFeedback}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<StreamingIndicatorV2\n\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\tloadingAnimation={config.loadingAnimation}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{hasAskPermission && (\n\t\t\t\t\t\t\t\t\t\t<ChatInputV2\n\t\t\t\t\t\t\t\t\t\t\tref={chatInputV2Ref}\n\t\t\t\t\t\t\t\t\t\t\tonSend={handleV2Send}\n\t\t\t\t\t\t\t\t\t\t\tonCancel={cancelStream}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={isV2InputDisabled}\n\t\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening...\" : placeholder}\n\t\t\t\t\t\t\t\t\t\t\tenableVoice={config.enableVoice === true}\n\t\t\t\t\t\t\t\t\t\t\ttranscribedText={\n\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true ? transcribedText : \"\"\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvoiceAvailable={config.enableVoice === true && voiceAvailable}\n\t\t\t\t\t\t\t\t\t\t\tisRecording={isRecording}\n\t\t\t\t\t\t\t\t\t\t\tonVoicePress={\n\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t? handleVoicePress\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonCancelRecording={handleCancelRecording}\n\t\t\t\t\t\t\t\t\t\t\tonConfirmRecording={handleConfirmRecording}\n\t\t\t\t\t\t\t\t\t\t\tshowResetSession={showResetSession}\n\t\t\t\t\t\t\t\t\t\t\tonResetSession={requestResetSession}\n\t\t\t\t\t\t\t\t\t\t\tshowAttachmentButton={showAttachmentButton}\n\t\t\t\t\t\t\t\t\t\t\tshowUploadImageButton={showUploadImageButton}\n\t\t\t\t\t\t\t\t\t\t\tshowAttachFileButton={showAttachFileButton}\n\t\t\t\t\t\t\t\t\t\t\tonUploadImageClick={onUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\tonAttachFileClick={onAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\teditingMessageId={editingMessageId}\n\t\t\t\t\t\t\t\t\t\t\tonClearEditing={handleClearEditing}\n\t\t\t\t\t\t\t\t\t\t\tanalysisMode={\n\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? analysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange={\n\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? setAnalysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tslashCommands={slashCommands}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t<ImageLightboxV2\n\t\t\t\t\t\tsrc={lightboxSrc}\n\t\t\t\t\t\talt={lightboxAlt}\n\t\t\t\t\t\tonClose={() => setLightboxSrc(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ResetSessionConfirmModal\n\t\t\t\t\t\tisOpen={isResetSessionConfirmOpen}\n\t\t\t\t\t\tonClose={closeResetSessionConfirm}\n\t\t\t\t\t\tonConfirm={performResetSession}\n\t\t\t\t\t/>\n\t\t\t\t\t{config.debug && (\n\t\t\t\t\t\t<TraceTimelineModal\n\t\t\t\t\t\t\topen={debugTraceExecutionId !== null}\n\t\t\t\t\t\t\tonClose={() => setDebugTraceExecutionId(null)}\n\t\t\t\t\t\t\texecutionId={debugTraceExecutionId}\n\t\t\t\t\t\t\tapiBaseUrl={config.api.baseUrl}\n\t\t\t\t\t\t\tapiHeaders={config.api.headers}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</PaymanChatContext.Provider>\n\t\t);\n});\n\n/**\n * PaymanChat — the public component. Delegates to `PaymanChatInner`\n * with a chat hook instance from `useChatV2`. The `config.uiVersion`\n * prop used to gate an older V1 render path; the V1 code has been\n * removed since nothing in the SDK's current consumers (paygent-studio\n * etc.) opted into it. The `uiVersion` prop is still accepted on\n * `ChatConfig` for type compatibility but is now ignored at runtime.\n */\nexport const PaymanChat = forwardRef<PaymanChatRef, PaymanChatProps>(\n\tfunction PaymanChat(props, ref) {\n\t\tconst mergedCallbacks = useSentryChatCallbacks(props.callbacks, props.config);\n\t\tconst chat = useChatV2(props.config, mergedCallbacks);\n\t\treturn <PaymanChatInner {...props} chat={chat} ref={ref} />;\n\t},\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../../payman-sdk-typescript/src/utils/generateId.ts","../../payman-sdk-typescript/src/utils/chatStore.ts","../../payman-sdk-typescript/src/utils/activeStreamStore.ts","../../payman-sdk-typescript/src/utils/streamingClient.ts","../../payman-sdk-typescript/src/utils/stageLabels.ts","../../payman-sdk-typescript/src/utils/v2EventProcessor.ts","../../payman-sdk-typescript/src/utils/requestBuilder.ts","../../payman-sdk-typescript/src/utils/ragImageResolver.ts","../../payman-sdk-typescript/src/hooks/useStreamManagerV2.ts","../../payman-sdk-typescript/src/utils/messageStateManager.ts","../../payman-sdk-typescript/src/utils/attachmentUploadClient.ts","../../payman-sdk-typescript/src/utils/userActionClient.ts","../../payman-sdk-typescript/src/hooks/useChatV2.ts","../../payman-sdk-typescript/src/hooks/useVoice.ts","../../payman-sdk-typescript/src/hooks/useAttachmentUpload.ts","../../payman-sdk-typescript/src/utils/jsonSchemaForm.ts","../../payman-sdk-typescript/src/utils/executionHistoryMapper.ts","../../payman-sdk-typescript/src/utils/attachmentDisplay.ts","../src/contexts/PaymanChatContext.tsx","../src/utils/cn.ts","../src/utils/formatDate.ts","../src/utils/sentryContext.ts","../src/utils/attachmentConfig.ts","../src/utils/formatAttachmentBytes.ts","../src/utils/pdfLink.ts","../src/utils/slashCommands.ts","../src/utils/errorMessages.ts","../src/utils/sentry.ts","../src/utils/feedbackClient.ts","../src/components/AgentMessage/ImageLightbox.tsx","../src/components/AgentMessage/MarkdownImage.tsx","../src/components/AgentMessage/markdownComponents.tsx","../src/components/AgentMessage/index.tsx","../src/components/UserMessage/index.tsx","../src/components/MessageRow/index.tsx","../src/components/MessageRowSkeleton/index.tsx","../src/components/MessageList/index.tsx","../src/components/ResetSessionConfirmModal/index.tsx","../src/components/v2/ActionTooltipV2.tsx","../src/components/v2/FilePreviewShell.tsx","../src/components/v2/AttachmentPreviewBlock.tsx","../src/components/v2/UserMessageV2.tsx","../src/components/v2/MarkdownImageV2.tsx","../src/components/v2/PdfBlockV2.tsx","../src/components/v2/MarkdownRendererV2.tsx","../src/components/v2/ThinkingBlockV2.tsx","../src/components/v2/FeedbackReasonModal.tsx","../src/components/v2/useTypingEffect.ts","../src/components/v2/AssistantMessageV2.tsx","../src/components/v2/OtpInputV2.tsx","../src/components/v2/VerificationInline.tsx","../src/components/v2/SchemaFormInline.tsx","../src/components/v2/NotificationInline.tsx","../src/components/v2/UserActionInline.tsx","../src/components/v2/MessageListV2.tsx","../src/components/v2/FilePreviewModal.tsx","../src/components/v2/ChatInputV2.tsx","../src/components/v2/StreamingIndicatorV2.tsx","../src/components/v2/ImageLightboxV2.tsx","../src/components/v2/TraceTimelineModal.tsx","../src/utils/pdfPreview.ts","../src/components/v2/PdfSheetV2.tsx","../src/components/PaymanChat/index.tsx"],"names":["events","__publicField","useRef","useCallback","submitUserAction","cancelUserAction","resendUserAction","useState","useEffect","useMemo","init","Sentry2","DEFAULT_STREAM_ENDPOINT","frameStyle","jsxs","jsx","Loader2","FRIENDLY_ERROR_MESSAGE","X","AnimatePresence","motion","Fragment","useContext","createPortal","Check","RAG_IMAGE_PATH_REGEX","isUnresolvedRagImageSource","ReactMarkdown","remarkGfm","AlertCircle","Copy","Binoculars","Pencil","SCROLL_THRESHOLD","MessageListV2","ArrowDown","forwardRef","ChatInputV2","useImperativeHandle","FileText","RotateCcw","Download","PaymanChatInner","isEmpty","PaymanChat"],"mappings":"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","file":"index.mjs","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","import type { MessageDisplay } from \"../types\";\n\nconst memoryStore = new Map<string, MessageDisplay[]>();\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\treturn memoryStore.get(key) ?? [];\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tmemoryStore.set(key, messages);\n\t},\n\tdelete(key: string): void {\n\t\tmemoryStore.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Rename an entry — used when the server assigns a new session ID mid-stream\n\trename(oldKey: string, newKey: string): void {\n\t\tconst entry = streams.get(oldKey);\n\t\tif (!entry) return;\n\t\tstreams.set(newKey, entry);\n\t\tstreams.delete(oldKey);\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","/**\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\t/**\n\t * Server-computed wall-clock duration from RunStarted to RunCompleted.\n\t * Carried on RUN_COMPLETED only — prefer this over client-side\n\t * step-span heuristics when present.\n\t */\n\ttotalTimeMs?: number;\n\t/**\n\t * User-facing progress label. Attached to:\n\t * - TOOL_CALL_STARTED / TOOL_CALL_COMPLETED — derived from the tool\n\t * name and (on completion) the row-count of the result, e.g.\n\t * \"Pulling your transactions\" / \"Got 437 transactions\".\n\t * - LLM_CALL_STARTED — an in-voice \"what's about to happen\" line.\n\t * - KEEP_ALIVE — a rotating phrase the server sends during silent-\n\t * think gaps so the chat-bubble status changes every few seconds\n\t * instead of staying frozen on \"Thinking…\".\n\t *\n\t * Clients should prefer this over raw type identifiers when\n\t * rendering a progress row.\n\t */\n\tdescription?: string;\n\t/**\n\t * Carried on `THINKING_DELTA` events — Anthropic extended-thinking\n\t * content streamed live from the upstream model. Distinct from\n\t * `partialText` (the user-facing answer); routes into a separate\n\t * \"Thinking…\" panel rather than the chat bubble.\n\t */\n\ttext?: string;\n\t/**\n\t * User-action / elicitation fields, carried at the TOP LEVEL of a\n\t * `USER_ACTION_REQUIRED` event (and `userActionId`/`message` on\n\t * `USER_NOTIFICATION`). The MCP `_meta.action` kind is forwarded\n\t * here as `action`; `requestedSchema` is standard JSON Schema.\n\t */\n\tuserActionId?: string;\n\taction?: string;\n\tsubAction?: string;\n\tverificationType?: string;\n\texpirySeconds?: number;\n\trequestedSchema?: Record<string, unknown>;\n\tmetadata?: Record<string, string>;\n\ttoolCallId?: string;\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 * Yield to the macrotask queue after a streaming-text delta so React can\n * commit a render before the next delta lands. No-op for non-delta events\n * (STAGE_*, TOOL_CALL_*) which don't drive the typing animation.\n *\n * Uses setTimeout(0) rather than queueMicrotask: microtasks execute before\n * React's render commit, so they don't break the batch.\n */\nfunction yieldAfterProgressEvent(event: StreamEvent): Promise<void> {\n\tconst t = event.eventType;\n\tif (\n\t\tt === \"RUN_IN_PROGRESS\" ||\n\t\tt === \"INTENT_PROGRESS\" ||\n\t\tt === \"THINKING_DELTA\"\n\t) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, 0));\n\t}\n\treturn Promise.resolve();\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\tawait yieldAfterProgressEvent(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\t// Yield after progress deltas so React commits a render between\n\t\t\t// them. Without this, multiple deltas batched into one TCP chunk\n\t\t\t// dispatch all setState calls in the same microtask, React 18\n\t\t\t// batches them, and the user sees the response appear at once\n\t\t\t// instead of streaming in.\n\t\t\tawait yieldAfterProgressEvent(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","/**\n * User-facing labels for the K2 pipeline stages, used by the event\n * processor to turn machine `stage` keys on STAGE_* events into the\n * text the UI shows in its \"Thought\" / streaming-step list.\n *\n * One label per stage — no completed / failed variants. The previous\n * version had three strings per stage (\"Checking your request\" →\n * \"Request OK\" → \"Couldn't process that request\") and flashed the\n * completed label for a few milliseconds between stages, which read\n * as noise rather than signal (\"Request OK\" and \"Got it\" don't\n * inspire trust in a banking product). The simpler model:\n *\n * - When a stage starts, the cursor shows the stage label.\n * - When the stage completes, the cursor moves on to the NEXT\n * stage's label (via a new STAGE_STARTED event). There is no\n * in-between \"completed\" flash.\n * - When the stage fails, the step is marked status=error but the\n * label stays — the expanded Thought view renders failed steps\n * differently via CSS, not by rewriting the text.\n *\n * The mapping lives in the SDK (not on the server) so copy changes\n * don't require a k2-server deploy. Future i18n replaces this table\n * with a lookup by key + locale without touching the server.\n *\n * Stage keys come from k2-server's `Pipeline.toStepKey()`:\n * sanitizer | analyzer | prefetcher | planner | execution | formatter\n */\n\nconst STAGE_LABELS: Record<string, string> = {\n\tsanitizer: \"Checking your request\",\n\tanalyzer: \"Understanding what you're asking\",\n\tprefetcher: \"Gathering context\",\n\tplanner: \"Planning how to handle this\",\n\texecution: \"Working on it\",\n\tformatter: \"Writing the response\",\n};\n\n/**\n * Map a pipeline stage key to a user-facing label. Returns a\n * sensible generic fallback (\"Running <stage>\") if the stage key is\n * unknown — a future k2-server stage that the SDK doesn't know\n * about yet still renders something in the UI instead of breaking\n * the stream.\n */\nexport function stageLabel(stage: string): string {\n\tconst label = STAGE_LABELS[stage];\n\tif (label) return label;\n\tconst pretty = stage.replace(/[_-]/g, \" \");\n\treturn `Running ${pretty}`;\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type {\n\tStreamingStep,\n\tUserActionRequest,\n\tUserActionKind,\n\tActiveUserAction,\n\tUserNotification,\n\tRequestedSchema,\n} from \"../types\";\nimport { stageLabel } from \"./stageLabels\";\n\n// ============================================================\n// Shared stream-event utilities\n// ============================================================\n//\n// These used to live in a separate `eventProcessor.ts` (the legacy\n// v1 processor file). The v1 processor + its stream manager + its\n// useChat hook have all been deleted — the v2 processor below is\n// the only one the SDK ships now — so the utilities moved here\n// rather than into a standalone shared file. They're exported\n// because `useStreamManagerV2` also imports `getEventMessage`.\n\n/**\n * Bland default-start labels every pipeline stage emits as\n * `defaultStartMessage` on the server when nothing more specific\n * has happened yet — `\"Executing…\"`, `\"Working on it…\"`, etc. The\n * stream manager filters these out of the chat-bubble status so\n * they don't replace useful messages (Analyzer's dynamic\n * \"Pulling those up for you now.\", a tool call's \"Got 437\n * transactions\") with a generic placeholder for the brief moment\n * between a stage starting and its first interesting event.\n *\n * Comparison is case-insensitive and trailing punctuation\n * (ellipsis `…` / `...` / period) is stripped so the same label\n * matches whether the server emits it with or without the\n * trailing dots.\n */\nexport function isBlandStatus(message: string | undefined | null): boolean {\n\tif (!message) return true;\n\tconst normalized = message\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[…\\.]+$/, \"\")\n\t\t.trim();\n\treturn BLAND_STATUS_LABELS.has(normalized);\n}\n\nconst BLAND_STATUS_LABELS: Set<string> = new Set([\n\t\"executing\",\n\t\"working on it\",\n\t\"thinking\",\n\t\"processing\",\n\t\"reviewing your request\",\n\t\"composing response\",\n\t\"checking your request\",\n\t\"polishing the response\",\n]);\n\n/**\n * Extract a user-friendly message string from a raw stream event.\n * Used by `useStreamManagerV2` when the streaming client needs a\n * label to attach to an intermediate event (e.g. for logging).\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 \"RUN_STARTED\":\n\t\t\treturn \"Starting agent run...\";\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\t// Prefer the server's human-readable `description` (e.g.\n\t\t\t// \"Pulling your transactions\") over the raw snake_case\n\t\t\t// tool identifier. Older k2-server builds don't populate\n\t\t\t// it, so we fall back to the tool name.\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `Calling ${toolName}...` : \"Calling tool...\";\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `${toolName} completed` : \"Tool call completed\";\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn (event.partialText as string) || \"Thinking...\";\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn \"Agent run completed\";\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn (event.errorMessage as string) || \"Agent run failed\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\t// k2-server attaches a rotating K2-voice phrase as `description`\n\t\t\t// during silent-think gaps so the chat-bubble status line has\n\t\t\t// something visibly changing instead of a frozen \"Thinking\".\n\t\t\t// Empty when the heartbeat is generic (legacy server builds).\n\t\t\treturn (event.description as string) || \"\";\n\t\tcase \"THINKING_DELTA\":\n\t\t\t// Anthropic extended-thinking content. Routed into the thinking\n\t\t\t// panel via processStreamEventV2; here we just contribute the\n\t\t\t// text to the bubble fallback in case the host UI doesn't\n\t\t\t// render the dedicated panel yet.\n\t\t\treturn (event.text as string) || \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\n/**\n * Pull the final assistant reply out of whatever shape the server\n * decided to send it in. Handles the common cases (direct string,\n * nested object with `text`/`content`/`message`/`answer`) and falls\n * back to a JSON stringification for anything else.\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 * Translate the clean K2 playground event types (RUN_STARTED,\n * TOOL_CALL_*, RUN_IN_PROGRESS, RUN_COMPLETED, RUN_FAILED) to the\n * internal event names the state machine below handles\n * (WORKFLOW_STARTED, INTENT_STARTED, INTENT_COMPLETED,\n * INTENT_PROGRESS, WORKFLOW_COMPLETED, WORKFLOW_ERROR).\n *\n * STAGE_* events pass through unchanged — they're handled directly\n * by the processor as K2 pipeline stage lifecycle events.\n *\n * Unknown event types pass through unchanged so the state machine\n * can ignore them safely.\n */\nexport function normalizeEvent(event: StreamEvent): StreamEvent {\n\tconst type = event.eventType;\n\tswitch (type) {\n\t\tcase \"RUN_STARTED\":\n\t\t\treturn { ...event, eventType: \"WORKFLOW_STARTED\" };\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\t// The server now ships a human-readable `description`\n\t\t\t// (\"Pulling your transactions\") on tool events. Surface it\n\t\t\t// as the normalized `message` so the INTENT_STARTED\n\t\t\t// handler below renders it in the thinking-block label\n\t\t\t// instead of the raw tool identifier. Falls back to the\n\t\t\t// existing `message` field when description is absent\n\t\t\t// (older k2-server builds).\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_COMPLETED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_PROGRESS\",\n\t\t\t\tmessage: (event.partialText as string | undefined) ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_COMPLETED\",\n\t\t\t\t// state machine reads event.response for the final content\n\t\t\t\tresponse: event.response ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_ERROR\",\n\t\t\t\terrorMessage: (event.errorMessage as string | undefined) ?? (event.message as string | undefined),\n\t\t\t};\n\t\tdefault:\n\t\t\treturn event;\n\t}\n}\n\n/**\n * A `requestedSchema` whose only field is `verificationCode` is the MCP\n * verification (one-time-code) shape, regardless of the declared\n * `action`. Used to refine classification.\n */\nfunction isVerificationSchema(schema: RequestedSchema | undefined): boolean {\n\tconst props = schema?.properties;\n\tif (!props) return false;\n\tconst keys = Object.keys(props);\n\treturn keys.length === 1 && keys[0] === \"verificationCode\";\n}\n\n/**\n * Classify a `USER_ACTION_REQUIRED` event into a render kind. Primary\n * discriminator is the MCP elicitation `action`; we fall back to the\n * schema shape so unknown/legacy `action` tags still route correctly.\n */\nexport function classifyUserActionKind(\n\taction: string | undefined,\n\tschema: RequestedSchema | undefined,\n): UserActionKind {\n\tswitch ((action || \"\").toLowerCase()) {\n\t\tcase \"userverificationrequest\":\n\t\t\treturn \"verification\";\n\t\tcase \"usernotificationrequest\":\n\t\t\treturn \"notification\";\n\t\tcase \"userformrequest\":\n\t\t\treturn isVerificationSchema(schema) ? \"verification\" : \"form\";\n\t\tdefault:\n\t\t\treturn isVerificationSchema(schema) ? \"verification\" : \"form\";\n\t}\n}\n\nexport type V2EventProcessorState = {\n\tfinalResponse: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\t/**\n\t * Active user-action prompts, an ordered collection keyed by\n\t * `toolCallId` (fallback `userActionId`). Usually 0–1 for serial\n\t * runs; multiple when parallel tool calls each elicit.\n\t */\n\tuserActions: ActiveUserAction[];\n\t/** One-way notifications surfaced this run (`USER_NOTIFICATION`). */\n\tnotifications: UserNotification[];\n\t/**\n\t * Transient: the prompt upserted by the most recent\n\t * `USER_ACTION_REQUIRED` event, so the stream manager can fire\n\t * `onUserActionRequired` for exactly that prompt. Reset each event.\n\t */\n\tlastUserAction?: UserActionRequest;\n\t/** Transient: the notification pushed by the most recent event. */\n\tlastNotification?: UserNotification;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\t/** Server-computed wall-clock duration captured from RUN_COMPLETED's `totalTimeMs`. */\n\ttotalElapsedMs?: number;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/**\n * Mirror the current tool-call START label onto the enclosing\n * in-progress STAGE_STARTED(\"execution\") step.\n *\n * Called on INTENT_STARTED only (not INTENT_COMPLETED). AGENTIC runs\n * fire many back-to-back tools (especially long query_engine chains),\n * so alternating start→end labels on every call produced a rapid\n * flicker of \"Crunching the numbers\" → \"Got 20 rows\" → \"Crunching\n * the numbers\" → \"Got 16 rows\" during a 60-120s run. Mirroring only\n * the start label means back-to-back same-type calls read as one\n * stable label (\"Crunching the numbers\" throughout the chain), with\n * transitions only when the tool *kind* actually changes.\n *\n * Why the mirror is needed at all: the chat-bubble label picker\n * walks steps in reverse and returns the most recent in-progress\n * step's message. Between tool calls the tool-level INTENT_STARTED\n * step is completed, so the picker falls back to the still-in-progress\n * execution-stage step — whose message is the static \"Executing…\"\n * default from the server. Mirroring the tool label onto that stage\n * step keeps the fallback dynamic and meaningful.\n *\n * No-op when `msg` is empty (older k2-server builds without\n * descriptions) or when no execution-stage step is in progress (run\n * hasn't reached the execution stage yet).\n */\nfunction updateExecutionStageMessage(state: V2EventProcessorState, msg: string): void {\n\tif (!msg) return;\n\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\tconst s = state.steps[i];\n\t\t// Match BOTH \"executor\" (current k2-server) and \"execution\"\n\t\t// (legacy ExecutionEngine). Without the \"executor\" match, the\n\t\t// tool-label mirror never landed on modern server builds and\n\t\t// the chat bubble was stuck on bland \"Executing…\" while the\n\t\t// pipeline panel showed live \"Crunching the numbers\"-style\n\t\t// labels — visible chat/pipeline desync.\n\t\tif (\n\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t(s.stage === \"executor\" || s.stage === \"execution\") &&\n\t\t\ts.status === \"in_progress\"\n\t\t) {\n\t\t\ts.message = msg;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tfinalResponse: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActions: [],\n\t\tnotifications: [],\n\t\tlastUserAction: undefined,\n\t\tlastNotification: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Upsert a prompt into `state.userActions`, applying the supersede rule:\n * a new event with a matching `toolCallId` (a `SubmissionInvalid` retry\n * or `RequestResent`, even with a new `userActionId`) REPLACES that slot\n * in place; otherwise it's appended as a new (parallel) prompt.\n */\nfunction upsertUserAction(state: V2EventProcessorState, req: UserActionRequest): void {\n\tconst active: ActiveUserAction = { ...req, status: \"pending\" };\n\tconst matchIdx = state.userActions.findIndex((p) =>\n\t\treq.toolCallId\n\t\t\t? p.toolCallId === req.toolCallId\n\t\t\t: p.userActionId === req.userActionId,\n\t);\n\tif (matchIdx >= 0) {\n\t\tstate.userActions[matchIdx] = active;\n\t} else {\n\t\tstate.userActions.push(active);\n\t}\n}\n\nexport function processStreamEventV2(\n\trawEvent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst event = normalizeEvent(rawEvent);\n\tconst eventType = event.eventType;\n\n\t// Transient per-event dispatch signals — cleared every call so the\n\t// stream manager only fires callbacks for the current event.\n\tstate.lastUserAction = undefined;\n\tstate.lastNotification = undefined;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t// k2-server attaches a rotating K2-voice phrase as `description` so\n\t\t// the chat-bubble status line changes during silent-think gaps\n\t\t// instead of staying pinned to \"Thinking\" for tens of seconds.\n\t\t// Mirror it onto the most-recent in-progress step's message so the\n\t\t// stream manager's `currentMessage` picker (which walks\n\t\t// state.steps for the latest substantive label) surfaces it.\n\t\tconst description = typeof event.description === \"string\" ? event.description : \"\";\n\t\tif (description) {\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tif (state.steps[i].status === \"in_progress\") {\n\t\t\t\t\tstate.steps[i].message = description;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t}\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"THINKING_DELTA\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\tstate.lastEventType = \"THINKING_DELTA\";\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t// Streaming delta from the Formatter stage — each event\n\t\t\t// carries `partialText` (the new chunk) which normalizeEvent\n\t\t\t// surfaces as `event.message`. Accumulate into\n\t\t\t// state.finalResponse so the stream manager can mirror it\n\t\t\t// into streamingContent in real time. The WORKFLOW_COMPLETED\n\t\t\t// event at the end still lands with the authoritative full\n\t\t\t// text; this just lets us show the answer building up.\n\t\t\t//\n\t\t\t// IMPORTANT: read raw values, do NOT `getEventText()` here.\n\t\t\t// getEventText() calls .trim(), which strips the leading\n\t\t\t// and trailing whitespace that providers include in each\n\t\t\t// token delta (\" bank\", \"accounts \", \"with\"). Trimming at\n\t\t\t// this layer destroys inter-word spacing and produces\n\t\t\t// \"Hereareallyourbankaccounts\" once deltas are concatenated.\n\t\t\tconst rawMessage = typeof event.message === \"string\" ? event.message : \"\";\n\t\t\tconst rawPartial = typeof event.partialText === \"string\" ? event.partialText : \"\";\n\t\t\tconst delta = rawMessage || rawPartial;\n\t\t\tif (delta.length > 0) {\n\t\t\t\tstate.finalResponse += delta;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst 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\t// Keep the enclosing execution stage step in sync with the\n\t\t\t// current tool label so the UI never flashes back to\n\t\t\t// \"Executing…\" between tool calls. See helper docs.\n\t\t\tupdateExecutionStageMessage(state, message);\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\t// DO NOT update the enclosing execution-stage message\n\t\t\t// here. AGENTIC runs fire many back-to-back tools\n\t\t\t// (especially query_engine chains) and surfacing the\n\t\t\t// per-tool completion label (\"Got 20 rows\" → \"Got 16\n\t\t\t// rows\" → …) caused a rapid flicker between start/end\n\t\t\t// labels during the 60-120s loop. Keeping the stage step\n\t\t\t// pinned to the CURRENT tool's start description means\n\t\t\t// back-to-back same-type tool calls all read as the same\n\t\t\t// stable label (\"Crunching the numbers\" throughout the\n\t\t\t// query_engine chain). The detail per tool still lives\n\t\t\t// on the tool's own step for expanded / trace views.\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\": {\n\t\t\t// Capture server-computed wall-clock duration. Authoritative.\n\t\t\tconst totalTime = Number(event.totalTimeMs);\n\t\t\tif (Number.isFinite(totalTime) && totalTime > 0) {\n\t\t\t\tstate.totalElapsedMs = totalTime;\n\t\t\t}\n\n\t\t\tconst content = extractResponseContent(event.response);\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\t// K2 playground runs emit the answer on `event.response`.\n\t\t\t\t// The full execution trace is fetched on demand via\n\t\t\t\t// GET /api/playground/executions/{id}/trace using\n\t\t\t\t// `executionId` on the final message.\n\t\t\t\tif (event.trace && typeof event.trace === \"object\") {\n\t\t\t\t\tstate.finalData = event.trace;\n\t\t\t\t}\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tconst rawAction = typeof event.action === \"string\" ? event.action : undefined;\n\t\t\tconst schema = event.requestedSchema as RequestedSchema | undefined;\n\t\t\tconst kind = classifyUserActionKind(rawAction, schema);\n\t\t\tconst promptMessage =\n\t\t\t\t(typeof event.message === \"string\" && event.message.trim()) || message || \"\";\n\t\t\tconst userActionId =\n\t\t\t\ttypeof event.userActionId === \"string\" ? event.userActionId : \"\";\n\n\t\t\t// A UserNotificationRequest is display-only — surface it as a\n\t\t\t// notification, not an interactive prompt.\n\t\t\tif (kind === \"notification\") {\n\t\t\t\tconst notification: UserNotification = {\n\t\t\t\t\tid: userActionId || `note-${state.stepCounter++}`,\n\t\t\t\t\tmessage: promptMessage,\n\t\t\t\t};\n\t\t\t\tstate.notifications.push(notification);\n\t\t\t\tstate.lastNotification = notification;\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Without an id we can't route a resolution back — skip.\n\t\t\tif (!userActionId) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst verificationType =\n\t\t\t\tevent.verificationType === \"ALPHANUMERIC_CODE\" ||\n\t\t\t\tevent.verificationType === \"NUMERIC_CODE\"\n\t\t\t\t\t? event.verificationType\n\t\t\t\t\t: undefined;\n\n\t\t\tconst request: UserActionRequest = {\n\t\t\t\tuserActionId,\n\t\t\t\tkind,\n\t\t\t\trawAction,\n\t\t\t\tsubAction: typeof event.subAction === \"string\" ? event.subAction : undefined,\n\t\t\t\tverificationType,\n\t\t\t\texpirySeconds:\n\t\t\t\t\ttypeof event.expirySeconds === \"number\" ? event.expirySeconds : undefined,\n\t\t\t\tmessage: promptMessage || undefined,\n\t\t\t\trequestedSchema: schema,\n\t\t\t\tmetadata: event.metadata as Record<string, string> | undefined,\n\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\texecutionId: state.executionId,\n\t\t\t\tsessionId: state.sessionId,\n\t\t\t};\n\n\t\t\tupsertUserAction(state, request);\n\t\t\tstate.lastUserAction = request;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage:\n\t\t\t\t\tpromptMessage ||\n\t\t\t\t\t(kind === \"verification\"\n\t\t\t\t\t\t? \"Waiting for verification...\"\n\t\t\t\t\t\t: \"Waiting for your input...\"),\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_NOTIFICATION\": {\n\t\t\tconst noteMessage =\n\t\t\t\t(typeof event.message === \"string\" && event.message.trim()) || message || \"\";\n\t\t\tconst userActionId =\n\t\t\t\ttypeof event.userActionId === \"string\" ? event.userActionId : \"\";\n\t\t\tif (noteMessage || userActionId) {\n\t\t\t\tconst notification: UserNotification = {\n\t\t\t\t\tid: userActionId || `note-${state.stepCounter++}`,\n\t\t\t\t\tmessage: noteMessage,\n\t\t\t\t};\n\t\t\t\tstate.notifications.push(notification);\n\t\t\t\tstate.lastNotification = notification;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\t// ---- K2 pipeline stage lifecycle events ----\n\t\t//\n\t\t// The k2-server playground streaming API emits\n\t\t// STAGE_STARTED / STAGE_COMPLETED / STAGE_FAILED /\n\t\t// STAGE_SKIPPED around each pipeline stage so the UI can\n\t\t// show real progress (sanitizer → analyzer → planner → …)\n\t\t// instead of a static placeholder. Each STAGE_STARTED\n\t\t// pushes an in-progress step with a user-facing label; the\n\t\t// matching STAGE_COMPLETED/FAILED closes it WITHOUT\n\t\t// rewriting the label — a terse \"completed\" flash between\n\t\t// stages was more noise than signal. STAGE_SKIPPED removes\n\t\t// the just-opened step entirely (skipping is expected on\n\t\t// DIRECT_RESPONSE short-circuits).\n\t\t//\n\t\t// Finding the matching step uses `stepId` directly rather\n\t\t// than comparing labels — the processor remembers which id\n\t\t// it minted for the latest open STAGE_STARTED and the\n\t\t// closing events look it up from state.currentExecutingStepId.\n\n\t\tcase \"STAGE_STARTED\": {\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Prefer the server-provided `message` — each K2 pipeline\n\t\t\t// stage now ships its own user-facing label on StageStarted\n\t\t\t// (Analyzer: \"Thinking…\", Prefetcher: \"Gathering context…\",\n\t\t\t// etc.). Fall back to the SDK's static stageLabel() table\n\t\t\t// only if the server didn't send one, which keeps this\n\t\t\t// processor compatible with older k2-server builds.\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tlet initialMessage = serverMessage || stageLabel(stage);\n\n\t\t\t// Execution-stage special case: the server's default label\n\t\t\t// is a bare \"Executing…\" which would show for the 5-10s\n\t\t\t// between STAGE_STARTED(\"executor\") and the first\n\t\t\t// TOOL_CALL_STARTED in an AGENTIC run. Prefer the\n\t\t\t// Analyzer's LLM-generated status (\"Pulling those up for\n\t\t\t// you now.\") — it's request-specific and bridges the gap\n\t\t\t// to the first tool event. Tool events subsequently mutate\n\t\t\t// this step's message via updateExecutionStageMessage().\n\t\t\t//\n\t\t\t// Match BOTH \"executor\" (current k2-server stage key) and\n\t\t\t// \"execution\" (legacy ExecutionEngine stage). Without the\n\t\t\t// \"executor\" match, the special case never fired against\n\t\t\t// modern server builds — observed in production: the chat\n\t\t\t// bubble showed bland \"Executing…\" for the entire agentic\n\t\t\t// run despite the analyzer having shipped a useful narrative\n\t\t\t// status that should have been inherited.\n\t\t\tif (stage === \"executor\" || stage === \"execution\") {\n\t\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst s = state.steps[i];\n\t\t\t\t\tif (\n\t\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\t\ts.stage === \"analyzer\" &&\n\t\t\t\t\t\ts.status === \"completed\" &&\n\t\t\t\t\t\ts.message\n\t\t\t\t\t) {\n\t\t\t\t\t\tinitialMessage = s.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stepId = `stage-${stage}-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: initialMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstage,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_COMPLETED\": {\n\t\t\t// Close the most recent in-progress step for this stage.\n\t\t\t// If the server provides a new `message` (the Analyzer's\n\t\t\t// LLM-generated \"Pulling those up for you now.\"), OVERWRITE\n\t\t\t// the step's label before marking completed — the UI's\n\t\t\t// currentStepLabel fallback shows the most recent step's\n\t\t\t// label during the gap between stages, so updating here\n\t\t\t// means the user sees the dynamic status instead of the\n\t\t\t// generic start-label until the next STAGE_STARTED lands.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"completed\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_FAILED\": {\n\t\t\t// Same as STAGE_COMPLETED but the step's status becomes\n\t\t\t// \"error\". If the server provides a specific failure\n\t\t\t// message we surface it; otherwise the label stays so the\n\t\t\t// user at least sees which stage was running. Expanded\n\t\t\t// Thought view renders errored steps differently via CSS.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"error\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_SKIPPED\": {\n\t\t\t// Mark the matching in-progress step as \"skipped\" rather\n\t\t\t// than removing it. The chat-bubble thinking animation\n\t\t\t// only reads in-progress steps so marking skipped doesn't\n\t\t\t// affect it. But pipeline-sidebar UIs need the step\n\t\t\t// retained (with the \"skipped\" status) so they can render\n\t\t\t// a visual indicator (e.g. a MinusCircle icon) for stages\n\t\t\t// the pipeline intentionally bypassed.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\ts.status = \"skipped\" as typeof s.status;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import type { ChatConfig, StreamAttachmentPayload } from \"../types\";\n\nconst DEFAULT_STREAM_ENDPOINT = \"/api/playground/ask/stream\";\n\n/**\n * Latency-vs-precision toggle surfaced in the chat widget. \"fast\"\n * (default) lets the server cap list-tool fetches and answer\n * quickly; \"deep\" runs a full analytical pass. The value is\n * forwarded verbatim to the server, which normalizes it — any\n * other string collapses to \"fast\" server-side. See\n * `ExecutionRequest.analysisMode` on the k2 backend for the\n * authoritative semantics.\n */\nexport type AnalysisMode = \"fast\" | \"deep\";\n\n/**\n * Build request body for the k2 playground ask endpoint.\n *\n * Shape matches PlaygroundAskRequest on the server:\n * { agentId, userInput, sessionId?, sessionOwnerId, sessionOwnerLabel?,\n * sessionAttributes?, analysisMode?, locale, timezone? }\n *\n * `analysisMode` is omitted from the body when undefined so older\n * SDK versions that don't pass it produce the exact same wire\n * shape they did before — the server defaults missing values to\n * \"fast\" anyway, so including the field is purely informational\n * when the caller hasn't opted in.\n *\n * `locale` is REQUIRED by the server's PlaygroundAskRequest. We resolve\n * it from `config.locale` first, then `navigator.language` (browser),\n * then fall back to \"en-US\". Without this the server returns 400 with\n * a serialization error.\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string,\n\toptions?: { analysisMode?: AnalysisMode; attachments?: StreamAttachmentPayload[] },\n): Record<string, unknown> {\n\tconst sessionOwner = config.sessionParams;\n\tconst sessionOwnerId = sessionOwner?.id?.trim();\n\tif (!sessionOwnerId) {\n\t\tthrow new Error(\"ChatConfig.sessionParams.id is required to send ask requests.\");\n\t}\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\tagentId: config.agentId,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId,\n\t\tsessionOwnerLabel: sessionOwner?.name || undefined,\n\t\tsessionAttributes,\n\t\tanalysisMode: options?.analysisMode,\n\t\tlocale: resolveLocale(config.locale),\n\t\ttimezone: resolveTimezone(config.timezone),\n\t\t...(options?.attachments?.length ? { attachments: options.attachments } : {}),\n\t};\n}\n\n/**\n * Resolve the BCP-47 locale to send with ask requests. Tries explicit\n * config first, then the browser's `navigator.language`, then a safe\n * \"en-US\" fallback. The server requires this field on the playground\n * endpoint — never returns undefined.\n */\nfunction resolveLocale(configured?: string): string {\n\tif (configured && configured.trim().length > 0) return configured.trim();\n\tif (typeof navigator !== \"undefined\") {\n\t\tconst navLocale = (navigator as { language?: string }).language;\n\t\tif (navLocale && navLocale.length > 0) return navLocale;\n\t}\n\treturn \"en-US\";\n}\n\n/**\n * Resolve the IANA timezone to send with ask requests. Tries explicit\n * config first, then `Intl.DateTimeFormat().resolvedOptions().timeZone`,\n * then \"UTC\" as a last resort. Optional on the server, but sending\n * something useful means agents can localize date prose without a\n * follow-up clarification.\n */\nfunction resolveTimezone(configured?: string): string {\n\tif (configured && configured.trim().length > 0) return configured.trim();\n\ttry {\n\t\tconst zone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\t\tif (zone && zone.length > 0) return zone;\n\t} catch {\n\t\t// Intl missing or unhappy — fall through to the UTC default.\n\t}\n\treturn \"UTC\";\n}\n\n/**\n * Build streaming URL. Defaults to the k2 playground stream endpoint.\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\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 || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n * Derives the base path from the stream endpoint (same pattern as buildUserActionUrl)\n * so that playground URLs stay on the playground path and workflow URLs stay on the\n * workflows path. An explicit resolveImagesEndpoint in config always wins.\n */\nexport function buildResolveImagesUrl(config: ChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\tconst streamEndpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = streamEndpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\treturn `${config.api.baseUrl}${basePath}/resolve-image-urls`;\n}\n\nconst NGROK_SKIP_BROWSER_WARNING = \"ngrok-skip-browser-warning\";\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\t// Skip ngrok's browser interstitial when the API is exposed via a tunnel.\n\tif (!headers[NGROK_SKIP_BROWSER_WARNING]) {\n\t\theaders[NGROK_SKIP_BROWSER_WARNING] = \"true\";\n\t}\n\treturn headers;\n}\n","import type { ChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: ChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport {\n\tprocessStreamEventV2,\n\tcreateInitialV2State,\n\tgetEventMessage,\n\tisBlandStatus,\n} from \"../utils/v2EventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n\ttype AnalysisMode,\n} from \"../utils/requestBuilder\";\nimport type { StreamAttachmentPayload } from \"../types\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * K2 stream manager:\n * - Mirrors answer tokens into `streamingContent` during RUN_IN_PROGRESS\n * - Buffers the final response until RUN_COMPLETED / WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t\toptions?: { analysisMode?: AnalysisMode; attachments?: StreamAttachmentPayload[] },\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst currentConfig = configRef.current;\n\t\t\t\tconst requestBody = buildRequestBody(\n\t\t\t\t\tcurrentConfig,\n\t\t\t\t\tuserMessage,\n\t\t\t\t\tsessionId,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\t\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\t// KEEP_ALIVE used to early-return here as a no-op\n\t\t\t\t\t\t// liveness tick. Server now attaches a rotating\n\t\t\t\t\t\t// `description` phrase during silent-think gaps so\n\t\t\t\t\t\t// the chat bubble status line changes instead of\n\t\t\t\t\t\t// freezing on \"Thinking…\". processStreamEventV2 owns\n\t\t\t\t\t\t// that mirroring; we fall through to updateMessage\n\t\t\t\t\t\t// so the new phrase actually reaches the UI.\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\t// Dispatch user-action callbacks from the transient\n\t\t\t\t\t\t// signals the processor set for THIS event. A\n\t\t\t\t\t\t// `USER_ACTION_REQUIRED` whose action is a notification\n\t\t\t\t\t\t// surfaces via `lastNotification` instead of\n\t\t\t\t\t\t// `lastUserAction`.\n\t\t\t\t\t\tif (state.lastUserAction) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.lastUserAction);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (state.lastNotification) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserNotification?.(state.lastNotification);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\t// Bland default-start labels like \"Executing…\" / \"Working\n\t\t\t\t\t\t// on it…\" come from each pipeline stage's\n\t\t\t\t\t\t// defaultStartMessage on the server. They flicker into the\n\t\t\t\t\t\t// chat bubble for the moment between an analyzer's dynamic\n\t\t\t\t\t\t// \"Pulling those up…\" status and the first tool call's\n\t\t\t\t\t\t// real \"Got 437 transactions\" — replacing useful info\n\t\t\t\t\t\t// with placeholder noise. Filter them out so the user\n\t\t\t\t\t\t// sees the most-recent SUBSTANTIVE message instead.\n\t\t\t\t\t\tconst useful = (m: string | undefined): string | undefined =>\n\t\t\t\t\t\t\tm && !isBlandStatus(m) ? m : undefined;\n\t\t\t\t\t\t// Walk backwards for the most recent USEFUL step message.\n\t\t\t\t\t\t// If executor just started with bland \"Executing…\" and\n\t\t\t\t\t\t// analyzer is done with \"Pulling those up for you now\",\n\t\t\t\t\t\t// we want analyzer's — bland on the latest step must\n\t\t\t\t\t\t// NOT shadow useful older ones. Previously latestWithMessage\n\t\t\t\t\t\t// returned the bland top-of-stack step and the candidate\n\t\t\t\t\t\t// chain fell through to the last-resort bland fallback even\n\t\t\t\t\t\t// though useful messages existed deeper in the stack.\n\t\t\t\t\t\tconst latestUsefulStep = [...state.steps].reverse().find(\n\t\t\t\t\t\t\t(s) => s.message && !isBlandStatus(s.message),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tuseful(activeStep?.message) ??\n\t\t\t\t\t\t\tuseful(lastInProgressStep?.message) ??\n\t\t\t\t\t\t\tlatestUsefulStep?.message ??\n\t\t\t\t\t\t\tuseful(getEventMessage(event)) ??\n\t\t\t\t\t\t\t// Last-resort: every candidate is bland (very first event,\n\t\t\t\t\t\t\t// nothing useful seen yet). Render the bland label so the\n\t\t\t\t\t\t\t// bubble isn't blank.\n\t\t\t\t\t\t\tactiveStep?.message ??\n\t\t\t\t\t\t\tlastInProgressStep?.message ??\n\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t// Notify consumers of every status-message change so a\n\t\t\t\t\t\t// surface outside the chat bubble (pipeline sidebar,\n\t\t\t\t\t\t// agent-avatar label) can mirror it without re-parsing\n\t\t\t\t\t\t// the event stream. Debounced implicitly by React\n\t\t\t\t\t\t// reconciliation — the callback fires every event but\n\t\t\t\t\t\t// consumers typically setState against it and React\n\t\t\t\t\t\t// dedups.\n\t\t\t\t\t\tif (currentMessage) {\n\t\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(currentMessage);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Give the host app the full steps snapshot so\n\t\t\t\t\t\t// pipeline-sidebar UIs can derive per-stage status\n\t\t\t\t\t\t// without reverse-mapping labels. Only fire when\n\t\t\t\t\t\t// steps actually changed (every STAGE_* event).\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([...state.steps]);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Mirror state.finalResponse into streamingContent\n\t\t\t\t\t\t\t// as it builds up from INTENT_PROGRESS deltas.\n\t\t\t\t\t\t\t// The k2 Formatter streams its LLM output chunk-\n\t\t\t\t\t\t\t// by-chunk; this is how the user sees the answer\n\t\t\t\t\t\t\t// build in real time instead of staring at a\n\t\t\t\t\t\t\t// blank screen for the ~2-3s the LLM takes.\n\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t// Pre-streaming servers never emit partial text,\n\t\t\t\t\t\t\t// so state.finalResponse stays \"\" until\n\t\t\t\t\t\t\t// WORKFLOW_COMPLETED — rendering \"\" here matches\n\t\t\t\t\t\t\t// the old behavior exactly for that case.\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: state.finalResponse,\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Clear any status-message consumers are mirroring —\n\t\t\t\t\t\t// the run is over, whatever was last showing is\n\t\t\t\t\t\t// stale now.\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Run is over — consumers tracking the status\n\t\t\t\t\t\t// message should clear their label / revert to\n\t\t\t\t\t\t// whatever default (agent name, blank).\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\t\t\t\t\t\t// Reset the steps snapshot so pipeline-sidebar\n\t\t\t\t\t\t// UIs can revert all stages back to idle.\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([]);\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t// Defensive: tracingData must be an object (or undefined)\n\t\t\t\t\t\t\t// so the JSON viewer doesn't char-iterate a string. The\n\t\t\t\t\t\t\t// event processor already drops bare strings; this is\n\t\t\t\t\t\t\t// the last stop before the message leaves the SDK.\n\t\t\t\t\t\t\ttracingData:\n\t\t\t\t\t\t\t\tstate.finalData != null && typeof state.finalData === \"object\"\n\t\t\t\t\t\t\t\t\t? state.finalData\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t\ttotalElapsedMs: state.hasError ? undefined : state.totalElapsedMs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\n}\n","import type { ChatConfig, StreamAttachmentPayload } from \"../types\";\nimport { buildRequestHeaders } from \"./requestBuilder\";\n\ntype SignedUrlResponse = {\n\tkey: string;\n\turl: string;\n};\n\nconst DEFAULT_SIGNED_URL_ENDPOINT = \"/api/files/signed-url\";\n\nfunction fileExtension(filename: string): string {\n\tconst ext = filename.split(\".\").pop()?.toLowerCase().replace(/^\\./, \"\");\n\treturn ext && ext.length > 0 ? ext : \"bin\";\n}\n\nfunction resolveMimeType(file: File): string {\n\tif (file.type && file.type.trim().length > 0) return file.type;\n\tconst ext = fileExtension(file.name);\n\tconst byExt: Record<string, string> = {\n\t\tpdf: \"application/pdf\",\n\t\tpng: \"image/png\",\n\t\tjpg: \"image/jpeg\",\n\t\tjpeg: \"image/jpeg\",\n\t\tgif: \"image/gif\",\n\t\twebp: \"image/webp\",\n\t};\n\treturn byExt[ext] ?? \"application/octet-stream\";\n}\n\nexport function buildSignedUrlEndpoint(config: ChatConfig, ext: string): string {\n\tconst endpoint = config.api.signedUrlEndpoint || DEFAULT_SIGNED_URL_ENDPOINT;\n\tconst queryParams = new URLSearchParams({ extn: ext.replace(/^\\./, \"\") });\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\n}\n\nasync function requestSignedUrl(\n\tconfig: ChatConfig,\n\text: string,\n\tsignal?: AbortSignal,\n): Promise<SignedUrlResponse> {\n\tconst url = buildSignedUrlEndpoint(config, ext);\n\tconst headers = buildRequestHeaders(config);\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text().catch(() => \"\");\n\t\tthrow new Error(\n\t\t\terrorText\n\t\t\t\t? `Failed to get upload URL (${response.status}): ${errorText}`\n\t\t\t\t: `Failed to get upload URL (${response.status})`,\n\t\t);\n\t}\n\n\tconst data = (await response.json()) as Partial<SignedUrlResponse>;\n\tif (!data.key || !data.url) {\n\t\tthrow new Error(\"Signed URL response missing key or url\");\n\t}\n\n\treturn { key: data.key, url: data.url };\n}\n\nasync function uploadToSignedUrl(\n\tsignedUrl: string,\n\tfile: File,\n\tmimeType: string,\n\tsignal?: AbortSignal,\n): Promise<void> {\n\tconst response = await fetch(signedUrl, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-Type\": mimeType,\n\t\t\t\"x-ms-blob-type\": \"BlockBlob\",\n\t\t},\n\t\tbody: file,\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text().catch(() => \"\");\n\t\tthrow new Error(\n\t\t\terrorText\n\t\t\t\t? `Failed to upload file (${response.status}): ${errorText}`\n\t\t\t\t: `Failed to upload file (${response.status})`,\n\t\t);\n\t}\n}\n\nexport async function uploadAttachment(\n\tconfig: ChatConfig,\n\tfile: File,\n\tsignal?: AbortSignal,\n): Promise<StreamAttachmentPayload> {\n\tconst ext = fileExtension(file.name);\n\tconst mimeType = resolveMimeType(file);\n\tconst { key, url } = await requestSignedUrl(config, ext, signal);\n\tawait uploadToSignedUrl(url, file, mimeType, signal);\n\n\treturn {\n\t\ttempKey: key,\n\t\tfilename: file.name,\n\t\tmimeType,\n\t};\n}\n\nexport async function uploadAttachments(\n\tconfig: ChatConfig,\n\tfiles: File[],\n\tsignal?: AbortSignal,\n): Promise<StreamAttachmentPayload[]> {\n\tconst uploads = files.map((file) => uploadAttachment(config, file, signal));\n\treturn Promise.all(uploads);\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 * Thrown when a resolution endpoint returns `404`\n * (`user_action_not_found`): the prompt already resolved, expired, or\n * the id is unknown. Callers should treat the prompt as no longer\n * actionable — stop any countdown and clear the form — rather than\n * surfacing this as a hard error.\n */\nexport class UserActionStaleError extends Error {\n\treadonly userActionId: string;\n\tconstructor(userActionId: string, message = \"User action is no longer actionable\") {\n\t\tsuper(message);\n\t\tthis.name = \"UserActionStaleError\";\n\t\tthis.userActionId = userActionId;\n\t}\n}\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws `UserActionStaleError` on 404 and a\n * generic error on other non-2xx status / 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.status === 404) {\n\t\tthrow new UserActionStaleError(userActionId);\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. `content` is the schema-typed form payload sent\n * straight through to the agent (its keys should match the prompt's\n * `requestedSchema.properties`) — e.g. `{ otp: \"123456\" }` for a\n * verification prompt or `{ amount: 50, confirm: true }` for a form.\n */\nexport async function submitUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\tcontent?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", content ?? {});\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, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n\tActiveUserAction,\n\tChatCallbacks,\n\tChatConfig,\n\tMessageAttachment,\n\tMessageDisplay,\n\tStreamAttachmentPayload,\n\tUserActionRequest,\n\tUserActionState,\n} from \"../types\";\nimport { generateId } from \"../utils/generateId\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport type { AnalysisMode } from \"../utils/requestBuilder\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tuploadAttachments,\n} from \"../utils/attachmentUploadClient\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n\tUserActionStaleError,\n} from \"../utils/userActionClient\";\n\nconst EMPTY_USER_ACTION_STATE: UserActionState = { prompts: [], notifications: [] };\n\n/**\n * Upsert a prompt applying the supersede rule: a request matching an\n * existing slot's `toolCallId` (a retry/resend, possibly with a new\n * `userActionId`) REPLACES that slot in place; otherwise it's appended\n * as a new (parallel) prompt.\n */\nfunction upsertPrompt(\n\tprompts: ActiveUserAction[],\n\treq: UserActionRequest,\n): ActiveUserAction[] {\n\tconst active: ActiveUserAction = { ...req, status: \"pending\" };\n\tconst idx = prompts.findIndex((p) =>\n\t\treq.toolCallId\n\t\t\t? p.toolCallId === req.toolCallId\n\t\t\t: p.userActionId === req.userActionId,\n\t);\n\tif (idx >= 0) {\n\t\tconst next = prompts.slice();\n\t\tnext[idx] = active;\n\t\treturn next;\n\t}\n\treturn [...prompts, active];\n}\n\nexport type SendMessageOptions = {\n\t/**\n\t * Latency-vs-precision toggle surfaced in the chat widget.\n\t * `\"fast\"` (default) — the server caps list-tool fetches and\n\t * returns a quick, directionally correct answer with a sampling\n\t * caveat. `\"deep\"` — the server runs a full analytical pass,\n\t * no row caps, full rankings.\n\t *\n\t * Undefined / omitted means \"don't set — let the server use its\n\t * default\", which is `\"fast\"` today. Callers that want explicit\n\t * control should always pass this; callers that don't care can\n\t * skip it and inherit the server default.\n\t */\n\tanalysisMode?: AnalysisMode;\n\t/** Local files to upload via signed URL before starting the stream. */\n\tfiles?: File[];\n\t/** Pre-uploaded attachments — skips signed-URL upload when provided. */\n\tattachments?: StreamAttachmentPayload[];\n};\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string, options?: SendMessageOptions) => Promise<void>;\n\tclearMessages: () => void;\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\t/** True while attachment signed-URL uploads are in flight (before the stream starts). */\n\tisUploadingAttachments: boolean;\n\tsessionId: string | undefined;\n\t/** Active user-action prompts + one-way notifications for this chat. */\n\tuserActionState: UserActionState;\n\t/**\n\t * Submit a prompt's form payload. `content` keys should match the\n\t * prompt's `requestedSchema.properties` (e.g. `{ otp: \"123456\" }`).\n\t */\n\tsubmitUserAction: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\t/** Cancel / decline a prompt. */\n\tcancelUserAction: (userActionId: string) => Promise<void>;\n\t/** Ask the agent to re-send a prompt (e.g. resend a verification code). */\n\tresendUserAction: (userActionId: string) => Promise<void>;\n\t/** Dismiss a one-way notification from local state. */\n\tdismissNotification: (id: string) => void;\n};\n\nfunction getStoredOrInitialMessages(config: ChatConfig): MessageDisplay[] {\n\tif (!config.userId) return config.initialMessages ?? [];\n\n\t// Active stream takes highest priority — avoids flash when restoring a streaming session\n\tconst activeStream = activeStreamStore.get(config.userId);\n\tif (activeStream) return activeStream.messages;\n\n\tconst stored = chatStore.get(config.userId);\n\tif (stored.length > 0) return stored;\n\n\tif (config.initialMessages?.length) {\n\t\tchatStore.set(config.userId, config.initialMessages);\n\t\treturn config.initialMessages;\n\t}\n\n\treturn [];\n}\n\nfunction getSessionIdFromMessages(messages: MessageDisplay[]): string | undefined {\n\treturn messages.find((message) => message.sessionId)?.sessionId;\n}\n\nconst IMAGE_EXTENSIONS = new Set([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"avif\"]);\n\nfunction attachmentKindFromFile(file: File): MessageAttachment[\"kind\"] {\n\tconst ext = file.name.split(\".\").pop()?.toLowerCase() ?? \"\";\n\tif (IMAGE_EXTENSIONS.has(ext) || file.type.startsWith(\"image/\")) return \"image\";\n\treturn \"file\";\n}\n\nfunction buildMessageAttachments(files: File[]): MessageAttachment[] {\n\treturn files.map((file, index) => {\n\t\tconst kind = attachmentKindFromFile(file);\n\t\treturn {\n\t\t\tid: `att-${Date.now()}-${index}`,\n\t\t\tfilename: file.name,\n\t\t\tmimeType: file.type || \"application/octet-stream\",\n\t\t\t// Blob URL for all local files so PDFs/docs stay previewable after send.\n\t\t\tpreviewUrl: URL.createObjectURL(file),\n\t\t\tkind,\n\t\t};\n\t});\n}\n\nexport function useChatV2(config: ChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => getStoredOrInitialMessages(config));\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(() => {\n\t\tif (!config.userId) return false;\n\t\treturn activeStreamStore.get(config.userId)?.isWaiting ?? false;\n\t});\n\tconst [isUploadingAttachments, setIsUploadingAttachments] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(\n\t\tgetSessionIdFromMessages(getStoredOrInitialMessages(config)) ?? config.initialSessionId ?? undefined,\n\t);\n\tconst prevUserIdRef = useRef<string | undefined>(config.userId);\n\t// Tracks the userId that was active when sendMessage was called — locked for the stream's lifetime\n\tconst streamUserIdRef = useRef<string | undefined>(undefined);\n\t// Tracks the previous userId seen by the subscription effect — used to detect renames\n\tconst subscriptionPrevUserIdRef = useRef<string | undefined>(config.userId);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\t// Use the locked stream userId (set at sendMessage time) so background stream\n\t\t\t// updates go to the right store key even if the user switches sessions.\n\t\t\tconst streamUserId = streamUserIdRef.current;\n\t\t\tconst currentUserId = configRef.current.userId;\n\t\t\tconst storeKey = streamUserId ?? currentUserId;\n\t\t\tif (storeKey && activeStreamStore.has(storeKey)) {\n\t\t\t\tactiveStreamStore.applyMessages(storeKey, updater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]));\n\t\t\t}\n\t\t\t// Only update React state when on the same session as the running stream\n\t\t\tif (!streamUserId || streamUserId === currentUserId) {\n\t\t\t\tsetMessages(updater);\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback(\n\t\t(waiting: boolean) => {\n\t\t\tconst streamUserId = streamUserIdRef.current;\n\t\t\tconst currentUserId = configRef.current.userId;\n\t\t\tconst storeKey = streamUserId ?? currentUserId;\n\t\t\tif (storeKey && activeStreamStore.has(storeKey)) {\n\t\t\t\tactiveStreamStore.setWaiting(storeKey, waiting);\n\t\t\t}\n\t\t\tif (!streamUserId || streamUserId === currentUserId) {\n\t\t\t\tsetIsWaitingForResponse(waiting);\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>(EMPTY_USER_ACTION_STATE);\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(() => ({\n\t\t...callbacksRef.current,\n\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\tonUserActionRequired: (request) => {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tprompts: upsertPrompt(prev.prompts, request),\n\t\t\t}));\n\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t},\n\t\tonUserNotification: (notification) => {\n\t\t\tsetUserActionState((prev) =>\n\t\t\t\tprev.notifications.some((n) => n.id === notification.id)\n\t\t\t\t\t? prev\n\t\t\t\t\t: { ...prev, notifications: [...prev.notifications, notification] },\n\t\t\t);\n\t\t\tcallbacksRef.current.onUserNotification?.(notification);\n\t\t},\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}), []);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string, options?: SendMessageOptions) => {\n\t\t\tconst trimmedMessage = userMessage.trim();\n\t\t\tconst files = options?.files ?? [];\n\t\t\tconst hasPreuploadedAttachments = (options?.attachments?.length ?? 0) > 0;\n\t\t\tif (!trimmedMessage && files.length === 0 && !hasPreuploadedAttachments) return;\n\n\t\t\tlet streamAttachments = options?.attachments;\n\t\t\tif (!streamAttachments && files.length > 0) {\n\t\t\t\tsetIsUploadingAttachments(true);\n\t\t\t\ttry {\n\t\t\t\t\tstreamAttachments = await uploadAttachments(configRef.current, files);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t} finally {\n\t\t\t\t\tsetIsUploadingAttachments(false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!sessionIdRef.current && configRef.current.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst messageAttachments =\n\t\t\t\tfiles.length > 0\n\t\t\t\t\t? buildMessageAttachments(files)\n\t\t\t\t\t: streamAttachments?.length\n\t\t\t\t\t\t? streamAttachments.map((attachment, index) => ({\n\t\t\t\t\t\t\t\tid: `att-${Date.now()}-${index}`,\n\t\t\t\t\t\t\t\tfilename: attachment.filename,\n\t\t\t\t\t\t\t\tmimeType: attachment.mimeType,\n\t\t\t\t\t\t\t\tkind: attachment.mimeType.startsWith(\"image/\")\n\t\t\t\t\t\t\t\t\t? (\"image\" as const)\n\t\t\t\t\t\t\t\t\t: (\"file\" as const),\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t: undefined;\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: trimmedMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: messageAttachments,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(trimmedMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId) {\n\t\t\t\tstreamUserIdRef.current = userId;\n\t\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\t\tactiveStreamStore.start(userId, abortController, initialMessages);\n\t\t\t}\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\ttrimmedMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tsessionIdRef.current,\n\t\t\t\tabortController,\n\t\t\t\t{\n\t\t\t\t\tanalysisMode: options?.analysisMode,\n\t\t\t\t\tattachments: streamAttachments,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\t// Use streamUserIdRef in case it was updated by a rename (onSessionIdChange)\n\t\t\tconst finalStreamUserId = streamUserIdRef.current ?? userId;\n\t\t\tif (finalStreamUserId) {\n\t\t\t\tactiveStreamStore.complete(finalStreamUserId);\n\t\t\t}\n\t\t\tstreamUserIdRef.current = undefined;\n\n\t\t\tif (!abortController.signal.aborted && newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tconst streamUserId = streamUserIdRef.current ?? configRef.current.userId;\n\t\tif (streamUserId) {\n\t\t\tactiveStreamStore.abort(streamUserId);\n\t\t}\n\t\tstreamUserIdRef.current = undefined;\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, prompts: [] }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(\n\t\t\t\t\t\t\tmsg.steps || [],\n\t\t\t\t\t\t\tmsg.currentMessage,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tconst streamUserId = streamUserIdRef.current ?? configRef.current.userId;\n\t\tif (streamUserId) {\n\t\t\tactiveStreamStore.abort(streamUserId);\n\t\t}\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tstreamUserIdRef.current = undefined;\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState(EMPTY_USER_ACTION_STATE);\n\t}, []);\n\n\tconst getSessionId = useCallback(() => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst getMessages = useCallback(() => {\n\t\treturn messages;\n\t}, [messages]);\n\n\tconst setPromptStatus = useCallback(\n\t\t(userActionId: string, status: ActiveUserAction[\"status\"]) => {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tprompts: prev.prompts.map((p) =>\n\t\t\t\t\tp.userActionId === userActionId ? { ...p, status } : p,\n\t\t\t\t),\n\t\t\t}));\n\t\t},\n\t\t[],\n\t);\n\n\tconst removePrompt = useCallback((userActionId: string) => {\n\t\tsetUserActionState((prev) => ({\n\t\t\t...prev,\n\t\t\tprompts: prev.prompts.filter((p) => p.userActionId !== userActionId),\n\t\t}));\n\t}, []);\n\n\tconst submitUserAction = useCallback(\n\t\tasync (userActionId: string, content: Record<string, unknown>) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait submitUserActionApi(configRef.current, userActionId, content);\n\t\t\t\t// Endpoint accepted the resolution: the run resumes on the\n\t\t\t\t// open stream. Drop the slot — if the input was invalid the\n\t\t\t\t// server emits a fresh USER_ACTION_REQUIRED (subAction\n\t\t\t\t// \"SubmissionInvalid\") that re-adds it.\n\t\t\t\tremovePrompt(userActionId);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tsetPromptStatus(userActionId, \"stale\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Recoverable failure — let the user retry the same prompt.\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[removePrompt, setPromptStatus],\n\t);\n\n\tconst cancelUserAction = useCallback(\n\t\tasync (userActionId: string) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait cancelUserActionApi(configRef.current, userActionId);\n\t\t\t\tremovePrompt(userActionId);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tremovePrompt(userActionId);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[removePrompt, setPromptStatus],\n\t);\n\n\tconst resendUserAction = useCallback(\n\t\tasync (userActionId: string) => {\n\t\t\tsetPromptStatus(userActionId, \"submitting\");\n\t\t\ttry {\n\t\t\t\tawait resendUserActionApi(configRef.current, userActionId);\n\t\t\t\t// Keep the slot open; the server pushes a new\n\t\t\t\t// USER_ACTION_REQUIRED (\"RequestResent\") that supersedes it.\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof UserActionStaleError) {\n\t\t\t\t\tsetPromptStatus(userActionId, \"stale\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsetPromptStatus(userActionId, \"pending\");\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[setPromptStatus],\n\t);\n\n\tconst dismissNotification = useCallback((id: string) => {\n\t\tsetUserActionState((prev) => ({\n\t\t\t...prev,\n\t\t\tnotifications: prev.notifications.filter((n) => n.id !== id),\n\t\t}));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst prevSubscriptionUserId = subscriptionPrevUserIdRef.current;\n\t\tsubscriptionPrevUserIdRef.current = config.userId;\n\t\tconst { userId } = config;\n\t\tif (!userId) return;\n\n\t\t// Detect when the stream was renamed (e.g. server assigned a new session ID via\n\t\t// migrateActiveStream in the app): old key is gone, new key has the stream,\n\t\t// and streamUserIdRef still points to the old key.\n\t\tif (\n\t\t\tprevSubscriptionUserId &&\n\t\t\tprevSubscriptionUserId !== userId &&\n\t\t\tstreamUserIdRef.current === prevSubscriptionUserId &&\n\t\t\t!activeStreamStore.has(prevSubscriptionUserId) &&\n\t\t\tactiveStreamStore.has(userId)\n\t\t) {\n\t\t\tstreamUserIdRef.current = userId;\n\t\t}\n\n\t\tconst unsubscribe = activeStreamStore.subscribe(userId, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(userId);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t}, [config.userId]);\n\n\tuseEffect(() => {\n\t\tif (!config.userId) return;\n\t\t// prevUserIdRef is updated in the userId-change effect which runs *after* this one.\n\t\t// If they differ here, userId just changed and messages still belong to the previous\n\t\t// session — skip so we don't corrupt the new session's chatStore entry.\n\t\tif (prevUserIdRef.current !== config.userId) return;\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(config.userId, toSave);\n\t\t}\n\t}, [messages, config.userId]);\n\n\tuseEffect(() => {\n\t\tif (!config.userId || activeStreamStore.has(config.userId)) return;\n\t\tif (!config.initialMessages?.length || messagesRef.current.length > 0) return;\n\n\t\tchatStore.set(config.userId, config.initialMessages);\n\t\tsetMessages(config.initialMessages);\n\t\tsessionIdRef.current = getSessionIdFromMessages(config.initialMessages) ?? config.initialSessionId;\n\t}, [config.initialMessages, config.initialSessionId, config.userId]);\n\n\t// When userId is omitted (resumed/history-only sessions), hydrate from\n\t// initialMessages when the loaded session changes. Skip once the user has\n\t// started chatting so we don't clobber in-flight messages.\n\tconst hydratedSessionIdRef = useRef<string | undefined>(undefined);\n\tuseEffect(() => {\n\t\tif (config.userId) return;\n\t\tif (!config.initialMessages?.length) return;\n\n\t\tconst sessionId = config.initialSessionId;\n\t\tif (\n\t\t\thydratedSessionIdRef.current === sessionId &&\n\t\t\tmessagesRef.current.length > 0\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\thydratedSessionIdRef.current = sessionId;\n\t\tsetMessages(config.initialMessages);\n\t\tsessionIdRef.current =\n\t\t\tgetSessionIdFromMessages(config.initialMessages) ?? sessionId;\n\t}, [config.initialMessages, config.initialSessionId, config.userId]);\n\n\tuseEffect(() => {\n\t\tconst prevUserId = prevUserIdRef.current;\n\t\tprevUserIdRef.current = config.userId;\n\n\t\tif (prevUserId === config.userId) return;\n\n\t\tif (prevUserId && !config.userId) {\n\t\t\tchatStore.delete(prevUserId);\n\t\t\tsetMessages([]);\n\t\t\tsessionIdRef.current = undefined;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetUserActionState(EMPTY_USER_ACTION_STATE);\n\t\t} else if (config.userId) {\n\t\t\tconst active = activeStreamStore.get(config.userId);\n\t\t\tif (active) {\n\t\t\t\tsetMessages(active.messages);\n\t\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t\t\tsessionIdRef.current = getSessionIdFromMessages(active.messages) ?? config.initialSessionId;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextMessages = getStoredOrInitialMessages(config);\n\t\t\tsetMessages(nextMessages);\n\t\t\tsessionIdRef.current = getSessionIdFromMessages(nextMessages) ?? config.initialSessionId;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t}\n\t}, [config]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tisUploadingAttachments,\n\t\tsessionId: sessionIdRef.current,\n\t\tuserActionState,\n\t\tsubmitUserAction,\n\t\tcancelUserAction,\n\t\tresendUserAction,\n\t\tdismissNotification,\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","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { ChatConfig, StreamAttachmentPayload } from \"../types\";\nimport { uploadAttachment } from \"../utils/attachmentUploadClient\";\n\nexport type AttachmentUploadStatus = \"uploading\" | \"done\" | \"error\";\n\nexport type TrackedAttachment = {\n\tid: string;\n\tfile: File;\n};\n\nexport type AttachmentUploadEntry = {\n\tid: string;\n\tstatus: AttachmentUploadStatus;\n\tpayload?: StreamAttachmentPayload;\n\terror?: string;\n};\n\nexport type UseAttachmentUploadReturn = {\n\t/** Sync the upload queue to match the current attachment picker list. */\n\tsyncAttachments: (attachments: TrackedAttachment[]) => void;\n\t/** Abort in-flight uploads and clear all tracked state. */\n\tclearAll: () => void;\n\tisUploading: boolean;\n\thasErrors: boolean;\n\t/** True when every tracked attachment finished uploading successfully. */\n\tallReady: boolean;\n\tpayloads: StreamAttachmentPayload[];\n\tstatusById: Record<string, AttachmentUploadStatus>;\n};\n\nexport function useAttachmentUpload(config: ChatConfig): UseAttachmentUploadReturn {\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\n\tconst [entries, setEntries] = useState<Map<string, AttachmentUploadEntry>>(new Map());\n\tconst [orderedIds, setOrderedIds] = useState<string[]>([]);\n\tconst abortControllersRef = useRef<Map<string, AbortController>>(new Map());\n\tconst activeIdsRef = useRef<Set<string>>(new Set());\n\n\tconst startUpload = useCallback((id: string, file: File) => {\n\t\tif (activeIdsRef.current.has(id)) return;\n\t\tactiveIdsRef.current.add(id);\n\n\t\tconst controller = new AbortController();\n\t\tabortControllersRef.current.set(id, controller);\n\n\t\tsetEntries((prev) => {\n\t\t\tconst next = new Map(prev);\n\t\t\tnext.set(id, { id, status: \"uploading\" });\n\t\t\treturn next;\n\t\t});\n\n\t\tvoid uploadAttachment(configRef.current, file, controller.signal)\n\t\t\t.then((payload) => {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tsetEntries((prev) => {\n\t\t\t\t\tconst next = new Map(prev);\n\t\t\t\t\tnext.set(id, { id, status: \"done\", payload });\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error: Error) => {\n\t\t\t\tif (error.name === \"AbortError\") return;\n\t\t\t\tsetEntries((prev) => {\n\t\t\t\t\tconst next = new Map(prev);\n\t\t\t\t\tnext.set(id, {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\terror: error.message || \"Upload failed\",\n\t\t\t\t\t});\n\t\t\t\t\treturn next;\n\t\t\t\t});\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tabortControllersRef.current.delete(id);\n\t\t\t});\n\t}, []);\n\n\tconst syncAttachments = useCallback(\n\t\t(attachments: TrackedAttachment[]) => {\n\t\t\tconst nextIds = attachments.map((attachment) => attachment.id);\n\t\t\tsetOrderedIds(nextIds);\n\t\t\tconst nextIdSet = new Set(nextIds);\n\n\t\t\tfor (const id of activeIdsRef.current) {\n\t\t\t\tif (nextIdSet.has(id)) continue;\n\t\t\t\tabortControllersRef.current.get(id)?.abort();\n\t\t\t\tabortControllersRef.current.delete(id);\n\t\t\t\tactiveIdsRef.current.delete(id);\n\t\t\t}\n\n\t\t\tsetEntries((prev) => {\n\t\t\t\tconst next = new Map(prev);\n\t\t\t\tfor (const id of next.keys()) {\n\t\t\t\t\tif (!nextIdSet.has(id)) next.delete(id);\n\t\t\t\t}\n\t\t\t\treturn next;\n\t\t\t});\n\n\t\t\tfor (const attachment of attachments) {\n\t\t\t\tstartUpload(attachment.id, attachment.file);\n\t\t\t}\n\t\t},\n\t\t[startUpload],\n\t);\n\n\tconst clearAll = useCallback(() => {\n\t\tfor (const controller of abortControllersRef.current.values()) {\n\t\t\tcontroller.abort();\n\t\t}\n\t\tabortControllersRef.current.clear();\n\t\tactiveIdsRef.current.clear();\n\t\tsetOrderedIds([]);\n\t\tsetEntries(new Map());\n\t}, []);\n\n\tconst entryList = useMemo(\n\t\t() =>\n\t\t\torderedIds\n\t\t\t\t.map((id) => entries.get(id))\n\t\t\t\t.filter((entry): entry is AttachmentUploadEntry => entry != null),\n\t\t[entries, orderedIds],\n\t);\n\n\tconst isUploading = entryList.some((entry) => entry.status === \"uploading\");\n\tconst hasErrors = entryList.some((entry) => entry.status === \"error\");\n\tconst allReady =\n\t\torderedIds.length === 0 ||\n\t\torderedIds.every((id) => entries.get(id)?.status === \"done\");\n\tconst payloads = entryList\n\t\t.filter((entry) => entry.status === \"done\" && entry.payload)\n\t\t.map((entry) => entry.payload!);\n\tconst statusById = useMemo(\n\t\t() =>\n\t\t\tObject.fromEntries(\n\t\t\t\tentryList.map((entry) => [entry.id, entry.status]),\n\t\t\t) as Record<string, AttachmentUploadStatus>,\n\t\t[entryList],\n\t);\n\n\treturn {\n\t\tsyncAttachments,\n\t\tclearAll,\n\t\tisUploading,\n\t\thasErrors,\n\t\tallReady,\n\t\tpayloads,\n\t\tstatusById,\n\t};\n}\n","// ============================================================\n// JSON Schema form helper (zero-dependency, platform-agnostic)\n// ============================================================\n//\n// MCP elicitation uses standard JSON Schema to describe the form a\n// prompt wants filled. The server emits a small, flat subset today\n// (a `properties` map of primitives + `oneOf` single-selects). These\n// pure helpers classify fields, coerce submitted values to the right\n// JSON type, and validate against the declared constraints.\n//\n// Design rules:\n// - No React, no DOM, no deps — usable by web and React Native UIs.\n// - Forward-compatible: unknown `type`s fall back to text, unknown\n// keywords are ignored, and nested objects/arrays are flagged as\n// unsupported (so the UI can skip them) rather than crashing.\n\nimport type {\n\tJsonSchemaField,\n\tJsonSchemaOption,\n\tRequestedSchema,\n} from \"../types\";\n\n/** The widget kinds the renderer knows how to draw. */\nexport type FieldWidget = \"text\" | \"integer\" | \"decimal\" | \"boolean\" | \"select\";\n\n/**\n * Classify a schema field into a widget kind. `oneOf` always wins\n * (titled single-select), then `type`. Anything unrecognized — or a\n * missing type — degrades to a plain text input.\n */\nexport function classifyField(field: JsonSchemaField | undefined): FieldWidget {\n\tif (!field) return \"text\";\n\tif (Array.isArray(field.oneOf) && field.oneOf.length > 0) return \"select\";\n\tswitch (field.type) {\n\t\tcase \"boolean\":\n\t\t\treturn \"boolean\";\n\t\tcase \"integer\":\n\t\t\treturn \"integer\";\n\t\tcase \"number\":\n\t\t\treturn \"decimal\";\n\t\tcase \"string\":\n\t\t\treturn \"text\";\n\t\tdefault:\n\t\t\treturn \"text\";\n\t}\n}\n\n/**\n * Fields we can't render as a flat primitive (nested objects, arrays,\n * tuple/composite schemas). The renderer should skip these rather than\n * attempt a best-effort input. `oneOf` is NOT considered unsupported —\n * it's our single-select shape.\n */\nexport function isNestedOrUnsupported(field: JsonSchemaField | undefined): boolean {\n\tif (!field) return false;\n\tif (field.type === \"object\" || field.type === \"array\") return true;\n\tif (\"properties\" in field && field.properties != null) return true;\n\tif (\"items\" in field && field.items != null) return true;\n\treturn false;\n}\n\n/** Normalize a field's `oneOf` into a clean option list (drops malformed entries). */\nexport function getOptions(field: JsonSchemaField | undefined): JsonSchemaOption[] {\n\tif (!field || !Array.isArray(field.oneOf)) return [];\n\treturn field.oneOf.filter(\n\t\t(o): o is JsonSchemaOption =>\n\t\t\t!!o && typeof o === \"object\" && typeof o.const === \"string\",\n\t);\n}\n\n/** Is `key` required per the schema's `required` array? */\nexport function isRequired(schema: RequestedSchema | undefined, key: string): boolean {\n\treturn Array.isArray(schema?.required) && schema!.required!.includes(key);\n}\n\n/**\n * Coerce a raw widget value into the JSON type the schema declares, so\n * the submitted `content` round-trips cleanly. Empty/blank values become\n * `undefined` (the field is simply omitted from the payload). The server\n * is tolerant of strings, but matching types keeps things clean.\n */\nexport function coerceValue(field: JsonSchemaField | undefined, raw: unknown): unknown {\n\tconst widget = classifyField(field);\n\n\tif (widget === \"boolean\") {\n\t\tif (typeof raw === \"boolean\") return raw;\n\t\tif (raw === \"true\") return true;\n\t\tif (raw === \"false\") return false;\n\t\treturn Boolean(raw);\n\t}\n\n\tif (widget === \"integer\" || widget === \"decimal\") {\n\t\tif (raw === \"\" || raw == null) return undefined;\n\t\tconst num = typeof raw === \"number\" ? raw : Number(String(raw).trim());\n\t\tif (Number.isNaN(num)) return undefined;\n\t\treturn widget === \"integer\" ? Math.trunc(num) : num;\n\t}\n\n\t// text + select → string\n\tif (raw == null) return undefined;\n\tconst str = String(raw);\n\treturn str === \"\" ? undefined : str;\n}\n\n/** Pre-fill value for a field's widget, from `default` (typed loosely for inputs). */\nexport function defaultValueFor(field: JsonSchemaField | undefined): unknown {\n\tif (!field || field.default === undefined) {\n\t\treturn classifyField(field) === \"boolean\" ? false : \"\";\n\t}\n\treturn field.default;\n}\n\n/**\n * Validate a single field's coerced value. Returns an error string or\n * `null` when valid. Only the documented keywords are enforced; unknown\n * keywords are ignored.\n */\nexport function validateField(\n\tfield: JsonSchemaField | undefined,\n\tvalue: unknown,\n\trequired: boolean,\n): string | null {\n\tconst widget = classifyField(field);\n\tconst label = field?.title || \"This field\";\n\n\tconst isEmpty =\n\t\tvalue === undefined ||\n\t\tvalue === null ||\n\t\t(typeof value === \"string\" && value.trim() === \"\");\n\n\tif (isEmpty) {\n\t\t// Booleans are never \"empty\" in a way that fails required.\n\t\tif (required && widget !== \"boolean\") return `${label} is required.`;\n\t\treturn null;\n\t}\n\n\tif (widget === \"integer\" || widget === \"decimal\") {\n\t\tconst num = typeof value === \"number\" ? value : Number(value);\n\t\tif (Number.isNaN(num)) return `${label} must be a number.`;\n\t\tif (widget === \"integer\" && !Number.isInteger(num)) {\n\t\t\treturn `${label} must be a whole number.`;\n\t\t}\n\t\tif (typeof field?.minimum === \"number\" && num < field.minimum) {\n\t\t\treturn `${label} must be at least ${field.minimum}.`;\n\t\t}\n\t\tif (typeof field?.maximum === \"number\" && num > field.maximum) {\n\t\t\treturn `${label} must be at most ${field.maximum}.`;\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (widget === \"select\") {\n\t\tconst allowed = getOptions(field).map((o) => o.const);\n\t\tif (allowed.length > 0 && !allowed.includes(String(value))) {\n\t\t\treturn `${label} has an invalid selection.`;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// text\n\tconst str = String(value);\n\tif (typeof field?.minLength === \"number\" && str.length < field.minLength) {\n\t\treturn `${label} must be at least ${field.minLength} characters.`;\n\t}\n\tif (typeof field?.maxLength === \"number\" && str.length > field.maxLength) {\n\t\treturn `${label} must be at most ${field.maxLength} characters.`;\n\t}\n\treturn null;\n}\n\n/** Ordered list of renderable [key, field] pairs (skips unsupported fields). */\nexport function renderableFields(\n\tschema: RequestedSchema | undefined,\n): Array<[string, JsonSchemaField]> {\n\tconst props = schema?.properties;\n\tif (!props) return [];\n\treturn Object.entries(props).filter(([, field]) => !isNestedOrUnsupported(field));\n}\n\n/**\n * Validate a full form. `values` is the raw widget-value map (pre-coercion).\n * Returns a `{ key: error }` map (empty when the form is valid).\n */\nexport function validateForm(\n\tschema: RequestedSchema | undefined,\n\tvalues: Record<string, unknown>,\n): Record<string, string> {\n\tconst errors: Record<string, string> = {};\n\tfor (const [key, field] of renderableFields(schema)) {\n\t\tconst coerced = coerceValue(field, values[key]);\n\t\tconst err = validateField(field, coerced, isRequired(schema, key));\n\t\tif (err) errors[key] = err;\n\t}\n\treturn errors;\n}\n\n/**\n * Build the schema-typed `content` object to POST on submit. Only fields\n * present in the schema are included; blank/undefined values are omitted.\n */\nexport function buildContent(\n\tschema: RequestedSchema | undefined,\n\tvalues: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst content: Record<string, unknown> = {};\n\tfor (const [key, field] of renderableFields(schema)) {\n\t\tconst coerced = coerceValue(field, values[key]);\n\t\tif (coerced !== undefined) content[key] = coerced;\n\t}\n\treturn content;\n}\n","import type { MessageAttachment, MessageDisplay, MessageFeedbackState } from \"../types\";\n\n/** Input attachment as returned by execution history / conversation message APIs. */\nexport type ExecutionHistoryAttachment = {\n\tfilename: string;\n\tmimeType: string;\n\turl?: string | null;\n\texpiresInSeconds?: number | null;\n};\n\n/** One execution turn from GET /api/conversations/sessions/{id}/messages (and similar). */\nexport type ExecutionHistoryMessage = {\n\tid: string;\n\tsessionUserIntent: string;\n\tagentResponse?: string | null;\n\tstatus: string;\n\tfeedback?: { feedback: string; details?: string | null } | null;\n\tattachments?: ExecutionHistoryAttachment[] | null;\n\tstartTime: string;\n\tendTime: string;\n\texecutionId?: string;\n\ttraceId?: string;\n};\n\nconst ATTACHMENTS_SUFFIX_RE = /\\n\\n\\[Attachments:[^\\]]*\\]\\s*$/;\n\n/**\n * Removes the server-appended attachments summary from `sessionUserIntent`\n * when attachment blocks are rendered separately in the UI.\n */\nexport function stripAttachmentsSuffixFromIntent(intent: string): string {\n\treturn intent.replace(ATTACHMENTS_SUFFIX_RE, \"\").trimEnd();\n}\n\nfunction mapFeedback(\n\tfeedback: ExecutionHistoryMessage[\"feedback\"],\n): MessageFeedbackState | null {\n\tif (!feedback?.feedback) return null;\n\treturn feedback.feedback === \"POSITIVE\" ? \"up\" : \"down\";\n}\n\nfunction mapHistoryAttachments(\n\texecutionId: string,\n\tattachments: ExecutionHistoryAttachment[] | null | undefined,\n): MessageAttachment[] | undefined {\n\tconst mapped = (attachments ?? []).map((attachment, index) => ({\n\t\tid: `${executionId}:att:${index}`,\n\t\tfilename: attachment.filename,\n\t\tmimeType: attachment.mimeType,\n\t\turl: attachment.url ?? undefined,\n\t\tkind: attachment.mimeType.startsWith(\"image/\")\n\t\t\t? (\"image\" as const)\n\t\t\t: (\"file\" as const),\n\t}));\n\treturn mapped.length > 0 ? mapped : undefined;\n}\n\n/**\n * Map one execution history row into user (+ optional assistant) chat messages.\n */\nexport function mapExecutionHistoryToChatMessages(\n\tmessage: ExecutionHistoryMessage,\n): MessageDisplay[] {\n\tconst timestamp = message.startTime || message.endTime || new Date().toISOString();\n\tconst executionId = message.executionId ?? message.traceId ?? message.id;\n\tconst attachments = mapHistoryAttachments(message.id, message.attachments);\n\n\tconst rows: MessageDisplay[] = [\n\t\t{\n\t\t\tid: `${message.id}:user`,\n\t\t\trole: \"user\",\n\t\t\tcontent: stripAttachmentsSuffixFromIntent(message.sessionUserIntent),\n\t\t\ttimestamp,\n\t\t\tattachments,\n\t\t},\n\t];\n\n\tif (message.agentResponse) {\n\t\trows.push({\n\t\t\tid: `${message.id}:assistant`,\n\t\t\trole: \"assistant\",\n\t\t\tcontent: message.agentResponse,\n\t\t\ttimestamp: message.endTime || timestamp,\n\t\t\tisError: message.status === \"FAILED\",\n\t\t\texecutionId,\n\t\t\tfeedback: mapFeedback(message.feedback),\n\t\t});\n\t}\n\n\treturn rows;\n}\n\n/** Map a page of execution history rows into flat chat messages. */\nexport function mapExecutionHistoryPageToChatMessages(\n\tmessages: ExecutionHistoryMessage[],\n): MessageDisplay[] {\n\treturn messages.flatMap(mapExecutionHistoryToChatMessages);\n}\n","import type { MessageAttachment } from \"../types\";\n\n/** Local blob URL or signed download URL for rendering an attachment. */\nexport function attachmentDisplayUrl(\n\tattachment: Pick<MessageAttachment, \"previewUrl\" | \"url\">,\n): string | undefined {\n\treturn attachment.previewUrl ?? attachment.url;\n}\n\nexport function isImageAttachment(\n\tattachment: Pick<MessageAttachment, \"kind\" | \"mimeType\" | \"previewUrl\" | \"url\">,\n): boolean {\n\tconst displayUrl = attachmentDisplayUrl(attachment);\n\treturn (\n\t\tattachment.kind === \"image\" ||\n\t\t(Boolean(displayUrl) && attachment.mimeType.startsWith(\"image/\"))\n\t);\n}\n\n/** True when filename / mime indicate a PDF (URL-based checks need `isPdfUrl`). */\nexport function isPdfAttachmentMeta(\n\tattachment: Pick<MessageAttachment, \"filename\" | \"mimeType\">,\n): boolean {\n\treturn (\n\t\tattachment.mimeType === \"application/pdf\" ||\n\t\t/\\.pdf$/i.test(attachment.filename)\n\t);\n}\n\nexport function isPdfFile(file: File): boolean {\n\treturn file.type === \"application/pdf\" || /\\.pdf$/i.test(file.name);\n}\n","import { createContext, useContext } from \"react\";\nimport type { MessageDisplay } from \"../types\";\n\nexport interface PaymanChatContextValue {\n\t/**\n\t * Clear all messages and reset the chat\n\t */\n\tresetSession: () => void;\n\n\t/**\n\t * Clear all messages without resetting session ID\n\t */\n\tclearMessages: () => void;\n\n\t/**\n\t * Prepend older messages to the top of the list (e.g. from history pagination)\n\t */\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\n\t/**\n\t * Cancel current streaming operation\n\t */\n\tcancelStream: () => void;\n\n\t/**\n\t * Get current session ID\n\t */\n\tgetSessionId: () => string | undefined;\n\n\t/**\n\t * Get all messages\n\t */\n\tgetMessages: () => MessageDisplay[];\n\n\t/**\n\t * Check if currently waiting for response\n\t */\n\tisWaitingForResponse: boolean;\n\n\t/**\n\t * Open the PDF preview panel with the given URL and title.\n\t * When called, the chat shifts left and the PDF panel slides in from the right.\n\t * Pass `{ auto: true }` for stream auto-open; auto-open is suppressed after the user closes the sheet.\n\t */\n\topenPdfSheet: (href: string, title: string, options?: { auto?: boolean }) => void;\n}\n\nexport const PaymanChatContext = createContext<\n\tPaymanChatContextValue | undefined\n>(undefined);\n\n/**\n * Hook to access PaymanChat controls from parent components\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const chat = usePaymanChat();\n * \n * return (\n * <>\n * <button onClick={chat.resetSession}>Reset</button>\n * <button onClick={chat.clearMessages}>Clear</button>\n * </>\n * );\n * }\n * ```\n */\nexport function usePaymanChat(): PaymanChatContextValue {\n\tconst context = useContext(PaymanChatContext);\n\tif (!context) {\n\t\tthrow new Error(\"usePaymanChat must be used within a PaymanChat component\");\n\t}\n\treturn context;\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes\n */\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","/**\n * Format a timestamp to a readable date/time string\n */\nexport function formatDate(timestamp: string | Date): string {\n\tconst date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n\n\tconst now = new Date();\n\tconst diffMs = now.getTime() - date.getTime();\n\tconst diffMins = Math.floor(diffMs / 60000);\n\tconst diffHours = Math.floor(diffMs / 3600000);\n\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t// Less than a minute\n\tif (diffMins < 1) {\n\t\treturn \"Just now\";\n\t}\n\n\t// Less than an hour\n\tif (diffMins < 60) {\n\t\treturn `${diffMins}m ago`;\n\t}\n\n\t// Less than a day\n\tif (diffHours < 24) {\n\t\treturn `${diffHours}h ago`;\n\t}\n\n\t// Less than a week\n\tif (diffDays < 7) {\n\t\treturn `${diffDays}d ago`;\n\t}\n\n\t// Format as date\n\treturn date.toLocaleDateString(\"en-US\", {\n\t\tmonth: \"short\",\n\t\tday: \"numeric\",\n\t\tyear: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n\t});\n}\n\nexport function formatElapsedTime(ms?: number): string {\n\tif (!ms) return \"\";\n\tif (ms < 1000) return `${ms}ms`;\n\treturn `${(ms / 1000).toFixed(1)}s`;\n}\n","import * as Sentry from \"@sentry/react\";\n\nexport interface ChatSessionContext {\n\tsessionId?: string;\n\tsessionOwnerId?: string;\n\tagentId?: string;\n\texecutionId?: string;\n\tcfRay?: string;\n\troute?: string;\n\tcustomerId?: string;\n\tcustomerEmail?: string;\n}\n\n/**\n * Reports an error to Sentry enriched with chat session context.\n * Tags and context are scoped to this event so they don't leak\n * to unrelated errors.\n *\n * No-op when Sentry is not initialised.\n */\nexport function captureSentryError(\n\terror: Error | string,\n\tcontext: ChatSessionContext\n): void {\n\tif (!Sentry.getClient()) return;\n\n\tconst tags: Record<string, string> = {};\n\tif (context.executionId) tags.executionId = context.executionId;\n\tif (context.sessionId) tags.sessionId = context.sessionId;\n\tif (context.route) tags.route = context.route;\n\tif (context.cfRay) tags.cfRay = context.cfRay;\n\n\tif (context.customerId) tags.customerId = context.customerId;\n\tif (context.customerEmail) tags.customerEmail = context.customerEmail;\n\n\tconst contexts = {\n\t\tchat_session: {\n\t\t\tsessionId: context.sessionId ?? null,\n\t\t\tsessionOwnerId: context.sessionOwnerId ?? null,\n\t\t\texecutionId: context.executionId ?? null,\n\t\t\tagentId: context.agentId ?? null,\n\t\t\tcfRay: context.cfRay ?? null,\n\t\t\tcustomerId: context.customerId ?? null,\n\t\t\tcustomerEmail: context.customerEmail ?? null,\n\t\t},\n\t};\n\n\tif (typeof error === \"string\") {\n\t\tSentry.captureMessage(error, { level: \"error\", tags, contexts });\n\t} else {\n\t\tSentry.captureException(error, { tags, contexts });\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Targeted fetch interceptor for capturing cf-ray headers\n// ---------------------------------------------------------------------------\n\ntype CfRayListener = (cfRay: string) => void;\n\ninterface InterceptorEntry {\n\turlPattern: string;\n\tlistener: CfRayListener;\n}\n\nconst interceptors: Set<InterceptorEntry> = new Set();\nlet originalFetch: typeof globalThis.fetch | null = null;\n\nfunction patchFetch(): void {\n\tif (originalFetch !== null) return;\n\tif (typeof globalThis === \"undefined\" || typeof globalThis.fetch !== \"function\")\n\t\treturn;\n\n\toriginalFetch = globalThis.fetch;\n\n\tglobalThis.fetch = async function (\n\t\tthis: typeof globalThis,\n\t\tinput: RequestInfo | URL,\n\t\tinit?: RequestInit\n\t): Promise<Response> {\n\t\tconst response = await originalFetch!.call(this, input, init);\n\n\t\tif (interceptors.size > 0) {\n\t\t\tconst url =\n\t\t\t\ttypeof input === \"string\"\n\t\t\t\t\t? input\n\t\t\t\t\t: input instanceof URL\n\t\t\t\t\t\t? input.href\n\t\t\t\t\t\t: (input as Request).url;\n\n\t\t\ttry {\n\t\t\t\tconst cfRay = response.headers.get(\"cf-ray\");\n\t\t\t\tif (cfRay) {\n\t\t\t\t\tfor (const entry of interceptors) {\n\t\t\t\t\t\tif (url.includes(entry.urlPattern)) {\n\t\t\t\t\t\t\tentry.listener(cfRay);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// headers may be inaccessible on opaque responses\n\t\t\t}\n\t\t}\n\n\t\treturn response;\n\t};\n}\n\nfunction maybeUnpatchFetch(): void {\n\tif (interceptors.size > 0 || originalFetch === null) return;\n\tglobalThis.fetch = originalFetch;\n\toriginalFetch = null;\n}\n\n/**\n * Registers a listener that receives the `cf-ray` header value whenever a\n * fetch response URL contains `urlPattern`.\n *\n * Returns an unsubscribe function (call on unmount).\n */\nexport function subscribeToCfRay(\n\turlPattern: string,\n\tlistener: CfRayListener\n): () => void {\n\tconst entry: InterceptorEntry = { urlPattern, listener };\n\tpatchFetch();\n\tinterceptors.add(entry);\n\treturn () => {\n\t\tinterceptors.delete(entry);\n\t\tmaybeUnpatchFetch();\n\t};\n}\n","import type { ChatAttachmentConfig, ChatConfig } from \"../types\";\n\nexport type ResolvedChatAttachmentConfig = {\n\tshowAttachmentButton: boolean;\n\tshowUploadImageButton: boolean;\n\tshowAttachFileButton: boolean;\n\tmaxCount?: number;\n\tmaxFileBytes?: number;\n\tmaxTotalBytes?: number;\n\tallowedImageExtensions: string[];\n\tallowedFileExtensions: string[];\n};\n\nconst DEFAULT_IMAGE_EXTENSIONS = [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\"];\nconst DEFAULT_DOCUMENT_EXTENSIONS = [\"pdf\", \"docx\", \"xlsx\", \"xls\"];\n\n/**\n * Merges `config.attachments` with legacy flat toggles on `ChatConfig`.\n * Nested `attachments` values win when both are set.\n */\nexport function resolveChatAttachmentConfig(\n\tconfig: Pick<\n\t\tChatConfig,\n\t\t| \"attachments\"\n\t\t| \"showAttachmentButton\"\n\t\t| \"showUploadImageButton\"\n\t\t| \"showAttachFileButton\"\n\t>,\n): ResolvedChatAttachmentConfig {\n\tconst nested: ChatAttachmentConfig | undefined = config.attachments;\n\tconst enabled = nested?.enabled ?? config.showAttachmentButton ?? true;\n\tconst uploadImage = nested?.uploadImage ?? config.showUploadImageButton ?? true;\n\tconst attachFile = nested?.attachFile ?? config.showAttachFileButton ?? true;\n\n\treturn {\n\t\tshowAttachmentButton: enabled && (uploadImage || attachFile),\n\t\tshowUploadImageButton: enabled && uploadImage,\n\t\tshowAttachFileButton: enabled && attachFile,\n\t\tmaxCount: nested?.maxCount ?? nested?.maxImages ?? nested?.maxDocuments,\n\t\tmaxFileBytes: nested?.maxFileBytes,\n\t\tmaxTotalBytes: nested?.maxTotalBytes,\n\t\tallowedImageExtensions:\n\t\t\tnested?.imageExtensions ?? DEFAULT_IMAGE_EXTENSIONS,\n\t\tallowedFileExtensions:\n\t\t\tnested?.documentExtensions ?? DEFAULT_DOCUMENT_EXTENSIONS,\n\t};\n}\n","/** Human-readable byte size for attachment limit hints. */\nexport function formatAttachmentBytes(bytes: number): string {\n\tif (!Number.isFinite(bytes) || bytes <= 0) return \"0 B\";\n\tconst units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n\tlet value = bytes;\n\tlet unitIndex = 0;\n\twhile (value >= 1024 && unitIndex < units.length - 1) {\n\t\tvalue /= 1024;\n\t\tunitIndex += 1;\n\t}\n\tconst rounded =\n\t\tunitIndex === 0\n\t\t\t? String(Math.round(value))\n\t\t\t: value >= 10\n\t\t\t\t? value.toFixed(0)\n\t\t\t\t: value.toFixed(1).replace(/\\.0$/, \"\");\n\treturn `${rounded} ${units[unitIndex]}`;\n}\n","/** Parse filename from Azure `rscd` / `response-content-disposition` query values. */\nfunction filenameFromContentDisposition(value: string | null | undefined): string | undefined {\n\tif (!value) return undefined;\n\tlet decoded = value;\n\ttry {\n\t\tdecoded = decodeURIComponent(value);\n\t} catch {\n\t\tdecoded = value;\n\t}\n\tconst quoted = decoded.match(/filename\\*=(?:UTF-8''([^;]+)|\"([^\"]+)\")/i);\n\tif (quoted?.[1] || quoted?.[2]) {\n\t\treturn (quoted[1] ?? quoted[2])?.trim();\n\t}\n\tconst unquoted = decoded.match(/filename=([^;]+)/i);\n\treturn unquoted?.[1]?.replace(/\"/g, \"\").trim();\n}\n\nfunction filenameFromUrlPath(href: string): string | undefined {\n\ttry {\n\t\tconst parts = new URL(href).pathname.split(\"/\").filter(Boolean);\n\t\tconst last = parts[parts.length - 1];\n\t\treturn last ? decodeURIComponent(last) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** True when a markdown link href points at a PDF (incl. Azure blob signed URLs). */\nexport function isPdfUrl(href: string): boolean {\n\tif (!href) return false;\n\n\tconst lower = href.toLowerCase();\n\tif (lower.includes(\".pdf\")) return true;\n\n\ttry {\n\t\tconst url = new URL(href);\n\t\tif (url.pathname.toLowerCase().endsWith(\".pdf\")) return true;\n\n\t\tconst filename = url.searchParams.get(\"filename\");\n\t\tif (filename?.toLowerCase().includes(\".pdf\")) return true;\n\n\t\tfor (const key of [\"rscd\", \"response-content-disposition\"] as const) {\n\t\t\tconst fromDisposition = filenameFromContentDisposition(\n\t\t\t\turl.searchParams.get(key),\n\t\t\t);\n\t\t\tif (fromDisposition?.toLowerCase().includes(\".pdf\")) return true;\n\t\t}\n\t} catch {\n\t\treturn lower.endsWith(\".pdf\");\n\t}\n\n\treturn false;\n}\n\n/** Title for the PDF preview sheet — prefers link text, then filename from URL. */\nexport function getPdfTitleFromUrl(href: string, linkText?: string): string {\n\tconst text = linkText?.trim();\n\tif (text) return text;\n\n\ttry {\n\t\tconst url = new URL(href);\n\t\tconst filename = url.searchParams.get(\"filename\");\n\t\tif (filename) {\n\t\t\treturn filename\n\t\t\t\t.replace(/\\.pdf$/i, \"\")\n\t\t\t\t.replace(/[-_]+/g, \" \")\n\t\t\t\t.trim();\n\t\t}\n\t\tfor (const key of [\"rscd\", \"response-content-disposition\"] as const) {\n\t\t\tconst fromDisposition = filenameFromContentDisposition(\n\t\t\t\turl.searchParams.get(key),\n\t\t\t);\n\t\t\tif (fromDisposition) {\n\t\t\t\treturn fromDisposition\n\t\t\t\t\t.replace(/\\.pdf$/i, \"\")\n\t\t\t\t\t.replace(/[-_]+/g, \" \")\n\t\t\t\t\t.trim();\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// fall through\n\t}\n\n\tconst fromPath = filenameFromUrlPath(href);\n\tif (fromPath) {\n\t\treturn fromPath.replace(/\\.pdf$/i, \"\").replace(/[-_]+/g, \" \").trim();\n\t}\n\n\treturn \"Document\";\n}\n","import type { SlashCommandConfig } from \"../types\";\n\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandConfig[] = [\n\t{\n\t\tname: \"/draft-knowledge\",\n\t\tdescription: \"Create a Knowledge Vault draft for admin review\",\n\t\trequiredAnyPermissions: [\"vault:author\", \"vault:publish\"],\n\t},\n];\n\nfunction hasCommandPermission(\n\tgranted: Set<string>,\n\trequiredPermission: string,\n): boolean {\n\tif (granted.has(\"*\") || granted.has(requiredPermission)) return true;\n\tif (!requiredPermission.includes(\".\")) return false;\n\tconst wildcard =\n\t\trequiredPermission.substring(0, requiredPermission.lastIndexOf(\".\")) + \".*\";\n\treturn granted.has(wildcard);\n}\n\nexport function filterSlashCommands(\n\tcommands: SlashCommandConfig[],\n\tpermissions: string[] | undefined,\n): SlashCommandConfig[] {\n\tconst granted = new Set(permissions ?? []);\n\treturn commands.filter((command) => {\n\t\tconst required = command.requiredAnyPermissions ?? [];\n\t\treturn (\n\t\t\trequired.length === 0 ||\n\t\t\trequired.some((permission) => hasCommandPermission(granted, permission))\n\t\t);\n\t});\n}\n\nexport function parseSlashCommand(content: string): {\n\tcommand: string;\n\tbody: string;\n} | null {\n\tconst trimmedStart = content.trimStart();\n\tif (!trimmedStart.startsWith(\"/\")) return null;\n\tconst match = trimmedStart.match(/^(\\/[a-z][a-z0-9-]*)(?:\\s+([\\s\\S]*))?$/i);\n\tif (!match) return null;\n\treturn {\n\t\tcommand: match[1],\n\t\tbody: match[2] ?? \"\",\n\t};\n}\n\nexport function getSlashCommandValidationHint(content: string): string | null {\n\tconst parsed = parseSlashCommand(content);\n\tif (parsed?.command !== \"/draft-knowledge\") return null;\n\n\tconst lines = parsed.body.split(/\\r?\\n/);\n\tconst title = lines[0]?.trim() ?? \"\";\n\tconst markdownContent = lines.slice(1).join(\"\\n\").trim();\n\n\tif (!title) {\n\t\treturn \"Add a title after /draft-knowledge, then add markdown content on the next line.\";\n\t}\n\tif (!markdownContent) {\n\t\treturn \"Add markdown content on a new line below the title.\";\n\t}\n\treturn null;\n}\n","const WORKFLOW_FAILED = \"WORKFLOW_FAILED\";\nconst STREAM_NOT_STARTED = \"STREAM_NOT_STARTED\";\nconst HTTP_ERROR_PREFIX = /^HTTP\\s+(\\d+)\\s*:\\s*([\\s\\S]+)$/;\n\ntype ErrorPayload = {\n\tstatus?: number;\n\tmessage?: string;\n};\n\nexport function isFriendlyWorkflowError(errorDetails?: string): boolean {\n\tif (!errorDetails) return false;\n\n\treturn (\n\t\terrorDetails === WORKFLOW_FAILED ||\n\t\terrorDetails === STREAM_NOT_STARTED ||\n\t\terrorDetails.includes(WORKFLOW_FAILED)\n\t);\n}\n\nfunction parseErrorPayload(payload: string): ErrorPayload {\n\ttry {\n\t\tconst parsed = JSON.parse(payload) as unknown;\n\n\t\tif (typeof parsed === \"string\") {\n\t\t\treturn { message: parsed.trim() || undefined };\n\t\t}\n\n\t\tif (typeof parsed === \"object\" && parsed !== null) {\n\t\t\tconst record = parsed as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tstatus:\n\t\t\t\t\ttypeof record.status === \"number\" ? record.status : undefined,\n\t\t\t\tmessage:\n\t\t\t\t\ttypeof record.message === \"string\" && record.message.trim()\n\t\t\t\t\t\t? record.message.trim()\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// Ignore invalid JSON payloads and fall back to plain-text handling.\n\t}\n\n\treturn {};\n}\n\nexport function getConflictErrorMessage(errorDetails?: string): string | undefined {\n\tif (!errorDetails) return undefined;\n\n\tconst trimmedError = errorDetails.trim();\n\tconst httpMatch = trimmedError.match(HTTP_ERROR_PREFIX);\n\tconst httpStatus = httpMatch ? Number(httpMatch[1]) : undefined;\n\tconst rawPayload = (httpMatch ? httpMatch[2] : trimmedError).trim();\n\tconst payload = parseErrorPayload(rawPayload);\n\tconst status = payload.status ?? httpStatus;\n\n\tif (status !== 409) {\n\t\treturn undefined;\n\t}\n\n\tif (payload.message) {\n\t\treturn payload.message;\n\t}\n\n\treturn rawPayload || undefined;\n}\n","import * as Sentry from \"@sentry/react\";\n\n/**\n * Initialise Sentry inside the SDK.\n * Only runs when a DSN is provided and Sentry has not already been initialised\n * by the host application, so it is safe to call even if the host also calls\n * Sentry.init().\n */\nexport function initSentryIfNeeded(dsn: string): void {\n\tif (!dsn) return;\n\n\t// getClient() returns undefined when Sentry has not been initialised yet\n\tif (Sentry.getClient()) return;\n\n\tSentry.init({\n\t\tdsn,\n\t\tsendDefaultPii: true,\n\t\tinitialScope: {\n\t\t\ttags: { source: \"payman-ask-sdk\" },\n\t\t},\n\t});\n}\n","// Feedback persistence for assistant responses. A thumbs-up is `POSITIVE`;\n// a thumbs-down resolves to one specific negative reason. The values mirror\n// the backend `Feedback` enum exactly — do not rename without changing the\n// k2-server enum (cloud.yaak.core.model.enums.Feedback).\n\nexport const NEGATIVE_FEEDBACK_REASONS = [\n\t{ value: \"NOT_FACTUALLY_CORRECT\", label: \"Not factually correct\" },\n\t{ value: \"INCOMPLETE_RESPONSE\", label: \"Incomplete response\" },\n\t{ value: \"DID_NOT_FOLLOW_REQUEST\", label: \"Did not follow my request\" },\n\t{ value: \"OVERACTIVE_REFUSAL\", label: \"Refused unnecessarily\" },\n\t{ value: \"ISSUE_WITH_THOUGHT_PROCESS\", label: \"Issue with reasoning\" },\n\t{ value: \"REPORT_CONTENT\", label: \"Report content\" },\n\t{ value: \"OTHER\", label: \"Other\" },\n] as const;\n\nexport type NegativeFeedbackReason =\n\t(typeof NEGATIVE_FEEDBACK_REASONS)[number][\"value\"];\n\n/** The full feedback value sent to the backend. */\nexport type FeedbackValue = \"POSITIVE\" | NegativeFeedbackReason;\n\nconst DEFAULT_STREAM_ENDPOINT = \"/api/playground/ask/stream\";\n\n/**\n * Handler threaded down to the message components. Resolves when the\n * feedback is durably saved and rejects when the POST fails, so the UI can\n * revert its optimistic state or surface an error.\n */\nexport type SubmitFeedbackHandler = (data: {\n\tmessageId: string;\n\texecutionId?: string;\n\tfeedback: FeedbackValue;\n\tdetails?: string;\n}) => Promise<void>;\n\nexport type SubmitFeedbackArgs = {\n\tbaseUrl: string;\n\t/**\n\t * The chat's streamEndpoint. The feedback path is derived from it the same\n\t * way the SDK derives other sub-resources (strip the trailing `/stream`,\n\t * append `/executions/{id}/feedback`) so it lands on the matching surface:\n\t * /api/playground/ask/stream → /api/playground/ask/executions/{id}/feedback (JWT)\n\t * /api/ask/stream → /api/ask/executions/{id}/feedback (api key)\n\t */\n\tstreamEndpoint?: string;\n\t/** Auth — mirrors buildRequestHeaders: custom headers + optional Bearer. */\n\theaders?: Record<string, string>;\n\tauthToken?: string;\n\t/** Deployment stage, forwarded as a query param like the stream call. */\n\tstage?: string;\n\tstageQueryParam?: string;\n\texecutionId: string;\n\tfeedback: FeedbackValue;\n\tdetails?: string;\n\tsignal?: AbortSignal;\n};\n\n/**\n * POST feedback for one execution. Resolves the URL and auth from the same\n * config the chat stream uses, so it works on both the JWT playground surface\n * and the API-key /api/ask surface. Throws on a non-2xx response.\n */\nexport async function submitFeedback({\n\tbaseUrl,\n\tstreamEndpoint,\n\theaders,\n\tauthToken,\n\tstage,\n\tstageQueryParam,\n\texecutionId,\n\tfeedback,\n\tdetails,\n\tsignal,\n}: SubmitFeedbackArgs): Promise<void> {\n\tconst base = baseUrl.replace(/\\/+$/, \"\");\n\tconst endpointPath = (streamEndpoint || DEFAULT_STREAM_ENDPOINT)\n\t\t.split(\"?\")[0]\n\t\t.replace(/\\/+$/, \"\");\n\tconst basePath = endpointPath.endsWith(\"/stream\")\n\t\t? endpointPath.slice(0, -\"/stream\".length)\n\t\t: endpointPath;\n\n\tconst query = new URLSearchParams();\n\tif (stage) query.set(stageQueryParam ?? \"stage\", stage);\n\tconst qs = query.toString() ? `?${query.toString()}` : \"\";\n\n\tconst url = `${base}${basePath}/executions/${encodeURIComponent(executionId)}/feedback${qs}`;\n\n\tconst requestHeaders: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\tAccept: \"application/json\",\n\t\t...(headers ?? {}),\n\t};\n\tif (authToken) requestHeaders.Authorization = `Bearer ${authToken}`;\n\n\tconst resp = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: requestHeaders,\n\t\tbody: JSON.stringify(details ? { feedback, details } : { feedback }),\n\t\tsignal,\n\t});\n\tif (!resp.ok) {\n\t\tthrow new Error(`Feedback failed: ${resp.status} ${resp.statusText}`);\n\t}\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { Loader2, X } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype ImageLightboxProps = {\n\tsrc: string;\n\talt?: string;\n\tonClose: () => void;\n};\n\nexport function ImageLightbox({\n\tsrc,\n\talt = \"\",\n\tonClose,\n}: ImageLightboxProps) {\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst [isImageLoaded, setIsImageLoaded] = useState(false);\n\tconst overlayStyle: CSSProperties = {\n\t\tposition: \"fixed\",\n\t\tinset: 0,\n\t\tzIndex: 2147483647,\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\tpadding: 16,\n\t\tbackground: \"rgba(2, 6, 23, 0.92)\",\n\t\tisolation: \"isolate\",\n\t};\n\tconst frameStyle: CSSProperties = {\n\t\tposition: \"relative\",\n\t\twidth: \"min(92vw, 1280px)\",\n\t\theight: \"min(88vh, 920px)\",\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tjustifyContent: \"center\",\n\t\toverflow: \"hidden\",\n\t};\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t\treturn () => setIsMounted(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetIsImageLoaded(false);\n\t}, [src]);\n\n\tuseEffect(() => {\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (typeof document === \"undefined\") return;\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t};\n\t}, [onClose]);\n\n\tif (!isMounted || typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t<motion.div\n\t\t\t\tstyle={overlayStyle}\n\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\tonClick={onClose}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tclassName=\"absolute top-4 right-4 z-[1] flex h-9 w-9 items-center justify-center rounded-full bg-black/60 text-white/90 transition-colors hover:bg-black/75\"\n\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<div style={frameStyle} onClick={(event) => event.stopPropagation()}>\n\t\t\t\t\t{!isImageLoaded ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2\">\n\t\t\t\t\t\t\t<Loader2 className=\"h-5 w-5 animate-spin text-white/80\" />\n\t\t\t\t\t\t\t<p className=\"text-sm font-medium text-white/90\">\n\t\t\t\t\t\t\t\tLoading image\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-xs text-white/60\">Reference image</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\n\t\t\t\t\t<div className=\"flex h-full w-full items-center justify-center p-3 sm:p-4\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\tonLoad={() => setIsImageLoaded(true)}\n\t\t\t\t\t\t\tclassName={`block h-full w-full rounded-xl object-contain shadow-2xl transition-opacity duration-200 ${\n\t\t\t\t\t\t\t\tisImageLoaded ? \"opacity-100\" : \"opacity-0\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</AnimatePresence>,\n\t\tdocument.body,\n\t);\n}\n","import { Loader2 } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ImageLightbox } from \"./ImageLightbox\";\n\nconst RAG_IMAGE_PATH_REGEX =\n\t/^(?:https?:\\/\\/[^/\\s]+)?\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image(?:[?#][^\"'\\s]*)?$/;\n\nfunction isUnresolvedRagImageSource(src: string) {\n\treturn RAG_IMAGE_PATH_REGEX.test(src);\n}\n\nfunction LoadingImageCard({\n\tlabel,\n\tdescription,\n}: {\n\tlabel: string;\n\tdescription: string;\n}) {\n\treturn (\n\t\t<span className=\"my-3 flex min-h-36 w-full flex-col items-center justify-center gap-2 px-4 py-5 text-center\">\n\t\t\t<Loader2 className=\"h-5 w-5 animate-spin text-slate-500 dark:text-slate-300\" />\n\t\t\t<span className=\"text-xs font-medium text-slate-600 dark:text-slate-200\">\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span className=\"text-[11px] leading-relaxed text-slate-500/90 dark:text-slate-300/80\">\n\t\t\t\t{description}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nfunction BrokenImageCard({ alt }: { alt?: string }) {\n\treturn (\n\t\t<span className=\"my-3 flex min-h-44 w-full flex-col items-center justify-center gap-2 rounded-xl border border-dashed border-red-200 bg-red-50/60 px-4 py-5 text-center dark:border-red-900/40 dark:bg-red-950/20\">\n\t\t\t<span className=\"text-xs font-medium text-red-600 dark:text-red-300\">\n\t\t\t\tUnable to load image\n\t\t\t</span>\n\t\t\t{alt ? (\n\t\t\t\t<span className=\"max-w-sm text-[11px] leading-relaxed text-red-500/80 dark:text-red-200/80\">\n\t\t\t\t\t{alt}\n\t\t\t\t</span>\n\t\t\t) : null}\n\t\t</span>\n\t);\n}\n\ntype MarkdownImageProps = {\n\tsrc?: string;\n\talt?: string;\n\tisResolving?: boolean;\n};\n\nexport function MarkdownImage({\n\tsrc,\n\talt,\n\tisResolving = false,\n}: MarkdownImageProps) {\n\tconst imageFrameStyle: CSSProperties = {\n\t\twidth: \"min(100%, 32rem)\",\n\t\tmaxWidth: \"100%\",\n\t};\n\tconst imageStyle: CSSProperties = {\n\t\tdisplay: \"block\",\n\t\twidth: \"100%\",\n\t\theight: \"auto\",\n\t\tmaxWidth: \"100%\",\n\t\tmaxHeight: \"18rem\",\n\t\tobjectFit: \"contain\",\n\t};\n\tconst [isLoaded, setIsLoaded] = useState(false);\n\tconst [hasError, setHasError] = useState(false);\n\tconst [isLightboxOpen, setIsLightboxOpen] = useState(false);\n\tconst isUnresolvedRagImage = useMemo(\n\t\t() => (src ? isUnresolvedRagImageSource(src) : false),\n\t\t[src]\n\t);\n\tconst isResolvingRagImage = isResolving && isUnresolvedRagImage;\n\n\tuseEffect(() => {\n\t\tsetIsLoaded(false);\n\t\tsetHasError(false);\n\t\tsetIsLightboxOpen(false);\n\t}, [src]);\n\n\tif (!src) {\n\t\treturn null;\n\t}\n\n\tif (isResolvingRagImage) {\n\t\treturn (\n\t\t\t<LoadingImageCard label=\"Loading image\" description=\"Reference image\" />\n\t\t);\n\t}\n\n\tif (hasError) {\n\t\treturn <BrokenImageCard alt={alt} />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<span className=\"my-3 block w-full\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\t\tsetIsLightboxOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!isLoaded}\n\t\t\t\t\taria-busy={!isLoaded}\n\t\t\t\t\tclassName=\"group relative mx-auto flex w-full items-center justify-center overflow-hidden rounded-xl bg-black/[0.03] px-3 py-3 text-left transition-colors hover:bg-black/[0.05] disabled:cursor-wait disabled:hover:bg-black/[0.03] dark:bg-white/[0.03] dark:hover:bg-white/[0.05] dark:disabled:hover:bg-white/[0.03]\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...imageFrameStyle,\n\t\t\t\t\t\t...(!isLoaded ? { minHeight: \"9rem\" } : {}),\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\talt={alt || \"\"}\n\t\t\t\t\t\tclassName={`relative z-[1] block h-auto max-h-[22rem] w-full max-w-full rounded-lg object-contain transition-opacity duration-200 ${\n\t\t\t\t\t\t\tisLoaded ? \"opacity-100\" : \"opacity-0\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t\tstyle={imageStyle}\n\t\t\t\t\t\tonLoad={() => {\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetIsLoaded(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonError={() => {\n\t\t\t\t\t\t\tsetIsLoaded(false);\n\t\t\t\t\t\t\tsetHasError(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t</span>\n\n\t\t\t{isLightboxOpen && isLoaded ? (\n\t\t\t\t<ImageLightbox\n\t\t\t\t\tsrc={src}\n\t\t\t\t\talt={alt}\n\t\t\t\t\tonClose={() => setIsLightboxOpen(false)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n","import type { Components } from \"react-markdown\";\nimport { MarkdownImage } from \"./MarkdownImage\";\n\ntype CreateMarkdownComponentsOptions = {\n\tisResolvingImages?: boolean;\n};\n\nexport function createMarkdownComponents(\n\toptions: CreateMarkdownComponentsOptions = {},\n): Components {\n\treturn {\n\t\tp: ({ children }) => (\n\t\t\t<p className=\"mb-3 last:mb-0 text-sm leading-relaxed\">{children}</p>\n\t\t),\n\t\tcode: ({ className: codeClassName, children }) => {\n\t\t\tconst isInline = !codeClassName;\n\n\t\t\treturn isInline ? (\n\t\t\t\t<code className=\"payman-agent-code-inline rounded-md px-1.5 py-0.5 font-mono text-xs break-all\">\n\t\t\t\t\t{children}\n\t\t\t\t</code>\n\t\t\t) : (\n\t\t\t\t<code className=\"payman-agent-code-block my-2 block overflow-x-auto rounded-lg p-3 font-mono text-xs whitespace-pre\">\n\t\t\t\t\t{children}\n\t\t\t\t</code>\n\t\t\t);\n\t\t},\n\t\tpre: ({ children }) => (\n\t\t\t<pre className=\"my-2 max-w-full overflow-x-auto rounded-lg\">\n\t\t\t\t{children}\n\t\t\t</pre>\n\t\t),\n\t\tul: ({ children }) => (\n\t\t\t<ul className=\"mb-3 ml-4 list-disc space-y-1 text-sm\">{children}</ul>\n\t\t),\n\t\tol: ({ children }) => (\n\t\t\t<ol className=\"mb-3 ml-4 list-decimal space-y-1 text-sm\">{children}</ol>\n\t\t),\n\t\tli: ({ children }) => <li className=\"text-sm leading-relaxed\">{children}</li>,\n\t\th1: ({ children }) => (\n\t\t\t<h1 className=\"mt-4 mb-2 text-lg font-semibold first:mt-0\">{children}</h1>\n\t\t),\n\t\th2: ({ children }) => (\n\t\t\t<h2 className=\"mt-3 mb-2 text-base font-semibold first:mt-0\">\n\t\t\t\t{children}\n\t\t\t</h2>\n\t\t),\n\t\th3: ({ children }) => (\n\t\t\t<h3 className=\"mt-2 mb-1 text-sm font-semibold first:mt-0\">{children}</h3>\n\t\t),\n\t\tstrong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n\t\tem: ({ children }) => <em className=\"italic\">{children}</em>,\n\t\tblockquote: ({ children }) => (\n\t\t\t<blockquote className=\"payman-agent-blockquote my-2 pl-4 italic\">\n\t\t\t\t{children}\n\t\t\t</blockquote>\n\t\t),\n\t\thr: () => <hr className=\"payman-agent-hr my-4\" />,\n\t\ta: ({ href, children }) => (\n\t\t\t<a\n\t\t\t\thref={href}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tclassName=\"payman-agent-link underline decoration-1 underline-offset-2\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t),\n\t\timg: ({ src, alt }) => (\n\t\t\t<MarkdownImage\n\t\t\t\tsrc={typeof src === \"string\" ? src : undefined}\n\t\t\t\talt={typeof alt === \"string\" ? alt : undefined}\n\t\t\t\tisResolving={options.isResolvingImages}\n\t\t\t/>\n\t\t),\n\t\ttable: ({ children }) => (\n\t\t\t<div className=\"relative my-4 -mx-1 w-full overflow-x-auto\">\n\t\t\t\t<table className=\"payman-agent-table min-w-full caption-bottom overflow-hidden rounded-lg text-sm\">\n\t\t\t\t\t{children}\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t),\n\t\tthead: ({ children }) => (\n\t\t\t<thead className=\"payman-agent-thead [&_tr]:border-b\">{children}</thead>\n\t\t),\n\t\ttbody: ({ children }) => (\n\t\t\t<tbody className=\"[&_tr:last-child]:border-0\">{children}</tbody>\n\t\t),\n\t\ttr: ({ children }) => (\n\t\t\t<tr className=\"payman-agent-tr border-b transition-colors\">{children}</tr>\n\t\t),\n\t\tth: ({ children }) => (\n\t\t\t<th className=\"h-10 px-3 text-left align-middle text-xs font-medium whitespace-nowrap\">\n\t\t\t\t{children}\n\t\t\t</th>\n\t\t),\n\t\ttd: ({ children }) => (\n\t\t\t<td className=\"p-3 align-middle text-sm whitespace-nowrap\">{children}</td>\n\t\t),\n\t};\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tBinoculars,\n\tCheck,\n\tChevronRight,\n\tClock,\n\tLoader2,\n\tSparkles,\n\tX,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport type { AgentMessageProps, StreamingStep } from \"../../types\";\nimport { cn } from \"../../utils\";\nimport { createMarkdownComponents } from \"./markdownComponents\";\nimport {\n\tgetConflictErrorMessage,\n\tisFriendlyWorkflowError,\n} from \"../../utils/errorMessages\";\nimport { formatElapsedTime } from \"../../utils/formatDate\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/** Content that looks like a raw error (INTENT_ERROR message) rather than a user-facing workflow response */\nfunction looksLikeRawError(text: string): boolean {\n\tif (!text || text.length < 10) return false;\n\treturn text.includes(\"errorType=\") || /failed:\\s*\\{/.test(text);\n}\n\nexport function AgentMessage({\n\tmessage,\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatar = false,\n\tlayout = \"full-width\",\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n}: AgentMessageProps) {\n\tconst isStreaming = message.isStreaming ?? false;\n\tconst hasSteps = message.steps && message.steps.length > 0;\n\tconst hasTraceData =\n\t\t!!(message.tracingData || message.executionId) && !isStreaming;\n\tconst isCancelled = message.isCancelled ?? false;\n\tconst currentExecutingStepId = message.currentExecutingStepId;\n\n\tconst [isStepsExpanded, setIsStepsExpanded] = useState(false);\n\tconst wasStreamingRef = useRef(isStreaming);\n\n\tuseEffect(() => {\n\t\tif (isStreaming && hasSteps) {\n\t\t\tsetIsStepsExpanded(true);\n\t\t}\n\t\tif (wasStreamingRef.current && !isStreaming) {\n\t\t\tsetIsStepsExpanded(false);\n\t\t}\n\t\twasStreamingRef.current = isStreaming;\n\t}, [isStreaming, hasSteps]);\n\n\tconst totalElapsedMs = hasSteps\n\t\t? message.steps!.reduce((sum, step) => sum + (step.elapsedMs || 0), 0)\n\t\t: 0;\n\n\tconst currentMessage = message.currentMessage;\n\tconst rawContent = message.streamingContent || message.content || \"\";\n\tconst content = rawContent.replace(/\\\\n/g, \"\\n\");\n\t// When workflow completes with a response (e.g. after INTENT_ERROR), prefer that over error UI. Only show friendly error when there's no meaningful response or when content is raw error dump.\n\tconst hasMeaningfulContent =\n\t\tcontent.length > 0 && !looksLikeRawError(content);\n\t// Also show friendly error when workflow completed with no content (e.g. preflight failed, no workflowMsg)\n\tconst completedWithNoContent =\n\t\t!isStreaming &&\n\t\t!isCancelled &&\n\t\tcontent.length === 0 &&\n\t\t(message.streamProgress === \"completed\" || message.streamProgress === \"error\");\n\tconst conflictErrorMessage = getConflictErrorMessage(message.errorDetails);\n\tconst isError =\n\t\t!!conflictErrorMessage ||\n\t\t((isFriendlyWorkflowError(message.errorDetails) ||\n\t\t\tlooksLikeRawError(content)) &&\n\t\t\t!hasMeaningfulContent) ||\n\t\tcompletedWithNoContent;\n\tconst currentStep = useMemo(\n\t\t() =>\n\t\t\tmessage.steps?.find(\n\t\t\t\t(s) => s.id === currentExecutingStepId && s.status === \"in_progress\"\n\t\t\t),\n\t\t[message.steps, currentExecutingStepId]\n\t);\n\tconst markdownRenderers = useMemo(\n\t\t() =>\n\t\t\tcreateMarkdownComponents({\n\t\t\t\tisResolvingImages: message.isResolvingImages,\n\t\t\t}),\n\t\t[message.isResolvingImages],\n\t);\n\n\tconst getStepsLabel = (streaming: boolean) => {\n\t\tconst count = message.steps!.length;\n\t\tconst stepWord = count === 1 ? \"step\" : \"steps\";\n\t\tif (streaming) {\n\t\t\tif (streamingStepsText)\n\t\t\t\treturn streamingStepsText.replace(\"{count}\", count.toString());\n\t\t\treturn `${count} ${stepWord} in progress`;\n\t\t}\n\t\tif (completedStepsText) {\n\t\t\treturn completedStepsText\n\t\t\t\t.replace(\"{count}\", count.toString())\n\t\t\t\t.replace(\"{time}\", (totalElapsedMs / 1000).toFixed(1));\n\t\t}\n\t\treturn `${count} ${stepWord} completed`;\n\t};\n\n\t// All icons in a fixed 4x4 wrapper for alignment\n\tconst renderStepIcon = (\n\t\tstep: StreamingStep,\n\t\tisCurrentlyExecuting: boolean\n\t) => {\n\t\tconst wrapper = \"h-4 w-4 flex items-center justify-center shrink-0\";\n\t\tif (isCurrentlyExecuting)\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Loader2 className=\"h-3.5 w-3.5 payman-agent-step-icon--active animate-spin\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"pending\" && isCancelled)\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<div className=\"h-1.5 w-1.5 rounded-full payman-agent-step-icon--pending\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"pending\" || step.status === \"in_progress\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Loader2 className=\"h-3.5 w-3.5 payman-agent-step-icon--in-progress-dim animate-spin\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"completed\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<Check\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-3.5 w-3.5\",\n\t\t\t\t\t\t\tstep.eventType === \"USER_ACTION_SUCCESS\"\n\t\t\t\t\t\t\t\t? \"payman-agent-step-icon--success\"\n\t\t\t\t\t\t\t\t: \"payman-agent-step-icon--success-dim\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\tif (step.status === \"error\")\n\t\t\treturn (\n\t\t\t\t<div className={wrapper}>\n\t\t\t\t\t<X className=\"h-3.5 w-3.5 payman-agent-step-icon--error\" />\n\t\t\t\t</div>\n\t\t\t);\n\t\treturn (\n\t\t\t<div className={wrapper}>\n\t\t\t\t<div className=\"h-1.5 w-1.5 rounded-full payman-agent-step-icon--pending-dim\" />\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst stepsListContent = hasSteps && (\n\t\t<AnimatePresence initial={false}>\n\t\t\t{isStepsExpanded && (\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ height: 0, opacity: 0 }}\n\t\t\t\t\tanimate={{ height: \"auto\", opacity: 1 }}\n\t\t\t\t\texit={{ height: 0, opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeInOut\" }}\n\t\t\t\t\tclassName=\"overflow-hidden\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"pt-1.5\">\n\t\t\t\t\t\t{message.steps!.map((step) => {\n\t\t\t\t\t\t\tconst isCurrentlyExecuting =\n\t\t\t\t\t\t\t\tstep.id === currentExecutingStepId &&\n\t\t\t\t\t\t\t\tstep.status === \"in_progress\" &&\n\t\t\t\t\t\t\t\tisStreaming &&\n\t\t\t\t\t\t\t\t!isCancelled;\n\t\t\t\t\t\t\tconst hasTime = step.elapsedMs != null && step.elapsedMs > 0;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div key={step.id} className=\"mb-1.5\">\n\t\t\t\t\t\t\t\t\t{/* Step row: icon + message */}\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-px\">\n\t\t\t\t\t\t\t\t\t\t\t{renderStepIcon(step, isCurrentlyExecuting)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"text-xs leading-relaxed min-w-0 break-words\",\n\t\t\t\t\t\t\t\t\t\t\t\tisCurrentlyExecuting && \"shimmer-text font-medium\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"error\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--error\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.eventType === \"USER_ACTION_SUCCESS\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--success\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"completed\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--completed\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"pending\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--pending\",\n\t\t\t\t\t\t\t\t\t\t\t\t!isCurrentlyExecuting &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstep.status === \"in_progress\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-agent-step-text--in-progress\"\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\t\t{step.message}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Time badge — indented to align with step text (16px icon + 6px gap = 22px) */}\n\t\t\t\t\t\t\t\t\t{hasTime && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"pl-[22px] mt-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded-md payman-agent-step-time leading-none\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Clock className=\"h-2.5 w-2.5 shrink-0 payman-agent-step-time-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] font-mono payman-agent-step-time-text\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{formatElapsedTime(step.elapsedMs!)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n\n\tconst stepsToggleRef = useRef<HTMLButtonElement>(null);\n\n\tconst handleStepsToggle = useCallback(() => {\n\t\tsetIsStepsExpanded((prev) => {\n\t\t\tconst next = !prev;\n\t\t\t// Dispatch event so MessageList can scroll to show expanded steps\n\t\t\tif (next) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tstepsToggleRef.current\n\t\t\t\t\t\t?.closest(\".payman-scrollbar\")\n\t\t\t\t\t\t?.dispatchEvent(new CustomEvent(\"payman-steps-toggle\"));\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t}, []);\n\n\tconst stepsToggle = (streaming: boolean) => (\n\t\t<button\n\t\t\tref={stepsToggleRef}\n\t\t\tonClick={handleStepsToggle}\n\t\t\tclassName=\"inline-flex items-center gap-1.5 text-xs payman-agent-step-toggle transition-colors\"\n\t\t>\n\t\t\t<motion.div\n\t\t\t\tanimate={{ rotate: isStepsExpanded ? 90 : 0 }}\n\t\t\t\ttransition={{ duration: 0.15 }}\n\t\t\t\tclassName=\"shrink-0\"\n\t\t\t>\n\t\t\t\t<ChevronRight className=\"h-3 w-3\" />\n\t\t\t</motion.div>\n\t\t\t<span>{getStepsLabel(streaming)}</span>\n\t\t</button>\n\t);\n\n\t// Below-bubble steps section: only after streaming (thinking lives in bubble during stream)\n\tconst showSteps = showExecutionSteps && hasSteps && !isStreaming && !isError;\n\n\tconst messageContent = (\n\t\t<div className=\"w-full\">\n\t\t\t{/* Row: avatar + bubble. Trace button used to live as a\n\t\t\t sibling of the bubble at top-right, but on long markdown\n\t\t\t tables the table extended to the right edge and was\n\t\t\t overlapped by the icon — making the rightmost data\n\t\t\t column unreadable. Now rendered below the bubble next\n\t\t\t to the consumer-supplied timestamp. */}\n\t\t\t<div className=\"flex gap-3 justify-start items-start w-full\">\n\t\t\t\t{/* Avatar */}\n\t\t\t\t{showAvatar && (\n\t\t\t\t\t<div className=\"shrink-0 mt-0.5\">\n\t\t\t\t\t\t{isStreaming && showStreamingDot ? (\n\t\t\t\t\t\t\t<div className=\"h-8 w-8 flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t<div className=\"h-2.5 w-2.5 rounded-full payman-agent-avatar-dot animate-pulse\" />\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 h-2.5 w-2.5 rounded-full payman-agent-avatar-dot-ping animate-ping\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"h-8 w-8 rounded-full payman-agent-avatar flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<Sparkles className=\"h-3.5 w-3.5 payman-agent-avatar-icon\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Bubble — constrained width */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"min-w-0\",\n\t\t\t\t\t\tlayout === \"centered\"\n\t\t\t\t\t\t\t? \"max-w-[85%]\"\n\t\t\t\t\t\t\t: showAvatar\n\t\t\t\t\t\t\t? \"max-w-[85%]\"\n\t\t\t\t\t\t\t: \"max-w-[80%]\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"overflow-hidden w-full min-w-0 px-4 py-3 rounded-2xl rounded-tl-md transition-all duration-200\",\n\t\t\t\t\t\t\tlayout === \"centered\"\n\t\t\t\t\t\t\t\t? cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-agent-bubble payman-agent-bubble--centered\",\n\t\t\t\t\t\t\t\t\t\tisStreaming && \"streaming\",\n\t\t\t\t\t\t\t\t\t\tisError && \"error\"\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-agent-bubble\",\n\t\t\t\t\t\t\t\t\t\tisError && \"payman-agent-bubble--error\"\n\t\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\t\t{showAgentName && (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"text-sm font-semibold mb-1 leading-none payman-agent-name\",\n\t\t\t\t\t\t\t\t\tisStreaming && !content && \"animate-pulse\"\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isStreaming && !content ? \"Thought Process\" : agentName}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-sm leading-relaxed min-w-0 w-full break-words overflow-wrap-anywhere\",\n\t\t\t\t\t\t\t\tshowAgentName && \"mt-1\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isStreaming && !content ? (\n\t\t\t\t\t\t\t\tcurrentStep ? (\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t{renderStepIcon(currentStep, true)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm leading-relaxed min-w-0 break-words shimmer-text font-medium flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t{currentStep.message}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex gap-2.5 items-start\">\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 mt-0.5 payman-agent-thinking-spinner animate-spin shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm payman-agent-thinking-text flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t{currentMessage || \"Thinking...\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) : isCancelled && !content ? (\n\t\t\t\t\t\t\t\t<div className=\"flex gap-2.5 items-start\">\n\t\t\t\t\t\t\t\t\t<X className=\"w-4 h-4 mt-0.5 payman-agent-cancelled-icon shrink-0\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm payman-agent-cancelled-text italic flex-1\">\n\t\t\t\t\t\t\t\t\t\t{currentMessage || \"Request was stopped.\"}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-markdown payman-agent-markdown prose prose-sm dark:prose-invert max-w-none min-w-0 w-full break-words overflow-wrap-anywhere\",\n\t\t\t\t\t\t\t\t\t\tisError && \"payman-agent-markdown--error\",\n\t\t\t\t\t\t\t\t\t\tisStreaming && content && \"streaming-cursor\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ReactMarkdown\n\t\t\t\t\t\t\t\t\t\tremarkPlugins={[remarkGfm]}\n\t\t\t\t\t\t\t\t\t\tcomponents={markdownRenderers}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isError\n\t\t\t\t\t\t\t\t\t\t\t? conflictErrorMessage ?? FRIENDLY_ERROR_MESSAGE\n\t\t\t\t\t\t\t\t\t\t\t: content ||\n\t\t\t\t\t\t\t\t\t\t\t (isStreaming\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Thinking...\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: isCancelled\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Request was stopped.\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\")}\n\t\t\t\t\t\t\t\t\t</ReactMarkdown>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\n\t\t\t{/* Trace button — positioned below the bubble in the same\n\t\t\t column the consumer renders the timestamp in. Avoids\n\t\t\t overlapping wide markdown content (tables, code blocks)\n\t\t\t that previously got clipped by the top-right icon. */}\n\t\t\t{hasTraceData && onExecutionTraceClick && (\n\t\t\t\t<div className={cn(\"mt-1\", showAvatar ? \"ml-11\" : \"ml-0\")}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tonExecutionTraceClick({\n\t\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\t\ttracingData: message.tracingData,\n\t\t\t\t\t\t\t\texecutionId: message.executionId,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"p-1.5 rounded-md inline-flex items-center justify-center payman-agent-trace\",\n\t\t\t\t\t\t\t\"active:scale-95 transition-all duration-150\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle=\"View execution trace\"\n\t\t\t\t\t\taria-label=\"View execution trace\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Binoculars className=\"w-3.5 h-3.5 payman-agent-trace-icon\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Steps — outside the flex row (only when not streaming) */}\n\t\t\t{showSteps && (\n\t\t\t\t<div className={cn(\"mt-1.5\", showAvatar ? \"ml-11\" : \"ml-0\")}>\n\t\t\t\t\t{showExecutionSteps &&\n\t\t\t\t\t\thasSteps &&\n\t\t\t\t\t\t!isStreaming &&\n\t\t\t\t\t\t!isError &&\n\t\t\t\t\t\tstepsToggle(false)}\n\t\t\t\t\t{stepsListContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\tif (animated) {\n\t\treturn (\n\t\t\t<motion.div\n\t\t\t\tinitial={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\ttransition={{ duration: 0.25, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t>\n\t\t\t\t{messageContent}\n\t\t\t</motion.div>\n\t\t);\n\t}\n\n\treturn messageContent;\n}\n","import { motion } from \"framer-motion\";\nimport { User } from \"lucide-react\";\nimport type { UserMessageProps } from \"../../types\";\nimport { parseSlashCommand } from \"../../utils/slashCommands\";\nimport { cn, formatDate } from \"../../utils\";\n\nexport function UserMessage({\n\tmessage,\n\tanimated = false,\n\tshowAvatar = false,\n}: UserMessageProps) {\n\tconst parsedCommand = parseSlashCommand(message.content);\n\tconst content = (\n\t\t<div className=\"flex gap-3 justify-end w-full\">\n\t\t\t{/* Message Container */}\n\t\t\t<div className=\"max-w-[80%] min-w-0 flex flex-col items-end\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-2xl rounded-br-md px-4 py-3\",\n\t\t\t\t\t\t\"bg-primary text-primary-foreground\",\n\t\t\t\t\t\t\"shadow-sm\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{parsedCommand ? (\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<span className=\"inline-flex rounded-md bg-black/15 px-2 py-0.5 font-mono text-xs\">\n\t\t\t\t\t\t\t\t{parsedCommand.command}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{parsedCommand.body.trim() ? (\n\t\t\t\t\t\t\t\t<p className=\"text-sm leading-relaxed whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t\t\t{parsedCommand.body}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"text-sm leading-relaxed whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t{message.content}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<span className=\"text-[10px] mt-1.5 mr-1 text-muted-foreground/70 select-none\">\n\t\t\t\t\t{formatDate(message.timestamp)}\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{/* Avatar */}\n\t\t\t{showAvatar && (\n\t\t\t\t<div className=\"shrink-0 mt-0.5\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-8 w-8 rounded-full\",\n\t\t\t\t\t\t\t\"bg-primary/10 border border-primary/20\",\n\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<User className=\"h-3.5 w-3.5 text-primary\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n\n\tif (animated) {\n\t\treturn (\n\t\t\t<motion.div\n\t\t\t\tinitial={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\ttransition={{ duration: 0.25, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t>\n\t\t\t\t{content}\n\t\t\t</motion.div>\n\t\t);\n\t}\n\n\treturn content;\n}\n","import type { MessageRowProps } from \"../../types\";\nimport { AgentMessage } from \"../AgentMessage\";\nimport { UserMessage } from \"../UserMessage\";\n\nexport function MessageRow({\n\tmessage,\n\tstage = \"DEVELOPMENT\",\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatars = false,\n\tshowUserAvatar,\n\tshowAssistantAvatar,\n\tlayout = \"full-width\",\n\tshowTimestamps = false,\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n}: MessageRowProps) {\n\tconst actualShowUserAvatar =\n\t\tshowUserAvatar !== undefined ? showUserAvatar : showAvatars;\n\tconst actualShowAssistantAvatar =\n\t\tshowAssistantAvatar !== undefined ? showAssistantAvatar : showAvatars;\n\n\tif (message.role === \"user\") {\n\t\treturn (\n\t\t\t<UserMessage\n\t\t\t\tmessage={message}\n\t\t\t\tanimated={animated}\n\t\t\t\tshowAvatar={actualShowUserAvatar}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AgentMessage\n\t\t\tmessage={message}\n\t\t\tstage={stage}\n\t\t\tanimated={animated}\n\t\t\tshowAgentName={showAgentName}\n\t\t\tagentName={agentName}\n\t\t\tshowAvatar={actualShowAssistantAvatar}\n\t\t\tlayout={layout}\n\t\t\tshowTimestamp={showTimestamps}\n\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\tcompletedStepsText={completedStepsText}\n\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t/>\n\t);\n}\n","import { cn } from \"../../utils\";\n\ninterface MessageRowSkeletonProps {\n\tisRightAligned?: boolean;\n}\n\nexport function MessageRowSkeleton({\n\tisRightAligned = false,\n}: MessageRowSkeletonProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-full\",\n\t\t\t\tisRightAligned ? \"justify-end\" : \"justify-start\"\n\t\t\t)}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col gap-2 w-full\",\n\t\t\t\t\tisRightAligned ? \"items-end max-w-[70%]\" : \"items-start max-w-[80%]\"\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"rounded-2xl p-4 w-full\",\n\t\t\t\t\t\tisRightAligned\n\t\t\t\t\t\t\t? \"bg-primary/8 rounded-br-md\"\n\t\t\t\t\t\t\t: \"bg-muted/70 rounded-bl-md\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"space-y-2.5\">\n\t\t\t\t\t\t<div className=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-[85%]\" />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-full\"\n\t\t\t\t\t\t\tstyle={{ animationDelay: \"0.1s\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!isRightAligned && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"h-3 skeleton-pulse rounded-full bg-muted-foreground/10 w-[60%]\"\n\t\t\t\t\t\t\t\tstyle={{ animationDelay: \"0.2s\" }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2 skeleton-pulse rounded-full bg-muted-foreground/8 w-12 mx-1\"\n\t\t\t\t\tstyle={{ animationDelay: \"0.3s\" }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { motion } from \"framer-motion\";\nimport { ArrowDown } from \"lucide-react\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { MessageListProps } from \"../../types\";\nimport { cn } from \"../../utils\";\nimport { MessageRow } from \"../MessageRow\";\nimport { MessageRowSkeleton } from \"../MessageRowSkeleton\";\n\nconst SCROLL_THRESHOLD = 150;\nconst LOAD_MORE_THRESHOLD = 80;\n\nexport function MessageList({\n\tmessages,\n\tisLoading = false,\n\temptyStateText = \"What can I help with?\",\n\tshowEmptyStateIcon: _showEmptyStateIcon = true,\n\temptyStateComponent,\n\tlayout = \"full-width\",\n\tshowTimestamps = false,\n\tstage = \"DEVELOPMENT\",\n\tanimated = false,\n\tshowAgentName = false,\n\tagentName = \"Assistant\",\n\tshowAvatars = false,\n\tshowUserAvatar,\n\tshowAssistantAvatar,\n\tshowExecutionSteps = false,\n\tshowStreamingDot = false,\n\tstreamingStepsText,\n\tcompletedStepsText,\n\tonExecutionTraceClick,\n\tclassName,\n\tonLoadMoreMessages,\n\tisLoadingMoreMessages = false,\n\thasMoreMessages = false,\n}: MessageListProps) {\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst isNearBottomRef = useRef(true);\n\tconst [showScrollBtn, setShowScrollBtn] = useState(false);\n\tconst prevMessageCountRef = useRef(messages.length);\n\n\t// Track scroll height before prepend so we can restore position\n\tconst scrollHeightBeforePrependRef = useRef<number | null>(null);\n\tconst firstMessageIdRef = useRef<string | undefined>(messages[0]?.id);\n\n\tconst getDistanceFromBottom = useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return 0;\n\t\treturn el.scrollHeight - el.scrollTop - el.clientHeight;\n\t}, []);\n\n\tconst scrollToBottom = useCallback((behavior: ScrollBehavior = \"smooth\") => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\t\tel.scrollTo({ top: el.scrollHeight, behavior });\n\t}, []);\n\n\tconst handleScroll = useCallback(() => {\n\t\tconst el = scrollRef.current;\n\t\tif (!el) return;\n\n\t\tconst distance = getDistanceFromBottom();\n\t\tconst nearBottom = distance <= SCROLL_THRESHOLD;\n\t\tisNearBottomRef.current = nearBottom;\n\t\tsetShowScrollBtn(!nearBottom);\n\n\t\t// Trigger load-more when scrolled near the top\n\t\tif (\n\t\t\tel.scrollTop <= LOAD_MORE_THRESHOLD &&\n\t\t\thasMoreMessages &&\n\t\t\t!isLoadingMoreMessages &&\n\t\t\tonLoadMoreMessages\n\t\t) {\n\t\t\t// Snapshot scroll height before the state update so we can restore position\n\t\t\tscrollHeightBeforePrependRef.current = el.scrollHeight;\n\t\t\tonLoadMoreMessages();\n\t\t}\n\t}, [getDistanceFromBottom, hasMoreMessages, isLoadingMoreMessages, onLoadMoreMessages]);\n\n\t// After messages are prepended, restore scroll position so the view doesn't jump\n\tuseLayoutEffect(() => {\n\t\tconst el = scrollRef.current;\n\t\tconst prevHeight = scrollHeightBeforePrependRef.current;\n\t\tconst newFirstId = messages[0]?.id;\n\n\t\tif (el && prevHeight !== null && newFirstId !== firstMessageIdRef.current) {\n\t\t\tel.scrollTop = el.scrollHeight - prevHeight;\n\t\t\tscrollHeightBeforePrependRef.current = null;\n\t\t}\n\t\tfirstMessageIdRef.current = newFirstId;\n\t}, [messages]);\n\n\t// Auto-scroll when new messages arrive\n\tuseEffect(() => {\n\t\tconst prevCount = prevMessageCountRef.current;\n\t\tprevMessageCountRef.current = messages.length;\n\n\t\tif (messages.length > prevCount && isNearBottomRef.current) {\n\t\t\trequestAnimationFrame(() => scrollToBottom());\n\t\t}\n\t}, [messages.length, scrollToBottom]);\n\n\t// Auto-scroll during streaming\n\tuseEffect(() => {\n\t\tconst lastMsg = messages[messages.length - 1];\n\t\tif (!lastMsg?.isStreaming) return;\n\t\tif (!isNearBottomRef.current) return;\n\n\t\trequestAnimationFrame(() => scrollToBottom());\n\t});\n\n\t// Instant scroll on mount\n\tuseEffect(() => {\n\t\tif (messages.length > 0) {\n\t\t\tsetTimeout(() => scrollToBottom(\"instant\"), 50);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\t// Listen for steps toggle events from AgentMessage\n\t// When steps expand, scroll down a bit so they're visible\n\tuseEffect(() => {\n\t\tconst handleStepsToggle = () => {\n\t\t\t// After steps expand/collapse, if we're near the bottom, scroll to show them\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tconst distance = getDistanceFromBottom();\n\t\t\t\t\tif (distance > 0 && distance < 600) {\n\t\t\t\t\t\tscrollToBottom();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tconst el = scrollRef.current;\n\t\tif (el) {\n\t\t\tel.addEventListener(\"payman-steps-toggle\", handleStepsToggle);\n\t\t\treturn () =>\n\t\t\t\tel.removeEventListener(\"payman-steps-toggle\", handleStepsToggle);\n\t\t}\n\t}, [getDistanceFromBottom, scrollToBottom]);\n\n\tconst handleScrollToBottom = useCallback(() => {\n\t\tscrollToBottom();\n\t}, [scrollToBottom]);\n\n\t/* Loading */\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 overflow-y-auto min-h-0 payman-scrollbar\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"space-y-5\",\n\t\t\t\t\t\tlayout === \"centered\" ? \"max-w-2xl mx-auto px-4 py-6\" : \"p-4\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{Array.from({ length: 5 }).map((_, i) => (\n\t\t\t\t\t\t<MessageRowSkeleton\n\t\t\t\t\t\t\tkey={`skel-${i}`}\n\t\t\t\t\t\t\tisRightAligned={i % 3 === 0}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/* Empty state */\n\tif (messages.length === 0) {\n\t\tconst lines = emptyStateText.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n\t\treturn (\n\t\t\t<div className={cn(\"payman-empty-root\", className)}>\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0, y: 20 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.5, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\tclassName=\"payman-empty-content\"\n\t\t\t\t>\n\t\t\t\t\t{/* Custom component (e.g. logo/illustration) from integrator */}\n\t\t\t\t\t{emptyStateComponent && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ scale: 0.9, opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ scale: 1, opacity: 1 }}\n\t\t\t\t\t\t\ttransition={{ delay: 0.05, duration: 0.45, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\t\t\tclassName=\"payman-empty-custom-component\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{emptyStateComponent}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"payman-empty-text-group\">\n\t\t\t\t\t\t{lines.map((line, i) => (\n\t\t\t\t\t\t\t<motion.p\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\ttransition={{ delay: 0.12 + i * 0.06, duration: 0.4 }}\n\t\t\t\t\t\t\t\tclassName={i === 0 ? \"payman-empty-title\" : \"payman-empty-subtitle\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</motion.p>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t/* Messages */\n\treturn (\n\t\t<>\n\t\t\t{/* Scrollable message list — takes full flex space */}\n\t\t\t<div\n\t\t\t\tref={scrollRef}\n\t\t\t\tonScroll={handleScroll}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 min-h-0 overflow-y-auto payman-scrollbar relative\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"space-y-4\",\n\t\t\t\t\t\tlayout === \"centered\" ? \"max-w-2xl mx-auto px-4 py-6\" : \"p-4\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Load-more spinner shown at top while fetching older messages */}\n\t\t\t\t\t{isLoadingMoreMessages && (\n\t\t\t\t\t\t<div className=\"flex justify-center py-2\">\n\t\t\t\t\t\t\t<div className=\"w-5 h-5 rounded-full border-2 border-muted-foreground/30 border-t-muted-foreground animate-spin\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{messages.map((message) => (\n\t\t\t\t\t\t<MessageRow\n\t\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\tstage={stage}\n\t\t\t\t\t\t\tanimated={animated}\n\t\t\t\t\t\t\tshowAgentName={showAgentName}\n\t\t\t\t\t\t\tagentName={agentName}\n\t\t\t\t\t\t\tshowAvatars={showAvatars}\n\t\t\t\t\t\t\tshowUserAvatar={showUserAvatar}\n\t\t\t\t\t\t\tshowAssistantAvatar={showAssistantAvatar}\n\t\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\t\tshowTimestamps={showTimestamps}\n\t\t\t\t\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\t\t\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\t\t\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\t\t\t\t\tcompletedStepsText={completedStepsText}\n\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Scroll-to-bottom button */}\n\t\t\t\t{showScrollBtn && (\n\t\t\t\t\t<div className=\"sticky bottom-0 z-20 flex justify-center pb-3 -mt-11\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={handleScrollToBottom}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"w-8 h-8 rounded-full\",\n\t\t\t\t\t\t\t\t\"bg-card border border-border shadow-lg\",\n\t\t\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\"hover:bg-muted active:scale-95\",\n\t\t\t\t\t\t\t\t\"transition-all duration-150\",\n\t\t\t\t\t\t\t\t\"cursor-pointer\"\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\taria-label=\"Scroll to bottom\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ArrowDown className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useCallback, useEffect } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\n\nexport type ResetSessionConfirmModalProps = {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: () => void;\n};\n\nexport function ResetSessionConfirmModal({\n\tisOpen,\n\tonClose,\n\tonConfirm,\n}: ResetSessionConfirmModalProps) {\n\tconst handleKeyDown = useCallback(\n\t\t(event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t},\n\t\t[onClose],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || typeof document === \"undefined\") return;\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [handleKeyDown, isOpen]);\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{isOpen ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName=\"payman-reset-session-modal-backdrop\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-reset-session-modal-overlay\" />\n\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 12, scale: 0.98 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n\t\t\t\t\t\tclassName=\"payman-reset-session-modal-dialog\"\n\t\t\t\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-labelledby=\"payman-reset-session-title\"\n\t\t\t\t\t\taria-describedby=\"payman-reset-session-description\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"payman-reset-session-modal-copy\">\n\t\t\t\t\t\t\t<p className=\"payman-reset-session-modal-eyebrow\">\n\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<h2\n\t\t\t\t\t\t\t\tid=\"payman-reset-session-title\"\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-title\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tStart a new session?\n\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tid=\"payman-reset-session-description\"\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-description\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tThis will clear the current conversation and start fresh.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"payman-reset-session-modal-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-btn payman-reset-session-modal-btn-secondary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onConfirm}\n\t\t\t\t\t\t\t\tclassName=\"payman-reset-session-modal-btn payman-reset-session-modal-btn-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>\n\t);\n}\n","import type { ReactNode } from \"react\";\n\ntype ActionTooltipV2Props = {\n\tlabel: string;\n\tchildren: ReactNode;\n};\n\nexport function ActionTooltipV2({ label, children }: ActionTooltipV2Props) {\n\treturn (\n\t\t<div className=\"payman-v2-tooltip\">\n\t\t\t{children}\n\t\t\t<div aria-hidden=\"true\" className=\"payman-v2-tooltip-content\">\n\t\t\t\t<div className=\"payman-v2-tooltip-text\">\n\t\t\t\t\t{label}\n\t\t\t\t\t<div className=\"payman-v2-tooltip-arrow\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { FileText } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type FilePreviewShellProps = {\n\tfilename: string;\n\ttypeLabel: string;\n\tonClick?: () => void;\n\tthumbnail?: ReactNode;\n\tclassName?: string;\n\t\"aria-label\"?: string;\n};\n\nexport function FilePreviewShell({\n\tfilename,\n\ttypeLabel,\n\tonClick,\n\tthumbnail,\n\tclassName,\n\t\"aria-label\": ariaLabel,\n}: FilePreviewShellProps) {\n\tconst shellClass = cn(\n\t\t\"payman-v2-file-preview-shell\",\n\t\t\"payman-v2-file-preview-shell-sent\",\n\t\tonClick && \"payman-v2-file-preview-shell-clickable\",\n\t\tclassName,\n\t);\n\n\tconst body = (\n\t\t<>\n\t\t\t<div className=\"payman-v2-file-preview-thumb\">\n\t\t\t\t{thumbnail ?? (\n\t\t\t\t\t<FileText\n\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\tstrokeWidth={1.75}\n\t\t\t\t\t\tclassName=\"payman-v2-file-preview-doc-icon\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"payman-v2-file-preview-info\">\n\t\t\t\t<span className=\"payman-v2-file-preview-name\">{filename}</span>\n\t\t\t\t<span className=\"payman-v2-file-preview-type\">{typeLabel}</span>\n\t\t\t</div>\n\t\t</>\n\t);\n\n\tif (onClick) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={shellClass}\n\t\t\t\tonClick={onClick}\n\t\t\t\taria-label={ariaLabel ?? `Open ${filename}`}\n\t\t\t>\n\t\t\t\t{body}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn <div className={shellClass}>{body}</div>;\n}\n\n/** Same outer layout as user-message attachment rows. */\nexport function FilePreviewBlockLayout({\n\tchildren,\n\tclassName,\n\t...rest\n}: {\n\tchildren: ReactNode;\n\tclassName?: string;\n} & HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div className={cn(\"payman-v2-file-preview-item\", className)} {...rest}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { useContext } from \"react\";\nimport { PaymanChatContext } from \"../../contexts\";\nimport type { MessageAttachment } from \"../../types\";\nimport { isPdfUrl } from \"../../utils/pdfLink\";\nimport {\n\tattachmentDisplayUrl,\n\tisImageAttachment,\n\tisPdfAttachmentMeta,\n} from \"@paymanai/payman-typescript-ask-sdk\";\nimport { FilePreviewBlockLayout, FilePreviewShell } from \"./FilePreviewShell\";\n\nfunction attachmentTypeLabel(attachment: MessageAttachment): string {\n\tif (isImageAttachment(attachment)) {\n\t\treturn \"Image\";\n\t}\n\tconst ext = attachment.filename.split(\".\").pop()?.toUpperCase();\n\treturn ext || \"Document\";\n}\n\nfunction isPdfAttachment(attachment: MessageAttachment): boolean {\n\tconst displayUrl = attachmentDisplayUrl(attachment);\n\treturn (\n\t\tisPdfAttachmentMeta(attachment) ||\n\t\t(Boolean(displayUrl) && isPdfUrl(displayUrl))\n\t);\n}\n\nexport type AttachmentPreviewBlockProps = {\n\tattachment: MessageAttachment;\n\tonImageClick?: (src: string, alt: string) => void;\n};\n\nexport function AttachmentPreviewBlock({\n\tattachment,\n\tonImageClick,\n}: AttachmentPreviewBlockProps) {\n\tconst chatContext = useContext(PaymanChatContext);\n\tconst displayUrl = attachmentDisplayUrl(attachment);\n\tconst typeLabel = attachmentTypeLabel(attachment);\n\tconst isImage = isImageAttachment(attachment) && displayUrl;\n\n\tconst openAttachment = () => {\n\t\tif (!displayUrl) return;\n\t\tif (isImageAttachment(attachment)) {\n\t\t\tonImageClick?.(displayUrl, attachment.filename);\n\t\t\treturn;\n\t\t}\n\t\tif (isPdfAttachment(attachment)) {\n\t\t\tchatContext?.openPdfSheet(displayUrl, attachment.filename);\n\t\t\treturn;\n\t\t}\n\t\twindow.open(displayUrl, \"_blank\", \"noopener,noreferrer\");\n\t};\n\n\tif (isImage) {\n\t\treturn (\n\t\t\t<FilePreviewBlockLayout>\n\t\t\t\t<FilePreviewShell\n\t\t\t\t\tfilename={attachment.filename}\n\t\t\t\t\ttypeLabel={typeLabel}\n\t\t\t\t\tonClick={openAttachment}\n\t\t\t\t\taria-label={`Preview ${attachment.filename}`}\n\t\t\t\t\tthumbnail={\n\t\t\t\t\t\t<img src={displayUrl} alt=\"\" draggable={false} />\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</FilePreviewBlockLayout>\n\t\t);\n\t}\n\n\treturn (\n\t\t<FilePreviewBlockLayout>\n\t\t\t<FilePreviewShell\n\t\t\t\tfilename={attachment.filename}\n\t\t\t\ttypeLabel={typeLabel}\n\t\t\t\tonClick={displayUrl ? openAttachment : undefined}\n\t\t\t\taria-label={`Open ${attachment.filename}`}\n\t\t\t/>\n\t\t</FilePreviewBlockLayout>\n\t);\n}\n","import { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n\tAlertCircle,\n\tCheck,\n\tCopy,\n\tPencil,\n\tRotateCcw,\n} from \"lucide-react\";\nimport { ActionTooltipV2 } from \"./ActionTooltipV2\";\nimport { AttachmentPreviewBlock } from \"./AttachmentPreviewBlock\";\nimport { cn } from \"../../utils/cn\";\nimport { getConflictErrorMessage } from \"../../utils/errorMessages\";\nimport { parseSlashCommand } from \"../../utils/slashCommands\";\nimport type { MessageDisplay, UserMessageActionsConfig } from \"../../types\";\n\nexport type UserMessageV2Props = {\n\tmessage: MessageDisplay;\n\tonEdit?: (messageId: string) => void;\n\tonRetry?: (messageId: string) => void;\n\tonImageClick?: (src: string, alt: string) => void;\n\tretryDisabled?: boolean;\n\tactions?: UserMessageActionsConfig;\n};\n\ntype ToastState = {\n\tlabel: string;\n\ttone: \"success\" | \"error\";\n} | null;\n\nfunction formatMessageTime(timestamp: string): string {\n\tconst value = new Date(timestamp);\n\tif (Number.isNaN(value.getTime())) return \"\";\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\thour: \"numeric\",\n\t\tminute: \"2-digit\",\n\t}).format(value);\n}\n\nexport function UserMessageV2({\n\tmessage,\n\tonEdit,\n\tonRetry,\n\tonImageClick,\n\tretryDisabled = false,\n\tactions,\n}: UserMessageV2Props) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [toast, setToast] = useState<ToastState>(null);\n\tconst copyResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst showCopyAction = actions?.copy ?? true;\n\tconst showEditAction = actions?.edit ?? false;\n\tconst showRetryAction = actions?.retry ?? false;\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\t};\n\t}, []);\n\n\tconst showToast = (label: string, tone: \"success\" | \"error\") => {\n\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\tsetToast({ label, tone });\n\t\ttoastTimerRef.current = setTimeout(() => setToast(null), 1800);\n\t};\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tif (!navigator.clipboard?.writeText) {\n\t\t\t\tthrow new Error(\"Clipboard unavailable\");\n\t\t\t}\n\t\t\tawait navigator.clipboard.writeText(message.content);\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tsetCopied(true);\n\t\t\tcopyResetTimerRef.current = setTimeout(() => setCopied(false), 1800);\n\t\t\tshowToast(\"Copied to clipboard\", \"success\");\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t\tshowToast(\"Could not copy\", \"error\");\n\t\t}\n\t};\n\n\tconst timestamp = formatMessageTime(message.timestamp);\n\tconst parsedCommand = parseSlashCommand(message.content);\n\tconst hasVisibleActions =\n\t\tshowCopyAction || (showEditAction && !!onEdit) || (showRetryAction && !!onRetry);\n\n\tconst toastPortal =\n\t\ttypeof document !== \"undefined\"\n\t\t\t? createPortal(\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{toast && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -18, scale: 0.96 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -12, scale: 0.96 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\ttype: \"spring\",\n\t\t\t\t\t\t\t\t\tstiffness: 360,\n\t\t\t\t\t\t\t\t\tdamping: 26,\n\t\t\t\t\t\t\t\t\tmass: 0.7,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-toast\"\n\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-toast-inner\",\n\t\t\t\t\t\t\t\t\t\ttoast.tone === \"success\"\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-toast-success\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-toast-error\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ borderRadius: 9999 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{toast.tone === \"success\" ? (\n\t\t\t\t\t\t\t\t\t<Check className=\"h-3.5 w-3.5\" style={{ color: \"#059669\" }} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#ef4444\" }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span>{toast.label}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<>\n\t\t\t{toastPortal}\n\n\t\t\t<div className=\"payman-v2-user-msg payman-v2-fade-in\">\n\t\t\t\t<div className=\"payman-v2-user-msg-group\">\n\t\t\t\t\t{message.attachments && message.attachments.length > 0 && (\n\t\t\t\t\t\t<div className=\"payman-v2-file-preview payman-v2-user-msg-attachments\">\n\t\t\t\t\t\t\t{message.attachments.map((attachment) => (\n\t\t\t\t\t\t\t\t<AttachmentPreviewBlock\n\t\t\t\t\t\t\t\t\tkey={attachment.id}\n\t\t\t\t\t\t\t\t\tattachment={attachment}\n\t\t\t\t\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{(message.content.trim().length > 0 || !message.attachments?.length) && (\n\t\t\t\t\t<div className=\"payman-v2-user-msg-bubble\">\n\t\t\t\t\t\t{parsedCommand ? (\n\t\t\t\t\t\t\t<div className=\"payman-v2-user-msg-command\">\n\t\t\t\t\t\t\t\t<span className=\"payman-v2-user-msg-command-chip\">\n\t\t\t\t\t\t\t\t\t{parsedCommand.command}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{parsedCommand.body.trim() ? (\n\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-text\">\n\t\t\t\t\t\t\t\t\t\t{parsedCommand.body}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-text\">{message.content}</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{message.isError && message.errorDetails && (() => {\n\t\t\t\t\t\tconst resolvedError =\n\t\t\t\t\t\t\tgetConflictErrorMessage(message.errorDetails) ??\n\t\t\t\t\t\t\tmessage.errorDetails;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div className=\"payman-v2-user-msg-error\">\n\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5 shrink-0\"\n\t\t\t\t\t\t\t\t\tstyle={{ color: \"rgba(239, 68, 68, 0.7)\", marginTop: \"2px\" }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"payman-v2-user-msg-error-text\">\n\t\t\t\t\t\t\t\t\t{resolvedError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})()}\n\n\t\t\t\t\t{(timestamp || hasVisibleActions) && (\n\t\t\t\t\t\t<div className=\"payman-v2-user-msg-actions\">\n\t\t\t\t\t\t\t{timestamp ? (\n\t\t\t\t\t\t\t\t<span className=\"payman-v2-user-msg-timestamp\">{timestamp}</span>\n\t\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t\t{showCopyAction && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Copy\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => void handleCopy()}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Copy message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#059669\" }}\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\t\t<Copy className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showEditAction && onEdit && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Edit\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onEdit(message.id)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Edit message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Pencil className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showRetryAction && onRetry && (\n\t\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Retry\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRetry(message.id)}\n\t\t\t\t\t\t\t\t\t\tdisabled={retryDisabled}\n\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-user-msg-action-btn\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Retry message\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RotateCcw className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import {\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype CSSProperties,\n} from \"react\";\nimport { Loader2, ImageOff, Eye } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\nconst RAG_IMAGE_PATH_REGEX =\n\t/^(?:https?:\\/\\/[^/\\s]+)?\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image(?:[?#][^\"'\\s]*)?$/;\n\nfunction isUnresolvedRagImageSource(src: string) {\n\treturn RAG_IMAGE_PATH_REGEX.test(src);\n}\n\n// Module-level cache of image URLs that have successfully loaded.\n// Survives component remounts caused by ReactMarkdown re-rendering\n// the tree on every typed character, so a remounted image with the\n// same src skips the loading state and doesn't flash.\nconst loadedImageCache = new Set<string>();\n\nexport type MarkdownImageV2Props = {\n\tsrc?: string;\n\talt?: string;\n\tisResolving?: boolean;\n\tonImageClick?: (src: string, alt: string) => void;\n};\n\nconst frameStyle: CSSProperties = {\n\twidth: \"min(100%, 32rem)\",\n\tmaxWidth: \"100%\",\n};\n\nconst imgStyle: CSSProperties = {\n\tdisplay: \"block\",\n\twidth: \"100%\",\n\theight: \"auto\",\n\tmaxWidth: \"100%\",\n\tmaxHeight: \"22rem\",\n\tobjectFit: \"contain\",\n};\n\nexport function MarkdownImageV2({\n\tsrc,\n\talt,\n\tisResolving = false,\n\tonImageClick,\n}: MarkdownImageV2Props) {\n\tconst cachedAlready = src ? loadedImageCache.has(src) : false;\n\tconst [isVisible, setIsVisible] = useState(cachedAlready);\n\tconst [isLoaded, setIsLoaded] = useState(cachedAlready);\n\tconst [hasError, setHasError] = useState(false);\n\tconst [retryCount, setRetryCount] = useState(0);\n\tconst sentinelRef = useRef<HTMLSpanElement>(null);\n\tconst prevLoadedRef = useRef(cachedAlready);\n\n\tconst isUnresolvedRag = useMemo(\n\t\t() => (src ? isUnresolvedRagImageSource(src) : false),\n\t\t[src],\n\t);\n\tconst isResolvingRag = Boolean(isResolving && isUnresolvedRag);\n\n\tuseEffect(() => {\n\t\tif (src && loadedImageCache.has(src)) {\n\t\t\tsetIsLoaded(true);\n\t\t\tsetIsVisible(true);\n\t\t\tprevLoadedRef.current = true;\n\t\t}\n\t\t// Don't reset isLoaded when src changes if any image was already\n\t\t// showing — keep it visible while the new URL loads (same visual\n\t\t// content, different URL during RAG → blob swap). onLoad/onError\n\t\t// will update the state once the new image finishes.\n\t\tsetHasError(false);\n\t\tsetRetryCount(0);\n\t}, [src]);\n\n\tuseEffect(() => {\n\t\tconst el = sentinelRef.current;\n\t\tif (!el || !src) return;\n\n\t\t// If the element is already in or near the viewport (e.g. remount\n\t\t// during streaming), set visible immediately to avoid a flash.\n\t\tconst rect = el.getBoundingClientRect();\n\t\tconst alreadyNear =\n\t\t\trect.bottom >= -200 &&\n\t\t\trect.top <= (window.innerHeight || document.documentElement.clientHeight) + 200;\n\t\tif (alreadyNear) {\n\t\t\tsetIsVisible(true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tsetIsVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"200px\" },\n\t\t);\n\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, [src]);\n\n\tif (!src) return null;\n\n\tif (isResolvingRag && !isLoaded) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={cn(\"payman-v2-md-image\", \"payman-v2-md-image-resolving\")}\n\t\t\t>\n\t\t\t\t<span className=\"payman-v2-md-image-resolving-inner\">\n\t\t\t\t\t<Loader2\n\t\t\t\t\t\tstyle={{ animation: \"payman-v2-spin 0.7s linear infinite\" }}\n\t\t\t\t\t\taria-hidden\n\t\t\t\t\t/>\n\t\t\t\t\t<span>Loading image</span>\n\t\t\t\t\t<span>Reference image</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t);\n\t}\n\n\tif (hasError) {\n\t\treturn (\n\t\t\t<span className={cn(\"payman-v2-md-image\", \"payman-v2-md-image-error\")}>\n\t\t\t\t<ImageOff aria-hidden />\n\t\t\t\t<span>Unable to load image</span>\n\t\t\t\t{alt ? <span>{alt}</span> : null}\n\t\t\t\t{retryCount < 3 ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-md-image-error-retry\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetRetryCount((c) => c + 1);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tRetry\n\t\t\t\t\t</button>\n\t\t\t\t) : null}\n\t\t\t</span>\n\t\t);\n\t}\n\n\tconst imgSrc =\n\t\tretryCount > 0\n\t\t\t? `${src}${src.includes(\"?\") ? \"&\" : \"?\"}_r=${retryCount}`\n\t\t\t: src;\n\n\treturn (\n\t\t<span ref={sentinelRef} className=\"payman-v2-md-image\">\n\t\t\t{isVisible ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"payman-v2-md-image-button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (isLoaded && src) onImageClick?.(src, alt || \"Image\");\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!isLoaded}\n\t\t\t\t\taria-busy={!isLoaded}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...frameStyle,\n\t\t\t\t\t\tminHeight: isLoaded ? 0 : \"10rem\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{!isLoaded && (\n\t\t\t\t\t\t<span className=\"payman-v2-md-image-loading\">\n\t\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\t\tstyle={{ animation: \"payman-v2-spin 0.7s linear infinite\" }}\n\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span>Loading image…</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={imgSrc}\n\t\t\t\t\t\talt={alt || \"\"}\n\t\t\t\t\t\tclassName=\"payman-v2-md-image-img\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...imgStyle,\n\t\t\t\t\t\t\topacity: isLoaded ? 1 : 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonLoad={() => {\n\t\t\t\t\t\t\tif (src) loadedImageCache.add(src);\n\t\t\t\t\t\t\tprevLoadedRef.current = true;\n\t\t\t\t\t\t\tsetHasError(false);\n\t\t\t\t\t\t\tsetIsLoaded(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonError={() => {\n\t\t\t\t\t\t\tprevLoadedRef.current = false;\n\t\t\t\t\t\t\tsetIsLoaded(false);\n\t\t\t\t\t\t\tsetHasError(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{isLoaded ? (\n\t\t\t\t\t\t<span className=\"payman-v2-md-image-overlay\" aria-hidden>\n\t\t\t\t\t\t\t<span className=\"payman-v2-md-image-overlay-icon\">\n\t\t\t\t\t\t\t\t<Eye />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"payman-v2-md-image-placeholder\"\n\t\t\t\t\tstyle={{ ...frameStyle, minHeight: \"10rem\" }}\n\t\t\t\t>\n\t\t\t\t\t<span>Image</span>\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n","import { useEffect, useRef } from \"react\";\nimport { FilePreviewBlockLayout, FilePreviewShell } from \"./FilePreviewShell\";\n\nexport type PdfBlockV2Props = {\n\ttitle: string;\n\thref: string;\n\tonOpen: (href: string, title: string, options?: { auto?: boolean }) => void;\n\t/** Auto-open the PDF sheet when this block mounts. Only set true for new streaming responses. */\n\tautoOpen?: boolean;\n};\n\nexport function PdfBlockV2({ title, href, onOpen, autoOpen = false }: PdfBlockV2Props) {\n\tconst autoOpenedHrefRef = useRef<string | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!autoOpen || autoOpenedHrefRef.current === href) return;\n\t\tautoOpenedHrefRef.current = href;\n\t\tonOpen(href, title, { auto: true });\n\t\t// Only re-fire if the URL changes, not on every onOpen reference change\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [href, autoOpen]);\n\n\treturn (\n\t\t<FilePreviewBlockLayout data-payman-file-block>\n\t\t\t<FilePreviewShell\n\t\t\t\tfilename={title}\n\t\t\t\ttypeLabel=\"PDF\"\n\t\t\t\tonClick={() => onOpen(href, title)}\n\t\t\t\taria-label={`Open PDF: ${title}`}\n\t\t\t/>\n\t\t</FilePreviewBlockLayout>\n\t);\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkBreaks from \"remark-breaks\";\nimport type { Components } from \"react-markdown\";\nimport { Children, isValidElement, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { MarkdownImageV2 } from \"./MarkdownImageV2\";\nimport { PdfBlockV2 } from \"./PdfBlockV2\";\nimport { getPdfTitleFromUrl, isPdfUrl } from \"../../utils/pdfLink\";\n\nexport type MarkdownRendererV2Props = {\n\tcontent: string;\n\tisStreaming?: boolean;\n\tisResolvingImages?: boolean;\n\tonImageClick?: (src: string, alt: string) => void;\n\tonPdfClick?: (href: string, title: string, options?: { auto?: boolean }) => void;\n\t/** Auto-open the sheet when a PDF block first mounts — only for new streaming responses. */\n\tautoOpenPdf?: boolean;\n};\n\nfunction childrenToText(children: ReactNode): string {\n\tif (typeof children === \"string\") return children;\n\tif (typeof children === \"number\") return String(children);\n\tif (Array.isArray(children)) return children.map(childrenToText).join(\"\");\n\tif (children && typeof children === \"object\" && \"props\" in (children as object)) {\n\t\treturn childrenToText((children as ReactElement<{ children?: ReactNode }>).props.children);\n\t}\n\treturn \"\";\n}\n\nfunction isFileBlockChild(child: unknown): boolean {\n\treturn (\n\t\tisValidElement(child) &&\n\t\ttypeof child.props === \"object\" &&\n\t\tchild.props !== null &&\n\t\t\"data-payman-file-block\" in child.props\n\t);\n}\n\nfunction buildComponents(\n\tonImageClick?: (src: string, alt: string) => void,\n\tisResolvingRef?: React.RefObject<boolean | undefined>,\n\tonPdfClick?: (href: string, title: string, options?: { auto?: boolean }) => void,\n\tautoOpenPdf?: boolean,\n): Components {\n\treturn {\n\t\tp: ({ children }) => {\n\t\t\tconst childArray = Children.toArray(children);\n\t\t\tif (childArray.length === 1 && isFileBlockChild(childArray[0])) {\n\t\t\t\treturn childArray[0];\n\t\t\t}\n\t\t\treturn <p>{children}</p>;\n\t\t},\n\t\tcode: ({ children }) => <code>{children}</code>,\n\t\tpre: ({ children }) => (\n\t\t\t<div className=\"payman-v2-markdown-pre\">\n\t\t\t\t<pre>{children}</pre>\n\t\t\t</div>\n\t\t),\n\t\tul: ({ children }) => <ul>{children}</ul>,\n\t\tol: ({ children }) => <ol>{children}</ol>,\n\t\tli: ({ children }) => <li>{children}</li>,\n\t\th1: ({ children }) => <h1>{children}</h1>,\n\t\th2: ({ children }) => <h2>{children}</h2>,\n\t\th3: ({ children }) => <h3>{children}</h3>,\n\t\tstrong: ({ children }) => <strong>{children}</strong>,\n\t\tem: ({ children }) => <em>{children}</em>,\n\t\tblockquote: ({ children }) => <blockquote>{children}</blockquote>,\n\t\thr: () => <hr />,\n\t\ta: ({ href, children }) => {\n\t\t\tconst url = href ?? \"\";\n\t\t\tif (onPdfClick && isPdfUrl(url)) {\n\t\t\t\tconst linkText = childrenToText(children).trim();\n\t\t\t\tconst title = getPdfTitleFromUrl(url, linkText);\n\t\t\t\treturn (\n\t\t\t\t\t<PdfBlockV2 href={url} title={title} onOpen={onPdfClick} autoOpen={autoOpenPdf} />\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t{children}\n\t\t\t\t</a>\n\t\t\t);\n\t\t},\n\t\timg: ({ src, alt }) => (\n\t\t\t<MarkdownImageV2\n\t\t\t\tsrc={typeof src === \"string\" ? src : undefined}\n\t\t\t\talt={typeof alt === \"string\" ? alt : undefined}\n\t\t\t\tisResolving={isResolvingRef?.current}\n\t\t\t\tonImageClick={onImageClick}\n\t\t\t/>\n\t\t),\n\t\ttable: ({ children }) => (\n\t\t\t<div className=\"payman-v2-markdown-table-wrapper\">\n\t\t\t\t<table className=\"payman-v2-markdown-table\">{children}</table>\n\t\t\t</div>\n\t\t),\n\t\tthead: ({ children }) => (\n\t\t\t<thead className=\"payman-v2-markdown-thead\">{children}</thead>\n\t\t),\n\t\ttbody: ({ children }) => (\n\t\t\t<tbody className=\"payman-v2-markdown-tbody\">{children}</tbody>\n\t\t),\n\t\tth: ({ children }) => (\n\t\t\t<th className=\"payman-v2-markdown-th\">{children}</th>\n\t\t),\n\t\ttd: ({ children }) => (\n\t\t\t<td className=\"payman-v2-markdown-td\">{children}</td>\n\t\t),\n\t};\n}\n\nexport function MarkdownRendererV2({\n\tcontent,\n\tisStreaming,\n\tisResolvingImages,\n\tonImageClick,\n\tonPdfClick,\n\tautoOpenPdf,\n}: MarkdownRendererV2Props) {\n\tconst isResolvingRef = useRef(isResolvingImages);\n\tisResolvingRef.current = isResolvingImages;\n\n\tconst components = useMemo(\n\t\t() => buildComponents(onImageClick, isResolvingRef, onPdfClick, autoOpenPdf),\n\t\t[onImageClick, onPdfClick, autoOpenPdf],\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"payman-v2-markdown\",\n\t\t\t\tisStreaming && \"payman-v2-streaming-cursor\",\n\t\t\t)}\n\t\t>\n\t\t\t<ReactMarkdown remarkPlugins={[remarkGfm, remarkBreaks]} components={components}>\n\t\t\t\t{content}\n\t\t\t</ReactMarkdown>\n\t\t</div>\n\t);\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\n\n/**\n * Label shown when streaming is in progress but no real step has\n * been recorded yet — the ~50ms window before the first\n * STAGE_STARTED event arrives. Single honest label, no rotating\n * made-up text.\n */\nexport const PENDING_LABEL = \"Thinking\";\n\nexport type ThinkingBlockV2Props = {\n\t/**\n\t * True while the stream is still producing events. The parent\n\t * (`AssistantMessageV2`) unmounts this component entirely when\n\t * this flips to false, wrapped in an outer AnimatePresence for\n\t * the exit fade, so this prop is effectively always true at\n\t * render time today — kept as a prop for future flexibility.\n\t */\n\tisStreaming: boolean;\n\t/**\n\t * Optional sticky header line — the Analyzer's plan narrative\n\t * (\"I'll pull your Q1 transactions and compare them against\n\t * April…\"). Rendered ABOVE the flipping cursor and stays put\n\t * for the duration of the run, so the user can keep the\n\t * strategy in view while the tactical [currentStepLabel] ticks\n\t * by below. Null during the Analyzer's own window — two-line\n\t * layout collapses to one line until the plan lands.\n\t */\n\tstickyLabel?: string;\n\t/**\n\t * The currently-running stage's label — computed from the\n\t * `message.steps` array in the parent. Rendered as a single\n\t * flipping line: when the label changes (next stage starts),\n\t * the old label slides up and fades while the new one slides\n\t * in from below (\"digital-clock flip\" style). Parent owns the\n\t * \"which step is current\" logic, so this component stays\n\t * dumb and just renders whatever it's given.\n\t */\n\tcurrentStepLabel?: string;\n};\n\n/**\n * Live streaming indicator rendered above the assistant response\n * while a playground/chat run is in flight. Just the current\n * stage's friendly label on a single line — \"Checking your\n * request…\", \"Pulling those up for you now.\", \"Executing…\" — with\n * framer-motion flipping between labels as stages advance.\n *\n * The \"time is passing\" signal used to live here as a spinning\n * asterisk glyph next to the label. That was moved to a dedicated\n * `StreamingIndicatorV2` component rendered above the chat input\n * (Claude-style), so the text area stays clean and the motion\n * lands where the user's eye naturally rests between reads.\n *\n * After streaming ends, the parent unmounts this component entirely\n * (inside its own AnimatePresence), so there is no post-streaming\n * \"Thought\" label, no expand/collapse history view, no duration\n * pill. Users who need to review the steps that ran can click the\n * trace icon in the action row.\n */\nexport function ThinkingBlockV2({\n\tisStreaming: _isStreaming,\n\tstickyLabel,\n\tcurrentStepLabel,\n}: ThinkingBlockV2Props) {\n\tconst displayedCursorLabel = currentStepLabel || PENDING_LABEL;\n\n\treturn (\n\t\t<div className=\"payman-v2-thinking\">\n\t\t\t{/*\n\t\t\t Sticky plan header — the Analyzer's LLM-generated\n\t\t\t narrative of how the agent plans to handle the request.\n\t\t\t Rendered with a gentle fade-in when it first arrives\n\t\t\t (usually 2-3s into the run), then stays put. No\n\t\t\t flipping animation: the whole point is stability.\n\t\t\t*/}\n\t\t\t<AnimatePresence>\n\t\t\t\t{stickyLabel && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tkey=\"sticky\"\n\t\t\t\t\t\tclassName=\"payman-v2-thinking-sticky\"\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 4 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{stickyLabel}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t\t<div className=\"payman-v2-thinking-cursor\">\n\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t<motion.span\n\t\t\t\t\t\tkey={displayedCursorLabel}\n\t\t\t\t\t\tclassName=\"payman-v2-thinking-cursor-label payman-v2-thinking-shimmer\"\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: -6 }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 0.34,\n\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{displayedCursorLabel}\n\t\t\t\t\t</motion.span>\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\nimport {\n\tNEGATIVE_FEEDBACK_REASONS,\n\ttype NegativeFeedbackReason,\n} from \"../../utils/feedbackClient\";\n\nconst MAX_DETAILS_CHARS = 2000;\n\nexport type FeedbackReasonModalProps = {\n\topen: boolean;\n\tonClose: () => void;\n\t/**\n\t * Persist the chosen reason + optional details. Should reject if the save\n\t * fails — the modal stays open and surfaces the error instead of closing.\n\t */\n\tonSubmit: (reason: NegativeFeedbackReason, details?: string) => Promise<void>;\n};\n\n/**\n * Thumbs-down reason picker. A negative rating always carries one reason\n * (matching the backend's required category) plus optional free-text detail.\n */\nexport function FeedbackReasonModal({\n\topen,\n\tonClose,\n\tonSubmit,\n}: FeedbackReasonModalProps) {\n\tconst [reason, setReason] = useState<NegativeFeedbackReason>(\n\t\tNEGATIVE_FEEDBACK_REASONS[0].value,\n\t);\n\tconst [details, setDetails] = useState(\"\");\n\tconst [submitting, setSubmitting] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [reasonOpen, setReasonOpen] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tsetReason(NEGATIVE_FEEDBACK_REASONS[0].value);\n\t\t\tsetDetails(\"\");\n\t\t\tsetError(null);\n\t\t\tsetSubmitting(false);\n\t\t\tsetReasonOpen(false);\n\t\t}\n\t}, [open]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(event: KeyboardEvent) => {\n\t\t\tif (event.key !== \"Escape\") return;\n\t\t\tif (reasonOpen) {\n\t\t\t\tsetReasonOpen(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClose();\n\t\t},\n\t\t[onClose, reasonOpen],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!open || typeof document === \"undefined\") return;\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [handleKeyDown, open]);\n\n\tconst handleSubmit = async () => {\n\t\tsetSubmitting(true);\n\t\tsetError(null);\n\t\tsetReasonOpen(false);\n\t\ttry {\n\t\t\tawait onSubmit(reason, details.trim() ? details.trim() : undefined);\n\t\t\tonClose();\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : \"Could not send feedback\");\n\t\t\tsetSubmitting(false);\n\t\t}\n\t};\n\n\tconst selectedReason =\n\t\tNEGATIVE_FEEDBACK_REASONS.find((item) => item.value === reason) ??\n\t\tNEGATIVE_FEEDBACK_REASONS[0];\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tclassName=\"payman-v2-feedback-modal-backdrop\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, y: 12, scale: 0.98 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, y: 8, scale: 0.98 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-dialog\"\n\t\t\t\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-labelledby=\"payman-v2-feedback-title\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-close\"\n\t\t\t\t\t\t\taria-label=\"Close feedback modal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X size={18} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<h2\n\t\t\t\t\t\t\tid=\"payman-v2-feedback-title\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-title\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tTell us what went wrong\n\t\t\t\t\t\t</h2>\n\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-label\"\n\t\t\t\t\t\t\thtmlFor=\"payman-v2-feedback-reason\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tWhat was the issue?\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid=\"payman-v2-feedback-reason\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason\"\n\t\t\t\t\t\t\tonBlur={(event) => {\n\t\t\t\t\t\t\t\tconst nextTarget = event.relatedTarget as Node | null;\n\t\t\t\t\t\t\t\tif (!nextTarget || !event.currentTarget.contains(nextTarget)) {\n\t\t\t\t\t\t\t\t\tsetReasonOpen(false);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason-trigger\"\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={reasonOpen}\n\t\t\t\t\t\t\t\taria-controls=\"payman-v2-feedback-reason-options\"\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tonClick={() => setReasonOpen((current) => !current)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{selectedReason.label}</span>\n\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\tsize={17}\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\treasonOpen\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-feedback-modal-reason-chevron payman-v2-feedback-modal-reason-chevron-open\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-feedback-modal-reason-chevron\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t{reasonOpen ? (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tid=\"payman-v2-feedback-reason-options\"\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-reason-menu\"\n\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\taria-label=\"Feedback issue\"\n\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{NEGATIVE_FEEDBACK_REASONS.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = item.value === reason;\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-feedback-modal-reason-option payman-v2-feedback-modal-reason-option-selected\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-feedback-modal-reason-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetReason(item.value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetReasonOpen(false);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{item.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{isSelected ? <Check size={16} strokeWidth={2} /> : null}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-textarea\"\n\t\t\t\t\t\t\tplaceholder=\"Add details (optional)\"\n\t\t\t\t\t\t\tvalue={details}\n\t\t\t\t\t\t\tmaxLength={MAX_DETAILS_CHARS}\n\t\t\t\t\t\t\tonChange={(e) => setDetails(e.target.value)}\n\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{error ? (\n\t\t\t\t\t\t\t<p className=\"payman-v2-feedback-modal-error\">{error}</p>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t<div className=\"payman-v2-feedback-modal-actions\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-btn payman-v2-feedback-modal-btn-secondary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\t\tdisabled={submitting}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-feedback-modal-btn payman-v2-feedback-modal-btn-primary\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{submitting ? \"Sending…\" : \"Submit\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>\n\t);\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Progressively reveals `targetText` char-by-char, matching the demo's\n * typing-loop feel for both thinking content and the final response.\n *\n * - While `enabled` is true the hook keeps a \"displayed\" buffer and\n * advances it toward the current `targetText` one character at a time.\n * - If new text is appended to `targetText` mid-animation, the loop\n * picks up from where it left off.\n * - When `enabled` becomes false the remaining text is flushed instantly\n * (e.g. when thinking ends and we auto-collapse).\n *\n * ### Speed multiplier\n *\n * Each character's per-char delay is divided by `speedMultiplier` so\n * larger values mean faster typing:\n * 1 → default pace (unchanged)\n * 2 → twice as fast\n * 0.5 → half speed\n * 0 → instant reveal (skip the animation entirely)\n *\n * Non-zero values are clamped to a minimum of 0.1 to avoid divide-by-zero\n * or absurdly slow playback from accidental tiny values.\n */\n\ntype SpeedProfile = {\n\tnormal: [number, number];\n\tfast: number;\n\tpunctuation: [number, number];\n\tnewline: [number, number];\n\tidle: number;\n};\n\nexport const THINKING_SPEED: SpeedProfile = {\n\tnormal: [6, 8],\n\tfast: 1,\n\tpunctuation: [20, 30],\n\tnewline: [12, 18],\n\tidle: 30,\n};\n\nexport const RESPONSE_SPEED: SpeedProfile = {\n\tnormal: [2, 4],\n\tfast: 1,\n\tpunctuation: [8, 12],\n\tnewline: [4, 6],\n\tidle: 15,\n};\n\n// Matches a complete markdown image token: \nconst MARKDOWN_IMAGE_REGEX = /^!\\[[^\\]]*\\]\\([^)]*\\)/;\n\nfunction charDelay(char: string, speed: SpeedProfile, multiplier: number): number {\n\tconst raw = (() => {\n\t\tif (char === \"*\") return speed.fast;\n\t\tif (char === \"\\n\")\n\t\t\treturn speed.newline[0] + Math.random() * speed.newline[1];\n\t\tif (\".!?,;:\".includes(char))\n\t\t\treturn speed.punctuation[0] + Math.random() * speed.punctuation[1];\n\t\treturn speed.normal[0] + Math.random() * speed.normal[1];\n\t})();\n\treturn raw / multiplier;\n}\n\nexport function useTypingEffect(\n\ttargetText: string,\n\tenabled: boolean,\n\tspeed: SpeedProfile = RESPONSE_SPEED,\n\tinitialDisplayedText?: string,\n\tspeedMultiplier: number = 1,\n): { displayedText: string; isTyping: boolean } {\n\t// speedMultiplier === 0 is a hard kill-switch: render instantly, no animation.\n\t// Any non-zero value is clamped to a sensible minimum.\n\tconst instant = speedMultiplier === 0;\n\tconst multiplier = instant ? 1 : Math.max(speedMultiplier, 0.1);\n\n\tconst [displayedText, setDisplayedText] = useState(\"\");\n\tconst displayedRef = useRef(\"\");\n\tconst targetRef = useRef(targetText);\n\tconst enabledRef = useRef(enabled);\n\tconst initialDisplayedRef = useRef(initialDisplayedText);\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst runningRef = useRef(false);\n\n\ttargetRef.current = targetText;\n\tenabledRef.current = enabled;\n\tinitialDisplayedRef.current = initialDisplayedText;\n\n\tuseEffect(() => {\n\t\tif (!enabled || instant) {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t\ttimerRef.current = null;\n\t\t\t}\n\t\t\trunningRef.current = false;\n\t\t\tdisplayedRef.current = targetText;\n\t\t\tsetDisplayedText(targetText);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tdisplayedRef.current.length === 0 &&\n\t\t\tinitialDisplayedRef.current &&\n\t\t\ttargetRef.current.startsWith(initialDisplayedRef.current)\n\t\t) {\n\t\t\tdisplayedRef.current = initialDisplayedRef.current;\n\t\t\tsetDisplayedText(initialDisplayedRef.current);\n\t\t}\n\n\t\t// If the target changed incompatibly (displayed is no longer a\n\t\t// prefix), flush instantly to the new target. This happens when\n\t\t// RAG image URLs are swapped to resolved blob URLs — the text is\n\t\t// visually identical so the jump is imperceptible.\n\t\tif (displayedRef.current && !targetRef.current.startsWith(displayedRef.current)) {\n\t\t\tdisplayedRef.current = targetRef.current;\n\t\t\tsetDisplayedText(targetRef.current);\n\t\t}\n\n\t\tif (runningRef.current) return;\n\t\trunningRef.current = true;\n\n\t\tconst tick = () => {\n\t\t\tif (!enabledRef.current) {\n\t\t\t\trunningRef.current = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Target changed incompatibly mid-tick (e.g. RAG URL swap).\n\t\t\t// Flush to the new content instantly rather than restarting.\n\t\t\tif (displayedRef.current && !targetRef.current.startsWith(displayedRef.current)) {\n\t\t\t\tdisplayedRef.current = targetRef.current;\n\t\t\t\tsetDisplayedText(targetRef.current);\n\t\t\t\ttimerRef.current = setTimeout(tick, speed.idle / multiplier);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (displayedRef.current.length < targetRef.current.length) {\n\t\t\t\tconst remaining = targetRef.current.slice(displayedRef.current.length);\n\n\t\t\t\t// Skip any complete markdown image token `` in one\n\t\t\t\t// step so the raw syntax never appears as typed text.\n\t\t\t\tconst imgMatch = MARKDOWN_IMAGE_REGEX.exec(remaining);\n\t\t\t\tif (imgMatch) {\n\t\t\t\t\tdisplayedRef.current += imgMatch[0];\n\t\t\t\t\tsetDisplayedText(displayedRef.current);\n\t\t\t\t\ttimerRef.current = setTimeout(tick, 0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst nextChar = remaining[0];\n\t\t\t\tdisplayedRef.current += nextChar;\n\t\t\t\tsetDisplayedText(displayedRef.current);\n\t\t\t\tconst delay = charDelay(nextChar, speed, multiplier);\n\t\t\t\ttimerRef.current = setTimeout(tick, delay);\n\t\t\t} else {\n\t\t\t\ttimerRef.current = setTimeout(tick, speed.idle / multiplier);\n\t\t\t}\n\t\t};\n\n\t\ttick();\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t\ttimerRef.current = null;\n\t\t\t}\n\t\t\trunningRef.current = false;\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [enabled, instant]);\n\n\tconst isTyping =\n\t\tenabled && !instant && displayedRef.current.length < targetRef.current.length;\n\n\treturn {\n\t\tdisplayedText: enabled || instant ? displayedText : targetText,\n\t\tisTyping,\n\t};\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tCopy,\n\tCheck,\n\tAlertCircle,\n\tWifiOff,\n\tBinoculars,\n\tThumbsUp,\n\tThumbsDown,\n} from \"lucide-react\";\nimport type {\n\tAssistantMessageActionsConfig,\n\tMessageDisplay,\n} from \"../../types\";\nimport { MarkdownRendererV2 } from \"./MarkdownRendererV2\";\nimport { ThinkingBlockV2 } from \"./ThinkingBlockV2\";\nimport { ActionTooltipV2 } from \"./ActionTooltipV2\";\nimport { FeedbackReasonModal } from \"./FeedbackReasonModal\";\nimport { cn } from \"../../utils/cn\";\nimport { useContext } from \"react\";\nimport { PaymanChatContext } from \"../../contexts\";\nimport type { SubmitFeedbackHandler } from \"../../utils/feedbackClient\";\nimport { useTypingEffect, RESPONSE_SPEED } from \"./useTypingEffect\";\n\n// Strips a trailing incomplete markdown image token from streaming content\n// so ReactMarkdown doesn't render raw URL text. Matches any of:\n// ![ — just opened\n// ![alt — alt text building\n// ![alt] — closed alt, no URL yet\n// \n// Does NOT match a complete token like .\nfunction stripIncompleteImageToken(text: string): string {\n\tconst lastBang = text.lastIndexOf(\" — keep it\n\tif (/^!\\[[^\\]]*\\]\\([^)]*\\)/.test(after)) return text;\n\t// Incomplete — strip from the `![` onward\n\treturn text.slice(0, lastBang);\n}\n\n// Strips a trailing incomplete markdown link token so ReactMarkdown doesn't\n// flash raw URL text while streaming or during the typing-reveal animation.\nfunction stripIncompleteLinkToken(text: string): string {\n\tconst lastBracket = text.lastIndexOf(\"[\");\n\tif (lastBracket === -1) return text;\n\t// Image tokens are handled by stripIncompleteImageToken.\n\tif (lastBracket > 0 && text[lastBracket - 1] === \"!\") return text;\n\n\tconst after = text.slice(lastBracket);\n\tif (/^\\[[^\\]]*\\]\\([^)]*\\)/.test(after)) return text;\n\treturn text.slice(0, lastBracket);\n}\n\nfunction stripIncompleteMarkdownTokens(text: string): string {\n\treturn stripIncompleteLinkToken(stripIncompleteImageToken(text));\n}\n\nexport type AssistantMessageV2Props = {\n\tmessage: MessageDisplay;\n\tonImageClick?: (src: string, alt: string) => void;\n\tonExecutionTraceClick?: (data: {\n\t\tmessage: MessageDisplay;\n\t\ttracingData?: unknown;\n\t\texecutionId?: string;\n\t}) => void;\n\t/**\n\t * Persist thumbs-up/down feedback. Resolves on a durable save and rejects\n\t * on failure so the optimistic UI can revert / the reason modal can show\n\t * an error.\n\t */\n\tonSubmitFeedback?: SubmitFeedbackHandler;\n\tactions?: AssistantMessageActionsConfig;\n\t/**\n\t * Typing-reveal speed multiplier. 1 = default, 2 = 2x faster,\n\t * 0.5 = half speed, 0 = instant reveal (animation disabled).\n\t */\n\ttypingSpeed?: number;\n};\n\ntype ToastState = {\n\tlabel: string;\n\ttone: \"success\" | \"error\";\n} | null;\n\nfunction getFeedbackState(message: MessageDisplay): \"up\" | \"down\" | null {\n\tconst feedback = (message as {\n\t\tfeedback?:\n\t\t\t| \"up\"\n\t\t\t| \"down\"\n\t\t\t| {\n\t\t\t\t\tfeedback?: string | null;\n\t\t\t }\n\t\t\t| null;\n\t}).feedback;\n\n\tif (feedback === \"up\" || feedback === \"down\") return feedback;\n\tif (feedback && typeof feedback === \"object\") {\n\t\tconst value = feedback.feedback;\n\t\tif (!value) return null;\n\t\treturn value === \"POSITIVE\" ? \"up\" : \"down\";\n\t}\n\n\treturn null;\n}\n\nexport function AssistantMessageV2({\n\tmessage,\n\tonImageClick,\n\tonExecutionTraceClick,\n\tonSubmitFeedback,\n\tactions,\n\ttypingSpeed = 4,\n}: AssistantMessageV2Props) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [activeFeedback, setActiveFeedback] = useState<\"up\" | \"down\" | null>(\n\t\t() => getFeedbackState(message),\n\t);\n\tconst [reasonModalOpen, setReasonModalOpen] = useState(false);\n\tconst chatContext = useContext(PaymanChatContext);\n\tconst chatContextRef = useRef(chatContext);\n\tchatContextRef.current = chatContext;\n\tconst handlePdfClick = useCallback((href: string, title: string, options?: { auto?: boolean }) => {\n\t\tchatContextRef.current?.openPdfSheet(href, title, options);\n\t}, []);\n\tconst canSubmitFeedback = !!onSubmitFeedback && !!message.executionId;\n\tconst [toast, setToast] = useState<ToastState>(null);\n\tconst copyResetTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst toastTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst showCopyAction = actions?.copy ?? true;\n\tconst showTraceAction =\n\t\t(actions?.trace ?? true) && !!onExecutionTraceClick;\n\tconst showThumbsUp = actions?.thumbsUp ?? true;\n\tconst showThumbsDown = actions?.thumbsDown ?? true;\n\tconst hydratedFeedback = (message as { feedback?: unknown }).feedback;\n\n\tconst hasEverStreamed = useRef(!!message.isStreaming);\n\tif (message.isStreaming) hasEverStreamed.current = true;\n\n\tuseEffect(() => {\n\t\tsetActiveFeedback(getFeedbackState(message));\n\t}, [hydratedFeedback, message.id]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\t};\n\t}, []);\n\n\tconst rawResponseContent = (() => {\n\t\tconst raw = message.isStreaming\n\t\t\t? (message.streamingContent || message.content)\n\t\t\t: message.content;\n\t\tif (!raw) return \"\";\n\t\tconst normalized = raw.replace(/\\\\n/g, \"\\n\");\n\t\t// While streaming, strip trailing incomplete markdown tokens so\n\t\t// ReactMarkdown doesn't flash raw URLs as plain text.\n\t\treturn message.isStreaming ? stripIncompleteMarkdownTokens(normalized) : normalized;\n\t})();\n\n\tconst isThinkingStreaming =\n\t\t!!message.isStreaming &&\n\t\t!rawResponseContent &&\n\t\t!message.isError;\n\n\tconst responseTypingEnabled =\n\t\thasEverStreamed.current && Boolean(rawResponseContent) && !message.isError;\n\n\tconst { displayedText: displayContent, isTyping: isResponseTyping } =\n\t\tuseTypingEffect(\n\t\t\trawResponseContent,\n\t\t\tresponseTypingEnabled,\n\t\t\tRESPONSE_SPEED,\n\t\t\tundefined,\n\t\t\ttypingSpeed,\n\t\t);\n\n\t// Two-line live-progress model computed from `message.steps`:\n\t//\n\t// stickyLabel: the Analyzer's LLM-generated plan narrative — e.g.\n\t// \"I'll pull your Q1 transactions and compare them against\n\t// April to spot the biggest recurring charges.\" Rendered as a\n\t// sticky header that never changes for the duration of the\n\t// run, so the user can read the agent's strategy while the\n\t// tactics tick by below. Null until the Analyzer completes.\n\t//\n\t// currentStepLabel: live tactical label — the tool/stage\n\t// currently in flight. Flips between \"Pulling debit\n\t// transactions from Jan 1 to Mar 31\", \"Totaling recurring\n\t// amount by merchant and month\", etc. as events land.\n\t//\n\t// This split matters especially for AGENTIC runs (60-120s with\n\t// 20+ tool events). A single flipping label meant the user saw\n\t// either the strategy OR the current tool, never both — they\n\t// couldn't map the running tools back onto the intent. Two lines\n\t// keep both in view.\n\tconst stickyLabel = (() => {\n\t\tconst steps = message.steps;\n\t\tif (!steps || steps.length === 0) return undefined;\n\t\t// Walk back looking for the most recent completed analyzer\n\t\t// stage with a dynamic server-provided message. The Analyzer\n\t\t// is the only stage today that writes a user-facing plan\n\t\t// narrative; future stages that do the same would match here\n\t\t// too via `stage === \"analyzer\"` (or expand the check).\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (\n\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\ts.stage === \"analyzer\" &&\n\t\t\t\ts.status === \"completed\" &&\n\t\t\t\ts.message\n\t\t\t) {\n\t\t\t\treturn s.message;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t})();\n\n\tconst currentStepLabel = (() => {\n\t\tconst steps = message.steps;\n\t\tif (!steps || steps.length === 0) return undefined;\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (s.status === \"in_progress\" && s.message) {\n\t\t\t\t// If the only in-progress step is the Analyzer itself\n\t\t\t\t// (we're still in the Analyzer's own window before it\n\t\t\t\t// publishes its plan), fall through to the default\n\t\t\t\t// start label — showing nothing would leave a blank\n\t\t\t\t// ticker.\n\t\t\t\tif (s.stage === \"analyzer\" && s.message === stickyLabel) continue;\n\t\t\t\t// Don't echo the sticky header in the ticker.\n\t\t\t\tif (s.message === stickyLabel) continue;\n\t\t\t\treturn s.message;\n\t\t\t}\n\t\t}\n\t\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\t\tconst s = steps[i];\n\t\t\tif (s.message && s.message !== stickyLabel) return s.message;\n\t\t}\n\t\treturn undefined;\n\t})();\n\n\tif (message.isError && !displayContent && !isThinkingStreaming) {\n\t\treturn (\n\t\t\t<div className=\"payman-v2-assistant-msg payman-v2-fade-in\">\n\t\t\t\t<div className=\"payman-v2-assistant-msg-error\">\n\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-error-icon\"\n\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-error-text\">\n\t\t\t\t\t\t\t{message.errorDetails || \"Something went wrong. Please try again.\"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst showToast = (label: string, tone: \"success\" | \"error\") => {\n\t\tif (toastTimerRef.current) clearTimeout(toastTimerRef.current);\n\t\tsetToast({ label, tone });\n\t\ttoastTimerRef.current = setTimeout(() => setToast(null), 1800);\n\t};\n\n\tconst handlePositiveFeedback = () => {\n\t\tif (!canSubmitFeedback || activeFeedback === \"up\") return;\n\t\tconst previous = activeFeedback;\n\t\tsetActiveFeedback(\"up\");\n\t\tPromise.resolve(\n\t\t\tonSubmitFeedback?.({\n\t\t\t\tmessageId: message.id,\n\t\t\t\texecutionId: message.executionId,\n\t\t\t\tfeedback: \"POSITIVE\",\n\t\t\t}),\n\t\t)\n\t\t\t.then(() => showToast(\"Thank you for your feedback\", \"success\"))\n\t\t\t.catch(() => {\n\t\t\t\tsetActiveFeedback(previous);\n\t\t\t\tshowToast(\"Could not send feedback\", \"error\");\n\t\t\t});\n\t};\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tif (!navigator.clipboard?.writeText) {\n\t\t\t\tthrow new Error(\"Clipboard unavailable\");\n\t\t\t}\n\t\t\tawait navigator.clipboard.writeText(displayContent);\n\t\t\tif (copyResetTimerRef.current) clearTimeout(copyResetTimerRef.current);\n\t\t\tsetCopied(true);\n\t\t\tcopyResetTimerRef.current = setTimeout(() => setCopied(false), 1800);\n\t\t\tshowToast(\"Copied to clipboard\", \"success\");\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t\tshowToast(\"Could not copy\", \"error\");\n\t\t}\n\t};\n\n\tconst handleTrace = () => {\n\t\tonExecutionTraceClick?.({\n\t\t\tmessage,\n\t\t\ttracingData: message.tracingData,\n\t\t\texecutionId: message.executionId,\n\t\t});\n\t};\n\n\tconst hasPartialError = message.isError && displayContent;\n\tconst isDone =\n\t\t!message.isStreaming &&\n\t\tdisplayContent &&\n\t\t!hasPartialError &&\n\t\t!isResponseTyping;\n\tconst hasVisibleDoneActions =\n\t\tshowCopyAction ||\n\t\tshowTraceAction ||\n\t\tshowThumbsUp ||\n\t\tshowThumbsDown;\n\tconst isCancelled = message.isCancelled;\n\n\tconst toastPortal =\n\t\ttypeof document !== \"undefined\"\n\t\t\t? createPortal(\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{toast && (\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -18, scale: 0.96 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -12, scale: 0.96 }}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\ttype: \"spring\",\n\t\t\t\t\t\t\t\t\tstiffness: 360,\n\t\t\t\t\t\t\t\t\tdamping: 26,\n\t\t\t\t\t\t\t\t\tmass: 0.7,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-toast\"\n\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-toast-inner\",\n\t\t\t\t\t\t\t\t\t\ttoast.tone === \"success\"\n\t\t\t\t\t\t\t\t\t\t\t? \"payman-v2-toast-success\"\n\t\t\t\t\t\t\t\t\t\t\t: \"payman-v2-toast-error\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{toast.tone === \"success\" ? (\n\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#059669\" }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ color: \"#ef4444\" }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span>{toast.label}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)\n\t\t\t: null;\n\n\treturn (\n\t\t<>\n\t\t\t{toastPortal}\n\n\t\t\t<div className=\"payman-v2-assistant-msg payman-v2-fade-in\">\n\t\t\t\t{/*\n\t\t\t\t Thinking block is live-progress only. Wrapped in\n\t\t\t\t AnimatePresence so that when streaming ends the\n\t\t\t\t block smoothly fades out and unmounts rather than\n\t\t\t\t popping off the page. No post-streaming \"Thought\"\n\t\t\t\t header — once the response is visible, the block's\n\t\t\t\t job is done and the user sees just the answer.\n\t\t\t\t Users who need to review what ran can click the\n\t\t\t\t trace icon in the action row.\n\t\t\t\t*/}\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{isThinkingStreaming && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tkey=\"thinking\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, height: \"auto\" }}\n\t\t\t\t\t\t\texit={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tduration: 0.32,\n\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tstyle={{ overflow: \"hidden\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ThinkingBlockV2\n\t\t\t\t\t\t\t\tisStreaming={isThinkingStreaming}\n\t\t\t\t\t\t\t\tstickyLabel={stickyLabel}\n\t\t\t\t\t\t\t\tcurrentStepLabel={currentStepLabel}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<div className=\"payman-v2-assistant-msg-content-area\">\n\t\t\t\t{displayContent ? (\n\t\t\t\t\t<MarkdownRendererV2\n\t\t\t\t\t\tcontent={\n\t\t\t\t\t\t\t(message.isStreaming && !isCancelled) || isResponseTyping\n\t\t\t\t\t\t\t\t? stripIncompleteMarkdownTokens(displayContent)\n\t\t\t\t\t\t\t\t: displayContent\n\t\t\t\t\t\t}\n\t\t\t\t\tisStreaming={(message.isStreaming && !isCancelled) || isResponseTyping}\n\t\t\t\t\tisResolvingImages={message.isResolvingImages}\n\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\tonPdfClick={handlePdfClick}\n\t\t\t\t\tautoOpenPdf={hasEverStreamed.current}\n\t\t\t\t\t/>\n\t\t\t\t) : !isThinkingStreaming ? (\n\t\t\t\t\t<span className=\"payman-v2-assistant-msg-placeholder\">...</span>\n\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t{isCancelled && message.isStreaming && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-paused\">\n\t\t\t\t\t\t<WifiOff\n\t\t\t\t\t\t\tstyle={{ width: 14, height: 14, color: \"rgba(217, 119, 6, 0.7)\", flexShrink: 0 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-paused-text\">\n\t\t\t\t\t\t\tConnection slow - resuming…\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{hasPartialError && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-partial-error\">\n\t\t\t\t\t\t<AlertCircle\n\t\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-error-icon\"\n\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"payman-v2-assistant-msg-error-text\">\n\t\t\t\t\t\t\t\t{message.errorDetails || \"The response was interrupted.\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{isDone && hasVisibleDoneActions && (\n\t\t\t\t\t<div className=\"payman-v2-assistant-msg-actions\">\n\t\t\t\t\t\t{showCopyAction && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Copy\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => void handleCopy()}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tcopied && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Copy\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t<Check style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Copy style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showThumbsUp && canSubmitFeedback && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Good response\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={handlePositiveFeedback}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tactiveFeedback === \"up\" && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Good response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThumbsUp\n\t\t\t\t\t\t\t\t\t\tfill={activeFeedback === \"up\" ? \"currentColor\" : \"none\"}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 15, height: 15 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showThumbsDown && canSubmitFeedback && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Bad response\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={() => setReasonModalOpen(true)}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-assistant-msg-action-btn\",\n\t\t\t\t\t\t\t\t\t\tactiveFeedback === \"down\" && \"payman-v2-assistant-msg-action-btn-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label=\"Bad response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThumbsDown\n\t\t\t\t\t\t\t\t\t\tfill={activeFeedback === \"down\" ? \"currentColor\" : \"none\"}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 15, height: 15 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showTraceAction && (\n\t\t\t\t\t\t\t<ActionTooltipV2 label=\"Trace\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={handleTrace}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-assistant-msg-action-btn\"\n\t\t\t\t\t\t\t\t\taria-label=\"Trace response\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Binoculars style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</ActionTooltipV2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t<FeedbackReasonModal\n\t\t\topen={reasonModalOpen}\n\t\t\tonClose={() => setReasonModalOpen(false)}\n\t\t\tonSubmit={async (reason, details) => {\n\t\t\t\tawait onSubmitFeedback?.({\n\t\t\t\t\tmessageId: message.id,\n\t\t\t\t\texecutionId: message.executionId,\n\t\t\t\t\tfeedback: reason,\n\t\t\t\t\tdetails,\n\t\t\t\t});\n\t\t\t\tsetActiveFeedback(\"down\");\n\t\t\t\tshowToast(\"Thank you for your feedback\", \"success\");\n\t\t\t}}\n\t\t/>\n\n\t\t</>\n\t);\n}\n","import { useEffect, useRef, type ClipboardEvent, type KeyboardEvent } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type OtpInputV2Props = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength?: number;\n\tdisabled?: boolean;\n\terror?: boolean;\n};\n\nconst DEFAULT_MAX_LENGTH = 6;\nconst MAX_SUPPORTED_LENGTH = 12;\nconst AUTO_FOCUS_DELAY_MS = 250;\n\nexport function OtpInputV2({\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tdisabled = false,\n\terror = false,\n}: OtpInputV2Props) {\n\tconst inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\tconst safeMaxLength =\n\t\tNumber.isInteger(maxLength) && (maxLength as number) > 0\n\t\t\t? Math.min(maxLength as number, MAX_SUPPORTED_LENGTH)\n\t\t\t: DEFAULT_MAX_LENGTH;\n\n\tconst digits = value\n\t\t.split(\"\")\n\t\t.concat(Array(safeMaxLength).fill(\"\"))\n\t\t.slice(0, safeMaxLength);\n\n\tuseEffect(() => {\n\t\tif (disabled) return;\n\t\tconst timer = window.setTimeout(() => {\n\t\t\tinputRefs.current[0]?.focus();\n\t\t}, AUTO_FOCUS_DELAY_MS);\n\t\treturn () => window.clearTimeout(timer);\n\t}, [disabled]);\n\n\tconst focusInput = (index: number) => {\n\t\tif (index >= 0 && index < safeMaxLength) {\n\t\t\tinputRefs.current[index]?.focus();\n\t\t}\n\t};\n\n\tconst updateValue = (newDigits: string[]) => {\n\t\tonChange(newDigits.join(\"\").slice(0, safeMaxLength));\n\t};\n\n\tconst handleChange = (index: number, char: string) => {\n\t\tif (char && !/^\\d$/.test(char)) return;\n\t\tconst newDigits = [...digits];\n\t\tnewDigits[index] = char;\n\t\tupdateValue(newDigits);\n\t\tif (char && index < safeMaxLength - 1) focusInput(index + 1);\n\t};\n\n\tconst handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (e.key === \"Enter\") {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === \"Backspace\") {\n\t\t\te.preventDefault();\n\t\t\tif (digits[index]) {\n\t\t\t\tconst newDigits = [...digits];\n\t\t\t\tnewDigits[index] = \"\";\n\t\t\t\tupdateValue(newDigits);\n\t\t\t} else if (index > 0) {\n\t\t\t\tconst newDigits = [...digits];\n\t\t\t\tnewDigits[index - 1] = \"\";\n\t\t\t\tupdateValue(newDigits);\n\t\t\t\tfocusInput(index - 1);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\tfocusInput(index - 1);\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\tfocusInput(index + 1);\n\t\t}\n\t};\n\n\tconst handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n\t\te.preventDefault();\n\t\tconst pasted = e.clipboardData\n\t\t\t.getData(\"text\")\n\t\t\t.replace(/\\D/g, \"\")\n\t\t\t.slice(0, safeMaxLength);\n\t\tif (!pasted) return;\n\t\tconst newDigits = pasted\n\t\t\t.split(\"\")\n\t\t\t.concat(Array(safeMaxLength).fill(\"\"))\n\t\t\t.slice(0, safeMaxLength);\n\t\tupdateValue(newDigits);\n\t\tfocusInput(Math.min(pasted.length, safeMaxLength - 1));\n\t};\n\n\treturn (\n\t\t<div className={cn(\"payman-v2-otp\", error && \"payman-v2-shake\")}>\n\t\t\t{digits.map((digit, i) => (\n\t\t\t\t<input\n\t\t\t\t\tkey={i}\n\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\tinputRefs.current[i] = el;\n\t\t\t\t\t}}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\tmaxLength={1}\n\t\t\t\t\tvalue={digit}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(e) => handleChange(i, e.target.value.slice(-1))}\n\t\t\t\t\tonKeyDown={(e) => handleKeyDown(i, e)}\n\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\tonFocus={(e) => e.target.select()}\n\t\t\t\t\taria-label={`Digit ${i + 1}`}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"payman-v2-otp-digit\",\n\t\t\t\t\t\tdigit && \"payman-v2-otp-digit-filled\",\n\t\t\t\t\t\terror && \"payman-v2-otp-digit-error\"\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ShieldCheck } from \"lucide-react\";\nimport type { ActiveUserAction } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { cn } from \"../../utils/cn\";\nimport { OtpInputV2 } from \"./OtpInputV2\";\n\nexport type VerificationInlineProps = {\n\tprompt: ActiveUserAction;\n\t/** Seconds left before expiry (undefined = no countdown). */\n\tsecondsLeft?: number;\n\t/** True once the expiry countdown has elapsed. */\n\texpired: boolean;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n\tonResend: (userActionId: string) => Promise<void>;\n};\n\nconst DEFAULT_CODE_LEN = 6;\nconst RESEND_COOLDOWN_S = 30;\n\n/** The verification code field is always keyed `verificationCode`. */\nfunction codeLengthFromSchema(prompt: ActiveUserAction): number {\n\tconst field = prompt.requestedSchema?.properties?.verificationCode;\n\tconst max = typeof field?.maxLength === \"number\" ? field.maxLength : undefined;\n\tconst min = typeof field?.minLength === \"number\" ? field.minLength : undefined;\n\treturn max ?? min ?? DEFAULT_CODE_LEN;\n}\n\n/**\n * Inline one-time-code entry. Numeric codes use the boxed OTP input and\n * auto-submit when full; alphanumeric codes use a single text field.\n * Text-driven: a short label, the input, then plain action links.\n */\nexport function VerificationInline({\n\tprompt,\n\tsecondsLeft,\n\texpired,\n\tonSubmit,\n\tonCancel,\n\tonResend,\n}: VerificationInlineProps) {\n\tconst isNumeric = prompt.verificationType !== \"ALPHANUMERIC_CODE\";\n\tconst codeLen = useMemo(() => codeLengthFromSchema(prompt), [prompt]);\n\n\tconst [code, setCode] = useState(\"\");\n\tconst [errored, setErrored] = useState(false);\n\tconst [resendSec, setResendSec] = useState(0);\n\tconst lastSubmittedRef = useRef<string | null>(null);\n\tconst resendTimerRef = useRef<number | undefined>(undefined);\n\n\tconst status = prompt.status;\n\tconst busy = status === \"submitting\";\n\tconst stale = status === \"stale\";\n\tconst locked = busy || stale || expired;\n\n\t// A SubmissionInvalid supersede arrives as a fresh prompt object;\n\t// flag the input red so the user sees the prior code was rejected.\n\tuseEffect(() => {\n\t\tif (prompt.subAction === \"SubmissionInvalid\") {\n\t\t\tsetErrored(true);\n\t\t\tsetCode(\"\");\n\t\t\tlastSubmittedRef.current = null;\n\t\t}\n\t}, [prompt.subAction, prompt.userActionId]);\n\n\tuseEffect(() => {\n\t\tif (code.length < codeLen) lastSubmittedRef.current = null;\n\t}, [code, codeLen]);\n\n\tconst doSubmit = useCallback(\n\t\t(value: string) => {\n\t\t\tif (locked || !value) return;\n\t\t\tif (lastSubmittedRef.current === value) return;\n\t\t\tlastSubmittedRef.current = value;\n\t\t\tvoid onSubmit(prompt.userActionId, { verificationCode: value }).catch(() => {\n\t\t\t\tlastSubmittedRef.current = null;\n\t\t\t\tsetErrored(true);\n\t\t\t});\n\t\t},\n\t\t[locked, onSubmit, prompt.userActionId],\n\t);\n\n\t// Auto-submit numeric codes once all digits are entered.\n\tuseEffect(() => {\n\t\tif (!isNumeric || locked) return;\n\t\tif (code.length === codeLen && /^\\d+$/.test(code)) {\n\t\t\tdoSubmit(code);\n\t\t}\n\t}, [code, codeLen, doSubmit, isNumeric, locked]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst startResendCooldown = useCallback(() => {\n\t\tsetResendSec(RESEND_COOLDOWN_S);\n\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t}\n\t\tresendTimerRef.current = window.setInterval(() => {\n\t\t\tsetResendSec((s) => {\n\t\t\t\tif (s <= 1) {\n\t\t\t\t\tif (typeof resendTimerRef.current === \"number\") {\n\t\t\t\t\t\twindow.clearInterval(resendTimerRef.current);\n\t\t\t\t\t\tresendTimerRef.current = undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn s - 1;\n\t\t\t});\n\t\t}, 1000);\n\t}, []);\n\n\tconst handleResend = useCallback(async () => {\n\t\tif (locked || resendSec > 0) return;\n\t\tsetErrored(false);\n\t\tsetCode(\"\");\n\t\tlastSubmittedRef.current = null;\n\t\ttry {\n\t\t\tawait onResend(prompt.userActionId);\n\t\t\tstartResendCooldown();\n\t\t} catch {\n\t\t\t/* hook surfaces the error */\n\t\t}\n\t}, [locked, onResend, prompt.userActionId, resendSec, startResendCooldown]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tif (busy) return;\n\t\tvoid onCancel(prompt.userActionId);\n\t}, [busy, onCancel, prompt.userActionId]);\n\n\tconst description =\n\t\tprompt.message?.trim() ||\n\t\t(isNumeric\n\t\t\t? `Enter the ${codeLen}-digit code to continue`\n\t\t\t: \"Enter the verification code to continue\");\n\n\treturn (\n\t\t<div className=\"payman-v2-ua\" role=\"group\" aria-label=\"Verification required\">\n\t\t\t<div className=\"payman-v2-ua-head\">\n\t\t\t\t<ShieldCheck className=\"payman-v2-ua-icon\" size={15} strokeWidth={1.75} aria-hidden />\n\t\t\t\t<span className=\"payman-v2-ua-title\">Verification required</span>\n\t\t\t\t{typeof secondsLeft === \"number\" && !stale && (\n\t\t\t\t\t<span className=\"payman-v2-ua-timer\">\n\t\t\t\t\t\t{expired ? \"Expired\" : `${secondsLeft}s`}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<p className=\"payman-v2-ua-desc\">{description}</p>\n\n\t\t\t{stale ? (\n\t\t\t\t<p className=\"payman-v2-ua-stale\">This request is no longer available.</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{isNumeric ? (\n\t\t\t\t\t\t<div className=\"payman-v2-ua-field\">\n\t\t\t\t\t\t\t<OtpInputV2\n\t\t\t\t\t\t\t\tvalue={code}\n\t\t\t\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\t\t\t\tsetErrored(false);\n\t\t\t\t\t\t\t\t\tsetCode(v);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tmaxLength={codeLen}\n\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\terror={errored}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"payman-v2-ua-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", errored && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\tvalue={code}\n\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\tautoComplete=\"one-time-code\"\n\t\t\t\t\t\t\t\tplaceholder=\"Verification code\"\n\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\tsetErrored(false);\n\t\t\t\t\t\t\t\t\tsetCode(e.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tdoSubmit(code.trim());\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"payman-v2-ua-actions\">\n\t\t\t\t\t\t{!isNumeric && (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-ua-btn payman-v2-ua-btn-primary\"\n\t\t\t\t\t\t\t\tdisabled={locked || !code.trim()}\n\t\t\t\t\t\t\t\tonClick={() => doSubmit(code.trim())}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{busy ? \"Submitting…\" : \"Submit\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-ua-link\"\n\t\t\t\t\t\t\tdisabled={locked || resendSec > 0}\n\t\t\t\t\t\t\tonClick={() => void handleResend()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{resendSec > 0 ? `Resend (${resendSec}s)` : \"Resend\"}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-ua-link payman-v2-ua-link-danger\"\n\t\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useMemo, useState } from \"react\";\nimport { Pencil } from \"lucide-react\";\nimport {\n\ttype ActiveUserAction,\n\tbuildContent,\n\tclassifyField,\n\tdefaultValueFor,\n\tgetOptions,\n\tisRequired,\n\trenderableFields,\n\tvalidateForm,\n} from \"@paymanai/payman-typescript-ask-sdk\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SchemaFormInlineProps = {\n\tprompt: ActiveUserAction;\n\tsecondsLeft?: number;\n\texpired: boolean;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n};\n\n/**\n * Inline form rendered from a prompt's `requestedSchema`. Supports the\n * documented flat subset (text / number / boolean / oneOf single-select)\n * via the core `jsonSchemaForm` helpers; unsupported nested fields are\n * skipped. Text-driven: a label, stacked fields, then plain actions.\n */\nexport function SchemaFormInline({\n\tprompt,\n\tsecondsLeft,\n\texpired,\n\tonSubmit,\n\tonCancel,\n}: SchemaFormInlineProps) {\n\tconst schema = prompt.requestedSchema;\n\tconst fields = useMemo(() => renderableFields(schema), [schema]);\n\n\tconst [values, setValues] = useState<Record<string, unknown>>(() => {\n\t\tconst init: Record<string, unknown> = {};\n\t\tfor (const [key, field] of fields) init[key] = defaultValueFor(field);\n\t\treturn init;\n\t});\n\tconst [errors, setErrors] = useState<Record<string, string>>({});\n\n\tconst status = prompt.status;\n\tconst busy = status === \"submitting\";\n\tconst stale = status === \"stale\";\n\tconst locked = busy || stale || expired;\n\n\tconst setValue = (key: string, value: unknown) => {\n\t\tsetValues((prev) => ({ ...prev, [key]: value }));\n\t\tsetErrors((prev) => {\n\t\t\tif (!prev[key]) return prev;\n\t\t\tconst next = { ...prev };\n\t\t\tdelete next[key];\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst handleSubmit = () => {\n\t\tif (locked) return;\n\t\tconst validation = validateForm(schema, values);\n\t\tif (Object.keys(validation).length > 0) {\n\t\t\tsetErrors(validation);\n\t\t\treturn;\n\t\t}\n\t\tvoid onSubmit(prompt.userActionId, buildContent(schema, values)).catch(() => {\n\t\t\t/* hook surfaces the error and re-opens the prompt */\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className=\"payman-v2-ua\" role=\"group\" aria-label=\"Action required\">\n\t\t\t<div className=\"payman-v2-ua-head\">\n\t\t\t\t<Pencil className=\"payman-v2-ua-icon\" size={14} strokeWidth={1.75} aria-hidden />\n\t\t\t\t<span className=\"payman-v2-ua-title\">Action required</span>\n\t\t\t\t{typeof secondsLeft === \"number\" && !stale && (\n\t\t\t\t\t<span className=\"payman-v2-ua-timer\">{expired ? \"Expired\" : `${secondsLeft}s`}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{prompt.message?.trim() && <p className=\"payman-v2-ua-desc\">{prompt.message}</p>}\n\n\t\t\t{stale ? (\n\t\t\t\t<p className=\"payman-v2-ua-stale\">This request is no longer available.</p>\n\t\t\t) : fields.length === 0 ? (\n\t\t\t\t<p className=\"payman-v2-ua-desc\">This action has no inputs to fill.</p>\n\t\t\t) : (\n\t\t\t\t<div className=\"payman-v2-ua-form\">\n\t\t\t\t\t{fields.map(([key, field]) => {\n\t\t\t\t\t\tconst widget = classifyField(field);\n\t\t\t\t\t\tconst label = field.title || key;\n\t\t\t\t\t\tconst required = isRequired(schema, key);\n\t\t\t\t\t\tconst err = errors[key];\n\t\t\t\t\t\tconst fieldId = `ua-${prompt.userActionId}-${key}`;\n\n\t\t\t\t\t\tif (widget === \"boolean\") {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<label key={key} className=\"payman-v2-ua-check\">\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\tchecked={Boolean(values[key])}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.checked)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t{required && <span className=\"payman-v2-ua-req\">*</span>}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={key} className=\"payman-v2-ua-row\">\n\t\t\t\t\t\t\t\t<label htmlFor={fieldId} className=\"payman-v2-ua-label\">\n\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t{required && <span className=\"payman-v2-ua-req\">*</span>}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t{field.description && (\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-ua-hint\">{field.description}</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{widget === \"select\" ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", err && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\t\t\tvalue={String(values[key] ?? \"\")}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.value)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<option value=\"\" disabled>\n\t\t\t\t\t\t\t\t\t\t\tSelect…\n\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t{getOptions(field).map((opt) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={opt.const} value={opt.const}>\n\t\t\t\t\t\t\t\t\t\t\t\t{opt.title || opt.const}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\t\t\ttype={widget === \"integer\" || widget === \"decimal\" ? \"number\" : \"text\"}\n\t\t\t\t\t\t\t\t\t\tinputMode={\n\t\t\t\t\t\t\t\t\t\t\twidget === \"integer\"\n\t\t\t\t\t\t\t\t\t\t\t\t? \"numeric\"\n\t\t\t\t\t\t\t\t\t\t\t\t: widget === \"decimal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"decimal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tstep={widget === \"decimal\" ? \"any\" : widget === \"integer\" ? \"1\" : undefined}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\"payman-v2-ua-input\", err && \"payman-v2-ua-input-error\")}\n\t\t\t\t\t\t\t\t\t\tvalue={String(values[key] ?? \"\")}\n\t\t\t\t\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\t\t\t\t\tplaceholder={field.description ? undefined : label}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setValue(key, e.target.value)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\") {\n\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\thandleSubmit();\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/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{err && <span className=\"payman-v2-ua-error\">{err}</span>}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!stale && (\n\t\t\t\t<div className=\"payman-v2-ua-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-ua-btn payman-v2-ua-btn-primary\"\n\t\t\t\t\t\tdisabled={locked}\n\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t>\n\t\t\t\t\t\t{busy ? \"Submitting…\" : \"Submit\"}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-ua-link payman-v2-ua-link-danger\"\n\t\t\t\t\t\tdisabled={busy}\n\t\t\t\t\t\tonClick={() => void onCancel(prompt.userActionId)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Info, X } from \"lucide-react\";\nimport type { UserNotification } from \"@paymanai/payman-typescript-ask-sdk\";\n\nexport type NotificationInlineProps = {\n\tnotification: UserNotification;\n\tonDismiss?: (id: string) => void;\n};\n\n/** A display-only, inline notification line with an optional dismiss. */\nexport function NotificationInline({ notification, onDismiss }: NotificationInlineProps) {\n\treturn (\n\t\t<div className=\"payman-v2-ua-note\" role=\"status\">\n\t\t\t<Info className=\"payman-v2-ua-note-icon\" size={14} strokeWidth={1.75} aria-hidden />\n\t\t\t<span className=\"payman-v2-ua-note-text\">{notification.message}</span>\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"payman-v2-ua-note-dismiss\"\n\t\t\t\t\taria-label=\"Dismiss notification\"\n\t\t\t\t\tonClick={() => onDismiss(notification.id)}\n\t\t\t\t>\n\t\t\t\t\t<X size={13} strokeWidth={2} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport type { ActiveUserAction, UserNotification } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { VerificationInline } from \"./VerificationInline\";\nimport { SchemaFormInline } from \"./SchemaFormInline\";\nimport { NotificationInline } from \"./NotificationInline\";\n\nexport type UserActionInlineProps = {\n\tprompt: ActiveUserAction;\n\tonSubmit: (userActionId: string, content: Record<string, unknown>) => Promise<void>;\n\tonCancel: (userActionId: string) => Promise<void>;\n\tonResend: (userActionId: string) => Promise<void>;\n};\n\n/**\n * Live countdown derived from `prompt.expirySeconds`. Returns `[secondsLeft,\n * expired]`; `secondsLeft` is `undefined` when no expiry was provided. The\n * countdown resets whenever the prompt id changes (a fresh prompt / resend).\n */\nfunction useExpiryCountdown(prompt: ActiveUserAction): [number | undefined, boolean] {\n\tconst initial =\n\t\ttypeof prompt.expirySeconds === \"number\" && prompt.expirySeconds > 0\n\t\t\t? Math.floor(prompt.expirySeconds)\n\t\t\t: undefined;\n\tconst [secondsLeft, setSecondsLeft] = useState<number | undefined>(initial);\n\n\tuseEffect(() => {\n\t\tif (initial === undefined) {\n\t\t\tsetSecondsLeft(undefined);\n\t\t\treturn;\n\t\t}\n\t\tsetSecondsLeft(initial);\n\t\tconst id = window.setInterval(() => {\n\t\t\tsetSecondsLeft((s) => {\n\t\t\t\tif (s === undefined) return s;\n\t\t\t\tif (s <= 1) {\n\t\t\t\t\twindow.clearInterval(id);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn s - 1;\n\t\t\t});\n\t\t}, 1000);\n\t\treturn () => window.clearInterval(id);\n\t\t// Restart the countdown on a new prompt id (resend / supersede).\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [prompt.userActionId, prompt.subAction, initial]);\n\n\tconst expired = initial !== undefined && secondsLeft === 0;\n\treturn [secondsLeft, expired];\n}\n\n/**\n * Dispatcher for a single active user-action prompt. Owns the shared\n * expiry countdown and routes to the verification or form renderer by\n * `prompt.kind`. (Notification-kind prompts are surfaced as\n * notifications upstream, but we handle the kind here defensively.)\n */\nexport function UserActionInline({ prompt, onSubmit, onCancel, onResend }: UserActionInlineProps) {\n\tconst [secondsLeft, expired] = useExpiryCountdown(prompt);\n\n\tlet body: React.ReactNode;\n\tif (prompt.kind === \"verification\") {\n\t\tbody = (\n\t\t\t<VerificationInline\n\t\t\t\tprompt={prompt}\n\t\t\t\tsecondsLeft={secondsLeft}\n\t\t\t\texpired={expired}\n\t\t\t\tonSubmit={onSubmit}\n\t\t\t\tonCancel={onCancel}\n\t\t\t\tonResend={onResend}\n\t\t\t/>\n\t\t);\n\t} else if (prompt.kind === \"notification\") {\n\t\tconst note: UserNotification = { id: prompt.userActionId, message: prompt.message ?? \"\" };\n\t\tbody = <NotificationInline notification={note} />;\n\t} else {\n\t\tbody = (\n\t\t\t<SchemaFormInline\n\t\t\t\tprompt={prompt}\n\t\t\t\tsecondsLeft={secondsLeft}\n\t\t\t\texpired={expired}\n\t\t\t\tonSubmit={onSubmit}\n\t\t\t\tonCancel={onCancel}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<motion.div\n\t\t\tclassName=\"payman-v2-ua-wrap\"\n\t\t\tinitial={{ opacity: 0, y: 8 }}\n\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\ttransition={{ type: \"spring\", stiffness: 320, damping: 28 }}\n\t\t>\n\t\t\t{body}\n\t\t</motion.div>\n\t);\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { MessageListV2Props } from \"../../types\";\nimport { UserMessageV2 } from \"./UserMessageV2\";\nimport { AssistantMessageV2 } from \"./AssistantMessageV2\";\nimport { UserActionInline } from \"./UserActionInline\";\nimport { NotificationInline } from \"./NotificationInline\";\n\nexport type { MessageListV2Props } from \"../../types\";\n\nconst SCROLL_THRESHOLD = 100;\n\n// Minimum upward delta (px) in scrollTop we treat as a deliberate user\n// scroll-up. Anything smaller is ignored — browsers occasionally emit\n// 1–2px scroll jitters on content growth that we don't want to\n// misinterpret as \"user wants to read history.\"\nconst USER_SCROLL_UP_EPSILON = 4;\n\nexport type MessageListV2Handle = {\n\tscrollToBottom: (behavior?: ScrollBehavior) => void;\n};\n\nexport const MessageListV2 = forwardRef<MessageListV2Handle, MessageListV2Props>(\n\tfunction MessageListV2(\n\t\t{\n\t\t\tmessages,\n\t\t\tisStreaming: _isStreaming = false,\n\t\t\tonEditUserMessage,\n\t\t\tonRetryUserMessage,\n\t\t\tonImageClick,\n\t\t\tonExecutionTraceClick,\n\t\t\tmessageActions,\n\t\t\tretryDisabled = false,\n\t\t\tuserActionPrompts,\n\t\t\tnotifications,\n\t\t\tonSubmitUserAction,\n\t\t\tonCancelUserAction,\n\t\t\tonResendUserAction,\n\t\t\tonDismissNotification,\n\t\t\tonSubmitFeedback,\n\t\t\ttypingSpeed = 4,\n\t\t\tsidePanelOpen = false,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst noop = useCallback(async () => {}, []);\n\t\tconst scrollRef = useRef<HTMLDivElement>(null);\n\t\tconst scrollInnerRef = useRef<HTMLDivElement>(null);\n\t\tconst isNearBottomRef = useRef(true);\n\t\tconst [showScrollBtn, setShowScrollBtn] = useState(false);\n\t\tconst prevCountRef = useRef(messages.length);\n\t\tconst pauseStickUntilUserMessageRef = useRef(false);\n\t\tconst followingBottomRef = useRef(true);\n\t\tconst sidePanelOpenRef = useRef(sidePanelOpen);\n\t\tsidePanelOpenRef.current = sidePanelOpen;\n\t\tconst lastPinAtRef = useRef(0);\n\t\tconst prevScrollTopRef = useRef(0);\n\n\t\tconst getDistanceFromBottom = useCallback(() => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return 0;\n\t\t\treturn el.scrollHeight - el.scrollTop - el.clientHeight;\n\t\t}, []);\n\n\t\tconst pinToBottom = useCallback((behavior: ScrollBehavior = \"instant\") => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return;\n\t\t\tlastPinAtRef.current = performance.now();\n\t\t\tel.scrollTo({ top: el.scrollHeight, behavior });\n\t\t\tprevScrollTopRef.current = el.scrollHeight;\n\t\t}, []);\n\n\t\tconst scrollToBottom = useCallback(\n\t\t\t(behavior: ScrollBehavior = \"smooth\") => {\n\t\t\t\tconst el = scrollRef.current;\n\t\t\t\tif (!el) return;\n\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\tpinToBottom(behavior);\n\t\t\t},\n\t\t\t[pinToBottom],\n\t\t);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tscrollToBottom: (behavior: ScrollBehavior = \"smooth\") => {\n\t\t\t\t\tisNearBottomRef.current = true;\n\t\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\t\tsetShowScrollBtn(false);\n\t\t\t\t\tscrollToBottom(behavior);\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[scrollToBottom],\n\t\t);\n\n\t\tconst handleScroll = useCallback(() => {\n\t\t\tconst el = scrollRef.current;\n\t\t\tif (!el) return;\n\n\t\t\tconst currentScrollTop = el.scrollTop;\n\t\t\tconst prevScrollTop = prevScrollTopRef.current;\n\t\t\tprevScrollTopRef.current = currentScrollTop;\n\n\t\t\tconst distance = getDistanceFromBottom();\n\t\t\tconst nearBottom = distance <= SCROLL_THRESHOLD;\n\t\t\tisNearBottomRef.current = nearBottom;\n\t\t\tsetShowScrollBtn(!nearBottom);\n\n\t\t\tconst scrolledUp = currentScrollTop < prevScrollTop - USER_SCROLL_UP_EPSILON;\n\t\t\tif (scrolledUp) {\n\t\t\t\tfollowingBottomRef.current = false;\n\t\t\t\tpauseStickUntilUserMessageRef.current = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sincePin = performance.now() - lastPinAtRef.current;\n\t\t\tif (sincePin < 250) return;\n\n\t\t\tif (nearBottom) {\n\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t}\n\t\t}, [getDistanceFromBottom]);\n\n\t\tconst handleWheel = useCallback((e: React.WheelEvent<HTMLDivElement>) => {\n\t\t\tif (e.deltaY < 0) {\n\t\t\t\tfollowingBottomRef.current = false;\n\t\t\t\tpauseStickUntilUserMessageRef.current = true;\n\t\t\t}\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tconst prevCount = prevCountRef.current;\n\t\t\tprevCountRef.current = messages.length;\n\t\t\tif (messages.length > prevCount) {\n\t\t\t\tconst last = messages[messages.length - 1];\n\t\t\t\tif (last?.role === \"user\") {\n\t\t\t\t\tpauseStickUntilUserMessageRef.current = false;\n\t\t\t\t\tfollowingBottomRef.current = true;\n\t\t\t\t\trequestAnimationFrame(() => scrollToBottom());\n\t\t\t\t} else if (\n\t\t\t\t\t!sidePanelOpenRef.current &&\n\t\t\t\t\t!pauseStickUntilUserMessageRef.current &&\n\t\t\t\t\tfollowingBottomRef.current\n\t\t\t\t) {\n\t\t\t\t\trequestAnimationFrame(() => scrollToBottom(\"instant\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}, [messages.length, scrollToBottom]);\n\n\t\tuseEffect(() => {\n\t\t\tconst inner = scrollInnerRef.current;\n\t\t\tif (!inner) return;\n\n\t\t\tconst pinIfFollowing = () => {\n\t\t\t\tif (sidePanelOpenRef.current) return;\n\t\t\t\tif (pauseStickUntilUserMessageRef.current) return;\n\t\t\t\tif (!followingBottomRef.current) return;\n\t\t\t\tif (getDistanceFromBottom() > SCROLL_THRESHOLD) return;\n\t\t\t\tpinToBottom(\"instant\");\n\t\t\t};\n\n\t\t\tconst ro = new ResizeObserver(pinIfFollowing);\n\t\t\tro.observe(inner);\n\n\t\t\treturn () => ro.disconnect();\n\t\t}, [pinToBottom, getDistanceFromBottom]);\n\n\t\tuseEffect(() => {\n\t\t\tif (messages.length > 0) {\n\t\t\t\tsetTimeout(() => scrollToBottom(\"instant\"), 50);\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t}, []);\n\n\t\treturn (\n\t\t\t<div className=\"payman-v2-message-list\">\n\t\t\t\t<div\n\t\t\t\t\tref={scrollRef}\n\t\t\t\t\tonScroll={handleScroll}\n\t\t\t\t\tonWheel={handleWheel}\n\t\t\t\t\tclassName=\"payman-v2-message-scroll payman-v2-scrollbar\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={scrollInnerRef}\n\t\t\t\t\t\tclassName=\"payman-v2-message-scroll-inner\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{messages.map((message) => (\n\t\t\t\t\t\t\t<div key={message.id}>\n\t\t\t\t\t\t\t\t{message.role === \"user\" ? (\n\t\t\t\t\t\t\t\t\t<UserMessageV2\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tonEdit={onEditUserMessage}\n\t\t\t\t\t\t\t\t\t\tonRetry={onRetryUserMessage}\n\t\t\t\t\t\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\t\t\t\t\t\tretryDisabled={retryDisabled}\n\t\t\t\t\t\t\t\t\t\tactions={messageActions?.userMessageActions}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<AssistantMessageV2\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tonImageClick={onImageClick}\n\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\tonSubmitFeedback={onSubmitFeedback}\n\t\t\t\t\t\t\t\t\t\tactions={messageActions?.assistantMessageActions}\n\t\t\t\t\t\t\t\t\t\ttypingSpeed={typingSpeed}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{notifications?.map((note) => (\n\t\t\t\t\t\t\t<NotificationInline\n\t\t\t\t\t\t\t\tkey={note.id}\n\t\t\t\t\t\t\t\tnotification={note}\n\t\t\t\t\t\t\t\tonDismiss={onDismissNotification}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t{userActionPrompts?.map((prompt) => (\n\t\t\t\t\t\t\t<UserActionInline\n\t\t\t\t\t\t\t\tkey={prompt.toolCallId || prompt.userActionId}\n\t\t\t\t\t\t\t\tprompt={prompt}\n\t\t\t\t\t\t\t\tonSubmit={onSubmitUserAction ?? noop}\n\t\t\t\t\t\t\t\tonCancel={onCancelUserAction ?? noop}\n\t\t\t\t\t\t\t\tonResend={onResendUserAction ?? noop}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{showScrollBtn && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: 6 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\tclassName=\"payman-v2-scroll-to-bottom\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tscrollToBottom();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-scroll-to-bottom-btn\"\n\t\t\t\t\t\t\t\taria-label=\"Scroll to bottom\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowDown style={{ width: 16, height: 16 }} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { X } from \"lucide-react\";\n\nexport type FilePreviewModalProps = {\n\tsrc: string | null;\n\tname: string;\n\tonClose: () => void;\n};\n\nexport function FilePreviewModal({ src, name, onClose }: FilePreviewModalProps) {\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst [isLoaded, setIsLoaded] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t\treturn () => setIsMounted(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetIsLoaded(false);\n\t}, [src]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t},\n\t\t[onClose],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!src || typeof document === \"undefined\") return;\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst prev = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = prev;\n\t\t};\n\t}, [src, handleKeyDown]);\n\n\tif (!isMounted || typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t{src ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey=\"file-preview\"\n\t\t\t\t\tclassName=\"payman-v2-file-preview-overlay\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\taria-label={`Preview: ${name}`}\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-file-preview-close\"\n\t\t\t\t\t\taria-label=\"Close preview\"\n\t\t\t\t\t\tonClick={(e) => { e.stopPropagation(); onClose(); }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<X size={18} strokeWidth={2} />\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tclassName=\"payman-v2-file-preview-inner\"\n\t\t\t\t\t\tinitial={{ scale: 0.93, opacity: 0 }}\n\t\t\t\t\t\tanimate={{ scale: isLoaded ? 1 : 0.93, opacity: isLoaded ? 1 : 0 }}\n\t\t\t\t\t\texit={{ scale: 0.93, opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\talt={name}\n\t\t\t\t\t\t\tclassName=\"payman-v2-file-preview-img\"\n\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\tonLoad={() => setIsLoaded(true)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>,\n\t\tdocument.body,\n\t);\n}\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n\tArrowUp,\n\tLoader2,\n\tMic,\n\tPlus,\n\tImagePlus,\n\tPaperclip,\n\tPencil,\n\tRotateCcw,\n\tTelescope,\n\tX,\n\tZap,\n\tFileText,\n} from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { getSlashCommandValidationHint } from \"../../utils/slashCommands\";\nimport type { SlashCommandConfig } from \"../../types\";\nimport type { AttachmentUploadStatus, StreamAttachmentPayload } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { isPdfFile } from \"@paymanai/payman-typescript-ask-sdk\";\nimport { PaymanChatContext } from \"../../contexts\";\nimport { FilePreviewModal } from \"./FilePreviewModal\";\nimport { formatAttachmentBytes } from \"../../utils/formatAttachmentBytes\";\n\ntype AttachmentKind = \"image\" | \"file\";\n\ntype AttachedFile = {\n\tid: string;\n\tfile: File;\n\tkind: AttachmentKind;\n\tobjectUrl: string;\n};\n\nfunction normalizeExtension(ext: string): string {\n\treturn ext.replace(/^\\./, \"\").toLowerCase();\n}\n\nfunction extOf(filename: string): string {\n\treturn filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n}\n\nfunction isAllowedImage(file: File, allowedExtensions: string[]): boolean {\n\tconst allowed = new Set(allowedExtensions.map(normalizeExtension));\n\tconst ext = extOf(file.name);\n\tif (allowed.has(ext)) return true;\n\tif (!file.type.startsWith(\"image/\")) return false;\n\tconst mimeSubtype = file.type.slice(\"image/\".length).toLowerCase();\n\treturn allowed.has(mimeSubtype) || mimeSubtype === \"jpeg\" && allowed.has(\"jpg\");\n}\n\nfunction isAllowedDocument(file: File, allowedExtensions: string[]): boolean {\n\tconst allowed = new Set(allowedExtensions.map(normalizeExtension));\n\treturn allowed.has(extOf(file.name));\n}\n\nfunction fileTypeLabel(file: File, kind: AttachmentKind): string {\n\tif (kind === \"image\") return \"Image\";\n\tconst ext = extOf(file.name);\n\treturn ext ? ext.toUpperCase() : \"Document\";\n}\n\nexport type ChatInputV2Props = {\n\tonSend: (\n\t\tmessage: string,\n\t\tfiles: File[],\n\t\tattachments: StreamAttachmentPayload[],\n\t) => void | Promise<void>;\n\tonCancel?: () => void;\n\tdisabled?: boolean;\n\tisStreaming?: boolean;\n\t/** Disables send while attachment signed-URL uploads are in flight. */\n\tisUploadingAttachments?: boolean;\n\t/** False while any attached file is still uploading. Default: true. */\n\tattachmentsReady?: boolean;\n\t/** True when at least one attachment failed to upload. */\n\thasAttachmentUploadErrors?: boolean;\n\t/** Per-attachment upload status keyed by attachment id. */\n\tattachmentUploadStatusById?: Record<string, AttachmentUploadStatus>;\n\t/** Pre-uploaded attachment payloads for the current picker selection. */\n\tuploadedAttachmentPayloads?: StreamAttachmentPayload[];\n\tplaceholder?: string;\n\tenableVoice?: boolean;\n\tvoiceAvailable?: boolean;\n\tisRecording?: boolean;\n\tonVoicePress?: () => void;\n\tonCancelRecording?: () => void;\n\tonConfirmRecording?: () => void;\n\ttranscribedText?: string;\n\tshowResetSession?: boolean;\n\tonResetSession?: () => void;\n\tshowAttachmentButton?: boolean;\n\tshowUploadImageButton?: boolean;\n\tshowAttachFileButton?: boolean;\n\tonUploadImageClick?: () => void;\n\tonAttachFileClick?: () => void;\n\t/** Extensions accepted by \"Upload image\" picker (no leading dot). Default: jpg, jpeg, png */\n\tallowedImageExtensions?: string[];\n\t/** Extensions accepted by \"Attach file\" picker (no leading dot). Default: pdf */\n\tallowedFileExtensions?: string[];\n\t/** Max combined attachments per message. Omit for no limit. */\n\tmaxCount?: number;\n\t/** Max bytes per attachment. Omit for no limit. */\n\tmaxFileBytes?: number;\n\t/** Max combined bytes across attachments per message. Omit for no limit. */\n\tmaxTotalBytes?: number;\n\t/** Called whenever the attached file list changes. */\n\tonFilesChange?: (files: File[]) => void;\n\t/** Called with stable ids whenever attachments are added or removed. */\n\tonAttachmentsChange?: (attachments: { id: string; file: File }[]) => void;\n\teditingMessageId?: string | null;\n\tonClearEditing?: () => void;\n\t/**\n\t * Latency-vs-precision toggle the user controls inline on the\n\t * input bar. \"fast\" (the widget's default) — server samples and\n\t * answers quickly. \"deep\" — server runs a full analytical pass.\n\t * When both [analysisMode] and [onAnalysisModeChange] are\n\t * provided, the toggle renders alongside the other left-hand\n\t * input controls. Omit either to hide the toggle entirely\n\t * (e.g. widgets whose host app already controls the mode, or\n\t * single-mode deployments).\n\t */\n\tanalysisMode?: \"fast\" | \"deep\";\n\tonAnalysisModeChange?: (next: \"fast\" | \"deep\") => void;\n\tslashCommands?: SlashCommandConfig[];\n};\n\nexport type ChatInputV2Handle = {\n\tsetDraft: (message: string) => void;\n\tclearAttachments: () => void;\n};\n\nexport const ChatInputV2 = forwardRef<ChatInputV2Handle, ChatInputV2Props>(\n\tfunction ChatInputV2(\n\t\t{\n\t\t\tonSend,\n\t\t\tdisabled = false,\n\t\t\tisStreaming = false,\n\t\t\tisUploadingAttachments = false,\n\t\t\tattachmentsReady = true,\n\t\t\thasAttachmentUploadErrors = false,\n\t\t\tattachmentUploadStatusById = {},\n\t\t\tuploadedAttachmentPayloads = [],\n\t\t\tplaceholder = \"Reply...\",\n\t\t\tenableVoice = false,\n\t\t\tvoiceAvailable = false,\n\t\t\tisRecording = false,\n\t\t\tonVoicePress,\n\t\t\ttranscribedText = \"\",\n\t\tshowResetSession = false,\n\t\tonResetSession,\n\t\tshowAttachmentButton = true,\n\t\tshowUploadImageButton = true,\n\t\tshowAttachFileButton = true,\n\t\tonUploadImageClick,\n\t\tonAttachFileClick,\n\t\tallowedImageExtensions = [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\"],\n\t\tallowedFileExtensions = [\"pdf\", \"docx\", \"xlsx\", \"xls\"],\n\t\tmaxCount,\n\t\tmaxFileBytes,\n\t\tmaxTotalBytes,\n\t\tonFilesChange,\n\t\tonAttachmentsChange,\n\t\teditingMessageId = null,\n\t\tonClearEditing,\n\t\tanalysisMode,\n\t\tonAnalysisModeChange,\n\t\tslashCommands = [],\n\t}: ChatInputV2Props,\n\tref,\n) {\n\tconst [value, setValue] = useState(\"\");\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [showActions, setShowActions] = useState(false);\n\tconst [showVoiceTooltip, setShowVoiceTooltip] = useState(false);\n\tconst [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\tconst [inlineHint, setInlineHint] = useState<string | null>(null);\n\tconst [commandMenuDismissed, setCommandMenuDismissed] = useState(false);\n\tconst [attachedFiles, setAttachedFiles] = useState<AttachedFile[]>([]);\n\tconst [previewFile, setPreviewFile] = useState<AttachedFile | null>(null);\n\tconst [isSending, setIsSending] = useState(false);\n\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\tconst actionsRef = useRef<HTMLDivElement>(null);\n\tconst imageInputRef = useRef<HTMLInputElement>(null);\n\tconst fileInputRef = useRef<HTMLInputElement>(null);\n\tconst preRecordTextRef = useRef(\"\");\n\tconst voiceTooltipTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t);\n\tconst voiceDraftSyncActiveRef = useRef(false);\n\tconst chatContext = useContext(PaymanChatContext);\n\n\t// Revoke all blob URLs on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tattachedFiles.forEach((f) => URL.revokeObjectURL(f.objectUrl));\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\tconst notifyAttachmentList = useCallback(\n\t\t(files: AttachedFile[]) => {\n\t\t\tonFilesChange?.(files.map((f) => f.file));\n\t\t\tonAttachmentsChange?.(files.map((f) => ({ id: f.id, file: f.file })));\n\t\t},\n\t\t[onAttachmentsChange, onFilesChange],\n\t);\n\n\tconst clearAttachmentsFromInput = useCallback(() => {\n\t\tsetAttachedFiles((prev) => {\n\t\t\tprev.forEach((f) => URL.revokeObjectURL(f.objectUrl));\n\t\t\treturn [];\n\t\t});\n\t\tsetPreviewFile(null);\n\t\tonFilesChange?.([]);\n\t\tonAttachmentsChange?.([]);\n\t}, [onAttachmentsChange, onFilesChange]);\n\n\tconst addFiles = useCallback(\n\t\t(incoming: File[], source: AttachmentKind) => {\n\t\t\tconst isImage = source === \"image\";\n\t\t\tconst allowedExtensions = isImage\n\t\t\t\t? allowedImageExtensions\n\t\t\t\t: allowedFileExtensions;\n\t\t\tconst isAllowed = isImage ? isAllowedImage : isAllowedDocument;\n\t\t\tconst kindLabel = isImage ? \"image\" : \"document\";\n\n\t\t\tsetAttachedFiles((prev) => {\n\t\t\t\tconst accepted: AttachedFile[] = [];\n\t\t\t\tlet rejectedType = false;\n\t\t\t\tlet hitCountLimit = false;\n\t\t\t\tlet hitFileSizeLimit = false;\n\t\t\t\tlet hitTotalSizeLimit = false;\n\t\t\t\tlet oversizedName = \"\";\n\t\t\t\tconst currentTotalBytes = prev.reduce(\n\t\t\t\t\t(sum, item) => sum + item.file.size,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tlet addedBytes = 0;\n\n\t\t\t\tfor (const file of incoming) {\n\t\t\t\t\tif (!isAllowed(file, allowedExtensions)) {\n\t\t\t\t\t\trejectedType = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (maxFileBytes != null && file.size > maxFileBytes) {\n\t\t\t\t\t\thitFileSizeLimit = true;\n\t\t\t\t\t\toversizedName = file.name;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tmaxTotalBytes != null &&\n\t\t\t\t\t\tcurrentTotalBytes + addedBytes + file.size > maxTotalBytes\n\t\t\t\t\t) {\n\t\t\t\t\t\thitTotalSizeLimit = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tmaxCount != null &&\n\t\t\t\t\t\tprev.length + accepted.length >= maxCount\n\t\t\t\t\t) {\n\t\t\t\t\t\thitCountLimit = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\taccepted.push({\n\t\t\t\t\t\tid: `${Date.now()}-${Math.random()}`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tkind: source,\n\t\t\t\t\t\tobjectUrl: URL.createObjectURL(file),\n\t\t\t\t\t});\n\t\t\t\t\taddedBytes += file.size;\n\t\t\t\t}\n\n\t\t\t\tif (rejectedType) {\n\t\t\t\t\tsetInlineHint(\n\t\t\t\t\t\t`Unsupported ${kindLabel} type. Allowed: ${allowedExtensions.map(normalizeExtension).join(\", \")}.`,\n\t\t\t\t\t);\n\t\t\t\t} else if (hitFileSizeLimit) {\n\t\t\t\t\tsetInlineHint(\n\t\t\t\t\t\tmaxFileBytes != null\n\t\t\t\t\t\t\t? `\"${oversizedName}\" exceeds the ${formatAttachmentBytes(maxFileBytes)} per-file limit.`\n\t\t\t\t\t\t\t: \"File exceeds the maximum allowed size.\",\n\t\t\t\t\t);\n\t\t\t\t} else if (hitTotalSizeLimit) {\n\t\t\t\t\tsetInlineHint(\n\t\t\t\t\t\tmaxTotalBytes != null\n\t\t\t\t\t\t\t? `Total attachment size would exceed ${formatAttachmentBytes(maxTotalBytes)}.`\n\t\t\t\t\t\t\t: \"Total attachment size exceeds the limit.\",\n\t\t\t\t\t);\n\t\t\t\t} else if (hitCountLimit) {\n\t\t\t\t\tsetInlineHint(\n\t\t\t\t\t\tmaxCount === 1\n\t\t\t\t\t\t\t? \"Only 1 attachment is allowed per message.\"\n\t\t\t\t\t\t\t: `Maximum ${maxCount} attachments allowed per message.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (accepted.length === 0) return prev;\n\n\t\t\t\tconst updated = [...prev, ...accepted];\n\t\t\t\tnotifyAttachmentList(updated);\n\t\t\t\treturn updated;\n\t\t\t});\n\t\t},\n\t\t[\n\t\t\tallowedFileExtensions,\n\t\t\tallowedImageExtensions,\n\t\t\tmaxCount,\n\t\t\tmaxFileBytes,\n\t\t\tmaxTotalBytes,\n\t\t\tnotifyAttachmentList,\n\t\t],\n\t);\n\n\tconst removeFile = useCallback(\n\t\t(id: string) => {\n\t\t\tsetAttachedFiles((prev) => {\n\t\t\t\tconst target = prev.find((f) => f.id === id);\n\t\t\t\tif (target) URL.revokeObjectURL(target.objectUrl);\n\t\t\t\tconst updated = prev.filter((f) => f.id !== id);\n\t\t\t\tnotifyAttachmentList(updated);\n\t\t\t\treturn updated;\n\t\t\t});\n\t\t\tsetPreviewFile((p) => (p?.id === id ? null : p));\n\t\t},\n\t\t[notifyAttachmentList],\n\t);\n\n\tconst imageAccept = allowedImageExtensions.map((e) => `.${e.replace(/^\\./, \"\")}`).join(\",\");\n\tconst fileAccept = allowedFileExtensions.map((e) => `.${e.replace(/^\\./, \"\")}`).join(\",\");\n\tconst isInputBusy = isSending || isUploadingAttachments;\n\n\t\tconst isInputLocked = disabled || isRecording || isInputBusy;\n\t\tconst hasAttachmentOptions = showUploadImageButton || showAttachFileButton;\n\t\tconst showAttachmentMenuButton = showAttachmentButton && hasAttachmentOptions;\n\t\tconst showVoiceButton = enableVoice && onVoicePress != null;\n\t\tconst isVoiceButtonDisabled = disabled || !voiceAvailable;\n\t\tconst commandQuery =\n\t\t\tvalue.startsWith(\"/\") && !value.includes(\"\\n\") && !/\\s/.test(value)\n\t\t\t\t? value.toLowerCase()\n\t\t\t\t: null;\n\t\tconst commandSuggestions =\n\t\t\tcommandQuery == null\n\t\t\t\t? []\n\t\t\t\t: slashCommands.filter((command) =>\n\t\t\t\t\t\tcommand.name.toLowerCase().startsWith(commandQuery),\n\t\t\t\t\t);\n\t\tconst showCommandSuggestions =\n\t\t\t!commandMenuDismissed &&\n\t\t\t!isRecording &&\n\t\t\t!disabled &&\n\t\t\tcommandSuggestions.length > 0;\n\n\t\tuseEffect(() => {\n\t\t\tif (textareaRef.current) {\n\t\t\t\ttextareaRef.current.style.height = \"auto\";\n\t\t\t\tconst scrollHeight = textareaRef.current.scrollHeight;\n\t\t\t\ttextareaRef.current.style.height = `${Math.min(scrollHeight, 200)}px`;\n\t\t\t}\n\t\t}, [value]);\n\n\t\tuseEffect(() => {\n\t\t\tif (disabled) {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\tsetShowActions(false);\n\t\t\t\ttextareaRef.current?.blur();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst frameId = requestAnimationFrame(() => textareaRef.current?.focus());\n\t\t\treturn () => cancelAnimationFrame(frameId);\n\t\t}, [disabled]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tsetDraft: (message: string) => {\n\t\t\t\t\tsetShowActions(false);\n\t\t\t\t\tsetValue(message);\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\t\t\tif (!textarea || disabled) return;\n\t\t\t\t\t\ttextarea.focus();\n\t\t\t\t\t\tconst end = message.length;\n\t\t\t\t\t\ttextarea.setSelectionRange(end, end);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tclearAttachments: clearAttachmentsFromInput,\n\t\t\t}),\n\t\t\t[disabled, clearAttachmentsFromInput],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (!showActions) return;\n\t\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tactionsRef.current &&\n\t\t\t\t\t!actionsRef.current.contains(e.target as Node)\n\t\t\t\t) {\n\t\t\t\t\tsetShowActions(false);\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\t\treturn () => document.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t}, [showActions]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!showAttachmentMenuButton) {\n\t\t\t\tsetShowActions(false);\n\t\t\t}\n\t\t}, [showAttachmentMenuButton]);\n\n\t\tuseEffect(() => {\n\t\t\tsetSelectedCommandIndex(0);\n\t\t\tsetCommandMenuDismissed(false);\n\t\t}, [commandQuery]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t\t}\n\t\t\t};\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (!voiceDraftSyncActiveRef.current) return;\n\t\t\tconst base = preRecordTextRef.current;\n\t\t\tconst separator = base && !base.endsWith(\" \") && transcribedText ? \" \" : \"\";\n\t\t\tsetValue(`${base}${separator}${transcribedText}`);\n\t\t}, [isRecording, transcribedText]);\n\n\tfunction uploadStatusLabel(\n\t\tstatus: AttachmentUploadStatus | undefined,\n\t\tfile: File,\n\t\tkind: AttachedFile[\"kind\"],\n\t): string {\n\t\tif (status === \"uploading\") return \"Uploading…\";\n\t\tif (status === \"error\") return \"Upload failed\";\n\t\treturn fileTypeLabel(file, kind);\n\t}\n\n\tconst handleSend = useCallback(async () => {\n\t\tconst hasText = value.trim().length > 0;\n\t\tconst hasFiles = attachedFiles.length > 0;\n\t\tif ((!hasText && !hasFiles) || disabled || isSending || isUploadingAttachments) return;\n\t\tif (hasFiles && !attachmentsReady) {\n\t\t\tsetInlineHint(\"Waiting for attachments to finish uploading.\");\n\t\t\treturn;\n\t\t}\n\t\tif (hasFiles && hasAttachmentUploadErrors) {\n\t\t\tsetInlineHint(\"Remove or re-add attachments that failed to upload.\");\n\t\t\treturn;\n\t\t}\n\t\tconst commandHint = getSlashCommandValidationHint(value);\n\t\tif (commandHint) {\n\t\t\tsetInlineHint(commandHint);\n\t\t\treturn;\n\t\t}\n\t\tvoiceDraftSyncActiveRef.current = false;\n\t\tpreRecordTextRef.current = \"\";\n\t\tsetInlineHint(null);\n\t\tonClearEditing?.();\n\n\t\tconst textToSend = value.trim();\n\t\tconst filesToSend = attachedFiles.map((f) => f.file);\n\t\tconst attachmentsToSend = [...uploadedAttachmentPayloads];\n\n\t\t// Clear text + attachments immediately — sendMessage awaits the full\n\t\t// stream, so waiting for onSend would leave stale files in the input.\n\t\tsetValue(\"\");\n\t\tclearAttachmentsFromInput();\n\t\trequestAnimationFrame(() => {\n\t\t\tif (textareaRef.current) {\n\t\t\t\ttextareaRef.current.style.height = \"auto\";\n\t\t\t\ttextareaRef.current.focus();\n\t\t\t}\n\t\t});\n\n\t\tsetIsSending(true);\n\t\ttry {\n\t\t\tawait onSend(textToSend, filesToSend, attachmentsToSend);\n\t\t} catch {\n\t\t\tsetInlineHint(\"Failed to send message. Please try again.\");\n\t\t} finally {\n\t\t\tsetIsSending(false);\n\t\t}\n\t}, [\n\t\tvalue,\n\t\tattachedFiles,\n\t\tuploadedAttachmentPayloads,\n\t\tdisabled,\n\t\tisSending,\n\t\tisUploadingAttachments,\n\t\tattachmentsReady,\n\t\thasAttachmentUploadErrors,\n\t\tonClearEditing,\n\t\tonSend,\n\t\tclearAttachmentsFromInput,\n\t]);\n\n\t\tconst selectCommand = useCallback(\n\t\t\t(command: SlashCommandConfig) => {\n\t\t\t\tconst insertText = command.insertText ?? `${command.name} `;\n\t\t\t\tsetValue(insertText);\n\t\t\t\tsetInlineHint(null);\n\t\t\t\tsetShowActions(false);\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\t\tif (!textarea) return;\n\t\t\t\t\ttextarea.focus();\n\t\t\t\t\ttextarea.setSelectionRange(insertText.length, insertText.length);\n\t\t\t\t});\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\tconst handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\t\tif (showCommandSuggestions) {\n\t\t\t\tif (e.key === \"ArrowDown\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex((current) =>\n\t\t\t\t\t\tMath.min(current + 1, commandSuggestions.length - 1),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"ArrowUp\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex((current) => Math.max(current - 1, 0));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"Enter\" || e.key === \"Tab\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst command = commandSuggestions[selectedCommandIndex];\n\t\t\t\t\tif (command) selectCommand(command);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.key === \"Escape\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetSelectedCommandIndex(0);\n\t\t\t\t\tsetCommandMenuDismissed(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (e.key === \"Enter\" && !e.shiftKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (isStreaming || isSending || isUploadingAttachments) return;\n\t\t\t\tvoid handleSend();\n\t\t\t}\n\t\t};\n\n\tconst handleUploadImageClick = () => {\n\t\timageInputRef.current?.click();\n\t\tonUploadImageClick?.();\n\t\tsetShowActions(false);\n\t};\n\n\tconst handleAttachFileClick = () => {\n\t\tfileInputRef.current?.click();\n\t\tonAttachFileClick?.();\n\t\tsetShowActions(false);\n\t};\n\n\tconst handleImageFilesSelected = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst files = Array.from(e.target.files ?? []);\n\t\tif (files.length) addFiles(files, \"image\");\n\t\te.target.value = \"\";\n\t};\n\n\tconst handleDocFilesSelected = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst files = Array.from(e.target.files ?? []);\n\t\tif (files.length) addFiles(files, \"file\");\n\t\te.target.value = \"\";\n\t};\n\n\t\tconst hideVoiceTooltip = useCallback(() => {\n\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t\tvoiceTooltipTimerRef.current = null;\n\t\t\t}\n\t\t\tsetShowVoiceTooltip(false);\n\t\t}, []);\n\n\t\tconst startVoiceTooltipTimer = useCallback(() => {\n\t\t\tif (isVoiceButtonDisabled || isRecording) return;\n\t\t\tif (voiceTooltipTimerRef.current) {\n\t\t\t\tclearTimeout(voiceTooltipTimerRef.current);\n\t\t\t}\n\t\t\tvoiceTooltipTimerRef.current = setTimeout(() => {\n\t\t\t\tsetShowVoiceTooltip(true);\n\t\t\t\tvoiceTooltipTimerRef.current = null;\n\t\t\t}, 2000);\n\t\t}, [isRecording, isVoiceButtonDisabled]);\n\n\t\tconst handleVoiceToggle = () => {\n\t\t\thideVoiceTooltip();\n\t\t\tsetShowActions(false);\n\t\t\tif (!onVoicePress || isVoiceButtonDisabled) return;\n\t\t\tif (!isRecording) {\n\t\t\t\tpreRecordTextRef.current = value;\n\t\t\t\tvoiceDraftSyncActiveRef.current = true;\n\t\t\t}\n\t\t\tonVoicePress();\n\t\t};\n\n\tconst canSend = (value.trim().length > 0 || attachedFiles.length > 0) && !disabled;\n\tconst sendDisabled =\n\t\t!canSend ||\n\t\tisStreaming ||\n\t\tisUploadingAttachments ||\n\t\t!attachmentsReady ||\n\t\thasAttachmentUploadErrors ||\n\t\tisSending;\n\n\t\treturn (\n\t\t<div className=\"payman-v2-input-container\">\n\t\t\t{/* Hidden file inputs */}\n\t\t\t<input\n\t\t\t\tref={imageInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept={imageAccept}\n\t\t\t\tmultiple={maxCount == null || maxCount > 1}\n\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\tonChange={handleImageFilesSelected}\n\t\t\t/>\n\t\t\t<input\n\t\t\t\tref={fileInputRef}\n\t\t\t\ttype=\"file\"\n\t\t\t\taccept={fileAccept}\n\t\t\t\tmultiple={maxCount == null || maxCount > 1}\n\t\t\t\tstyle={{ display: \"none\" }}\n\t\t\t\tonChange={handleDocFilesSelected}\n\t\t\t/>\n\n\t\t\t{/* Image preview modal */}\n\t\t\t<FilePreviewModal\n\t\t\t\tsrc={previewFile?.kind === \"image\" ? previewFile.objectUrl : null}\n\t\t\t\tname={previewFile?.file.name ?? \"\"}\n\t\t\t\tonClose={() => setPreviewFile(null)}\n\t\t\t/>\n\n\t\t\t<AnimatePresence>\n\t\t\t\t{showCommandSuggestions && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 6, scale: 0.98 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, y: 6, scale: 0.98 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\tclassName=\"payman-v2-command-menu\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{commandSuggestions.map((command, index) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={command.name}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\tselectCommand(command);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-command-option\",\n\t\t\t\t\t\t\t\t\t\tindex === selectedCommandIndex &&\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-command-option-active\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-command-name\">\n\t\t\t\t\t\t\t\t\t\t{command.name}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-command-description\">\n\t\t\t\t\t\t\t\t\t\t{command.description}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"payman-v2-input-wrapper\",\n\t\t\t\t\t\t(isFocused || isRecording) && \"payman-v2-input-wrapper-focused\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-v2-input-body\">\n\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t{attachedFiles.length > 0 && (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tkey=\"file-preview\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, height: \"auto\" }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, height: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.15, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-file-preview\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{attachedFiles.map((af) => {\n\t\t\t\t\t\t\t\t\t\tconst uploadStatus = attachmentUploadStatusById[af.id];\n\t\t\t\t\t\t\t\t\t\tconst isUploadingFile = uploadStatus === \"uploading\";\n\t\t\t\t\t\t\t\t\t\tconst hasUploadError = uploadStatus === \"error\";\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div key={af.id} className=\"payman-v2-file-preview-item\">\n\t\t\t\t\t\t\t\t\t\t\t{af.kind === \"image\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-file-preview-shell payman-v2-file-preview-shell-clickable\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thasUploadError && \"payman-v2-file-preview-shell-error\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setPreviewFile(af)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isUploadingFile}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Preview ${af.file.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-thumb\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={af.objectUrl}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isUploadingFile && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-uploading\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 size={14} className=\"payman-v2-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-name\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{af.file.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-type\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{uploadStatusLabel(uploadStatus, af.file, af.kind)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t) : isPdfFile(af.file) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-file-preview-shell payman-v2-file-preview-shell-clickable\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thasUploadError && \"payman-v2-file-preview-shell-error\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchatContext?.openPdfSheet(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taf.objectUrl,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taf.file.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isUploadingFile}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Preview ${af.file.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-thumb\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isUploadingFile ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 size={16} className=\"payman-v2-spin payman-v2-file-preview-doc-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FileText\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.75}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-file-preview-doc-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-name\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{af.file.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-type\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{uploadStatusLabel(uploadStatus, af.file, af.kind)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-file-preview-shell\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thasUploadError && \"payman-v2-file-preview-shell-error\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-thumb\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isUploadingFile ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 size={16} className=\"payman-v2-spin payman-v2-file-preview-doc-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FileText\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={16}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.75}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-file-preview-doc-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-file-preview-info\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-name\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{af.file.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-file-preview-type\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{uploadStatusLabel(uploadStatus, af.file, af.kind)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-file-preview-remove\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => removeFile(af.id)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Remove ${af.file.name}`}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<X size={12} strokeWidth={2.5} />\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t{editingMessageId && (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: -4 }}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: -4 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.14, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-editing-banner\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-editing-banner-info\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-editing-icon-wrap\">\n\t\t\t\t\t\t\t\t\t\t\t<Pencil style={{ width: 12, height: 12 }} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<p className=\"payman-v2-input-editing-label\">\n\t\t\t\t\t\t\t\t\t\t\tEditing message\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{onClearEditing && (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={onClearEditing}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-editing-close\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Stop editing message\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<X style={{ width: 14, height: 14 }} />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tref={textareaRef}\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\tif (isRecording) return;\n\t\t\t\t\t\t\t\tconst nextValue = e.target.value;\n\t\t\t\t\t\t\t\tvoiceDraftSyncActiveRef.current = false;\n\t\t\t\t\t\t\t\tsetInlineHint(null);\n\t\t\t\t\t\t\t\tsetCommandMenuDismissed(false);\n\t\t\t\t\t\t\t\tsetValue(nextValue);\n\t\t\t\t\t\t\t\tif (editingMessageId && nextValue.length === 0) {\n\t\t\t\t\t\t\t\t\tonClearEditing?.();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\tif (!disabled) setIsFocused(true);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\t\tif (disabled) e.preventDefault();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-disabled={disabled}\n\t\t\t\t\t\t\treadOnly={isInputLocked}\n\t\t\t\t\t\t\ttabIndex={disabled ? -1 : 0}\n\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening…\" : placeholder}\n\t\t\t\t\t\t\tclassName=\"payman-v2-input-textarea\"\n\t\t\t\t\t\t\tdata-disabled={disabled ? \"true\" : \"false\"}\n\t\t\t\t\t\t\trows={1}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"payman-v2-input-controls\">\n\t\t\t\t\t\t<div className=\"payman-v2-input-controls-left\">\n\t\t\t\t\t\t\t{showResetSession && onResetSession && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={onResetSession}\n\t\t\t\t\t\t\t\t\tdisabled={isStreaming || isRecording}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-new-session-btn\"\n\t\t\t\t\t\t\t\t\taria-label=\"New Session\"\n\t\t\t\t\t\t\t\t\ttitle=\"New Session\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<RotateCcw\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-new-session-tooltip\">\n\t\t\t\t\t\t\t\t\t\tNew Session\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{analysisMode && onAnalysisModeChange && (\n\t\t\t\t\t\t\t\t// Fast/Deep toggle — a single-click button that\n\t\t\t\t\t\t\t\t// flips between modes. \"Fast\" is cheap and quick\n\t\t\t\t\t\t\t\t// (sampled data, sub-30s answers); \"Deep\" opts\n\t\t\t\t\t\t\t\t// the user into the full analytical pass. Shown\n\t\t\t\t\t\t\t\t// as a compact pill so operators can flip it\n\t\t\t\t\t\t\t\t// per-message without leaving the input area.\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange(\n\t\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\" ? \"fast\" : \"deep\",\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdisabled={isStreaming || isRecording}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-new-session-btn\",\n\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mode-toggle\",\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\" &&\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mode-toggle-deep\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\"\n\t\t\t\t\t\t\t\t\t\t\t? \"Deep analysis (click to switch to Fast)\"\n\t\t\t\t\t\t\t\t\t\t\t: \"Fast analysis (click to switch to Deep)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\tanalysisMode === \"deep\"\n\t\t\t\t\t\t\t\t\t\t\t? \"Deep — full analytical pass\"\n\t\t\t\t\t\t\t\t\t\t\t: \"Fast — sampled, quick answer\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdata-mode={analysisMode}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{analysisMode === \"deep\" ? (\n\t\t\t\t\t\t\t\t\t\t<Telescope\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Zap\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.25 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-new-session-tooltip\">\n\t\t\t\t\t\t\t\t\t\t{analysisMode === \"deep\" ? \"Deep\" : \"Fast\"}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showAttachmentMenuButton && (\n\t\t\t\t\t\t\t\t<div style={{ position: \"relative\" }} ref={actionsRef}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setShowActions((current) => !current)}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled || isRecording}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-attach-btn\",\n\t\t\t\t\t\t\t\t\t\t\tshowActions && \"payman-v2-input-attach-btn-active\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-label=\"Attach\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Plus\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 20, height: 20, strokeWidth: 2 }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t\t\t\t{showActions && (\n\t\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 4, scale: 0.95 }}\n\t\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: 4, scale: 0.95 }}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.12 }}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-menu\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{showUploadImageButton && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ImagePlus\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tUpload image\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{showAttachFileButton && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Paperclip\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16 }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-attach-option-icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAttach file\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{showVoiceButton && (\n\t\t\t\t\t\t\t\t<div style={{ position: \"relative\" }}>\n\t\t\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t\t\t{showVoiceTooltip && (\n\t\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 4, scale: 0.98 }}\n\t\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, y: 4, scale: 0.98 }}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.14, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-voice-tooltip\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-voice-tooltip-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tChat with your voice\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"payman-v2-input-voice-tooltip-arrow\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleVoiceToggle}\n\t\t\t\t\t\t\t\t\t\tonMouseEnter={startVoiceTooltipTimer}\n\t\t\t\t\t\t\t\t\t\tonMouseLeave={hideVoiceTooltip}\n\t\t\t\t\t\t\t\t\t\tonFocus={startVoiceTooltipTimer}\n\t\t\t\t\t\t\t\t\t\tonBlur={hideVoiceTooltip}\n\t\t\t\t\t\t\t\t\t\tdisabled={isVoiceButtonDisabled}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"payman-v2-input-mic-btn\",\n\t\t\t\t\t\t\t\t\t\t\tisRecording && \"payman-v2-input-mic-recording\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-label={isRecording ? \"Stop recording\" : \"Voice input\"}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Mic style={{ width: 18, height: 18 }} />\n\t\t\t\t\t\t\t\t\t\t{isRecording && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"payman-v2-input-mic-indicator\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"payman-v2-input-controls-right\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => void handleSend()}\n\t\t\t\t\t\t\t\tdisabled={sendDisabled}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"payman-v2-input-send-btn\",\n\t\t\t\t\t\t\t\t\tsendDisabled && \"payman-v2-input-send-btn-disabled\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisUploadingAttachments || isSending\n\t\t\t\t\t\t\t\t\t\t? \"Uploading attachments\"\n\t\t\t\t\t\t\t\t\t\t: \"Send message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowUp\n\t\t\t\t\t\t\t\t\tstyle={{ width: 16, height: 16, strokeWidth: 2.5 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-input-send-icon\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{inlineHint && (\n\t\t\t\t\t<p className=\"payman-v2-input-inline-hint\">{inlineHint}</p>\n\t\t\t\t)}\n\n\t\t\t\t<p className=\"payman-v2-input-disclaimer\">\n\t\t\t\t\tAI can make mistakes. Please double-check responses.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport { DotLottieReact } from \"@lottiefiles/dotlottie-react\";\nimport { useEffect, useRef, useState } from \"react\";\n// Bundled default loader. tsup's `dataurl` loader (see tsup.config.ts)\n// inlines the .lottie bundle as a base64 data URI at build time so\n// DotLottieReact can load it with zero network round-trip and no\n// dependency on any external CDN being reachable at runtime.\nimport thinkingAtomSrc from \"../../assets/thinking-atom.lottie\";\n\n/**\n * Bottom-of-chat streaming indicator — a small animated glyph shown\n * directly above the chat input while the agent is working, with a\n * live-ticking elapsed-seconds label next to it. Inspired by\n * Claude's spinning-asterisk indicator: the label-and-status lives\n * inside the assistant message bubble, but this tiny bottom indicator\n * signals \"something is happening, the client hasn't hung\" in a spot\n * the user's eye lands on between glances at the answer.\n *\n * The whole block mounts only while streaming is in flight — once\n * the run ends, it fades out entirely. An earlier iteration tried\n * to keep the Lottie on screen in a paused state via the\n * dotLottieRefCallback + .pause() API, but pause() didn't reliably\n * freeze the animation in practice. Unmounting is simpler and\n * predictable: the user sees motion only when there's actually\n * motion to indicate.\n */\n\nexport type StreamingIndicatorV2Props = {\n\t/**\n\t * Whether to show the indicator. Parent (`PaymanChat`) flips this\n\t * with `isWaitingForResponse`. When this flips false the whole\n\t * block unmounts — DotLottieReact with it — so no extra wiring is\n\t * needed to stop the Lottie animation on run end.\n\t */\n\tisStreaming: boolean;\n\t/**\n\t * Optional consumer-supplied Lottie override. Accepts any\n\t * `.lottie` or Lottie `.json` URL — see `ChatConfig.loadingAnimation`.\n\t * When unset the bundled default (`thinking-atom.lottie`) is used.\n\t */\n\tloadingAnimation?: {\n\t\tsrc: string;\n\t\tsize?: number;\n\t};\n};\n\nconst DEFAULT_SIZE = 36;\n\n/**\n * Tiny hook that returns the number of whole seconds since the\n * indicator's most recent `isStreaming=true` transition. Updates\n * every 100ms while running so the label feels live. Resets to 0\n * when streaming ends (the block unmounts anyway, so the stale\n * value never renders).\n *\n * Why 100ms, not 1000ms: at 1Hz the counter \"jumps\" — the user sees\n * a visible pause at each integer. At 10Hz the counter feels\n * smooth, and we still only update the DOM text when the rounded\n * value changes (React reconciles to a no-op).\n */\nfunction useElapsedSeconds(isStreaming: boolean): number {\n\tconst [elapsed, setElapsed] = useState(0);\n\tconst startRef = useRef<number | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!isStreaming) {\n\t\t\tstartRef.current = null;\n\t\t\tsetElapsed(0);\n\t\t\treturn;\n\t\t}\n\t\tstartRef.current = performance.now();\n\t\tsetElapsed(0);\n\t\tconst id = setInterval(() => {\n\t\t\tif (startRef.current == null) return;\n\t\t\tconst secs = Math.floor((performance.now() - startRef.current) / 1000);\n\t\t\tsetElapsed(secs);\n\t\t}, 100);\n\t\treturn () => clearInterval(id);\n\t}, [isStreaming]);\n\n\treturn elapsed;\n}\n\nexport function StreamingIndicatorV2({\n\tisStreaming,\n\tloadingAnimation,\n}: StreamingIndicatorV2Props) {\n\tconst size = loadingAnimation?.size ?? DEFAULT_SIZE;\n\tconst elapsed = useElapsedSeconds(isStreaming);\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{isStreaming && (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey=\"streaming-indicator\"\n\t\t\t\t\tclassName=\"payman-v2-streaming-indicator\"\n\t\t\t\t\tinitial={{ opacity: 0, y: 4 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\texit={{ opacity: 0, y: 4 }}\n\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"payman-v2-streaming-indicator-glyph\"\n\t\t\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/*\n\t\t\t\t\t\t One render path for both cases: DotLottieReact's\n\t\t\t\t\t\t `src` prop accepts both a regular URL (consumer\n\t\t\t\t\t\t override) and a base64 data URI (bundled default).\n\t\t\t\t\t\t The bundled asset is inlined by esbuild's dataurl\n\t\t\t\t\t\t loader — no network round-trip for the default\n\t\t\t\t\t\t case.\n\t\t\t\t\t\t*/}\n\t\t\t\t\t\t<DotLottieReact\n\t\t\t\t\t\t\tsrc={loadingAnimation?.src ?? thinkingAtomSrc}\n\t\t\t\t\t\t\tloop\n\t\t\t\t\t\t\tautoplay\n\t\t\t\t\t\t\tstyle={{ width: \"100%\", height: \"100%\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t{/*\n\t\t\t\t\t Live-ticking elapsed time next to the glyph. Hidden\n\t\t\t\t\t for the first tick so sub-second responses don't\n\t\t\t\t\t flash \"0s\" before the whole block exits.\n\t\t\t\t\t*/}\n\t\t\t\t\t{elapsed > 0 && (\n\t\t\t\t\t\t<span className=\"payman-v2-streaming-indicator-elapsed\">\n\t\t\t\t\t\t\t{elapsed}s\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Download, Loader2, X } from \"lucide-react\";\n\nexport type ImageLightboxV2Props = {\n\tsrc: string | null;\n\talt: string;\n\tonClose: () => void;\n};\n\nexport function ImageLightboxV2({ src, alt, onClose }: ImageLightboxV2Props) {\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst [isImageLoaded, setIsImageLoaded] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t\treturn () => setIsMounted(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tsetIsImageLoaded(false);\n\t}, [src]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t},\n\t\t[onClose]\n\t);\n\n\tuseEffect(() => {\n\t\tif (!src || typeof document === \"undefined\") return;\n\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = \"hidden\";\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t};\n\t}, [src, handleKeyDown]);\n\n\tconst handleDownload = () => {\n\t\tif (!src || typeof document === \"undefined\") return;\n\t\tconst a = document.createElement(\"a\");\n\t\ta.href = src;\n\t\ta.download = alt.trim() ? alt : \"image\";\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\ta.remove();\n\t};\n\n\tif (!isMounted || typeof document === \"undefined\") {\n\t\treturn null;\n\t}\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t{src ? (\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={src}\n\t\t\t\t\tclassName=\"payman-v2-lightbox\"\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\trole=\"presentation\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-v2-lightbox-controls\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-btn\"\n\t\t\t\t\t\t\taria-label=\"Download\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\thandleDownload();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Download size={20} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-btn\"\n\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X size={20} strokeWidth={2} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"payman-v2-lightbox-content\"\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\taria-label={alt || \"Image preview\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!isImageLoaded ? (\n\t\t\t\t\t\t\t<div className=\"payman-v2-lightbox-loading\">\n\t\t\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\t\t\tsize={24}\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tcolor: \"rgba(255, 255, 255, 0.8)\",\n\t\t\t\t\t\t\t\t\t\tanimation: \"payman-v2-spin 0.6s linear infinite\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"payman-v2-lightbox-loading-text\">\n\t\t\t\t\t\t\t\t\tLoading image\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t<div className=\"payman-v2-lightbox-img-wrapper\">\n\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\tinitial={{ scale: 0.92, opacity: 0 }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tscale: isImageLoaded ? 1 : 0.92,\n\t\t\t\t\t\t\t\t\topacity: isImageLoaded ? 1 : 0,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\texit={{ scale: 0.92, opacity: 0 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-lightbox-img\"\n\t\t\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\t\t\talt={alt}\n\t\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t\t\tonLoad={() => setIsImageLoaded(true)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</motion.div>\n\t\t\t) : null}\n\t\t</AnimatePresence>,\n\t\tdocument.body\n\t);\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { X } from \"lucide-react\";\n\n/**\n * Diagnostic-mode latency timeline. Renders one horizontal bar per\n * pipeline step in proportion to its wall-clock duration so it's\n * obvious at a glance which phase ate the turn's budget.\n *\n * Bars are styled inline (no Tailwind, no chart lib) so the modal\n * looks the same regardless of how the consuming app has its CSS\n * configured.\n */\n\ntype PipelineStep = {\n\tstep: string;\n\tstatus: string;\n\tstartTime: number;\n\tendTime?: number | null;\n\tdurationMs?: number | null;\n\terror?: string | null;\n\tllmCall?: {\n\t\tmodel?: string;\n\t\tdurationMs?: number | null;\n\t\tinputTokens?: number | null;\n\t\toutputTokens?: number | null;\n\t} | null;\n};\n\ntype ExecutionTrace = {\n\texecutionId: string;\n\tpipelineSteps: PipelineStep[];\n\trunMetadata?: {\n\t\tstartTime?: number | null;\n\t\tendTime?: number | null;\n\t\ttotalTimeMs?: number | null;\n\t} | null;\n\tstatus?: string;\n};\n\nexport type TraceTimelineModalProps = {\n\topen: boolean;\n\tonClose: () => void;\n\texecutionId: string | null;\n\tapiBaseUrl: string;\n\tapiHeaders?: Record<string, string>;\n};\n\n// Categories: phases that happen before sanitizer = pre-pipeline (orange),\n// pipeline stages = blue, anything else = grey.\nconst PRE_PIPELINE_STEPS = new Set([\n\t\"record_execution\",\n\t\"resolve_provider\",\n\t\"resolve_mcp_servers\",\n\t\"build_pipeline\",\n\t\"load_skill_index\",\n]);\n\nfunction stepColor(step: PipelineStep): string {\n\tif (step.status === \"failed\") return \"#ef4444\";\n\tif (PRE_PIPELINE_STEPS.has(step.step)) return \"#f59e0b\";\n\treturn \"#3b82f6\";\n}\n\nfunction formatMs(ms: number | null | undefined): string {\n\tif (ms == null) return \"—\";\n\tif (ms < 1000) return `${ms} ms`;\n\treturn `${(ms / 1000).toFixed(2)} s`;\n}\n\nexport function TraceTimelineModal({\n\topen,\n\tonClose,\n\texecutionId,\n\tapiBaseUrl,\n\tapiHeaders,\n}: TraceTimelineModalProps) {\n\tconst [trace, setTrace] = useState<ExecutionTrace | null>(null);\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\tif (!open || !executionId) return;\n\t\tconst ctrl = new AbortController();\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\tsetTrace(null);\n\t\tconst base = apiBaseUrl.replace(/\\/+$/, \"\");\n\t\tfetch(`${base}/api/ask/executions/${encodeURIComponent(executionId)}/trace`, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: { Accept: \"application/json\", ...apiHeaders },\n\t\t\tsignal: ctrl.signal,\n\t\t})\n\t\t\t.then(async (resp) => {\n\t\t\t\tif (!resp.ok) {\n\t\t\t\t\tthrow new Error(`Trace fetch failed: ${resp.status} ${resp.statusText}`);\n\t\t\t\t}\n\t\t\t\treturn resp.json() as Promise<ExecutionTrace>;\n\t\t\t})\n\t\t\t.then((data) => setTrace(data))\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tif ((e as { name?: string }).name === \"AbortError\") return;\n\t\t\t\tsetError(e instanceof Error ? e.message : \"Trace fetch failed\");\n\t\t\t})\n\t\t\t.finally(() => setLoading(false));\n\t\treturn () => ctrl.abort();\n\t}, [open, executionId, apiBaseUrl, apiHeaders]);\n\n\tconst totalMs = useMemo<number>(() => {\n\t\tif (!trace) return 0;\n\t\tconst meta = trace.runMetadata?.totalTimeMs;\n\t\tif (typeof meta === \"number\" && meta > 0) return meta;\n\t\t// Fall back to span of step timestamps if runMetadata is absent.\n\t\tconst starts = trace.pipelineSteps.map((s) => s.startTime);\n\t\tconst ends = trace.pipelineSteps\n\t\t\t.map((s) => s.endTime ?? s.startTime)\n\t\t\t.filter((t): t is number => typeof t === \"number\");\n\t\tif (starts.length === 0 || ends.length === 0) return 0;\n\t\treturn Math.max(...ends) - Math.min(...starts);\n\t}, [trace]);\n\n\tconst accountedMs = useMemo<number>(\n\t\t() =>\n\t\t\t(trace?.pipelineSteps ?? []).reduce(\n\t\t\t\t(sum, s) => sum + (s.durationMs ?? 0),\n\t\t\t\t0,\n\t\t\t),\n\t\t[trace],\n\t);\n\n\tconst unaccountedMs = Math.max(totalMs - accountedMs, 0);\n\n\tif (typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<motion.div\n\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\ttransition={{ duration: 0.15 }}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\tbackground: \"rgba(0,0,0,0.45)\",\n\t\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\tpadding: 24,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ y: 12, opacity: 0 }}\n\t\t\t\t\t\tanimate={{ y: 0, opacity: 1 }}\n\t\t\t\t\t\texit={{ y: 12, opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.18 }}\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: \"#0b1220\",\n\t\t\t\t\t\t\tcolor: \"#e5e7eb\",\n\t\t\t\t\t\t\tborderRadius: 12,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\tmaxWidth: 760,\n\t\t\t\t\t\t\tmaxHeight: \"85vh\",\n\t\t\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\t\t\tboxShadow: \"0 20px 60px rgba(0,0,0,0.45)\",\n\t\t\t\t\t\t\tfontFamily:\n\t\t\t\t\t\t\t\t\"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<header\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\t\tpadding: \"14px 18px\",\n\t\t\t\t\t\t\t\tborderBottom: \"1px solid rgba(255,255,255,0.08)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div style={{ fontSize: 14, fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t\tExecution trace\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tfontSize: 11,\n\t\t\t\t\t\t\t\t\t\topacity: 0.6,\n\t\t\t\t\t\t\t\t\t\tmarginTop: 2,\n\t\t\t\t\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{executionId ?? \"\"}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackground: \"transparent\",\n\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\tcolor: \"#e5e7eb\",\n\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\n\t\t\t\t\t\t\t\t\tpadding: 6,\n\t\t\t\t\t\t\t\t\tborderRadius: 6,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X style={{ width: 18, height: 18 }} />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</header>\n\n\t\t\t\t\t\t<div style={{ padding: 18 }}>\n\t\t\t\t\t\t\t{loading && (\n\t\t\t\t\t\t\t\t<div style={{ opacity: 0.7, fontSize: 13 }}>\n\t\t\t\t\t\t\t\t\tLoading trace…\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{error && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tcolor: \"#fca5a5\",\n\t\t\t\t\t\t\t\t\t\tfontSize: 13,\n\t\t\t\t\t\t\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{trace && !loading && !error && (\n\t\t\t\t\t\t\t\t<TimelineBars\n\t\t\t\t\t\t\t\t\ttrace={trace}\n\t\t\t\t\t\t\t\t\ttotalMs={totalMs}\n\t\t\t\t\t\t\t\t\tunaccountedMs={unaccountedMs}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t</motion.div>\n\t\t\t)}\n\t\t</AnimatePresence>,\n\t\tdocument.body,\n\t);\n}\n\nfunction TimelineBars({\n\ttrace,\n\ttotalMs,\n\tunaccountedMs,\n}: {\n\ttrace: ExecutionTrace;\n\ttotalMs: number;\n\tunaccountedMs: number;\n}) {\n\tconst bars = trace.pipelineSteps.map((step) => {\n\t\tconst duration = step.durationMs ?? 0;\n\t\tconst widthPct = totalMs > 0 ? (duration / totalMs) * 100 : 0;\n\t\tconst llmMs = step.llmCall?.durationMs ?? null;\n\t\treturn (\n\t\t\t<div key={`${step.step}-${step.startTime}`} style={{ marginBottom: 8 }}>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{step.step}\n\t\t\t\t\t\t{step.status === \"failed\" && (\n\t\t\t\t\t\t\t<span style={{ color: \"#fca5a5\", marginLeft: 6 }}>\n\t\t\t\t\t\t\t\t(failed)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span style={{ opacity: 0.75 }}>\n\t\t\t\t\t\t{formatMs(duration)}\n\t\t\t\t\t\t{llmMs != null && (\n\t\t\t\t\t\t\t<span style={{ marginLeft: 8, opacity: 0.6 }}>\n\t\t\t\t\t\t\t\t(LLM {formatMs(llmMs)})\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\tbackground: \"rgba(255,255,255,0.06)\",\n\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\twidth: `${Math.max(widthPct, 0.3)}%`,\n\t\t\t\t\t\t\tbackground: stepColor(step),\n\t\t\t\t\t\t\ttransition: \"width 0.2s ease\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t{bars}\n\t\t\t{unaccountedMs > 0 && (\n\t\t\t\t<div style={{ marginBottom: 8 }}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\t\tmarginBottom: 4,\n\t\t\t\t\t\t\tfontFamily: \"ui-monospace, SFMono-Regular, monospace\",\n\t\t\t\t\t\t\topacity: 0.7,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>(unaccounted)</span>\n\t\t\t\t\t\t<span>{formatMs(unaccountedMs)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: 8,\n\t\t\t\t\t\t\tbackground: \"rgba(255,255,255,0.06)\",\n\t\t\t\t\t\t\tborderRadius: 4,\n\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\t\t\twidth: `${(unaccountedMs / Math.max(totalMs, 1)) * 100}%`,\n\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\"repeating-linear-gradient(45deg, rgba(255,255,255,0.18) 0 4px, transparent 4px 8px)\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tmarginTop: 14,\n\t\t\t\t\tpaddingTop: 12,\n\t\t\t\t\tborderTop: \"1px solid rgba(255,255,255,0.08)\",\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\topacity: 0.85,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span>\n\t\t\t\t\t{trace.pipelineSteps.length} step\n\t\t\t\t\t{trace.pipelineSteps.length === 1 ? \"\" : \"s\"}\n\t\t\t\t</span>\n\t\t\t\t<span style={{ fontFamily: \"ui-monospace, SFMono-Regular, monospace\" }}>\n\t\t\t\t\ttotal: {formatMs(totalMs)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","export type PdfPreviewErrorKind =\n\t| \"expired\"\n\t| \"forbidden\"\n\t| \"not_found\"\n\t| \"network\"\n\t| \"empty\"\n\t| \"unknown\";\n\nexport class PdfPreviewError extends Error {\n\treadonly kind: PdfPreviewErrorKind;\n\treadonly title: string;\n\treadonly userMessage: string;\n\n\tconstructor(kind: PdfPreviewErrorKind, title: string, userMessage: string) {\n\t\tsuper(userMessage);\n\t\tthis.name = \"PdfPreviewError\";\n\t\tthis.kind = kind;\n\t\tthis.title = title;\n\t\tthis.userMessage = userMessage;\n\t}\n}\n\nfunction classifyErrorBody(body: string, status?: number): PdfPreviewError {\n\tconst text = body.replace(/\\s+/g, \" \").trim();\n\n\tif (\n\t\t/signed expiry time|must be after signed start time|expired|expir/i.test(text)\n\t) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"expired\",\n\t\t\t\"Link expired\",\n\t\t\t\"This download link has expired. Ask the assistant to generate a new copy of the document.\",\n\t\t);\n\t}\n\n\tif (\n\t\t/AuthenticationFailed|authorization header|formed correctly including the signature/i.test(\n\t\t\ttext,\n\t\t)\n\t) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"forbidden\",\n\t\t\t\"Link no longer valid\",\n\t\t\t\"This preview link is no longer valid. Request a fresh download link and try again.\",\n\t\t);\n\t}\n\n\tif (status === 404 || /BlobNotFound|ResourceNotFound|The specified blob does not exist/i.test(text)) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"not_found\",\n\t\t\t\"Document not found\",\n\t\t\t\"The file is no longer available. It may have been removed or the link is incorrect.\",\n\t\t);\n\t}\n\n\tif (status === 403) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"forbidden\",\n\t\t\t\"Can't open document\",\n\t\t\t\"You may not have access to this file, or the link has expired.\",\n\t\t);\n\t}\n\n\tif (status === 401) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"forbidden\",\n\t\t\t\"Access denied\",\n\t\t\t\"This preview link could not be verified. Request a new download link.\",\n\t\t);\n\t}\n\n\treturn new PdfPreviewError(\n\t\t\"unknown\",\n\t\t\"Can't preview document\",\n\t\t\"Something went wrong while opening this file. Try downloading it or request a new link.\",\n\t);\n}\n\nexport function normalizePdfPreviewError(error: unknown): PdfPreviewError {\n\tif (error instanceof PdfPreviewError) return error;\n\n\tif (error instanceof TypeError) {\n\t\treturn new PdfPreviewError(\n\t\t\t\"network\",\n\t\t\t\"Connection problem\",\n\t\t\t\"Could not load the document. Check your connection and try again.\",\n\t\t);\n\t}\n\n\treturn new PdfPreviewError(\n\t\t\"unknown\",\n\t\t\"Can't preview document\",\n\t\t\"Something went wrong while opening this file. Try downloading it or request a new link.\",\n\t);\n}\n\nasync function assertPdfBlob(blob: Blob, status?: number): Promise<Blob> {\n\tif (!blob.size) {\n\t\treturn Promise.reject(\n\t\t\tnew PdfPreviewError(\n\t\t\t\t\"empty\",\n\t\t\t\t\"Document unavailable\",\n\t\t\t\t\"The file response was empty. Request a new download link and try again.\",\n\t\t\t),\n\t\t);\n\t}\n\n\tconst head = await blob.slice(0, Math.min(blob.size, 1024)).text();\n\tif (head.startsWith(\"%PDF\")) {\n\t\treturn blob;\n\t}\n\n\tthrow classifyErrorBody(head, status);\n}\n\nexport async function fetchPdfBlob(src: string): Promise<Blob> {\n\tlet response: Response;\n\n\ttry {\n\t\tresponse = await fetch(src, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: { Accept: \"application/pdf,*/*\" },\n\t\t});\n\t} catch {\n\t\tthrow new PdfPreviewError(\n\t\t\t\"network\",\n\t\t\t\"Connection problem\",\n\t\t\t\"Could not load the document. Check your connection and try again.\",\n\t\t);\n\t}\n\n\tconst blob = await response.blob();\n\n\tif (!response.ok) {\n\t\tconst body = await blob.text().catch(() => \"\");\n\t\tthrow classifyErrorBody(body, response.status);\n\t}\n\n\treturn assertPdfBlob(blob, response.status);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Download, X, FileText, Loader2, AlertCircle, RefreshCw, ExternalLink } from \"lucide-react\";\nimport { fetchPdfBlob, normalizePdfPreviewError, type PdfPreviewError } from \"../../utils/pdfPreview\";\nimport type { PdfPreviewLayoutMode } from \"../../utils/pdfPreviewLayout\";\nimport { cn } from \"../../utils\";\n\nexport type PdfSheetV2Props = {\n\tsrc: string | null;\n\ttitle: string;\n\tonClose: () => void;\n\tmode?: PdfPreviewLayoutMode;\n};\n\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH_RATIO = 0.6;\nconst DEFAULT_WIDTH = 520;\n\nconst SPRING = { type: \"spring\" as const, stiffness: 340, damping: 34, mass: 0.85 };\nconst SHEET_EXIT = { duration: 0.22, ease: [0.4, 0, 1, 1] as const };\n\nfunction pdfDownloadName(title: string): string {\n\tconst base = title.trim() || \"document\";\n\treturn base.toLowerCase().endsWith(\".pdf\") ? base : `${base}.pdf`;\n}\n\nfunction clampSplitWidth(w: number): number {\n\tconst maxW = Math.floor(window.innerWidth * MAX_WIDTH_RATIO);\n\treturn Math.max(MIN_WIDTH, Math.min(maxW, w));\n}\n\nexport function PdfSheetV2({\n\tsrc,\n\ttitle,\n\tonClose,\n\tmode = \"split\",\n}: PdfSheetV2Props) {\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{src && (\n\t\t\t\t<PdfSheetPanel\n\t\t\t\t\tkey=\"pdf-panel\"\n\t\t\t\t\tsrc={src}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tonClose={onClose}\n\t\t\t\t\tmode={mode}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n\ntype PdfSheetPanelProps = Omit<PdfSheetV2Props, \"src\"> & { src: string; mode: PdfPreviewLayoutMode };\n\nfunction PdfSheetPanel({\n\tsrc,\n\ttitle,\n\tonClose,\n\tmode,\n}: PdfSheetPanelProps) {\n\tconst isSheet = mode === \"sheet\";\n\tconst [isLoaded, setIsLoaded] = useState(false);\n\tconst [isDownloading, setIsDownloading] = useState(false);\n\tconst [previewUrl, setPreviewUrl] = useState<string | null>(null);\n\tconst [previewError, setPreviewError] = useState<PdfPreviewError | null>(null);\n\tconst [loadAttempt, setLoadAttempt] = useState(0);\n\tconst blobRef = useRef<Blob | null>(null);\n\tconst objectUrlRef = useRef<string | null>(null);\n\tconst [panelWidth, setPanelWidth] = useState(DEFAULT_WIDTH);\n\tconst [splitOpened, setSplitOpened] = useState(false);\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tuseEffect(() => {\n\t\tsetIsLoaded(false);\n\t\tsetPreviewUrl(null);\n\t\tsetPreviewError(null);\n\t\tsetPanelWidth(DEFAULT_WIDTH);\n\t\tsetSplitOpened(false);\n\t\tblobRef.current = null;\n\n\t\tif (objectUrlRef.current) {\n\t\t\tURL.revokeObjectURL(objectUrlRef.current);\n\t\t\tobjectUrlRef.current = null;\n\t\t}\n\n\t\tlet cancelled = false;\n\n\t\tconst loadPreview = async () => {\n\t\t\ttry {\n\t\t\t\tconst blob = await fetchPdfBlob(src);\n\t\t\t\tif (cancelled) return;\n\t\t\t\tblobRef.current = blob;\n\t\t\t\tconst objectUrl = URL.createObjectURL(blob);\n\t\t\t\tobjectUrlRef.current = objectUrl;\n\t\t\t\tsetPreviewUrl(objectUrl);\n\t\t\t} catch (error) {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetPreviewError(normalizePdfPreviewError(error));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvoid loadPreview();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tif (objectUrlRef.current) {\n\t\t\t\tURL.revokeObjectURL(objectUrlRef.current);\n\t\t\t\tobjectUrlRef.current = null;\n\t\t\t}\n\t\t\tblobRef.current = null;\n\t\t};\n\t}, [src, loadAttempt]);\n\n\tuseEffect(() => {\n\t\tif (isSheet) return;\n\t\tconst onWindowResize = () => setPanelWidth((size) => clampSplitWidth(size));\n\t\twindow.addEventListener(\"resize\", onWindowResize);\n\t\treturn () => window.removeEventListener(\"resize\", onWindowResize);\n\t}, [isSheet]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") onClose();\n\t\t},\n\t\t[onClose],\n\t);\n\n\tuseEffect(() => {\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [handleKeyDown]);\n\n\tconst canDownload = isLoaded && previewUrl != null && !previewError;\n\n\tconst handleDownload = async () => {\n\t\tconst filename = pdfDownloadName(title);\n\t\tsetIsDownloading(true);\n\t\ttry {\n\t\t\tconst blob = blobRef.current ?? (await fetchPdfBlob(src));\n\t\t\tconst objectUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = objectUrl;\n\t\t\ta.download = filename;\n\t\t\ta.target = \"_blank\";\n\t\t\ta.rel = \"noopener noreferrer\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\ta.remove();\n\t\t\tURL.revokeObjectURL(objectUrl);\n\t\t} catch (error) {\n\t\t\tsetPreviewError(normalizePdfPreviewError(error));\n\t\t} finally {\n\t\t\tsetIsDownloading(false);\n\t\t}\n\t};\n\n\tconst handleRetry = () => {\n\t\tsetPreviewError(null);\n\t\tsetIsLoaded(false);\n\t\tsetPreviewUrl(null);\n\t\tsetLoadAttempt((attempt) => attempt + 1);\n\t};\n\n\tconst handleOpenInNewTab = () => {\n\t\twindow.open(src, \"_blank\", \"noopener,noreferrer\");\n\t};\n\n\tconst onResizeMouseDown = (e: React.MouseEvent) => {\n\t\tif (e.button !== 0) return;\n\t\te.preventDefault();\n\n\t\tconst startX = e.clientX;\n\t\tconst startW = panelWidth;\n\t\tsetIsDragging(true);\n\n\t\tconst onMove = (ev: MouseEvent) => {\n\t\t\tsetPanelWidth(clampSplitWidth(startW + (startX - ev.clientX)));\n\t\t};\n\n\t\tconst onUp = () => {\n\t\t\tsetIsDragging(false);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMove);\n\t\t\tdocument.removeEventListener(\"mouseup\", onUp);\n\t\t};\n\n\t\tdocument.addEventListener(\"mousemove\", onMove);\n\t\tdocument.addEventListener(\"mouseup\", onUp);\n\t};\n\n\treturn (\n\t\t<motion.div\n\t\t\tclassName={cn(\n\t\t\t\t\"payman-v2-root payman-v2-pdf-sheet-panel\",\n\t\t\t\tisSheet && \"payman-v2-pdf-sheet-panel--sheet\",\n\t\t\t)}\n\t\t\tstyle={{ minWidth: 0 }}\n\t\t\tinitial={isSheet ? { x: \"100%\", opacity: 0 } : { width: 0, opacity: 0 }}\n\t\t\tanimate={isSheet ? { x: 0, opacity: 1 } : { width: panelWidth, opacity: 1 }}\n\t\t\texit={\n\t\t\t\tisSheet\n\t\t\t\t\t? { x: \"100%\", opacity: 0, transition: { x: SHEET_EXIT, opacity: SHEET_EXIT } }\n\t\t\t\t\t: { width: 0, opacity: 0, transition: { width: SHEET_EXIT, opacity: SHEET_EXIT } }\n\t\t\t}\n\t\t\ttransition={\n\t\t\t\tisSheet\n\t\t\t\t\t? { x: SPRING, opacity: SPRING }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\twidth: splitOpened ? { duration: 0 } : SPRING,\n\t\t\t\t\t\t\topacity: SPRING,\n\t\t\t\t\t\t}\n\t\t\t}\n\t\t\tonAnimationComplete={() => {\n\t\t\t\tif (!isSheet && !splitOpened) setSplitOpened(true);\n\t\t\t}}\n\t\t>\n\t\t\t{!isSheet && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-resize-handle\"\n\t\t\t\t\tonMouseDown={onResizeMouseDown}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-resize-grip\" />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"payman-v2-pdf-sheet-header\">\n\t\t\t\t<div className=\"payman-v2-pdf-sheet-header-left\">\n\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-file-icon\">\n\t\t\t\t\t\t<FileText size={14} strokeWidth={1.75} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"payman-v2-pdf-sheet-title\" title={title}>\n\t\t\t\t\t\t{title || \"Document\"}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"payman-v2-pdf-sheet-header-actions\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-download-btn\"\n\t\t\t\t\t\taria-label=\"Download PDF\"\n\t\t\t\t\t\tdisabled={!canDownload || isDownloading}\n\t\t\t\t\t\tonClick={() => void handleDownload()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDownloading\n\t\t\t\t\t\t\t? <Loader2 size={13} strokeWidth={2} style={{ animation: \"payman-v2-spin 0.65s linear infinite\" }} />\n\t\t\t\t\t\t\t: <Download size={13} strokeWidth={2} />\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<span>{isDownloading ? \"Downloading…\" : \"Download\"}</span>\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-close-btn\"\n\t\t\t\t\t\taria-label=\"Close preview\"\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<X size={15} strokeWidth={2.25} />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"payman-v2-pdf-sheet-body\">\n\t\t\t\t{previewError ? (\n\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-error\" role=\"alert\">\n\t\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-error-icon\">\n\t\t\t\t\t\t\t<AlertCircle size={22} strokeWidth={1.75} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"payman-v2-pdf-sheet-error-title\">{previewError.title}</p>\n\t\t\t\t\t\t<p className=\"payman-v2-pdf-sheet-error-message\">{previewError.userMessage}</p>\n\t\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-error-actions\">\n\t\t\t\t\t\t\t{previewError.kind === \"network\" && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-error-btn\"\n\t\t\t\t\t\t\t\t\tonClick={handleRetry}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<RefreshCw size={14} strokeWidth={2} />\n\t\t\t\t\t\t\t\t\t<span>Try again</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{(previewError.kind === \"network\" || previewError.kind === \"unknown\") && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-error-btn payman-v2-pdf-sheet-error-btn-secondary\"\n\t\t\t\t\t\t\t\t\tonClick={handleOpenInNewTab}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ExternalLink size={14} strokeWidth={2} />\n\t\t\t\t\t\t\t\t\t<span>Open link</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{(!isLoaded || !previewUrl) && (\n\t\t\t\t\t\t\t<div className=\"payman-v2-pdf-sheet-loading\">\n\t\t\t\t\t\t\t\t<Loader2\n\t\t\t\t\t\t\t\t\tsize={20}\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\tstyle={{ animation: \"payman-v2-spin 0.65s linear infinite\", color: \"var(--payman-v2-text-3)\" }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"payman-v2-pdf-sheet-loading-text\">\n\t\t\t\t\t\t\t\t\t{previewUrl ? \"Preparing preview…\" : \"Opening document…\"}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{previewUrl && (\n\t\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\t\tkey={previewUrl}\n\t\t\t\t\t\t\t\tsrc={previewUrl}\n\t\t\t\t\t\t\t\ttitle={title || \"PDF Preview\"}\n\t\t\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-iframe\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\topacity: isLoaded ? 1 : 0,\n\t\t\t\t\t\t\t\t\ttransition: \"opacity 0.3s ease\",\n\t\t\t\t\t\t\t\t\tpointerEvents: isDragging ? \"none\" : \"auto\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonLoad={() => setIsLoaded(true)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</motion.div>\n\t);\n}\n","import { useChatV2, useVoice, useAttachmentUpload } from \"@paymanai/payman-typescript-ask-sdk\";\nimport type {\n\tUseChatV2Return,\n\tUseAttachmentUploadReturn,\n\tStreamAttachmentPayload,\n} from \"@paymanai/payman-typescript-ask-sdk\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from \"react\";\nimport { PaymanChatContext } from \"../../contexts\";\nimport type {\n\tChatCallbacks,\n\tChatConfig,\n\tMessageActionsConfig,\n\tMessageDisplay,\n\tPaymanChatProps,\n\tPaymanChatRef,\n\tUserActionState,\n} from \"../../types\";\nimport { cn } from \"../../utils\";\nimport {\n\tisFriendlyWorkflowError,\n\tgetConflictErrorMessage,\n} from \"../../utils/errorMessages\";\nimport {\n\tDEFAULT_SLASH_COMMANDS,\n\tfilterSlashCommands,\n} from \"../../utils/slashCommands\";\nimport { initSentryIfNeeded } from \"../../utils/sentry\";\nimport { submitFeedback } from \"../../utils/feedbackClient\";\nimport type { SubmitFeedbackHandler } from \"../../utils/feedbackClient\";\nimport {\n\tcaptureSentryError,\n\tsubscribeToCfRay,\n\ttype ChatSessionContext,\n} from \"../../utils/sentryContext\";\nimport { MessageList } from \"../MessageList\";\nimport { ResetSessionConfirmModal } from \"../ResetSessionConfirmModal\";\nimport { MessageListV2 } from \"../v2/MessageListV2\";\nimport type { MessageListV2Handle } from \"../v2/MessageListV2\";\nimport { ChatInputV2 } from \"../v2/ChatInputV2\";\nimport type { ChatInputV2Handle } from \"../v2/ChatInputV2\";\nimport { StreamingIndicatorV2 } from \"../v2/StreamingIndicatorV2\";\nimport { ImageLightboxV2 } from \"../v2/ImageLightboxV2\";\nimport { TraceTimelineModal } from \"../v2/TraceTimelineModal\";\nimport { PdfSheetV2 } from \"../v2/PdfSheetV2\";\nimport { resolveChatAttachmentConfig } from \"../../utils/attachmentConfig\";\n\nconst DEFAULT_USER_ACTION_STATE: UserActionState = {\n\tprompts: [],\n\tnotifications: [],\n};\n\nconst NOOP_ASYNC = async () => {};\nconst NOOP = () => {};\n\nfunction useSentryChatCallbacks(\n\tcallbacks: ChatCallbacks | undefined,\n\tconfig: ChatConfig,\n): ChatCallbacks {\n\tconst sentryCtxRef = useRef<ChatSessionContext>({});\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst initialSessionId = config.initialSessionId;\n\tconst apiHeaders = config.api.headers;\n\n\tuseEffect(() => {\n\t\tsentryCtxRef.current.agentId = config.agentId;\n\t\tsentryCtxRef.current.sessionOwnerId = config.sessionParams?.id;\n\t\tif (initialSessionId) {\n\t\t\tsentryCtxRef.current.sessionId = initialSessionId;\n\t\t}\n\t\tif (apiHeaders) {\n\t\t\tsentryCtxRef.current.customerId =\n\t\t\t\tapiHeaders[\"x-paygent-wf-mcp-customer-id\"] ?? sentryCtxRef.current.customerId;\n\t\t\tsentryCtxRef.current.customerEmail =\n\t\t\t\tapiHeaders[\"x-paygent-wf-mcp-customer-email\"] ?? sentryCtxRef.current.customerEmail;\n\t\t}\n\t}, [\n\t\tconfig.agentId,\n\t\tconfig.sessionParams?.id,\n\t\tinitialSessionId,\n\t\tapiHeaders,\n\t]);\n\n\tuseEffect(() => {\n\t\tconst endpoint = config.api.streamEndpoint || \"/api/playground/ask/stream\";\n\t\treturn subscribeToCfRay(endpoint, (cfRay) => {\n\t\t\tsentryCtxRef.current.cfRay = cfRay;\n\t\t});\n\t}, [config.api.streamEndpoint]);\n\n\treturn useMemo<ChatCallbacks>(\n\t\t() => ({\n\t\t\tonMessageSent: (msg) => callbacksRef.current?.onMessageSent?.(msg),\n\t\t\tonStreamStart: () => callbacksRef.current?.onStreamStart?.(),\n\t\t\tonStreamComplete: (message: MessageDisplay) => {\n\t\t\t\tif (message.executionId) {\n\t\t\t\t\tsentryCtxRef.current.executionId = message.executionId;\n\t\t\t\t}\n\t\t\t\tif (message.sessionId) {\n\t\t\t\t\tsentryCtxRef.current.sessionId = message.sessionId;\n\t\t\t\t}\n\n\t\t\t\tconst content = message.content ?? \"\";\n\t\t\t\tconst looksLikeRawErr =\n\t\t\t\t\tcontent.length >= 10 &&\n\t\t\t\t\t(content.includes(\"errorType=\") || /failed:\\s*\\{/.test(content));\n\t\t\t\tconst completedEmpty =\n\t\t\t\t\t!message.isStreaming &&\n\t\t\t\t\t!message.isCancelled &&\n\t\t\t\t\tcontent.length === 0 &&\n\t\t\t\t\t(message.streamProgress === \"completed\" || message.streamProgress === \"error\");\n\t\t\t\tconst hasConflict = !!getConflictErrorMessage(message.errorDetails);\n\t\t\t\tconst hasFriendlyErr = isFriendlyWorkflowError(message.errorDetails);\n\n\t\t\t\tconst shouldCapture =\n\t\t\t\t\tmessage.isError ||\n\t\t\t\t\thasConflict ||\n\t\t\t\t\thasFriendlyErr ||\n\t\t\t\t\tlooksLikeRawErr ||\n\t\t\t\t\tcompletedEmpty;\n\n\t\t\t\tif (shouldCapture) {\n\t\t\t\t\tsentryCtxRef.current.route =\n\t\t\t\t\t\ttypeof window !== \"undefined\"\n\t\t\t\t\t\t\t? window.location.pathname\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tcaptureSentryError(\n\t\t\t\t\t\t`Workflow error: ${message.errorDetails || content || \"Unknown error\"}`,\n\t\t\t\t\t\t{ ...sentryCtxRef.current },\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcallbacksRef.current?.onStreamComplete?.(message);\n\t\t\t},\n\t\t\tonError: (error: Error) => {\n\t\t\t\tsentryCtxRef.current.route =\n\t\t\t\t\ttypeof window !== \"undefined\" ? window.location.pathname : undefined;\n\t\t\t\tcaptureSentryError(error, { ...sentryCtxRef.current });\n\t\t\t\tcallbacksRef.current?.onError?.(error);\n\t\t\t},\n\t\t\tonSessionIdChange: (sessionId: string) => {\n\t\t\t\tsentryCtxRef.current.sessionId = sessionId;\n\t\t\t\tcallbacksRef.current?.onSessionIdChange?.(sessionId);\n\t\t\t},\n\t\t\tonExecutionTraceClick: (data) =>\n\t\t\t\tcallbacksRef.current?.onExecutionTraceClick?.(data),\n\t\t\tonResetSession: () => callbacksRef.current?.onResetSession?.(),\n\t\tonUploadImageClick: () => callbacksRef.current?.onUploadImageClick?.(),\n\t\tonAttachFileClick: () => callbacksRef.current?.onAttachFileClick?.(),\n\t\tonMessageFeedback: (data: { messageId: string; feedback: \"up\" | \"down\" }) =>\n\t\t\tcallbacksRef.current?.onMessageFeedback?.(data),\n\t\t\tonUserActionRequired: (req) =>\n\t\t\t\tcallbacksRef.current?.onUserActionRequired?.(req),\n\t\t\tonUserNotification: (note) =>\n\t\t\t\tcallbacksRef.current?.onUserNotification?.(note),\n\t\t\tonStatusMessage: (msg) =>\n\t\t\t\tcallbacksRef.current?.onStatusMessage?.(msg),\n\t\t\tonStepsUpdate: (steps) =>\n\t\t\t\tcallbacksRef.current?.onStepsUpdate?.(steps),\n\t\t}),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n}\n\ntype PaymanChatInnerProps = PaymanChatProps & {\n\tchat: UseChatV2Return;\n\tattachmentUpload: UseAttachmentUploadReturn;\n};\n\nconst PaymanChatInner = forwardRef<PaymanChatRef, PaymanChatInnerProps>(function PaymanChatInner({\n\tconfig,\n\tcallbacks = {},\n\tclassName,\n\tstyle,\n\tchildren,\n\tonLoadMoreMessages,\n\tisLoadingMoreMessages = false,\n\thasMoreMessages = false,\n\tchat,\n\tattachmentUpload,\n}, ref) {\n\tconst [inputValue, setInputValue] = useState(\"\");\n\tconst prevInputValueRef = useRef(inputValue);\n\tconst [hasEverSentMessage, setHasEverSentMessage] = useState(false);\n\tconst [lightboxSrc, setLightboxSrc] = useState<string | null>(null);\n\tconst [lightboxAlt, setLightboxAlt] = useState(\"\");\n\tconst [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n\tconst [isResetSessionConfirmOpen, setIsResetSessionConfirmOpen] =\n\t\tuseState(false);\n\t// Latency/precision toggle the user flips on the input bar.\n\t// Fast = sampled, quick answer; Deep = full analytical pass.\n\t// Default \"fast\" — the server also defaults to fast when the\n\t// field is omitted, so leaving this unset on old SDK versions\n\t// yields the same behavior. Hosts can hide the toggle with\n\t// `enableDeepModeToggle={false}`; sends then stay pinned to fast.\n\tconst [analysisMode, setAnalysisMode] = useState<\"fast\" | \"deep\">(\"fast\");\n\tconst chatInputV2Ref = useRef<ChatInputV2Handle>(null);\n\tconst messageListV2Ref = useRef<MessageListV2Handle>(null);\n\tconst resetToEmptyStateRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (config.sentryDsn) {\n\t\t\tinitSentryIfNeeded(config.sentryDsn);\n\t\t}\n\t}, [config.sentryDsn]);\n\n\tconst {\n\t\tmessages,\n\t\tsendMessage,\n\t\tisWaitingForResponse,\n\t\tresetSession,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t} = chat;\n\n\t// Track when messages first appear (for animation)\n\tuseEffect(() => {\n\t\tif (resetToEmptyStateRef.current) {\n\t\t\tif (messages.length === 0) {\n\t\t\t\tsetHasEverSentMessage(false);\n\t\t\t\tresetToEmptyStateRef.current = false;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (messages.length > 0 && !hasEverSentMessage) {\n\t\t\tsetHasEverSentMessage(true);\n\t\t}\n\t}, [messages.length, hasEverSentMessage]);\n\n\tuseEffect(() => {\n\t\tif (!editingMessageId) return;\n\t\tconst editingMessageStillExists = messages.some(\n\t\t\t(message) => message.id === editingMessageId && message.role === \"user\"\n\t\t);\n\t\tif (!editingMessageStillExists) {\n\t\t\tsetEditingMessageId(null);\n\t\t}\n\t}, [editingMessageId, messages]);\n\n\t// Keep user-action features backward-safe if the hook returns an\n\t// older shape without the collection-based API.\n\tconst userActionState = chat.userActionState ?? DEFAULT_USER_ACTION_STATE;\n\tconst submitUserAction = chat.submitUserAction ?? NOOP_ASYNC;\n\tconst cancelUserAction = chat.cancelUserAction ?? NOOP_ASYNC;\n\tconst resendUserAction = chat.resendUserAction ?? NOOP_ASYNC;\n\tconst dismissNotification = chat.dismissNotification ?? NOOP;\n\tconst isUserActionSupported =\n\t\ttypeof chat.submitUserAction === \"function\" &&\n\t\ttypeof chat.cancelUserAction === \"function\" &&\n\t\ttypeof chat.resendUserAction === \"function\";\n\n\t// Voice support\n\tconst {\n\t\ttranscribedText,\n\t\tisAvailable: voiceAvailable,\n\t\tisRecording,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\tclearTranscript,\n\t} = useVoice(\n\t\t{\n\t\t\tlang: config.voiceLang || \"en-US\",\n\t\t\tinterimResults: config.voiceInterimResults !== false,\n\t\t\tcontinuous: config.voiceContinuous !== false,\n\t\t},\n\t\t{\n\t\t\tonResult: () => {\n\t\t\t\t// V2 input element handles voice transcription internally\n\t\t\t\t// via the recording modal; the host component no longer\n\t\t\t\t// needs to sync the textarea value. (Previously guarded\n\t\t\t\t// by `if (!isV2)` — v1 is gone.)\n\t\t\t},\n\t\t\tonEnd: () => {},\n\t\t\tonError: (error) => {\n\t\t\t\tconsole.error(\"Voice error:\", error);\n\t\t\t},\n\t\t}\n\t);\n\n\tconst [pdfSheet, setPdfSheet] = useState<{ href: string; title: string } | null>(null);\n\tconst autoOpenedPdfHrefsRef = useRef(new Set<string>());\n\n\tconst pdfPreviewMode = config.pdfPreviewMode ?? \"split\";\n\n\tconst openPdfSheet = useCallback((href: string, title: string, options?: { auto?: boolean }) => {\n\t\tif (options?.auto) {\n\t\t\tif (autoOpenedPdfHrefsRef.current.has(href)) return;\n\t\t\tautoOpenedPdfHrefsRef.current.add(href);\n\t\t}\n\t\tsetPdfSheet({ href, title });\n\t}, []);\n\n\tconst closePdfSheet = useCallback(() => {\n\t\tsetPdfSheet(null);\n\t}, []);\n\n\t// Create context value with control methods\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tresetSession,\n\t\t\tclearMessages,\n\t\t\tprependMessages,\n\t\t\tcancelStream,\n\t\t\tgetSessionId,\n\t\t\tgetMessages,\n\t\t\tisWaitingForResponse,\n\t\t\topenPdfSheet,\n\t\t}),\n\t\t[\n\t\t\tresetSession,\n\t\t\tclearMessages,\n\t\t\tprependMessages,\n\t\t\tcancelStream,\n\t\t\tgetSessionId,\n\t\t\tgetMessages,\n\t\t\tisWaitingForResponse,\n\t\t\topenPdfSheet,\n\t\t]\n\t);\n\n\t// Extract callbacks\n\tconst {\n\t\tonExecutionTraceClick: rawOnExecutionTraceClick,\n\t\tonResetSession,\n\t\tonUploadImageClick,\n\t\tonAttachFileClick,\n\t\tonMessageFeedback,\n\t} = callbacks;\n\n\t// Debug-mode trace viewer state. Holds the executionId currently\n\t// being inspected; null while the modal is closed.\n\tconst [debugTraceExecutionId, setDebugTraceExecutionId] = useState<\n\t\tstring | null\n\t>(null);\n\n\t// Persist thumbs-up/down to /api/ask/executions/{id}/feedback using the\n\t// same api key the chat already authenticates with. Resolves on a durable\n\t// save (so the message UI keeps its active state) and rejects on failure\n\t// (so it reverts / the reason modal shows an error). The consumer's\n\t// onMessageFeedback callback fires only after a successful save.\n\tconst handleSubmitFeedback = useCallback<SubmitFeedbackHandler>(\n\t\tasync ({ messageId, executionId, feedback, details }) => {\n\t\t\tif (!executionId) {\n\t\t\t\tthrow new Error(\"Cannot submit feedback before the response completes\");\n\t\t\t}\n\t\t\tawait submitFeedback({\n\t\t\t\tbaseUrl: config.api.baseUrl,\n\t\t\t\tstreamEndpoint: config.api.streamEndpoint,\n\t\t\t\theaders: config.api.headers,\n\t\t\t\tauthToken: config.api.authToken,\n\t\t\t\tstage: config.stage,\n\t\t\t\tstageQueryParam: config.stageQueryParam,\n\t\t\t\texecutionId,\n\t\t\t\tfeedback,\n\t\t\t\tdetails,\n\t\t\t});\n\t\t\tonMessageFeedback?.({\n\t\t\t\tmessageId,\n\t\t\t\tfeedback: feedback === \"POSITIVE\" ? \"up\" : \"down\",\n\t\t\t});\n\t\t},\n\t\t[\n\t\t\tconfig.api.baseUrl,\n\t\t\tconfig.api.streamEndpoint,\n\t\t\tconfig.api.headers,\n\t\t\tconfig.api.authToken,\n\t\t\tconfig.stage,\n\t\t\tconfig.stageQueryParam,\n\t\t\tonMessageFeedback,\n\t\t],\n\t);\n\n\t// In debug mode we intercept the trace click to open the built-in\n\t// latency timeline. Any consumer-provided handler still fires so\n\t// existing telemetry / overrides aren't silently disabled.\n\tconst onExecutionTraceClick = useMemo(() => {\n\t\tif (!config.debug) return rawOnExecutionTraceClick;\n\t\treturn (data: {\n\t\t\tmessage: MessageDisplay;\n\t\t\ttracingData?: unknown;\n\t\t\texecutionId?: string;\n\t\t}) => {\n\t\t\trawOnExecutionTraceClick?.(data);\n\t\t\tif (data.executionId) setDebugTraceExecutionId(data.executionId);\n\t\t};\n\t}, [config.debug, rawOnExecutionTraceClick]);\n\n\tconst performResetSession = useCallback(() => {\n\t\tresetToEmptyStateRef.current = true;\n\t\tsetEditingMessageId(null);\n\t\tsetIsResetSessionConfirmOpen(false);\n\t\tsetInputValue(\"\");\n\t\tsetLightboxSrc(null);\n\t\tsetLightboxAlt(\"\");\n\t\tsetPdfSheet(null);\n\t\tautoOpenedPdfHrefsRef.current.clear();\n\t\tchatInputV2Ref.current?.setDraft(\"\");\n\t\tchatInputV2Ref.current?.clearAttachments();\n\t\tclearTranscript();\n\t\tif (isRecording) {\n\t\t\tstopRecording();\n\t\t}\n\t\tresetSession();\n\t\tonResetSession?.();\n\t}, [\n\t\tclearTranscript,\n\t\tisRecording,\n\t\tonResetSession,\n\t\tresetSession,\n\t\tstopRecording,\n\t]);\n\n\tconst requestResetSession = useCallback(() => {\n\t\tsetIsResetSessionConfirmOpen(true);\n\t}, []);\n\n\tconst closeResetSessionConfirm = useCallback(() => {\n\t\tsetIsResetSessionConfirmOpen(false);\n\t}, []);\n\n\t// Expose control methods via ref\n\tuseImperativeHandle(ref, () => ({\n\t\tresetSession: performResetSession,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t}), [performResetSession, clearMessages, cancelStream, getSessionId, getMessages]);\n\n\t// Extract config with hardcoded UI defaults\n\tconst {\n\t\tplaceholder = \"Type your message...\",\n\t\temptyStateText = \"What can I help with?\",\n\t\tsessionParams,\n\t\tdisableInput = false,\n\t\thasAskPermission = true,\n\t\tstreamingStepsText,\n\t\tcompletedStepsText,\n\t\tshowAvatars = false,\n\t\tshowUserAvatar,\n\t\tshowAssistantAvatar,\n\t\tshowAgentName = true,\n\t\tagentName = \"Assistant\",\n\t\tshowExecutionSteps = true,\n\t\tshowStreamingDot = true,\n\t\tlayout = \"full-width\",\n\t\tshowTimestamps = false,\n\t\tanimated = true,\n\t\tisChatDisabled = false,\n\t\tdisabledComponent,\n\t\tshowEmptyStateIcon = true,\n\t\temptyStateComponent,\n\t\tshowResetSession = false,\n\t\tenableDeepModeToggle = true,\n\t\tmessageActions: messageActionsConfig,\n\t\tenableSlashCommands = true,\n\t\tslashCommands: slashCommandsConfig,\n\t\tcommandPermissions,\n\t} = config;\n\n\tconst attachmentSettings = useMemo(\n\t\t() => resolveChatAttachmentConfig(config),\n\t\t[\n\t\t\tconfig.attachments,\n\t\t\tconfig.showAttachmentButton,\n\t\t\tconfig.showUploadImageButton,\n\t\t\tconfig.showAttachFileButton,\n\t\t],\n\t);\n\n\tconst messageActions = useMemo<Required<MessageActionsConfig>>(\n\t\t() => ({\n\t\t\tuserMessageActions: {\n\t\t\t\tcopy: messageActionsConfig?.userMessageActions?.copy ?? true,\n\t\t\t\tedit: messageActionsConfig?.userMessageActions?.edit ?? false,\n\t\t\t\tretry: messageActionsConfig?.userMessageActions?.retry ?? false,\n\t\t\t},\n\t\tassistantMessageActions: {\n\t\t\tcopy: messageActionsConfig?.assistantMessageActions?.copy ?? true,\n\t\t\ttrace: messageActionsConfig?.assistantMessageActions?.trace ?? true,\n\t\t\tthumbsUp: messageActionsConfig?.assistantMessageActions?.thumbsUp ?? true,\n\t\t\tthumbsDown: messageActionsConfig?.assistantMessageActions?.thumbsDown ?? true,\n\t\t},\n\t\t}),\n\t\t[messageActionsConfig]\n\t);\n\tconst slashCommands = useMemo(\n\t\t() =>\n\t\t\tenableSlashCommands\n\t\t\t\t? filterSlashCommands(\n\t\t\t\t\t\tslashCommandsConfig ?? DEFAULT_SLASH_COMMANDS,\n\t\t\t\t\t\tcommandPermissions,\n\t\t\t\t\t)\n\t\t\t\t: [],\n\t\t[commandPermissions, enableSlashCommands, slashCommandsConfig],\n\t);\n\n\t// Check if session params are configured\n\tconst isSessionParamsConfigured = useMemo(() => {\n\t\tif (!sessionParams) return false;\n\t\treturn !!(sessionParams.id?.trim() && sessionParams.name?.trim());\n\t}, [sessionParams?.id, sessionParams?.name]);\n\n\t// Reset voice recognition only when user clears the input (not on initial empty state)\n\tuseEffect(() => {\n\t\tconst wasEmpty = prevInputValueRef.current.trim() === \"\";\n\t\tconst isEmpty = inputValue.trim() === \"\";\n\t\tprevInputValueRef.current = inputValue;\n\t\tif (!wasEmpty && isEmpty) {\n\t\t\tclearTranscript();\n\t\t\tif (isRecording) {\n\t\t\t\tstopRecording();\n\t\t\t}\n\t\t}\n\t}, [inputValue, clearTranscript, isRecording, stopRecording]);\n\n\tconst handleCancelRecording = () => {\n\t\tstopRecording();\n\t\tclearTranscript();\n\t\tsetInputValue(\"\");\n\t};\n\n\tconst handleConfirmRecording = () => {\n\t\tstopRecording();\n\t\t// Keep the transcribed text in the input for user to review/send\n\t};\n\n\tconst isV2InputDisabled = !isSessionParamsConfigured || disableInput;\n\tconst effectiveAnalysisMode = enableDeepModeToggle ? analysisMode : \"fast\";\n\n\tconst isEmpty = messages.length === 0;\n\n\t// If chat is disabled, show custom component or default disabled UI\n\tif (isChatDisabled) {\n\t\tif (disabledComponent) {\n\t\t\treturn (\n\t\t\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"bg-background overflow-hidden flex flex-col flex-[4]\",\n\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t{disabledComponent}\n\t\t\t\t\t</div>\n\t\t\t\t</PaymanChatContext.Provider>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-background overflow-hidden flex flex-col flex-[4]\",\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={style}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"flex-1 flex items-center justify-center p-4\">\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\tChat is currently disabled\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</PaymanChatContext.Provider>\n\t\t);\n\t}\n\n\t// --- V2 helpers ---\n\tconst handleImageClick = (src: string, alt: string) => {\n\t\tsetLightboxSrc(src);\n\t\tsetLightboxAlt(alt);\n\t};\n\n\tconst userActionPrompts = isUserActionSupported ? userActionState.prompts : undefined;\n\tconst notifications = userActionState.notifications;\n\n\tconst handleAttachmentsChange = useCallback(\n\t\t(attachments: { id: string; file: File }[]) => {\n\t\t\tattachmentUpload.syncAttachments(attachments);\n\t\t},\n\t\t[attachmentUpload],\n\t);\n\n\tconst handleV2Send = (\n\t\ttext: string,\n\t\tfiles: File[] = [],\n\t\tattachments: StreamAttachmentPayload[] = [],\n\t) => {\n\t\tif (isRecording) stopRecording();\n\t\tif ((text.trim() || files.length > 0) && !disableInput && isSessionParamsConfigured) {\n\t\t\tif (files.length > 0 && attachments.length === 0) return;\n\t\t\tsetEditingMessageId(null);\n\t\t\tvoid sendMessage(text.trim(), {\n\t\t\t\tanalysisMode: effectiveAnalysisMode,\n\t\t\t\tattachments,\n\t\t\t\tfiles,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst handleVoicePress = useCallback(async () => {\n\t\tif (!voiceAvailable) return;\n\t\tif (isRecording) {\n\t\t\tstopRecording();\n\t\t\treturn;\n\t\t}\n\t\tclearTranscript();\n\t\tawait startRecording();\n\t}, [clearTranscript, isRecording, startRecording, stopRecording, voiceAvailable]);\n\n\tconst handleEditMessageDraft = useCallback((messageId: string) => {\n\t\tconst targetMessage = messages.find((message) => message.id === messageId);\n\t\tif (!targetMessage?.content.trim()) return;\n\t\tsetEditingMessageId(messageId);\n\t\tchatInputV2Ref.current?.setDraft(targetMessage.content);\n\t\trequestAnimationFrame(() => {\n\t\t\tmessageListV2Ref.current?.scrollToBottom(\"smooth\");\n\t\t});\n\t}, [messages]);\n\n\tconst handleRetryUserMessage = useCallback((messageId: string) => {\n\t\tif (isWaitingForResponse) return;\n\t\tconst targetMessage = messages.find(\n\t\t\t(message) => message.id === messageId && message.role === \"user\"\n\t\t);\n\t\tif (!targetMessage?.content.trim()) return;\n\t\t// Retry inherits the current mode — if the user flipped to\n\t\t// Deep after seeing an unsatisfying Fast answer, retrying\n\t\t// sends in Deep. Matches how users intuitively expect\n\t\t// \"retry with more depth\" to behave.\n\t\tvoid sendMessage(targetMessage.content.trim(), {\n\t\t\tanalysisMode: effectiveAnalysisMode,\n\t\t});\n\t\tconst bump = () => messageListV2Ref.current?.scrollToBottom(\"instant\");\n\t\trequestAnimationFrame(() => {\n\t\t\tbump();\n\t\t\tqueueMicrotask(() => {\n\t\t\t\twindow.setTimeout(bump, 120);\n\t\t\t});\n\t\t});\n\t}, [isWaitingForResponse, messages, sendMessage, effectiveAnalysisMode]);\n\n\tconst handleClearEditing = useCallback(() => {\n\t\tsetEditingMessageId(null);\n\t}, []);\n\n\treturn (\n\t\t<PaymanChatContext.Provider value={contextValue}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\"payman-v2-root\", className)}\n\t\t\t\tstyle={style}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"payman-v2-split-layout\",\n\t\t\t\t\t\tpdfPreviewMode === \"sheet\" && \"payman-v2-split-layout--sheet\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t<div className=\"payman-v2-chat-column\">\n\t\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t\t\t{isEmpty && !hasEverSentMessage ? (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tkey=\"v2-empty\"\n\t\t\t\t\t\t\t\t\tinitial={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\texit={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-chat-layout\"\n\t\t\t\t\t\t\t\t\tstyle={{ justifyContent: \"center\", alignItems: \"center\" }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", flex: 1, width: \"100%\" }}>\n\t\t\t\t\t\t\t\t\t\t<MessageList\n\t\t\t\t\t\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\t\t\t\t\t\tisLoading={false}\n\t\t\t\t\t\t\t\t\t\t\temptyStateText={emptyStateText}\n\t\t\t\t\t\t\t\t\t\t\tshowEmptyStateIcon={showEmptyStateIcon}\n\t\t\t\t\t\t\t\t\t\t\temptyStateComponent={emptyStateComponent}\n\t\t\t\t\t\t\t\t\t\t\tlayout={layout}\n\t\t\t\t\t\t\t\t\t\t\tshowTimestamps={showTimestamps}\n\t\t\t\t\t\t\t\t\t\t\tstage={config.stage || \"DEVELOPMENT\"}\n\t\t\t\t\t\t\t\t\t\t\tanimated={animated}\n\t\t\t\t\t\t\t\t\t\t\tshowAgentName={showAgentName}\n\t\t\t\t\t\t\t\t\t\t\tagentName={agentName}\n\t\t\t\t\t\t\t\t\t\t\tshowAvatars={showAvatars}\n\t\t\t\t\t\t\t\t\t\t\tshowUserAvatar={showUserAvatar}\n\t\t\t\t\t\t\t\t\t\t\tshowAssistantAvatar={showAssistantAvatar}\n\t\t\t\t\t\t\t\t\t\t\tshowExecutionSteps={showExecutionSteps}\n\t\t\t\t\t\t\t\t\t\t\tshowStreamingDot={showStreamingDot}\n\t\t\t\t\t\t\t\t\t\t\tstreamingStepsText={streamingStepsText}\n\t\t\t\t\t\t\t\t\t\t\tcompletedStepsText={completedStepsText}\n\t\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\t\tonLoadMoreMessages={onLoadMoreMessages}\n\t\t\t\t\t\t\t\t\t\t\tisLoadingMoreMessages={isLoadingMoreMessages}\n\t\t\t\t\t\t\t\t\t\t\thasMoreMessages={hasMoreMessages}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, y: 12 }}\n\t\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\t\t\t\t\t\t\ttransition={{ delay: 0.2, duration: 0.4, ease: [0.25, 0.46, 0.45, 0.94] }}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ width: \"100%\" }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{hasAskPermission && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ChatInputV2\n\t\t\t\t\t\t\t\t\t\t\t\t\tref={chatInputV2Ref}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSend={handleV2Send}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCancel={cancelStream}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isV2InputDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisUploadingAttachments={attachmentUpload.isUploading}\n\t\t\t\t\t\t\t\t\t\t\t\t\tattachmentsReady={attachmentUpload.allReady}\n\t\t\t\t\t\t\t\t\t\t\t\t\thasAttachmentUploadErrors={attachmentUpload.hasErrors}\n\t\t\t\t\t\t\t\t\t\t\t\t\tattachmentUploadStatusById={attachmentUpload.statusById}\n\t\t\t\t\t\t\t\t\t\t\t\t\tuploadedAttachmentPayloads={attachmentUpload.payloads}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAttachmentsChange={handleAttachmentsChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening...\" : placeholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\tenableVoice={config.enableVoice === true}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttranscribedText={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true ? transcribedText : \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvoiceAvailable={config.enableVoice === true && voiceAvailable}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisRecording={isRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonVoicePress={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? handleVoicePress\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonCancelRecording={handleCancelRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonConfirmRecording={handleConfirmRecording}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowResetSession={showResetSession}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonResetSession={requestResetSession}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowAttachmentButton={attachmentSettings.showAttachmentButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowUploadImageButton={attachmentSettings.showUploadImageButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowAttachFileButton={attachmentSettings.showAttachFileButton}\n\t\t\t\t\t\t\t\t\t\t\t\t\tallowedImageExtensions={attachmentSettings.allowedImageExtensions}\n\t\t\t\t\t\t\t\t\t\t\t\t\tallowedFileExtensions={attachmentSettings.allowedFileExtensions}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmaxCount={attachmentSettings.maxCount}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmaxFileBytes={attachmentSettings.maxFileBytes}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmaxTotalBytes={attachmentSettings.maxTotalBytes}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonUploadImageClick={onUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAttachFileClick={onAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\t\t\teditingMessageId={editingMessageId}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClearEditing={handleClearEditing}\n\t\t\t\t\t\t\t\t\t\t\t\t\tanalysisMode={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? analysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? setAnalysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tslashCommands={slashCommands}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\tkey=\"v2-chat\"\n\t\t\t\t\t\t\t\t\tinitial={hasEverSentMessage ? { opacity: 0 } : false}\n\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t\t\t\tclassName=\"payman-v2-chat-layout\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<MessageListV2\n\t\t\t\t\t\t\t\t\t\tref={messageListV2Ref}\n\t\t\t\t\t\t\t\t\t\tmessages={messages}\n\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\tsidePanelOpen={!!pdfSheet}\n\t\t\t\t\t\t\t\t\t\tonEditUserMessage={handleEditMessageDraft}\n\t\t\t\t\t\t\t\t\t\tonRetryUserMessage={handleRetryUserMessage}\n\t\t\t\t\t\t\t\t\t\tonImageClick={handleImageClick}\n\t\t\t\t\t\t\t\t\t\tonExecutionTraceClick={onExecutionTraceClick}\n\t\t\t\t\t\t\t\t\t\tmessageActions={messageActions}\n\t\t\t\t\t\t\t\t\t\tretryDisabled={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\ttypingSpeed={config.typingSpeed ?? 4}\n\t\t\t\t\t\t\t\t\t\tuserActionPrompts={userActionPrompts}\n\t\t\t\t\t\t\t\t\t\tnotifications={notifications}\n\t\t\t\t\t\t\t\t\t\tonSubmitUserAction={isUserActionSupported ? submitUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonCancelUserAction={isUserActionSupported ? cancelUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonResendUserAction={isUserActionSupported ? resendUserAction : undefined}\n\t\t\t\t\t\t\t\t\t\tonDismissNotification={dismissNotification}\n\t\t\t\t\t\t\t\t\t\tonSubmitFeedback={handleSubmitFeedback}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<StreamingIndicatorV2\n\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\tloadingAnimation={config.loadingAnimation}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{hasAskPermission && (\n\t\t\t\t\t\t\t\t\t\t<ChatInputV2\n\t\t\t\t\t\t\t\t\t\t\tref={chatInputV2Ref}\n\t\t\t\t\t\t\t\t\t\t\tonSend={handleV2Send}\n\t\t\t\t\t\t\t\t\t\t\tonCancel={cancelStream}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={isV2InputDisabled}\n\t\t\t\t\t\t\t\t\t\t\tisStreaming={isWaitingForResponse}\n\t\t\t\t\t\t\t\t\t\t\tisUploadingAttachments={attachmentUpload.isUploading}\n\t\t\t\t\t\t\t\t\t\t\tattachmentsReady={attachmentUpload.allReady}\n\t\t\t\t\t\t\t\t\t\t\thasAttachmentUploadErrors={attachmentUpload.hasErrors}\n\t\t\t\t\t\t\t\t\t\t\tattachmentUploadStatusById={attachmentUpload.statusById}\n\t\t\t\t\t\t\t\t\t\t\tuploadedAttachmentPayloads={attachmentUpload.payloads}\n\t\t\t\t\t\t\t\t\t\t\tonAttachmentsChange={handleAttachmentsChange}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={isRecording ? \"Listening...\" : placeholder}\n\t\t\t\t\t\t\t\t\t\t\tenableVoice={config.enableVoice === true}\n\t\t\t\t\t\t\t\t\t\t\ttranscribedText={\n\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true ? transcribedText : \"\"\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvoiceAvailable={config.enableVoice === true && voiceAvailable}\n\t\t\t\t\t\t\t\t\t\t\tisRecording={isRecording}\n\t\t\t\t\t\t\t\t\t\t\tonVoicePress={\n\t\t\t\t\t\t\t\t\t\t\t\tconfig.enableVoice === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t? handleVoicePress\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonCancelRecording={handleCancelRecording}\n\t\t\t\t\t\t\t\t\t\t\tonConfirmRecording={handleConfirmRecording}\n\t\t\t\t\t\t\t\t\t\t\tshowResetSession={showResetSession}\n\t\t\t\t\t\t\t\t\t\t\tonResetSession={requestResetSession}\n\t\t\t\t\t\t\t\t\t\t\tshowAttachmentButton={attachmentSettings.showAttachmentButton}\n\t\t\t\t\t\t\t\t\t\t\tshowUploadImageButton={attachmentSettings.showUploadImageButton}\n\t\t\t\t\t\t\t\t\t\t\tshowAttachFileButton={attachmentSettings.showAttachFileButton}\n\t\t\t\t\t\t\t\t\t\t\tallowedImageExtensions={attachmentSettings.allowedImageExtensions}\n\t\t\t\t\t\t\t\t\t\t\tallowedFileExtensions={attachmentSettings.allowedFileExtensions}\n\t\t\t\t\t\t\t\t\t\t\tmaxCount={attachmentSettings.maxCount}\n\t\t\t\t\t\t\t\t\t\t\tmaxFileBytes={attachmentSettings.maxFileBytes}\n\t\t\t\t\t\t\t\t\t\t\tmaxTotalBytes={attachmentSettings.maxTotalBytes}\n\t\t\t\t\t\t\t\t\t\t\tonUploadImageClick={onUploadImageClick}\n\t\t\t\t\t\t\t\t\t\t\tonAttachFileClick={onAttachFileClick}\n\t\t\t\t\t\t\t\t\t\t\teditingMessageId={editingMessageId}\n\t\t\t\t\t\t\t\t\t\t\tonClearEditing={handleClearEditing}\n\t\t\t\t\t\t\t\t\t\t\tanalysisMode={\n\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? analysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tonAnalysisModeChange={\n\t\t\t\t\t\t\t\t\t\t\t\tenableDeepModeToggle ? setAnalysisMode : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tslashCommands={slashCommands}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</div>\n\n\t\t\t\t{pdfPreviewMode === \"split\" && (\n\t\t\t\t\t<PdfSheetV2\n\t\t\t\t\t\tsrc={pdfSheet?.href ?? null}\n\t\t\t\t\t\ttitle={pdfSheet?.title ?? \"\"}\n\t\t\t\t\t\tonClose={closePdfSheet}\n\t\t\t\t\t\tmode=\"split\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{pdfPreviewMode === \"sheet\" && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"payman-v2-pdf-sheet-top-anchor\"\n\t\t\t\t\t\taria-hidden={!pdfSheet}\n\t\t\t\t\t>\n\t\t\t\t\t\t<PdfSheetV2\n\t\t\t\t\t\t\tsrc={pdfSheet?.href ?? null}\n\t\t\t\t\t\t\ttitle={pdfSheet?.title ?? \"\"}\n\t\t\t\t\t\t\tonClose={closePdfSheet}\n\t\t\t\t\t\t\tmode=\"sheet\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<ImageLightboxV2\n\t\t\t\t\t\tsrc={lightboxSrc}\n\t\t\t\t\t\talt={lightboxAlt}\n\t\t\t\t\t\tonClose={() => setLightboxSrc(null)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ResetSessionConfirmModal\n\t\t\t\t\t\tisOpen={isResetSessionConfirmOpen}\n\t\t\t\t\t\tonClose={closeResetSessionConfirm}\n\t\t\t\t\t\tonConfirm={performResetSession}\n\t\t\t\t\t/>\n\t\t\t\t\t{config.debug && (\n\t\t\t\t\t\t<TraceTimelineModal\n\t\t\t\t\t\t\topen={debugTraceExecutionId !== null}\n\t\t\t\t\t\t\tonClose={() => setDebugTraceExecutionId(null)}\n\t\t\t\t\t\t\texecutionId={debugTraceExecutionId}\n\t\t\t\t\t\t\tapiBaseUrl={config.api.baseUrl}\n\t\t\t\t\t\t\tapiHeaders={config.api.headers}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</PaymanChatContext.Provider>\n\t\t);\n});\n\n/**\n * PaymanChat — the public component. Delegates to `PaymanChatInner`\n * with a chat hook instance from `useChatV2`. The `config.uiVersion`\n * prop used to gate an older V1 render path; the V1 code has been\n * removed since nothing in the SDK's current consumers (paygent-studio\n * etc.) opted into it. The `uiVersion` prop is still accepted on\n * `ChatConfig` for type compatibility but is now ignored at runtime.\n */\nexport const PaymanChat = forwardRef<PaymanChatRef, PaymanChatProps>(\n\tfunction PaymanChat(props, ref) {\n\t\tconst mergedCallbacks = useSentryChatCallbacks(props.callbacks, props.config);\n\t\tconst chat = useChatV2(props.config, mergedCallbacks);\n\t\tconst attachmentUpload = useAttachmentUpload(props.config);\n\t\treturn (\n\t\t\t<PaymanChatInner\n\t\t\t\t{...props}\n\t\t\t\tchat={chat}\n\t\t\t\tattachmentUpload={attachmentUpload}\n\t\t\t\tref={ref}\n\t\t\t/>\n\t\t);\n\t},\n);\n"]}
|