@agent-native/core 0.15.4 → 0.15.6
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/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +3 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +12 -10
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +1 -1
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.js +2 -1
- package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.d.ts.map +1 -1
- package/dist/client/settings/BrowserSection.js +3 -2
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +1 -1
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +1 -0
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +1 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +53 -12
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.spec.js +43 -7
- package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.js +7 -2
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +3 -1
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +19 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts +15 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +80 -1
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +58 -18
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/dev-mode.d.ts +0 -14
- package/dist/client/dev-mode.d.ts.map +0 -1
- package/dist/client/dev-mode.js +0 -14
- package/dist/client/dev-mode.js.map +0 -1
- package/dist/client/extensions/EmbeddedTool.d.ts +0 -20
- package/dist/client/extensions/EmbeddedTool.d.ts.map +0 -1
- package/dist/client/extensions/EmbeddedTool.js +0 -199
- package/dist/client/extensions/EmbeddedTool.js.map +0 -1
- package/dist/client/extensions/ToolEditor.d.ts +0 -5
- package/dist/client/extensions/ToolEditor.d.ts.map +0 -1
- package/dist/client/extensions/ToolEditor.js +0 -129
- package/dist/client/extensions/ToolEditor.js.map +0 -1
- package/dist/client/extensions/ToolViewer.d.ts +0 -5
- package/dist/client/extensions/ToolViewer.d.ts.map +0 -1
- package/dist/client/extensions/ToolViewer.js +0 -400
- package/dist/client/extensions/ToolViewer.js.map +0 -1
- package/dist/client/extensions/ToolViewerPage.d.ts +0 -2
- package/dist/client/extensions/ToolViewerPage.d.ts.map +0 -1
- package/dist/client/extensions/ToolViewerPage.js +0 -24
- package/dist/client/extensions/ToolViewerPage.js.map +0 -1
- package/dist/client/extensions/ToolsListPage.d.ts +0 -2
- package/dist/client/extensions/ToolsListPage.d.ts.map +0 -1
- package/dist/client/extensions/ToolsListPage.js +0 -67
- package/dist/client/extensions/ToolsListPage.js.map +0 -1
- package/dist/client/extensions/ToolsSidebarSection.d.ts +0 -2
- package/dist/client/extensions/ToolsSidebarSection.d.ts.map +0 -1
- package/dist/client/extensions/ToolsSidebarSection.js +0 -236
- package/dist/client/extensions/ToolsSidebarSection.js.map +0 -1
- package/dist/client/extensions/tool-order.d.ts +0 -7
- package/dist/client/extensions/tool-order.d.ts.map +0 -1
- package/dist/client/extensions/tool-order.js +0 -47
- package/dist/client/extensions/tool-order.js.map +0 -1
- package/dist/client/tools/EmbeddedTool.d.ts +0 -20
- package/dist/client/tools/EmbeddedTool.d.ts.map +0 -1
- package/dist/client/tools/EmbeddedTool.js +0 -199
- package/dist/client/tools/EmbeddedTool.js.map +0 -1
- package/dist/client/tools/ExtensionSlot.d.ts +0 -27
- package/dist/client/tools/ExtensionSlot.d.ts.map +0 -1
- package/dist/client/tools/ExtensionSlot.js +0 -96
- package/dist/client/tools/ExtensionSlot.js.map +0 -1
- package/dist/client/tools/ToolEditor.d.ts +0 -5
- package/dist/client/tools/ToolEditor.d.ts.map +0 -1
- package/dist/client/tools/ToolEditor.js +0 -129
- package/dist/client/tools/ToolEditor.js.map +0 -1
- package/dist/client/tools/ToolViewer.d.ts +0 -5
- package/dist/client/tools/ToolViewer.d.ts.map +0 -1
- package/dist/client/tools/ToolViewer.js +0 -400
- package/dist/client/tools/ToolViewer.js.map +0 -1
- package/dist/client/tools/ToolViewerPage.d.ts +0 -2
- package/dist/client/tools/ToolViewerPage.d.ts.map +0 -1
- package/dist/client/tools/ToolViewerPage.js +0 -24
- package/dist/client/tools/ToolViewerPage.js.map +0 -1
- package/dist/client/tools/ToolsListPage.d.ts +0 -2
- package/dist/client/tools/ToolsListPage.d.ts.map +0 -1
- package/dist/client/tools/ToolsListPage.js +0 -67
- package/dist/client/tools/ToolsListPage.js.map +0 -1
- package/dist/client/tools/ToolsSidebarSection.d.ts +0 -2
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +0 -1
- package/dist/client/tools/ToolsSidebarSection.js +0 -236
- package/dist/client/tools/ToolsSidebarSection.js.map +0 -1
- package/dist/client/tools/iframe-bridge.d.ts +0 -38
- package/dist/client/tools/iframe-bridge.d.ts.map +0 -1
- package/dist/client/tools/iframe-bridge.js +0 -207
- package/dist/client/tools/iframe-bridge.js.map +0 -1
- package/dist/client/tools/index.d.ts +0 -8
- package/dist/client/tools/index.d.ts.map +0 -1
- package/dist/client/tools/index.js +0 -8
- package/dist/client/tools/index.js.map +0 -1
- package/dist/client/tools/tool-order.d.ts +0 -7
- package/dist/client/tools/tool-order.d.ts.map +0 -1
- package/dist/client/tools/tool-order.js +0 -47
- package/dist/client/tools/tool-order.js.map +0 -1
- package/dist/server/local-migration.d.ts +0 -41
- package/dist/server/local-migration.d.ts.map +0 -1
- package/dist/server/local-migration.js +0 -235
- package/dist/server/local-migration.js.map +0 -1
- package/dist/tools/actions.d.ts +0 -3
- package/dist/tools/actions.d.ts.map +0 -1
- package/dist/tools/actions.js +0 -272
- package/dist/tools/actions.js.map +0 -1
- package/dist/tools/fetch-tool.d.ts +0 -23
- package/dist/tools/fetch-tool.d.ts.map +0 -1
- package/dist/tools/fetch-tool.js +0 -178
- package/dist/tools/fetch-tool.js.map +0 -1
- package/dist/tools/html-shell.d.ts +0 -45
- package/dist/tools/html-shell.d.ts.map +0 -1
- package/dist/tools/html-shell.js +0 -514
- package/dist/tools/html-shell.js.map +0 -1
- package/dist/tools/proxy-security.d.ts +0 -12
- package/dist/tools/proxy-security.d.ts.map +0 -1
- package/dist/tools/proxy-security.js +0 -158
- package/dist/tools/proxy-security.js.map +0 -1
- package/dist/tools/routes.d.ts +0 -2
- package/dist/tools/routes.d.ts.map +0 -1
- package/dist/tools/routes.js +0 -627
- package/dist/tools/routes.js.map +0 -1
- package/dist/tools/schema.d.ts +0 -664
- package/dist/tools/schema.d.ts.map +0 -1
- package/dist/tools/schema.js +0 -146
- package/dist/tools/schema.js.map +0 -1
- package/dist/tools/slots/routes.d.ts +0 -15
- package/dist/tools/slots/routes.d.ts.map +0 -1
- package/dist/tools/slots/routes.js +0 -94
- package/dist/tools/slots/routes.js.map +0 -1
- package/dist/tools/slots/schema.d.ts +0 -303
- package/dist/tools/slots/schema.d.ts.map +0 -1
- package/dist/tools/slots/schema.js +0 -76
- package/dist/tools/slots/schema.js.map +0 -1
- package/dist/tools/slots/store.d.ts +0 -66
- package/dist/tools/slots/store.d.ts.map +0 -1
- package/dist/tools/slots/store.js +0 -227
- package/dist/tools/slots/store.js.map +0 -1
- package/dist/tools/store.d.ts +0 -40
- package/dist/tools/store.d.ts.map +0 -1
- package/dist/tools/store.js +0 -193
- package/dist/tools/store.js.map +0 -1
- package/dist/tools/theme.d.ts +0 -2
- package/dist/tools/theme.d.ts.map +0 -1
- package/dist/tools/theme.js +0 -67
- package/dist/tools/theme.js.map +0 -1
- package/dist/tools/url-safety.d.ts +0 -24
- package/dist/tools/url-safety.d.ts.map +0 -1
- package/dist/tools/url-safety.js +0 -224
- package/dist/tools/url-safety.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantChat.js","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n AssistantRuntimeProvider,\n useLocalRuntime,\n useThreadRuntime,\n useThread,\n useAui,\n useComposer,\n useComposerRuntime,\n useMessageRuntime,\n ThreadPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n} from \"@assistant-ui/react\";\nimport type {\n AttachmentAdapter,\n CompleteAttachment,\n PendingAttachment,\n ToolCallMessagePartProps,\n Attachment,\n} from \"@assistant-ui/react\";\nimport { CompositeAttachmentAdapter } from \"@assistant-ui/react\";\nimport { MarkdownTextPrimitive } from \"@assistant-ui/react-markdown\";\nimport ReactMarkdown, { defaultUrlTransform } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { createAgentChatAdapter } from \"./agent-chat-adapter.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport type {\n ChatThreadScope,\n ChatThreadSnapshot,\n} from \"./use-chat-threads.js\";\nimport { getActiveRun } from \"./active-run-state.js\";\nimport {\n AgentAutoContinueSignal,\n type ContentPart,\n readSSEStreamRaw,\n} from \"./sse-event-processor.js\";\nimport { captureError, trackEvent } from \"./analytics.js\";\nimport { cn } from \"./utils.js\";\nimport { TextAttachmentAdapter } from \"./composer/attachment-accept.js\";\nimport { AgentTaskCard } from \"./AgentTaskCard.js\";\nimport { ConnectBuilderCard } from \"./ConnectBuilderCard.js\";\nimport { useBuilderConnectFlow } from \"./settings/useBuilderStatus.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./components/ui/dropdown-menu.js\";\nimport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n BUILDER_SPACE_SETTINGS_URL,\n NEW_CHAT_ACTION_HREF,\n} from \"./error-format.js\";\nimport { ThumbsFeedback } from \"./observability/ThumbsFeedback.js\";\nimport {\n TiptapComposer,\n type TiptapComposerHandle,\n} from \"./composer/TiptapComposer.js\";\nimport type { Reference } from \"./composer/types.js\";\nimport { isPastedTextAttachmentName } from \"./composer/pasted-text.js\";\nimport { PastedTextChip } from \"./composer/PastedTextChip.js\";\nimport {\n IconMessage,\n IconX,\n IconPlayerStop,\n IconCheck,\n IconChevronDown,\n IconCopy,\n IconTerminal,\n IconLoader2,\n IconCircleX,\n IconSquareFilled,\n IconClock,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconLock,\n IconArrowBackUp,\n IconExternalLink,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconGauge,\n IconArrowRight,\n IconSettings,\n IconAlertTriangle,\n IconRefresh,\n IconPlayerPlay,\n IconClipboardList,\n IconSearch,\n IconArrowsMaximize,\n IconArrowsMinimize,\n IconPlus,\n} from \"@tabler/icons-react\";\n\nclass DownscalingImageAttachmentAdapter implements AttachmentAdapter {\n public accept = \"image/*\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"image\",\n name: state.file.name,\n contentType: state.file.type,\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"image\",\n image: await getImageFileDataURL(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nclass BinaryDocumentAttachmentAdapter implements AttachmentAdapter {\n public accept = \"application/pdf,.pdf\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"document\",\n name: state.file.name,\n contentType: inferDocumentContentType(state.file),\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: attachment.name,\n data: await getFileDataURL(attachment.file),\n mimeType: inferDocumentContentType(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nfunction inferDocumentContentType(file: File): string {\n if (file.type) return file.type;\n if (file.name.toLowerCase().endsWith(\".pdf\")) return \"application/pdf\";\n return \"application/octet-stream\";\n}\n\nfunction getFileDataURL(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n}\n\n// Anthropic / OpenAI vision inputs choke on multi-megabyte images, and\n// base64-encoding a raw screenshot eats enough heap to crash the composer\n// (PayloadTooLarge / \"Maximum call stack\" in serializers). Downscale large\n// images on the client before we ever serialize them.\nconst MAX_IMAGE_BYTES = 4 * 1024 * 1024;\nconst MAX_IMAGE_DIMENSION = 2048;\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to decode pasted image\"));\n img.src = url;\n });\n}\n\nasync function getImageFileDataURL(file: File): Promise<string> {\n if (file.size <= MAX_IMAGE_BYTES) {\n return getFileDataURL(file);\n }\n if (typeof document === \"undefined\" || typeof Image === \"undefined\") {\n return getFileDataURL(file);\n }\n const objectUrl = URL.createObjectURL(file);\n try {\n const img = await loadImage(objectUrl);\n const ratio = Math.min(\n MAX_IMAGE_DIMENSION / img.naturalWidth,\n MAX_IMAGE_DIMENSION / img.naturalHeight,\n 1,\n );\n const width = Math.max(1, Math.round(img.naturalWidth * ratio));\n const height = Math.max(1, Math.round(img.naturalHeight * ratio));\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return getFileDataURL(file);\n }\n ctx.drawImage(img, 0, 0, width, height);\n const useJpeg =\n file.type !== \"image/png\" || file.size > MAX_IMAGE_BYTES * 2;\n return canvas.toDataURL(useJpeg ? \"image/jpeg\" : \"image/png\", 0.85);\n } catch {\n return getFileDataURL(file);\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\ntype QueuedAttachment = CompleteAttachment;\ntype AgentRequestMode = \"act\" | \"plan\";\n\nfunction createUserMessageRunConfig(\n references?: Reference[],\n requestMode?: AgentRequestMode,\n) {\n const custom: { references?: Reference[]; requestMode?: AgentRequestMode } =\n {};\n if (references && references.length > 0) {\n custom.references = references;\n }\n if (requestMode) {\n custom.requestMode = requestMode;\n }\n return Object.keys(custom).length > 0 ? { runConfig: { custom } } : {};\n}\n\nfunction escapeQueuedAttachmentAttribute(value: string): string {\n return value.replace(/&/g, \"&\").replace(/\"/g, \""\");\n}\n\nfunction isTextLikeFile(file: File): boolean {\n if (file.type.startsWith(\"text/\")) return true;\n if (file.type === \"application/json\") return true;\n return /\\.(txt|md|markdown|csv|json|yaml|yml)$/i.test(file.name);\n}\n\nfunction textFileAttachmentEnvelope(file: File, text: string): string {\n const contentType = file.type || \"text/plain\";\n return `<attachment name=\"${escapeQueuedAttachmentAttribute(file.name)}\" contentType=\"${escapeQueuedAttachmentAttribute(contentType)}\">\\n${text}\\n</attachment>`;\n}\n\nfunction serializeAttachmentContentPart(\n part: Record<string, unknown>,\n): QueuedAttachment[\"content\"][number] | null {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n return { type: \"image\", image: part.image };\n }\n if (part.type === \"text\" && typeof part.text === \"string\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"file\" && typeof part.data === \"string\") {\n return {\n type: \"file\",\n data: part.data,\n mimeType:\n typeof part.mimeType === \"string\"\n ? part.mimeType\n : \"application/octet-stream\",\n ...(typeof part.filename === \"string\" ? { filename: part.filename } : {}),\n };\n }\n return null;\n}\n\nasync function serializeQueuedAttachments(\n attachments?: ReadonlyArray<unknown>,\n): Promise<QueuedAttachment[] | undefined> {\n const queued: QueuedAttachment[] = [];\n for (const raw of attachments ?? []) {\n const attachment = raw as Partial<Attachment> & { file?: File };\n const name = attachment.name || attachment.file?.name || \"attachment\";\n const id = attachment.id || name;\n const type = attachment.type || \"file\";\n const contentType = attachment.contentType || attachment.file?.type;\n\n if (Array.isArray(attachment.content) && attachment.content.length > 0) {\n const content = attachment.content\n .map((part) =>\n serializeAttachmentContentPart(part as Record<string, unknown>),\n )\n .filter((part): part is QueuedAttachment[\"content\"][number] => !!part);\n if (content.length > 0) {\n queued.push({\n id,\n type,\n name,\n contentType,\n status: { type: \"complete\" },\n content,\n });\n }\n continue;\n }\n\n if (typeof File !== \"undefined\" && attachment.file instanceof File) {\n const file = attachment.file;\n if (file.type.startsWith(\"image/\")) {\n queued.push({\n id,\n type: \"image\",\n name,\n contentType: file.type,\n status: { type: \"complete\" },\n content: [{ type: \"image\", image: await getImageFileDataURL(file) }],\n });\n } else if (isTextLikeFile(file)) {\n queued.push({\n id,\n type: \"file\",\n name,\n contentType: file.type || \"text/plain\",\n status: { type: \"complete\" },\n content: [\n {\n type: \"text\",\n text: textFileAttachmentEnvelope(file, await file.text()),\n },\n ],\n });\n } else {\n queued.push({\n id,\n type: \"document\",\n name,\n contentType: inferDocumentContentType(file),\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: file.name,\n data: await getFileDataURL(file),\n mimeType: inferDocumentContentType(file),\n },\n ],\n });\n }\n }\n }\n\n return queued.length > 0 ? queued : undefined;\n}\n\n// ─── Markdown Text ──────────────────────────────────────────────────────────\n\nconst markdownStyles = `\n.agent-markdown > :first-child { margin-top: 0; }\n.agent-markdown > :last-child { margin-bottom: 0; }\n.agent-markdown p { margin: 0.5em 0; }\n.agent-markdown ul, .agent-markdown ol { margin: 0.5em 0; padding-left: 1.5em; }\n.agent-markdown li { margin: 0.2em 0; }\n.agent-markdown li > p { margin: 0; }\n.agent-markdown h1 { font-size: 1.25em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h2 { font-size: 1.125em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h3 { font-size: 1em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown strong { font-weight: 600; }\n.agent-markdown em { font-style: italic; }\n.agent-markdown code { font-size: 0.875em; padding: 0.15em 0.35em; border-radius: 0.25em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre { margin: 0.5em 0; padding: 0.75em 1em; border-radius: 0.375em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); overflow-x: auto; border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre code { padding: 0; background: transparent; font-size: 0.8125em; color: inherit; border: none; }\n.agent-markdown-shiki { margin: 0.5em 0; border-radius: 0.375em; overflow: hidden; font-size: 0.8125em; }\n.agent-markdown-shiki pre { margin: 0; padding: 0.75em 1em; overflow-x: auto; background: var(--shiki-light-bg); color: var(--shiki-light); }\n.agent-markdown-shiki pre code { background: transparent; padding: 0; font-size: inherit; color: inherit; }\n.agent-markdown-shiki pre span { color: var(--shiki-light); background: var(--shiki-light-bg); }\n.dark .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); }\n.dark .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); }\n@media (prefers-color-scheme: dark) { :root:not(.light) .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); } :root:not(.light) .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); } }\n.agent-tool-code .agent-markdown-shiki { margin: 0; border-radius: 0; min-width: max-content; }\n.agent-tool-code .agent-markdown-shiki pre { padding: 0.75rem; border: 0; background: transparent; }\n.agent-tool-code .agent-markdown-shiki pre span { background: transparent; }\n.agent-tool-code pre { margin: 0; min-width: max-content; padding: 0.75rem; background: transparent; color: inherit; }\n.agent-tool-code mark { border-radius: 0.1875rem; background: rgba(245, 158, 11, 0.25); color: inherit; }\n.agent-markdown hr { border: none; border-top: 1px solid hsl(var(--border, 0 0% 20%)); margin: 0.75em 0; }\n.agent-markdown a { text-decoration: underline; text-underline-offset: 2px; }\n.agent-markdown a.agent-markdown-cta { text-decoration: none; }\n.agent-markdown blockquote { border-left: 2px solid hsl(var(--border, 0 0% 20%)); padding-left: 0.75em; margin: 0.5em 0; opacity: 0.8; }\n.agent-markdown table { border-collapse: collapse; margin: 0.5em 0; font-size: 0.875em; }\n.agent-markdown th, .agent-markdown td { border: 1px solid hsl(var(--border, 0 0% 20%)); padding: 0.35em 0.65em; text-align: left; }\n.agent-markdown th { font-weight: 600; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); }\n`;\n\n/**\n * Pending selection context — written to application_state when the user\n * presses Cmd+I with text selected on the page. The agent's next turn picks\n * it up via the `selectionContextPromise` in production-agent. The pill\n * below tells the user the context is attached and lets them clear it.\n */\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\nconst ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;\nconst ACTIVE_RUN_POLL_INTERVAL_MS = 150;\n\ntype ActiveRunLookup = {\n active?: boolean;\n runId?: string;\n threadId?: string;\n status?: string;\n heartbeatAt?: number | null;\n};\n\nfunction activeRunLooksStale(runInfo: ActiveRunLookup): boolean {\n const heartbeatAt =\n typeof runInfo.heartbeatAt === \"number\" ? runInfo.heartbeatAt : null;\n return (\n runInfo.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000\n );\n}\n\nfunction repoHasAssistantMessage(repo: any): boolean {\n return repo?.messages?.some(\n (m: { message?: { role?: string }; role?: string }) =>\n (m.message?.role ?? m.role) === \"assistant\",\n );\n}\n\nfunction getRepoMessages(repo: any): any[] {\n return Array.isArray(repo?.messages) ? repo.messages : [];\n}\n\nfunction getRepoMessage(entry: any): any {\n return entry?.message ?? entry;\n}\n\nfunction isAssistantMessageTerminal(message: any): boolean {\n const statusType =\n message?.status && typeof message.status === \"object\"\n ? message.status.type\n : undefined;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nfunction repoTextLength(repo: any): number {\n let length = 0;\n for (const entry of getRepoMessages(repo)) {\n const message = getRepoMessage(entry);\n const content = message?.content;\n if (typeof content === \"string\") {\n length += content.length;\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n length += part.text.length;\n }\n }\n }\n }\n return length;\n}\n\nfunction repoTerminalAssistantCount(repo: any): number {\n return getRepoMessages(repo).filter((entry) => {\n const message = getRepoMessage(entry);\n return message?.role === \"assistant\" && isAssistantMessageTerminal(message);\n }).length;\n}\n\nfunction shouldImportServerThreadData(currentRepo: any, incomingRepo: any) {\n const incomingCount = getRepoMessages(incomingRepo).length;\n if (incomingCount === 0) return false;\n\n const currentCount = getRepoMessages(currentRepo).length;\n if (currentCount === 0) return true;\n if (incomingCount < currentCount) return false;\n\n if (incomingCount === currentCount) {\n const currentTerminalAssistants = repoTerminalAssistantCount(currentRepo);\n const incomingTerminalAssistants = repoTerminalAssistantCount(incomingRepo);\n if (incomingTerminalAssistants < currentTerminalAssistants) {\n return false;\n }\n if (\n incomingTerminalAssistants <= currentTerminalAssistants &&\n repoTextLength(incomingRepo) < repoTextLength(currentRepo)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction clearPendingSelection() {\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n {\n method: \"DELETE\",\n keepalive: true,\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"agent-panel:selection-cleared\"));\n }\n}\n\nasync function waitForThreadRunToClear(apiUrl: string, threadId?: string) {\n if (!threadId) return;\n const deadline = Date.now() + ACTIVE_RUN_CLEAR_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const info = await res.json();\n const heartbeatAt =\n typeof info?.heartbeatAt === \"number\" ? info.heartbeatAt : null;\n const stale =\n info?.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000;\n if (!info?.active || info?.status !== \"running\" || stale) return;\n }\n } catch {\n // Transient poll failure — try again until the short grace period ends.\n }\n\n await new Promise((resolve) =>\n window.setTimeout(resolve, ACTIVE_RUN_POLL_INTERVAL_MS),\n );\n }\n}\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nfunction MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\nfunction SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n clearPendingSelection();\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\nlet stylesInjected = false;\nfunction injectMarkdownStyles() {\n if (stylesInjected || typeof document === \"undefined\") return;\n stylesInjected = true;\n const style = document.createElement(\"style\");\n style.textContent = markdownStyles;\n document.head.appendChild(style);\n}\n\nfunction extractCodeText(child: React.ReactNode): string {\n if (typeof child === \"string\") return child;\n if (Array.isArray(child)) return child.map(extractCodeText).join(\"\");\n if (React.isValidElement(child)) {\n const props = child.props as { children?: React.ReactNode };\n return extractCodeText(props.children);\n }\n return \"\";\n}\n\n// Lazy-loaded shiki highlighter using the fine-grained API so we only ship\n// the languages and themes we actually use (instead of shiki's full ~30 MB\n// bundle of every grammar). This is required to keep the Cloudflare Pages\n// Functions bundle under the 25 MiB limit.\ntype ShikiHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n};\n\nlet highlighterLoader: Promise<ShikiHighlighter> | null = null;\nfunction loadHighlighter(): Promise<ShikiHighlighter> {\n if (!highlighterLoader) {\n highlighterLoader = (async () => {\n const [{ createHighlighterCore }, { createOnigurumaEngine }] =\n await Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/oniguruma\"),\n ]);\n return createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light-default.mjs\"),\n import(\"shiki/themes/github-dark-default.mjs\"),\n ],\n langs: [\n import(\"shiki/langs/javascript.mjs\"),\n import(\"shiki/langs/typescript.mjs\"),\n import(\"shiki/langs/jsx.mjs\"),\n import(\"shiki/langs/tsx.mjs\"),\n import(\"shiki/langs/json.mjs\"),\n import(\"shiki/langs/css.mjs\"),\n import(\"shiki/langs/html.mjs\"),\n import(\"shiki/langs/markdown.mjs\"),\n import(\"shiki/langs/bash.mjs\"),\n import(\"shiki/langs/shellscript.mjs\"),\n import(\"shiki/langs/python.mjs\"),\n import(\"shiki/langs/yaml.mjs\"),\n import(\"shiki/langs/sql.mjs\"),\n ],\n engine: createOnigurumaEngine(import(\"shiki/wasm\")),\n }) as unknown as Promise<ShikiHighlighter>;\n })().catch((error) => {\n // Reset on failure so a future code block can retry instead of\n // silently failing forever on a stale chunk / network blip.\n highlighterLoader = null;\n throw error;\n });\n }\n return highlighterLoader;\n}\n\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n// Map a few common aliases to languages we bundled above.\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\nfunction HighlightedCodeBlock({ code, lang }: { code: string; lang: string }) {\n const [html, setHtml] = useState<string | null>(null);\n useEffect(() => {\n let cancelled = false;\n loadHighlighter()\n .then((highlighter) => {\n const requested = (lang || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const finalLang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang: finalLang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelled) setHtml(out);\n })\n .catch(() => {\n // Unknown language or other shiki failure — fall back to plain pre.\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n }, [code, lang]);\n\n if (html) {\n return (\n <div\n className=\"agent-markdown-shiki\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n return (\n <pre>\n <code className={lang ? `language-${lang}` : undefined}>{code}</code>\n </pre>\n );\n}\n\nconst CTA_BUTTON_CLASSES =\n \"agent-markdown-cta mt-1 inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background no-underline shadow-sm transition-colors hover:bg-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background cursor-pointer\";\n\nconst markdownComponents = {\n a(props: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\n const {\n href,\n children,\n className,\n rel: _rel,\n target: _target,\n ...rest\n } = props;\n if (href === NEW_CHAT_ACTION_HREF) {\n // In-app action: dispatch a CustomEvent that MultiTabAssistantChat\n // listens for and opens a new chat tab. Not an external navigation.\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n window.dispatchEvent(new CustomEvent(\"agent-chat:new-chat\"));\n }}\n className={cn(CTA_BUTTON_CLASSES, className)}\n >\n <IconPlus size={13} strokeWidth={2} aria-hidden=\"true\" />\n <span>{children}</span>\n </button>\n );\n }\n const isBuilderCta = isBuilderErrorCtaHref(href);\n if (!isBuilderCta) {\n return (\n <a href={href} className={className} {...rest}>\n {children}\n </a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(CTA_BUTTON_CLASSES, className)}\n {...rest}\n >\n <span>{children}</span>\n <IconExternalLink size={13} strokeWidth={2} aria-hidden=\"true\" />\n </a>\n );\n },\n pre(props: React.HTMLAttributes<HTMLPreElement>) {\n const { children, ...rest } = props;\n if (React.isValidElement(children)) {\n const childProps = children.props as {\n className?: string;\n children?: React.ReactNode;\n };\n const className = childProps.className || \"\";\n if (/\\blanguage-embed\\b/.test(className)) {\n const body = extractCodeText(childProps.children);\n const parsed = parseEmbedBody(body);\n return (\n <IframeEmbed {...(parsed as Parameters<typeof IframeEmbed>[0])} />\n );\n }\n const langMatch = className.match(/\\blanguage-([\\w+-]+)\\b/);\n if (langMatch) {\n const code = extractCodeText(childProps.children).replace(/\\n$/, \"\");\n return <HighlightedCodeBlock code={code} lang={langMatch[1]} />;\n }\n }\n return <pre {...rest}>{children}</pre>;\n },\n};\n\nfunction isBuilderErrorCtaHref(href: string | undefined): boolean {\n if (!href) return false;\n try {\n const url = new URL(href);\n if (url.protocol !== \"https:\" || url.hostname !== \"builder.io\") {\n return false;\n }\n return (\n url.href === BUILDER_SPACE_SETTINGS_URL ||\n url.pathname === \"/account/billing\" ||\n /^\\/app\\/organizations\\/[^/]+\\/billing$/.test(url.pathname)\n );\n } catch {\n return false;\n }\n}\n\n// react-markdown's defaultUrlTransform strips href values whose protocol\n// isn't on its safe list (https, mailto, etc.). Our in-app pseudo-href\n// `agent-native:new-chat` would be blanked out by that, so let it through\n// while delegating every other URL to the default transform for sanitization.\nfunction markdownUrlTransform(value: string): string {\n if (value === NEW_CHAT_ACTION_HREF) return value;\n return defaultUrlTransform(value);\n}\n\nfunction MarkdownText() {\n useEffect(() => {\n injectMarkdownStyles();\n }, []);\n return (\n <MarkdownTextPrimitive\n smooth\n className=\"agent-markdown break-words\"\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n />\n );\n}\n\n// ─── Composer Attachment Preview ─────────────────────────────────────────────\n\nfunction getImageAttachmentSrc(attachment: Attachment): string | null {\n if (attachment.type !== \"image\") return null;\n\n if (\"file\" in attachment && attachment.file) {\n return URL.createObjectURL(attachment.file);\n }\n\n const imagePart = attachment.content?.find((part) => part.type === \"image\");\n return imagePart && \"image\" in imagePart ? imagePart.image : null;\n}\n\nfunction ComposerAttachmentPreviewCard({\n attachment,\n onRemove,\n}: {\n attachment: Attachment;\n onRemove: (id: string) => void;\n}) {\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n\n useEffect(() => {\n const nextSrc = getImageAttachmentSrc(attachment);\n setImageSrc(nextSrc);\n\n return () => {\n if (nextSrc?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(nextSrc);\n }\n };\n }, [attachment]);\n\n if (isPastedTextAttachmentName(attachment.name)) {\n return <PastedTextChip attachment={attachment} onRemove={onRemove} />;\n }\n\n const isImage = !!imageSrc;\n\n return (\n <div\n className={cn(\n \"group relative overflow-hidden border border-border/70 bg-muted/50 text-foreground\",\n isImage\n ? \"h-20 w-20 rounded-xl shadow-[0_12px_30px_-18px_rgba(0,0,0,0.7)]\"\n : \"inline-flex max-w-[220px] items-center gap-2 rounded-lg px-2.5 py-2 text-xs\",\n )}\n >\n {isImage ? (\n <>\n <img\n src={imageSrc}\n alt={attachment.name}\n className=\"h-full w-full object-cover\"\n />\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent px-2 py-1.5\">\n <div className=\"truncate text-[10px] font-medium text-white/95\">\n {attachment.name}\n </div>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-background text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {attachment.name.split(\".\").pop() || \"file\"}\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{attachment.name}</div>\n <div className=\"text-[11px] text-muted-foreground\">\n {attachment.contentType || attachment.type}\n </div>\n </div>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className={cn(\n \"absolute flex h-6 w-6 items-center justify-center rounded-full border border-border/60 bg-background/95 text-muted-foreground shadow-sm transition hover:text-foreground\",\n isImage\n ? \"right-1.5 top-1.5 opacity-100 md:opacity-0 md:group-hover:opacity-100\"\n : \"right-1.5 top-1.5\",\n )}\n aria-label={`Remove ${attachment.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\nfunction ComposerAttachmentPreviewStrip() {\n const attachments = useComposer((state) => state.attachments);\n const aui = useAui();\n\n const handleRemove = useCallback(\n (id: string) => {\n void aui.composer().attachment({ id }).remove();\n },\n [aui],\n );\n\n if (attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 px-2 pt-2\">\n {attachments.map((attachment) => (\n <ComposerAttachmentPreviewCard\n key={attachment.id}\n attachment={attachment}\n onRemove={handleRemove}\n />\n ))}\n </div>\n );\n}\n\n// Provides the parent's combined running state to tool-call renderers so they\n// can stop spinning when the user clicks stop. `thread.isRunning` alone misses\n// the force-stopped case; `part.result === undefined` alone ignores stop.\nconst ChatRunningContext = React.createContext(false);\n\n// ─── Tool Call Display ──────────────────────────────────────────────────────\n// Shared presentational component for rendering a tool call pill + result.\n// Used by both the normal message path (ToolCallFallback) and the reconnect\n// stream path (ReconnectStreamMessage). All state is passed as props — no\n// assistant-ui hooks here.\n\ntype ToolDetailSection = \"input\" | \"result\";\ntype ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction toolArgsPreview(args: Record<string, unknown>): string {\n return Object.entries(args)\n .map(([key, value]) => {\n const singleLine = stringifyToolValue(value).replace(/\\s+/g, \" \").trim();\n const preview =\n singleLine.length > 96 ? `${singleLine.slice(0, 96)}...` : singleLine;\n return `${key}=${preview}`;\n })\n .join(\", \");\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nfunction toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nfunction toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countTextMatches(text: string, query: string): number {\n const needle = query.trim();\n if (!needle) return 0;\n return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), \"gi\")))\n .length;\n}\n\nfunction renderHighlightedSearchText(\n text: string,\n query: string,\n): React.ReactNode {\n const needle = query.trim();\n if (!needle) return text;\n const regex = new RegExp(escapeRegExp(needle), \"gi\");\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text))) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n if (match[0].length === 0) regex.lastIndex += 1;\n }\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return parts;\n}\n\nfunction ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {\n const [expanded, setExpanded] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const matchCount = useMemo(\n () => countTextMatches(payload.text, search),\n [payload.text, search],\n );\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(payload.copyText);\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <div className=\"rounded-md border border-border/50 bg-background/60\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-[11px] font-medium text-foreground/85\">\n {payload.title}\n </span>\n {payload.lang !== \"text\" && (\n <span className=\"shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground\">\n {payload.lang}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setSearchOpen((v) => !v)}\n aria-label={`Search ${payload.title.toLowerCase()}`}\n aria-pressed={searchOpen}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\",\n searchOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSearch size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={expanded ? \"Shrink code viewer\" : \"Expand code viewer\"}\n aria-pressed={expanded}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {expanded ? (\n <IconArrowsMinimize size={12} />\n ) : (\n <IconArrowsMaximize size={12} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n {searchOpen && (\n <div className=\"flex items-center gap-2 border-b border-border/50 px-2.5 py-2\">\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Find\"\n className=\"h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring\"\n />\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {search.trim() ? matchCount : \"\"}\n </span>\n </div>\n )}\n <div\n className={cn(\n \"agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground\",\n expanded ? \"max-h-[70vh]\" : \"max-h-72\",\n )}\n >\n {search.trim() ? (\n <pre>\n <code>{renderHighlightedSearchText(payload.text, search)}</code>\n </pre>\n ) : (\n <HighlightedCodeBlock code={payload.text} lang={payload.lang} />\n )}\n </div>\n </div>\n );\n}\n\nfunction activityTrailFromMetadata(message: unknown): ActivityStep[] {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { activityTrail?: unknown };\n activityTrail?: unknown;\n }\n | undefined;\n const raw = meta?.custom?.activityTrail ?? meta?.activityTrail;\n if (!Array.isArray(raw)) return [];\n return raw\n .map((item, index): ActivityStep | null => {\n if (!item || typeof item !== \"object\") return null;\n const label = (item as { label?: unknown }).label;\n const tool = (item as { tool?: unknown }).tool;\n if (typeof label !== \"string\" || !label.trim()) return null;\n return {\n id: `trail-${index}-${label}`,\n label: label.trim(),\n ...(typeof tool === \"string\" && tool.trim()\n ? { tool: tool.trim() }\n : {}),\n };\n })\n .filter((item): item is ActivityStep => item !== null);\n}\n\nfunction RunActivityTrail({ steps }: { steps: ActivityStep[] }) {\n const [open, setOpen] = useState(false);\n if (steps.length === 0) return null;\n const visibleSteps = steps.slice(-6);\n return (\n <div className=\"mt-1.5\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n size={12}\n className={cn(\"transition-transform\", open && \"rotate-180\")}\n />\n Steps\n </button>\n {open && (\n <div className=\"mt-1 rounded-md border border-border/60 bg-muted/25 px-2.5 py-2 text-[11px] text-muted-foreground\">\n <div className=\"space-y-1\">\n {visibleSteps.map((step) => (\n <div key={step.id} className=\"flex min-w-0 items-center gap-2\">\n <IconCheck className=\"h-3 w-3 shrink-0 text-emerald-500\" />\n <span className=\"truncate\">{step.label}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n isRunning,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n isRunning: boolean;\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const argsStr = isAgentCall ? \"\" : toolArgsPreview(args);\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : toolName;\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n\n return (\n <div className=\"my-1 overflow-hidden\">\n <button\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n )}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"h-3 w-3 text-destructive\" />\n ) : result !== undefined ? (\n <IconCheck className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <IconSquareFilled className=\"h-3 w-3 text-muted-foreground\" />\n )}\n </span>\n <span className=\"truncate min-w-0\">\n <span className=\"font-medium\">{displayName}</span>\n {argsStr && <span className=\"opacity-60 ml-1\">({argsStr})</span>}\n </span>\n {canExpand && (\n <IconChevronDown\n className={cn(\n \"ml-auto h-3 w-3 shrink-0 opacity-40\",\n isExpanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n {isExpanded && isAgentCall && hasStreamText && (\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </ReactMarkdown>\n </div>\n )}\n {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (\n <div className=\"mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground\">\n {inputPayload && <ToolDetailViewer payload={inputPayload} />}\n {resultPayload && <ToolDetailViewer payload={resultPayload} />}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n}: ToolCallMessagePartProps) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning = result === undefined && chatRunning;\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n isRunning={isRunning}\n />\n );\n}\n\n// ─── Reconnect Stream Message ───────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nfunction ReconnectStreamMessage({ content }: { content: ContentPart[] }) {\n const endRef = useRef<HTMLDivElement>(null);\n const chatRunning = React.useContext(ChatRunningContext);\n\n useEffect(() => {\n endRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }, [content]);\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <div\n key={`reconnect-text-${i}`}\n className=\"agent-markdown break-words\"\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {part.text}\n </ReactMarkdown>\n </div>\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n isRunning={part.result === undefined && chatRunning}\n />\n );\n }\n return null;\n })}\n <div ref={endRef} />\n </div>\n </div>\n );\n}\n\n// ─── Message Components ─────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\nexport function displayableUserMessageText(text: string): string {\n return text.replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\").trim();\n}\n\nexport function isAssistantUiStaleIndexError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /^tapClientLookup: Index \\d+ out of bounds \\(length: \\d+\\)$/.test(\n message,\n );\n}\n\ntype AssistantUiStaleIndexErrorBoundaryProps = {\n resetKey: string;\n componentName?: string;\n children: React.ReactNode;\n};\n\ntype AssistantUiStaleIndexErrorBoundaryState = {\n error: Error | null;\n retryToken: number;\n};\n\nexport class AssistantUiStaleIndexErrorBoundary extends React.Component<\n AssistantUiStaleIndexErrorBoundaryProps,\n AssistantUiStaleIndexErrorBoundaryState\n> {\n state: AssistantUiStaleIndexErrorBoundaryState = {\n error: null,\n retryToken: 0,\n };\n\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n static getDerivedStateFromError(\n error: unknown,\n ): Partial<AssistantUiStaleIndexErrorBoundaryState> {\n return {\n error: error instanceof Error ? error : new Error(String(error ?? \"\")),\n };\n }\n\n componentDidCatch(error: unknown, info: React.ErrorInfo) {\n if (!isAssistantUiStaleIndexError(error)) return;\n\n captureError(error, {\n tags: {\n component: this.props.componentName ?? \"AssistantChat\",\n recoverable: \"assistant-ui-stale-message-index\",\n },\n extra: {\n resetKey: this.props.resetKey,\n componentStack: info.componentStack,\n },\n });\n\n if (this.retryTimer) return;\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.setState((state) => {\n if (!state.error || !isAssistantUiStaleIndexError(state.error)) {\n return null;\n }\n return { error: null, retryToken: state.retryToken + 1 };\n });\n }, 0);\n }\n\n componentDidUpdate(prevProps: AssistantUiStaleIndexErrorBoundaryProps) {\n if (\n this.state.error &&\n isAssistantUiStaleIndexError(this.state.error) &&\n prevProps.resetKey !== this.props.resetKey\n ) {\n this.setState((state) => ({\n error: null,\n retryToken: state.retryToken + 1,\n }));\n }\n }\n\n componentWillUnmount() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n\n render() {\n if (this.state.error) {\n if (!isAssistantUiStaleIndexError(this.state.error)) {\n throw this.state.error;\n }\n return null;\n }\n\n return (\n <React.Fragment key={`${this.props.resetKey}:${this.state.retryToken}`}>\n {this.props.children}\n </React.Fragment>\n );\n }\n}\n\nexport function AssistantMessageListErrorBoundary({\n resetKey,\n children,\n}: {\n resetKey: string;\n children: React.ReactNode;\n}) {\n return (\n <AssistantUiStaleIndexErrorBoundary\n resetKey={resetKey}\n componentName=\"AssistantMessageList\"\n >\n {children}\n </AssistantUiStaleIndexErrorBoundary>\n );\n}\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" && \"image\" in p && !!p.image,\n );\n if (imagePart) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imagePart.image}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const hasDisplayableText =\n message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false;\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n {timestamp && (\n <div className=\"mt-1 flex justify-end\">\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nconst MessageActionsContext = React.createContext<{\n onForkChat?: () => void;\n} | null>(null);\n\nfunction MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n navigator.clipboard.writeText(text);\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n navigator.clipboard.writeText(runId);\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const activityTrail = activityTrailFromMetadata(msg);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const isComplete = !isLast || !chatRunning;\n const cpCtx = React.useContext(CheckpointContext);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: any[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find((cp: any) => cp.runId === runId);\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ checkpointId: checkpoint.id }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: {\n Fallback: ToolCallFallback,\n },\n }}\n />\n </div>\n {isComplete && activityTrail.length > 0 && (\n <RunActivityTrail steps={activityTrail} />\n )}\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Thinking Indicator ─────────────────────────────────────────────────────\n\ninterface ActivityStep {\n id: string;\n label: string;\n tool?: string;\n}\n\nfunction ActivitySteps({ steps }: { steps: ActivityStep[] }) {\n if (steps.length === 0) return null;\n const visibleSteps = steps.slice(-4);\n return (\n <div\n className=\"max-w-[85%] rounded-md border border-border/60 bg-muted/30 px-2.5 py-2 text-xs text-muted-foreground\"\n aria-live=\"polite\"\n >\n <div className=\"space-y-1\">\n {visibleSteps.map((step, index) => {\n const isCurrent = index === visibleSteps.length - 1;\n return (\n <div key={step.id} className=\"flex min-w-0 items-center gap-2\">\n {isCurrent ? (\n <IconLoader2 className=\"h-3 w-3 shrink-0 animate-spin\" />\n ) : (\n <IconCheck className=\"h-3 w-3 shrink-0 text-emerald-500\" />\n )}\n <span className=\"truncate\">{step.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ThinkingIndicator({ label = \"Thinking\" }: { label?: string } = {}) {\n const [dots, setDots] = useState(0);\n useEffect(() => {\n const interval = setInterval(() => {\n setDots((d) => (d + 1) % 4);\n }, 400);\n return () => clearInterval(interval);\n }, []);\n return (\n <div className=\"flex items-center text-muted-foreground\">\n <span className=\"text-xs\">\n {label}\n {\".\".repeat(dots)}\n </span>\n </div>\n );\n}\n\n// ─── Builder.io Connect CTA (shared by setup + usage-limit cards) ───────────\n//\n// Renders a single row with left-aligned copy and a right-aligned action.\n// Click opens the Builder CLI-auth popup via the shared\n// `useBuilderConnectFlow` hook (which owns the synchronous window.open,\n// the 2s status poll, and the focus-refresh). On success the hook broadcasts\n// a config-change event and this card clears its local `missingApiKey` gate\n// so the user can start chatting without a full-page reload.\n//\n// Desktop note: when this component runs inside the Electron shell, the\n// window.open call is intercepted by the main process's webview popup handler,\n// which opens the flow in an Electron BrowserWindow that shares the webview's\n// session. See packages/desktop-app/src/main/index.ts.\n\nfunction BuilderConnectCta({\n variant = \"primary\",\n onConnected,\n}: {\n variant?: \"primary\" | \"compact\";\n onConnected?: () => void;\n}) {\n const { configured, orgName, connecting, error, start } =\n useBuilderConnectFlow({\n trackingSource: \"assistant_chat_builder_cta\",\n onConnected,\n });\n\n const containerClass =\n variant === \"compact\"\n ? \"rounded-md border border-border px-3 py-2.5\"\n : \"flex items-center gap-3 rounded-md border border-border px-3 py-3\";\n\n if (configured) {\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">Builder.io</div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5\">\n {orgName ? `Connected — ${orgName}` : \"Connected\"}\n </p>\n </div>\n <span className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-emerald-500/10 px-2 py-0.5 text-[10px] font-medium text-emerald-500\">\n <IconCheck size={10} />\n Connected\n </span>\n </div>\n );\n }\n\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">\n Connect Builder.io\n </div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5 max-w-[220px]\">\n Free credits for LLM, hosting, and more — no API key needed\n </p>\n {error && <p className=\"mt-1 text-[10px] text-destructive\">{error}</p>}\n </div>\n <button\n type=\"button\"\n onClick={start}\n disabled={connecting}\n className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-foreground px-3 py-1.5 text-[11px] font-medium no-underline text-background hover:opacity-90 disabled:opacity-60 disabled:cursor-wait\"\n aria-busy={connecting}\n >\n {connecting ? (\n <>\n <IconLoader2 size={10} className=\"animate-spin\" />\n Waiting…\n </>\n ) : (\n <>\n Connect\n <IconExternalLink size={10} />\n </>\n )}\n </button>\n </div>\n );\n}\n\n// ─── Builder Setup Card ─────────────────────────────────────────────────────\n\nfunction BuilderSetupCard({\n onConnected,\n bouncePulse,\n}: {\n onConnected?: () => void;\n bouncePulse?: number;\n}) {\n const openSettings = useCallback(() => {\n try {\n window.location.hash = \"llm\";\n } catch {}\n window.dispatchEvent(new CustomEvent(\"agent-panel:open-settings\"));\n }, []);\n\n const cardRef = useRef<HTMLDivElement>(null);\n // Replay the bounce keyframe each time bouncePulse increments. Toggling the\n // class off-then-on (with a forced reflow) restarts the animation even when\n // the value changes back-to-back.\n useEffect(() => {\n if (!bouncePulse) return;\n const el = cardRef.current;\n if (!el) return;\n el.classList.remove(\"animate-bounce-once\");\n void el.offsetWidth;\n el.classList.add(\"animate-bounce-once\");\n }, [bouncePulse]);\n\n return (\n <div\n ref={cardRef}\n className=\"mx-4 my-6 rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-4.5 w-4.5 text-muted-foreground\" />\n </div>\n <div>\n <h3 className=\"text-sm font-medium text-foreground\">\n Turn on the AI assistant\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n One click to connect Builder for free hosted access — no API keys\n needed.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <BuilderConnectCta onConnected={onConnected} />\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={openSettings}\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n Or add your own API key\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Loop Limit Continue Card ───────────────────────────────────────────────\n\ntype LoopLimitInfo = { maxIterations?: number };\ntype RunErrorInfo = {\n message: string;\n details?: string;\n errorCode?: string;\n runId?: string;\n recoverable?: boolean;\n};\n\ninterface AgentLoopSettingsResponse {\n maxIterations: number;\n defaultMaxIterations: number;\n minMaxIterations: number;\n maxMaxIterations: number;\n scope: \"org\" | \"user\" | \"default\";\n source: \"org\" | \"user\" | \"env\" | \"default\";\n canUpdate: boolean;\n orgName?: string | null;\n role?: string | null;\n}\n\nfunction getLoopLimitMetadata(message: unknown): LoopLimitInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { loopLimit?: LoopLimitInfo };\n loopLimit?: LoopLimitInfo;\n }\n | undefined;\n const loopLimit = meta?.custom?.loopLimit ?? meta?.loopLimit;\n if (!loopLimit || typeof loopLimit !== \"object\") return null;\n return {\n ...(typeof loopLimit.maxIterations === \"number\"\n ? { maxIterations: loopLimit.maxIterations }\n : {}),\n };\n}\n\nfunction getRunErrorMetadata(message: unknown): RunErrorInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { runError?: RunErrorInfo; runId?: unknown };\n runError?: RunErrorInfo;\n runId?: unknown;\n }\n | undefined;\n const runError = meta?.custom?.runError ?? meta?.runError;\n if (!runError || typeof runError !== \"object\") return null;\n const messageText =\n typeof runError.message === \"string\" ? runError.message : \"\";\n if (!messageText) return null;\n const runId =\n typeof runError.runId === \"string\"\n ? runError.runId\n : typeof meta?.custom?.runId === \"string\"\n ? meta.custom.runId\n : typeof meta?.runId === \"string\"\n ? meta.runId\n : undefined;\n return {\n message: messageText,\n ...(typeof runError.details === \"string\"\n ? { details: runError.details }\n : {}),\n ...(typeof runError.errorCode === \"string\"\n ? { errorCode: runError.errorCode }\n : {}),\n ...(runId ? { runId } : {}),\n ...(runError.recoverable ? { recoverable: true } : {}),\n };\n}\n\nfunction getRequestModeMetadata(message: unknown): AgentRequestMode | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { requestMode?: unknown };\n requestMode?: unknown;\n }\n | undefined;\n const requestMode = meta?.custom?.requestMode ?? meta?.requestMode;\n return requestMode === \"act\" || requestMode === \"plan\" ? requestMode : null;\n}\n\nfunction isBuilderReconnectRunError(info: RunErrorInfo): boolean {\n const code = (info.errorCode ?? \"\").toLowerCase();\n const message = info.message.toLowerCase();\n const isAuthCode =\n code === \"authentication_error\" ||\n code === \"unauthorized\" ||\n code === \"http_401\" ||\n code === \"http_403\";\n return (\n code === \"builder_auth_error\" ||\n message.includes(\"builder authentication failed\") ||\n (isAuthCode && message.includes(\"invalid token\"))\n );\n}\n\nfunction isProviderQueryRunError(info: RunErrorInfo): boolean {\n const text = [info.errorCode, info.message, info.details]\n .filter(Boolean)\n .join(\"\\n\")\n .toLowerCase();\n return (\n text.includes(\"bigquery\") ||\n text.includes(\"sql\") ||\n text.includes(\"query\") ||\n text.includes(\"schema\") ||\n text.includes(\"syntax\") ||\n text.includes(\"unknown column\") ||\n text.includes(\"unknown table\") ||\n text.includes(\"type mismatch\")\n );\n}\n\nfunction getMessageText(message: unknown): string {\n const msg = (message as { message?: unknown })?.message ?? message;\n const content = (msg as { content?: unknown })?.content;\n if (Array.isArray(content)) {\n return content\n .filter((p: any) => p?.type === \"text\" && typeof p.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\\n\")\n .trim();\n }\n return typeof content === \"string\" ? content.trim() : \"\";\n}\n\nfunction RunErrorRecoveryCard({\n info,\n onContinue,\n onRetry,\n onFork,\n onDismiss,\n}: {\n info: RunErrorInfo;\n onContinue: () => void;\n onRetry: () => void;\n onFork?: () => void;\n onDismiss: () => void;\n}) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const canRecover = info.recoverable === true;\n const shouldShowBuilderReconnect = isBuilderReconnectRunError(info);\n const isQueryError = isProviderQueryRunError(info);\n const copyLabel =\n info.runId || info.errorCode || info.details ? \"Copy debug\" : \"Copy\";\n const copyDetails = useCallback(() => {\n const text = [\n info.message,\n info.errorCode ? `Code: ${info.errorCode}` : \"\",\n info.runId ? `Run: ${info.runId}` : \"\",\n info.details ? `Details:\\n${info.details}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n }, [info]);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] p-3 text-sm\">\n <div className=\"flex items-start gap-2\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-700 dark:text-amber-300\">\n <IconAlertTriangle size={14} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-foreground\">\n {canRecover\n ? \"The agent stopped before finishing\"\n : \"The agent hit an error\"}\n </div>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {info.message}\n </p>\n {shouldShowBuilderReconnect && (\n <p className=\"mt-2 text-xs leading-relaxed text-muted-foreground\">\n The current Builder.io or model-provider credential was rejected.\n Reconnect Builder.io, then retry this message.\n </p>\n )}\n {(info.runId || info.errorCode || info.details) && (\n <button\n type=\"button\"\n onClick={() => setDetailsOpen((v) => !v)}\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n size={12}\n className={cn(\n \"transition-transform\",\n detailsOpen && \"rotate-180\",\n )}\n />\n Details\n </button>\n )}\n {detailsOpen && (\n <div className=\"mt-2 rounded-md border border-border/60 bg-background/70 p-2 font-mono text-[11px] leading-relaxed text-muted-foreground\">\n {info.runId && <div>run: {info.runId}</div>}\n {info.errorCode && <div>code: {info.errorCode}</div>}\n {info.details && (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n {info.details}\n </pre>\n )}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n <IconX size={14} />\n </button>\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {shouldShowBuilderReconnect && (\n <a\n href={agentNativePath(\"/_agent-native/builder/connect\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={() => {\n trackEvent(\"builder connect clicked\", {\n feature: \"builder\",\n stage: \"client\",\n source: \"assistant_chat_reconnect_error\",\n connect_url_kind: \"default\",\n });\n }}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconExternalLink size={13} />\n Reconnect Builder.io\n </a>\n )}\n {canRecover && (\n <>\n <button\n type=\"button\"\n onClick={onContinue}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Continue\n </button>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconRefresh size={13} />\n {isQueryError ? \"Diagnose and retry\" : \"Retry\"}\n </button>\n </>\n )}\n {canRecover && onFork && (\n <button\n type=\"button\"\n onClick={onFork}\n title=\"Fork this conversation into a separate chat thread.\"\n aria-label=\"Fork this conversation into a separate chat thread\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconGitFork size={13} />\n Fork chat\n </button>\n )}\n <button\n type=\"button\"\n onClick={copyDetails}\n className=\"ml-auto inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-medium text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}\n {copied ? \"Copied\" : copyLabel}\n </button>\n </div>\n </div>\n );\n}\n\nfunction LoopLimitContinueCard({\n info,\n onContinue,\n}: {\n info: LoopLimitInfo;\n onContinue: () => void;\n}) {\n const [settings, setSettings] = useState<AgentLoopSettingsResponse | null>(\n null,\n );\n const [value, setValue] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/agent-loop-settings\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data: AgentLoopSettingsResponse | null) => {\n if (cancelled || !data) return;\n setSettings(data);\n setValue(String(data.maxIterations));\n })\n .catch(() => {\n if (!cancelled) setValue(String(info.maxIterations ?? \"\"));\n });\n return () => {\n cancelled = true;\n };\n }, [info.maxIterations]);\n\n useEffect(() => load(), [load]);\n\n const currentLimit = settings?.maxIterations ?? info.maxIterations;\n const numericValue = Number(value);\n const hasPendingChange =\n !!settings &&\n settings.canUpdate &&\n Number.isInteger(numericValue) &&\n numericValue !== settings.maxIterations;\n const scopeLabel =\n settings?.scope === \"org\"\n ? settings.orgName\n ? `${settings.orgName} org`\n : \"org\"\n : \"your account\";\n\n const saveLimit = useCallback(async (): Promise<boolean> => {\n if (!settings?.canUpdate) return false;\n setSaving(true);\n setSaved(false);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/agent-loop-settings\"),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ maxIterations: numericValue }),\n },\n );\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(body?.error ?? `Save failed (${res.status})`);\n }\n setSettings(body as AgentLoopSettingsResponse);\n setValue(String((body as AgentLoopSettingsResponse).maxIterations));\n setSaved(true);\n window.dispatchEvent(\n new CustomEvent(\"agent-loop-settings:changed\", { detail: body }),\n );\n setTimeout(() => setSaved(false), 2000);\n return true;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Save failed\");\n return false;\n } finally {\n setSaving(false);\n }\n }, [numericValue, settings?.canUpdate]);\n\n const handleContinue = useCallback(async () => {\n if (hasPendingChange) {\n const ok = await saveLimit();\n if (!ok) return;\n }\n onContinue();\n }, [hasPendingChange, onContinue, saveLimit]);\n\n const openSettings = useCallback(() => {\n try {\n window.location.hash = \"agent-limits\";\n } catch {}\n window.dispatchEvent(new CustomEvent(\"agent-panel:open-settings\"));\n }, []);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] px-3 py-3 shadow-sm\">\n <div className=\"flex items-start gap-2.5\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-600 dark:text-amber-400\">\n <IconGauge size={14} />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">\n Step limit reached\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n The agent used{\" \"}\n {currentLimit\n ? `${currentLimit.toLocaleString()} steps`\n : \"all available steps\"}\n . Keep going in a fresh turn, or raise the {scopeLabel} limit first.\n </p>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-end gap-2\">\n <label className=\"min-w-[116px] flex-1 space-y-1\">\n <span className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Max steps\n </span>\n <input\n type=\"number\"\n min={settings?.minMaxIterations ?? 1}\n max={settings?.maxMaxIterations ?? 1000}\n value={value}\n disabled={!settings?.canUpdate || saving}\n onChange={(e) => {\n setValue(e.target.value);\n setError(null);\n }}\n className=\"h-8 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none focus:ring-1 focus:ring-ring disabled:opacity-60\"\n />\n </label>\n <button\n type=\"button\"\n onClick={saveLimit}\n disabled={!hasPendingChange || saving}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-foreground hover:bg-accent disabled:opacity-50\"\n >\n {saving ? (\n <IconLoader2 size={12} className=\"animate-spin\" />\n ) : saved ? (\n <IconCheck size={12} />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={openSettings}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <IconSettings size={12} />\n Settings\n </button>\n <button\n type=\"button\"\n onClick={handleContinue}\n disabled={saving}\n className=\"ml-auto inline-flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:opacity-60\"\n >\n {hasPendingChange ? \"Save and keep going\" : \"Keep going\"}\n <IconArrowRight size={12} />\n </button>\n </div>\n\n {settings && !settings.canUpdate && (\n <p className=\"mt-2 text-[11px] text-muted-foreground\">\n Only organization owners and admins can change this limit.\n </p>\n )}\n {error && <p className=\"mt-2 text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n\nfunction PlanModeCallout({\n canImplementPlan,\n onImplementPlan,\n onSwitchToAct,\n}: {\n canImplementPlan: boolean;\n onImplementPlan: () => void;\n onSwitchToAct: () => void;\n}) {\n return (\n <div className=\"shrink-0 px-3 pt-2\">\n <div className=\"rounded-lg border border-blue-500/25 bg-blue-500/[0.06] px-3 py-2.5 shadow-sm\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-300\">\n <IconClipboardList size={15} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {canImplementPlan ? \"Plan ready\" : \"Plan mode is on\"}\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n {canImplementPlan\n ? \"Switch to Act and run the proposed plan.\"\n : \"The next turn will stay read-only until you switch to Act.\"}\n </p>\n </div>\n {canImplementPlan ? (\n <button\n type=\"button\"\n onClick={onImplementPlan}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Implement Plan\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onSwitchToAct}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Act\n <IconArrowRight size={13} />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface AssistantChatHandle {\n /** Programmatically send a message into this chat */\n sendMessage(text: string): void;\n /** Queue a message to send after the current run finishes */\n queueMessage(text: string): void;\n /** Whether the chat is currently running */\n isRunning(): boolean;\n /** Focus the composer input */\n focusComposer(): void;\n /** Export the currently visible client-side thread for operations like fork. */\n exportThreadSnapshot(): ChatThreadSnapshot | null;\n}\n\nexport interface AssistantChatProps {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n /** Stable tab identifier passed to the adapter for event correlation */\n tabId?: string;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /** Thread ID for SQL-backed persistence. When set, messages are loaded from and saved to the server. */\n threadId?: string;\n /** Resource scope to include with chat requests for server-side context. */\n contextScope?: ChatThreadScope | null;\n /** Placeholder text for empty state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Optional content rendered in the empty state, above the suggestion buttons.\n * Used by MultiTabAssistantChat to surface \"previous chats for this design\"\n * when the current thread is empty but the scope has other threads. */\n emptyStateAddon?: React.ReactNode;\n /** Whether to show the header bar. Default: true */\n showHeader?: boolean;\n /** CSS class for the outer container */\n className?: string;\n /** Callback when user clicks \"Use CLI\" button */\n onSwitchToCli?: () => void;\n /** Callback when message count changes */\n onMessageCountChange?: (count: number) => void;\n /** Callback to save thread data to the server (provided by useChatThreads) */\n onSaveThread?: (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => void;\n /** Callback to generate a title from the first user message */\n onGenerateTitle?: (threadId: string, message: string) => void;\n /** Optional content rendered just above the composer input */\n composerSlot?: React.ReactNode;\n /** Disable the composer for capability-gated surfaces while still showing history. */\n composerDisabled?: boolean;\n /** Placeholder to show while the composer is disabled by the host surface. */\n composerDisabledPlaceholder?: string;\n /** When true, skip the restore skeleton (used for freshly created threads with no messages) */\n isNewThread?: boolean;\n /** Called when a slash command (e.g. /clear, /help) is executed */\n onSlashCommand?: (command: string) => void;\n /** Current execution mode (build/plan) */\n execMode?: \"build\" | \"plan\";\n /** Callback to change execution mode */\n onExecModeChange?: (mode: \"build\" | \"plan\") => void;\n /** Disable Plan mode while leaving Act mode available. */\n planModeDisabled?: boolean;\n /** Explanation shown next to the disabled Plan option. */\n planModeDisabledReason?: string;\n /** Selected model override for this conversation (undefined = use server default) */\n selectedModel?: string;\n /** Default model from server config (shown in picker when no override is set) */\n defaultModel?: string;\n /** Selected engine override for this conversation */\n selectedEngine?: string;\n /** Selected reasoning effort override for this conversation */\n selectedEffort?: ReasoningEffort;\n /** Available engine/model list for the model picker */\n availableModels?: Array<{\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n }>;\n /** Callback when user picks a model from the picker */\n onModelChange?: (model: string, engine: string) => void;\n /** Callback when user picks a reasoning effort from the picker */\n onEffortChange?: (effort: ReasoningEffort) => void;\n /** Callback when user clicks \"Fork Chat\" in the message actions menu */\n onForkChat?: () => void;\n}\n\nexport const CHAT_STORAGE_PREFIX = \"agent-chat:\";\n\n/** Remove persisted chat for a given tabId (or \"default\"). */\nexport function clearChatStorage(tabId?: string) {\n try {\n sessionStorage.removeItem(`${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`);\n } catch {}\n}\n\n/**\n * Ensure all messages in a thread repository have required fields.\n * assistant-ui accesses `message.metadata.submittedFeedback` and\n * `lastMessage.status.type` without null-checking, so server-constructed\n * messages missing these fields crash.\n */\nfunction ensureMessageMetadata(repo: any): any {\n if (!repo?.messages || !Array.isArray(repo.messages)) return repo;\n for (const entry of repo.messages) {\n // Handle both wrapped ({ message: { ... } }) and flat ({ role, ... }) formats\n const msg = entry?.message ?? entry;\n if (!msg) continue;\n if (!msg.metadata) {\n msg.metadata = {};\n }\n if (msg.role === \"assistant\") {\n const statusType =\n msg.status && typeof msg.status === \"object\"\n ? (msg.status as { type?: unknown }).type\n : undefined;\n const isTerminal =\n statusType === \"complete\" || statusType === \"incomplete\";\n if (!isTerminal) {\n const runError =\n msg.metadata?.custom?.runError ?? msg.metadata?.runError;\n msg.status = runError\n ? { type: \"incomplete\", reason: \"error\" }\n : { type: \"complete\", reason: \"stop\" };\n }\n }\n }\n return repo;\n}\n\n// Re-export for backwards compatibility\nimport {\n extractThreadMeta,\n normalizeThreadRepository,\n} from \"../agent/thread-data-builder.js\";\nexport { extractThreadMeta };\n\nconst AssistantChatInner = forwardRef<\n AssistantChatHandle,\n AssistantChatProps & { apiUrl: string }\n>(function AssistantChatInner(\n {\n emptyStateText,\n suggestions,\n emptyStateAddon,\n showHeader = true,\n onSwitchToCli,\n className,\n apiUrl,\n tabId,\n threadId,\n onMessageCountChange,\n onSaveThread,\n onGenerateTitle,\n composerSlot,\n composerDisabled = false,\n composerDisabledPlaceholder,\n isNewThread,\n onSlashCommand,\n execMode,\n onExecModeChange,\n planModeDisabled,\n planModeDisabledReason,\n selectedModel,\n defaultModel,\n selectedEngine,\n selectedEffort,\n availableModels,\n onModelChange,\n onEffortChange,\n onForkChat,\n },\n ref,\n) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const thread = useThread();\n const threadRuntime = useThreadRuntime();\n const composerRuntime = useComposerRuntime();\n const isRuntimeRunning = thread.isRunning;\n const messages = thread.messages;\n const messageListResetKey = useMemo(\n () => messages.map((message) => message.id).join(\"|\"),\n [messages],\n );\n\n // Chat-wide drag-and-drop: users expect to drop a file anywhere on the agent\n // sidebar (thread, header, composer) and have it attach — same as ChatGPT,\n // Claude.ai, Linear, Slack, etc. Tiptap's own `handleDrop` only fires inside\n // the contenteditable; drops on the message thread or the composer\n // attachment strip otherwise navigate to the file (browser default), which\n // is why \"upload does nothing\" — the chat refreshes to the dropped image.\n const [dropActive, setDropActive] = useState(false);\n const dropDepthRef = useRef(0);\n const handleChatDragEnter = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n dropDepthRef.current += 1;\n setDropActive(true);\n }, []);\n const handleChatDragOver = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n }, []);\n const handleChatDragLeave = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = Math.max(0, dropDepthRef.current - 1);\n if (dropDepthRef.current === 0) setDropActive(false);\n }, []);\n const handleChatDrop = useCallback(\n (e: React.DragEvent) => {\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n dropDepthRef.current = 0;\n setDropActive(false);\n // Mirror TiptapComposer's paste/drop name-uniqueness so consecutive\n // screenshots (all named `image.png`) don't collide on the\n // SimpleImageAttachmentAdapter id.\n const attachments = files.map((file) => {\n if (!file.type.startsWith(\"image/\")) return file;\n const uniqueName = `${Date.now()}-${Math.random().toString(36).slice(2)}-${file.name}`;\n return new File([file], uniqueName, { type: file.type });\n });\n void Promise.all(\n attachments.map((file) => composerRuntime.addAttachment(file)),\n ).catch((error) => {\n console.error(\"Error adding dropped chat attachment:\", error);\n });\n },\n [composerRuntime],\n );\n\n // Patch the underlying assistant-ui MessageRepository so addOrUpdateMessage\n // can't throw \"Parent message not found\" mid-run. assistant-ui calls\n // `repository.clear()` from `runtime.import()` and from `resetHead(null)`,\n // and on a few async paths (history-adapter load, branch reset, repeat\n // imports) the repo can be cleared between the `append` that added the\n // user message and the `performRoundtrip` call that tries to record the\n // assistant placeholder against that user message's id. The internal-bug\n // throw turns into an unhandled rejection that Sentry captures from the\n // images.agent-native.com prompt composer (AGENT-NATIVE-BROWSER-18). Fix\n // it by relinking to the current head whenever the requested parent has\n // gone missing instead of throwing.\n useEffect(() => {\n const repo = (threadRuntime as any)?.__internal_threadBinding?.getState?.()\n ?.repository as\n | { addOrUpdateMessage?: (parentId: any, message: any) => void }\n | undefined;\n if (!repo || typeof repo.addOrUpdateMessage !== \"function\") return;\n const patched = repo as any;\n if (patched.__agentNativePatched) return;\n patched.__agentNativePatched = true;\n const original = repo.addOrUpdateMessage.bind(repo);\n repo.addOrUpdateMessage = function (parentId: any, message: any) {\n try {\n return original(parentId, message);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (parentId && msg.includes(\"Parent message not found\")) {\n const fallbackParent = (this as any).head?.current?.id ?? null;\n if (fallbackParent && fallbackParent !== parentId) {\n return original(fallbackParent, message);\n }\n return original(null, message);\n }\n throw err;\n }\n };\n }, [threadRuntime]);\n const [missingApiKey, setMissingApiKey] = useState(false);\n const isComposerDisabled = missingApiKey || composerDisabled;\n // Increments each time the user clicks the (disabled) composer while no LLM\n // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.\n const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);\n const [authError, setAuthError] = useState<{\n sessionExpired?: boolean;\n } | null>(null);\n const [authSessionAvailable, setAuthSessionAvailable] = useState(false);\n const [queuedMessages, setQueuedMessages] = useState<\n Array<{\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n }>\n >([]);\n // Tracks the JSON of the last queue we successfully persisted so the\n // debounced save effect can skip no-op writes (e.g. restore-from-server\n // on mount, or queue state that hasn't actually changed).\n const lastPersistedQueueRef = useRef<string>(\"[]\");\n const [showContinue, setShowContinue] = useState(false);\n const [loopLimitInfo, setLoopLimitInfo] = useState<LoopLimitInfo | null>(\n null,\n );\n const [runErrorInfo, setRunErrorInfo] = useState<RunErrorInfo | null>(null);\n const [dismissedRunErrorKey, setDismissedRunErrorKey] = useState<\n string | null\n >(null);\n const userStoppedRunRef = useRef<{\n at: number;\n runId?: string;\n } | null>(null);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [reconnectContent, setReconnectContent] = useState<ContentPart[]>([]);\n const [activityLabel, setActivityLabel] = useState<string | null>(null);\n const activityStepIdCounter = useRef(0);\n // When stop is clicked during reconnect, keep content visible (don't wipe it)\n const [reconnectFrozen, setReconnectFrozen] = useState(false);\n const reconnectRunIdRef = useRef<string | null>(null);\n const reconnectAbortRef = useRef<AbortController | null>(null);\n // Nuclear stop: user clicked stop. Clears the stop button/indicator AND\n // lets new submissions go through immediately — prevents the \"stuck\n // queueing forever\" state where isReconnecting or isRuntimeRunning gets\n // wedged (e.g. after a tab refresh + stop during reconnect).\n const [forceStopped, setForceStopped] = useState(false);\n // Real running state — drives submission/queue gating. Treat reconnecting\n // to an active run the same as running, UNLESS the user has explicitly\n // clicked stop (forceStopped).\n const isRunning = !forceStopped && (isRuntimeRunning || isReconnecting);\n // UI-only running state — drives the stop button and thinking indicator.\n const showRunningInUI = isRunning;\n const wasRunningRef = useRef(false);\n const lastBroadcastRunningRef = useRef(isRunning);\n const tiptapRef = useRef<TiptapComposerHandle>(null);\n const [activitySteps, setActivitySteps] = useState<ActivityStep[]>([]);\n\n useEffect(() => {\n if (lastBroadcastRunningRef.current === isRunning) return;\n lastBroadcastRunningRef.current = isRunning;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning, tabId: tabId || threadId },\n }),\n );\n }, [isRunning, tabId, threadId]);\n\n // ─── Chat persistence ──────────────────────────────────────────────\n const hasRestoredRef = useRef(false);\n const [isRestoring, setIsRestoring] = useState(!!threadId && !isNewThread);\n const onSaveThreadRef = useRef(onSaveThread);\n onSaveThreadRef.current = onSaveThread;\n const onGenerateTitleRef = useRef(onGenerateTitle);\n onGenerateTitleRef.current = onGenerateTitle;\n const titleGeneratedRef = useRef(false);\n\n const importThreadData = useCallback(\n (threadData: unknown, options?: { markTitleGenerated?: boolean }): any => {\n const repo = normalizeThreadRepository(\n typeof threadData === \"string\" ? JSON.parse(threadData) : threadData,\n );\n if (repo?.messages?.length > 0) {\n let shouldImport = true;\n try {\n shouldImport = shouldImportServerThreadData(\n normalizeThreadRepository(threadRuntime.export()),\n repo,\n );\n } catch {\n shouldImport = true;\n }\n if (shouldImport) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n if (Array.isArray(repo?.queuedMessages)) {\n setQueuedMessages(repo.queuedMessages);\n lastPersistedQueueRef.current = JSON.stringify(repo.queuedMessages);\n }\n return repo;\n },\n [threadRuntime],\n );\n\n const refreshThreadFromServer = useCallback(async (): Promise<any | null> => {\n if (!threadId) return null;\n try {\n const refreshRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!refreshRes.ok) return null;\n const refreshData = await refreshRes.json();\n if (!refreshData.threadData) return null;\n return importThreadData(refreshData.threadData);\n } catch {\n return null;\n }\n }, [apiUrl, importThreadData, threadId]);\n\n const wasRecentlyStoppedRun = useCallback((runId?: string): boolean => {\n const stopped = userStoppedRunRef.current;\n return Boolean(\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !runId || stopped.runId === runId),\n );\n }, []);\n\n const startReconnectToRun = useCallback(\n (runInfo: ActiveRunLookup): boolean => {\n if (!threadId || !runInfo.runId || runInfo.status !== \"running\") {\n return false;\n }\n const runId = String(runInfo.runId);\n if (wasRecentlyStoppedRun(runId)) return false;\n if (reconnectRunIdRef.current === runId) return true;\n\n reconnectRunIdRef.current = runId;\n setIsReconnecting(true);\n setReconnectFrozen(false);\n setReconnectContent([]);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: true, tabId: tabId || threadId },\n }),\n );\n\n const abortCtrl = new AbortController();\n reconnectAbortRef.current = abortCtrl;\n\n const watchdog = setInterval(async () => {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) {\n abortCtrl.abort();\n clearInterval(watchdog);\n return;\n }\n const info = (await res.json()) as ActiveRunLookup;\n if (info.status !== \"running\" || activeRunLooksStale(info)) {\n abortCtrl.abort();\n clearInterval(watchdog);\n }\n } catch {\n // Network blip — keep polling.\n }\n }, 1000);\n\n let reconnectTimedOut = false;\n const maxReconnectTimer = setTimeout(() => {\n reconnectTimedOut = true;\n abortCtrl.abort();\n clearInterval(watchdog);\n }, 20_000);\n\n const streamReconnect = async () => {\n let noProgressDuringReconnect = false;\n let latestContent: ContentPart[] = [];\n try {\n const sseRes = await fetch(\n `${apiUrl}/runs/${encodeURIComponent(runId)}/events?after=0`,\n { signal: abortCtrl.signal },\n );\n if (sseRes.ok && sseRes.body) {\n const content: ContentPart[] = [];\n latestContent = content;\n const toolCallCounter = { value: 0 };\n\n let rafPending = false;\n let latestSnapshot: ContentPart[] = [];\n const scheduleUpdate = (snapshot: ContentPart[]) => {\n latestSnapshot = snapshot;\n if (rafPending) return;\n rafPending = true;\n requestAnimationFrame(() => {\n rafPending = false;\n setReconnectContent(latestSnapshot);\n });\n };\n\n await readSSEStreamRaw(\n sseRes.body,\n content,\n toolCallCounter,\n tabId,\n scheduleUpdate,\n );\n setReconnectContent([...content]);\n }\n } catch (err) {\n if (\n err instanceof AgentAutoContinueSignal &&\n err.reason === \"no_progress\"\n ) {\n noProgressDuringReconnect = true;\n } else if (\n reconnectTimedOut &&\n err instanceof Error &&\n err.name === \"AbortError\"\n ) {\n noProgressDuringReconnect = true;\n }\n } finally {\n clearInterval(watchdog);\n clearTimeout(maxReconnectTimer);\n }\n\n if (noProgressDuringReconnect && reconnectRunIdRef.current === runId) {\n captureError(new Error(\"agent-chat:reconnect_no_progress\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"reconnect_no_progress\",\n reconnectTimedOut: String(reconnectTimedOut),\n },\n extra: {\n runId,\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n contentLength: latestContent.length,\n },\n });\n try {\n await fetch(`${apiUrl}/runs/${encodeURIComponent(runId)}/abort`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason: \"no_progress\" }),\n });\n } catch {\n // Best effort — the important part is unwinding the UI.\n }\n setReconnectContent([...latestContent]);\n setReconnectFrozen(latestContent.length > 0);\n setRunErrorInfo({\n message:\n \"The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.\",\n errorCode: \"reconnect_no_progress\",\n recoverable: true,\n runId,\n });\n setDismissedRunErrorKey(null);\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n return;\n }\n\n setReconnectFrozen(true);\n let loaded = false;\n for (let attempt = 0; attempt < 10; attempt++) {\n await new Promise((r) => setTimeout(r, 500));\n if (reconnectRunIdRef.current !== runId) break;\n const repo = await refreshThreadFromServer();\n if (repoHasAssistantMessage(repo)) {\n setReconnectContent([]);\n setReconnectFrozen(false);\n loaded = true;\n break;\n }\n }\n\n if (reconnectRunIdRef.current === runId) {\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n }\n if (!loaded) {\n await refreshThreadFromServer();\n }\n };\n\n void streamReconnect();\n return true;\n },\n [apiUrl, refreshThreadFromServer, tabId, threadId, wasRecentlyStoppedRun],\n );\n\n const reconnectActiveRunForThread =\n useCallback(async (): Promise<boolean> => {\n if (!threadId) return false;\n try {\n const runRes = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!runRes.ok) return false;\n const runInfo = (await runRes.json()) as ActiveRunLookup;\n if (\n !runInfo.active ||\n runInfo.status !== \"running\" ||\n activeRunLooksStale(runInfo)\n ) {\n await refreshThreadFromServer();\n return false;\n }\n return startReconnectToRun(runInfo);\n } catch {\n return false;\n }\n }, [apiUrl, refreshThreadFromServer, startReconnectToRun, threadId]);\n\n // Restore messages from server on mount (when threadId is set). The\n // server is the single source of truth — we don't hydrate from localStorage\n // first, so what the user sees in the chat panel always matches what the\n // history list (and the agent) sees on disk.\n useEffect(() => {\n if (hasRestoredRef.current) return;\n hasRestoredRef.current = true;\n\n if (threadId) {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) return;\n const data = await res.json();\n if (data.threadData) {\n importThreadData(data.threadData, { markTitleGenerated: true });\n }\n // Also skip title generation if thread already has a title\n if (data.title) {\n titleGeneratedRef.current = true;\n }\n\n // Check if there's an active run for this thread (e.g. after hot\n // reload), and reconnect to it if it is still running.\n await reconnectActiveRunForThread();\n } catch {\n // Start fresh\n } finally {\n setIsRestoring(false);\n }\n })();\n } else {\n // Legacy: restore from sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n const saved = sessionStorage.getItem(storageKey);\n if (saved) {\n const repo = JSON.parse(saved);\n if (repo?.messages?.length > 0) {\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n } catch {}\n setIsRestoring(false);\n }\n }, [\n threadId,\n tabId,\n apiUrl,\n threadRuntime,\n importThreadData,\n reconnectActiveRunForThread,\n ]);\n\n // If assistant-ui stops the local runtime while the background server run is\n // still alive, immediately switch into the same reconnect path used after a\n // reload. Otherwise the composer unlocks, the next send hits a 409, and the\n // user sees \"still working\" even though the UI stopped updating.\n const prevRuntimeRunningForReconnectRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRuntimeRunning = prevRuntimeRunningForReconnectRef.current;\n prevRuntimeRunningForReconnectRef.current = isRuntimeRunning;\n if (\n !wasRuntimeRunning ||\n isRuntimeRunning ||\n !threadId ||\n forceStopped ||\n isReconnecting ||\n wasRecentlyStoppedRun()\n ) {\n return;\n }\n\n let cancelled = false;\n const timer = window.setTimeout(() => {\n if (!cancelled) {\n void reconnectActiveRunForThread();\n }\n }, 250);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n forceStopped,\n isReconnecting,\n isRuntimeRunning,\n reconnectActiveRunForThread,\n threadId,\n wasRecentlyStoppedRun,\n ]);\n\n // Generate a title when the first user message is sent\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (titleGeneratedRef.current) return;\n if (messages.length === 0) return;\n\n const firstUserMsg = messages.find((m) => m.role === \"user\");\n if (!firstUserMsg) return;\n\n // Extract text from the first user message\n const text =\n \"content\" in firstUserMsg\n ? Array.isArray(firstUserMsg.content)\n ? firstUserMsg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof firstUserMsg.content === \"string\"\n ? firstUserMsg.content\n : \"\"\n : \"\";\n\n if (!text.trim()) return;\n titleGeneratedRef.current = true;\n if (threadId) {\n onGenerateTitleRef.current?.(threadId, text.trim());\n }\n }, [messages, threadId]);\n\n // Periodically save thread data while the agent is running so refreshes\n // don't lose messages. Saves every 5 seconds while running.\n const savedTitleRef = useRef(\"\");\n const lastSaveTimeRef = useRef(0);\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (!isRunning) return;\n if (messages.length === 0) return;\n if (!threadId || !onSaveThreadRef.current) return;\n\n const now = Date.now();\n const timeSinceLastSave = now - lastSaveTimeRef.current;\n if (timeSinceLastSave < 5000) return;\n\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n\n lastSaveTimeRef.current = now;\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n }, [messages, isRunning, threadId, threadRuntime]);\n\n // Persist full thread data after each completed response\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (isRunning) return;\n if (messages.length === 0) return;\n\n const repo = threadRuntime.export();\n\n if (threadId && onSaveThreadRef.current) {\n // Save to server via the hook callback\n const { title, preview } = extractThreadMeta(repo);\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n } else {\n // Legacy: save to sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(repo));\n } catch {}\n }\n }, [messages, isRunning, threadId, tabId, threadRuntime]);\n\n useEffect(() => {\n onMessageCountChange?.(messages.length);\n }, [messages.length, onMessageCountChange]);\n\n // Persist queued messages to the server so they survive reloads. Debounced\n // to 300ms so typing-and-queuing-rapidly doesn't hammer the endpoint.\n // Stores them in thread_data.queuedMessages via POST /threads/:id/queued.\n useEffect(() => {\n if (!threadId) return;\n if (!hasRestoredRef.current) return;\n const serialized = JSON.stringify(queuedMessages);\n if (serialized === lastPersistedQueueRef.current) return;\n const timer = setTimeout(() => {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/queued`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ queuedMessages }),\n },\n );\n if (res.ok) {\n lastPersistedQueueRef.current = serialized;\n }\n } catch {\n // Best-effort — next queue change will retry.\n }\n })();\n }, 300);\n return () => clearTimeout(timer);\n }, [queuedMessages, threadId, apiUrl]);\n\n // Listen for missing API key events from the adapter\n useEffect(() => {\n const handler = () => setMissingApiKey(true);\n window.addEventListener(\"agent-chat:missing-api-key\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:missing-api-key\", handler);\n }, []);\n\n const handleBuilderConnected = useCallback(() => {\n setMissingApiKey(false);\n }, []);\n\n // Check on mount and whenever SettingsPanel dispatches\n // `agent-engine:configured-changed` so the gate flips live without reload.\n useEffect(() => {\n let cancelled = false;\n const check = async () => {\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/agent-engine/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ]);\n if (cancelled) return;\n // All three status endpoints failed — avoid flashing the gate on a\n // transient network error.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return;\n }\n const keys = (envKeys ?? []) as Array<{\n key: string;\n configured: boolean;\n }>;\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n builderStatus?.configured === true ||\n engineStatus?.configured === true;\n setMissingApiKey(!anyConfigured);\n };\n check();\n window.addEventListener(\"agent-engine:configured-changed\", check);\n return () => {\n cancelled = true;\n window.removeEventListener(\"agent-engine:configured-changed\", check);\n };\n }, []);\n\n // Listen for auth error events from the adapter\n const checkAuthSession = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/auth/session\"), {\n cache: \"no-store\",\n });\n if (!res.ok) return false;\n const data = await res.json().catch(() => null);\n const hasSession = !!data && !data.error;\n setAuthSessionAvailable(hasSession);\n if (hasSession) {\n setAuthError(null);\n }\n return hasSession;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as\n | {\n reason?: string;\n tabId?: string;\n threadId?: string;\n }\n | undefined;\n const eventTabId =\n typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (\n (eventTabId || eventThreadId) &&\n eventTabId !== tabId &&\n eventThreadId !== threadId\n ) {\n return;\n }\n setAuthSessionAvailable(false);\n setAuthError({ sessionExpired: detail?.reason === \"session-expired\" });\n void checkAuthSession();\n };\n window.addEventListener(\"agent-chat:auth-error\", handler);\n return () => window.removeEventListener(\"agent-chat:auth-error\", handler);\n }, [checkAuthSession, tabId, threadId]);\n\n useEffect(() => {\n if (!authError) return;\n // Auto-recovery (`checkAuthSession`) runs immediately + at 250ms. If the\n // card is still showing 3 seconds later, recovery failed and the user\n // is about to hit \"Refresh chat\" — that's the \"Reload UI required\"\n // symptom we want signal on.\n const stuckCapture = window.setTimeout(() => {\n captureError(new Error(\"agent-chat:auth_error_card_stuck\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"auth_error_card\",\n sessionAvailable: String(authSessionAvailable),\n sessionExpired: String(!!authError.sessionExpired),\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n },\n });\n }, 3000);\n const handler = () => void checkAuthSession();\n const timer = window.setTimeout(handler, 250);\n window.addEventListener(\"focus\", handler);\n window.addEventListener(\"agent-engine:configured-changed\", handler);\n return () => {\n window.clearTimeout(stuckCapture);\n window.clearTimeout(timer);\n window.removeEventListener(\"focus\", handler);\n window.removeEventListener(\"agent-engine:configured-changed\", handler);\n };\n }, [authError, authSessionAvailable, checkAuthSession, tabId, threadId]);\n\n // Listen for loop-limit events from the adapter\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!tabId || detail?.tabId === tabId) {\n setLoopLimitInfo({\n ...(typeof detail?.maxIterations === \"number\"\n ? { maxIterations: detail.maxIterations }\n : {}),\n });\n setShowContinue(true);\n }\n };\n window.addEventListener(\"agent-chat:loop-limit\", handler);\n return () => window.removeEventListener(\"agent-chat:loop-limit\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as RunErrorInfo & {\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (!detail?.message) return;\n const stopped = userStoppedRunRef.current;\n if (\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !detail.runId || stopped.runId === detail.runId)\n ) {\n return;\n }\n setRunErrorInfo({\n message: detail.message,\n ...(detail.details ? { details: detail.details } : {}),\n ...(detail.errorCode ? { errorCode: detail.errorCode } : {}),\n ...(detail.runId ? { runId: detail.runId } : {}),\n ...(detail.recoverable ? { recoverable: detail.recoverable } : {}),\n });\n setDismissedRunErrorKey(null);\n };\n window.addEventListener(\"agent-chat:run-error\", handler);\n return () => window.removeEventListener(\"agent-chat:run-error\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as {\n label?: string;\n tool?: string;\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (typeof detail?.label === \"string\" && detail.label.trim()) {\n const label = detail.label.trim();\n const tool = detail.tool?.trim() || undefined;\n setActivityLabel(label);\n setActivitySteps((prev) => {\n const last = prev[prev.length - 1];\n if (last?.label === label && last.tool === tool) return prev;\n return [\n ...prev,\n {\n id: `${Date.now()}-${++activityStepIdCounter.current}`,\n label,\n ...(tool ? { tool } : {}),\n },\n ].slice(-6);\n });\n }\n };\n window.addEventListener(\"agent-chat:activity\", handler);\n return () => window.removeEventListener(\"agent-chat:activity\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as { tabId?: string };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n setActivityLabel(null);\n setActivitySteps([]);\n };\n window.addEventListener(\"agent-chat:activity-clear\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:activity-clear\", handler);\n }, [tabId]);\n\n useEffect(() => {\n if (!showRunningInUI) {\n setActivityLabel(null);\n setActivitySteps([]);\n }\n }, [showRunningInUI]);\n\n // Auto-dequeue: when agent finishes running, send the next queued message\n useEffect(() => {\n if (wasRunningRef.current && !isRunning && queuedMessages.length > 0) {\n const [next, ...rest] = queuedMessages;\n setQueuedMessages(rest);\n // Small delay to let the runtime settle after completion\n setTimeout(() => {\n void (async () => {\n // In serverless/cross-isolate deployments the client can receive the\n // terminal SSE event a beat before SQL has marked the previous run\n // complete. Starting the queued turn during that window can reconnect\n // to the old run and replay the old answer under the new prompt.\n await waitForThreadRunToClear(apiUrl, threadId);\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; image: string }\n > = [{ type: \"text\", text: next.text }];\n if (next.images) {\n for (const img of next.images) {\n content.push({ type: \"image\", image: img });\n }\n }\n threadRuntime.append({\n role: \"user\",\n content,\n ...(next.attachments && next.attachments.length > 0\n ? { attachments: next.attachments }\n : {}),\n ...createUserMessageRunConfig(next.references, next.requestMode),\n } as Parameters<typeof threadRuntime.append>[0]);\n })();\n }, 100);\n }\n wasRunningRef.current = isRunning;\n }, [apiUrl, isRunning, queuedMessages, threadId, threadRuntime]);\n\n // Clear frozen reconnect content + forceStopped only on the false→true\n // transition of isRuntimeRunning (i.e. a NEW run is actually starting).\n // Reacting to \"isRuntimeRunning is currently true\" would clear the\n // nuclear-stop flag immediately after the user clicks stop, since\n // cancellation is async and isRuntimeRunning is still true at that moment.\n const prevIsRuntimeRunningRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRunning = prevIsRuntimeRunningRef.current;\n prevIsRuntimeRunningRef.current = isRuntimeRunning;\n if (isRuntimeRunning && !wasRunning) {\n if (reconnectFrozen) {\n setReconnectFrozen(false);\n setReconnectContent([]);\n }\n if (forceStopped) {\n setForceStopped(false);\n }\n }\n }, [isRuntimeRunning, reconnectFrozen, forceStopped]);\n\n // Same transition guard for isReconnecting: only clear forceStopped on\n // the false→true edge (a new reconnect starting on page load).\n const prevIsReconnectingRef = useRef(isReconnecting);\n useEffect(() => {\n const wasReconnecting = prevIsReconnectingRef.current;\n prevIsReconnectingRef.current = isReconnecting;\n if (isReconnecting && !wasReconnecting && forceStopped) {\n setForceStopped(false);\n }\n }, [isReconnecting, forceStopped]);\n\n const addToQueue = useCallback(\n async (\n text: string,\n images?: string[],\n references?: Reference[],\n attachments?: ReadonlyArray<unknown>,\n requestMode?: AgentRequestMode,\n ) => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n setActivityLabel(null);\n setActivitySteps([]);\n userStoppedRunRef.current = null;\n // Selection context attached via Cmd+I is one-shot — clear it as soon\n // as the user actually sends a message so it can't be re-used.\n clearPendingSelection();\n // Sending a message is an explicit user action — always anchor to the\n // bottom so the new message and any reply land in view, even if the\n // user had scrolled up to read history. The sticky-bottom override\n // exists to stop streaming from yanking the viewport, not to swallow\n // direct sends.\n isNearBottomRef.current = true;\n setShowScrollToBottom(false);\n const queuedAttachments = await serializeQueuedAttachments(attachments);\n // Snapshot the exec mode at enqueue time when the caller didn't\n // pass an explicit override. Without this, a plan-mode message that\n // sits in the queue runs as 'act' if the user flips the global toggle\n // before the queue flushes — turning a read-only message into a write.\n const effectiveRequestMode: AgentRequestMode | undefined =\n requestMode ??\n (execMode === \"plan\"\n ? \"plan\"\n : execMode === \"build\"\n ? \"act\"\n : undefined);\n if (isRunning) {\n setQueuedMessages((prev) => [\n ...prev,\n {\n id:\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n text,\n images,\n attachments: queuedAttachments,\n references,\n requestMode: effectiveRequestMode,\n },\n ]);\n } else {\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; image: string }\n > = [{ type: \"text\", text }];\n if (images) {\n for (const img of images) {\n content.push({ type: \"image\", image: img });\n }\n }\n threadRuntime.append({\n role: \"user\",\n content,\n ...(queuedAttachments && queuedAttachments.length > 0\n ? { attachments: queuedAttachments }\n : {}),\n ...createUserMessageRunConfig(references, effectiveRequestMode),\n } as Parameters<typeof threadRuntime.append>[0]);\n }\n },\n [execMode, isRunning, threadRuntime],\n );\n\n // Expose imperative handle\n useImperativeHandle(\n ref,\n () => ({\n sendMessage(text: string) {\n addToQueue(text);\n },\n queueMessage(text: string) {\n addToQueue(text);\n },\n isRunning() {\n return thread.isRunning;\n },\n focusComposer() {\n tiptapRef.current?.focus();\n },\n exportThreadSnapshot() {\n if (messages.length === 0) return null;\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n return {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n };\n },\n }),\n [addToQueue, messages.length, thread.isRunning, threadRuntime],\n );\n\n // Track whether user has scrolled away from bottom\n const isNearBottomRef = useRef(true);\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n function onScroll() {\n if (!el) return;\n const threshold = 40;\n const nearBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n isNearBottomRef.current = nearBottom;\n setShowScrollToBottom(!nearBottom && messages.length > 0);\n }\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, [messages.length]);\n\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n isNearBottomRef.current = true;\n setShowScrollToBottom(false);\n }\n }, []);\n\n const scrollToBottomAfterPaint = useCallback(() => {\n scrollToBottom();\n requestAnimationFrame(() => {\n scrollToBottom();\n requestAnimationFrame(scrollToBottom);\n });\n setTimeout(scrollToBottom, 80);\n }, [scrollToBottom]);\n\n const scrollToBottomWhileLayoutSettles = useCallback(() => {\n scrollToBottomAfterPaint();\n const el = scrollRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return undefined;\n\n let stopped = false;\n const observer = new ResizeObserver(() => {\n if (!stopped) scrollToBottom();\n });\n observer.observe(el);\n const timeout = window.setTimeout(() => {\n stopped = true;\n observer.disconnect();\n scrollToBottom();\n }, 1600);\n\n return () => {\n stopped = true;\n window.clearTimeout(timeout);\n observer.disconnect();\n };\n }, [scrollToBottom, scrollToBottomAfterPaint]);\n\n // Scroll to bottom when a restored thread finishes loading\n const wasRestoringRef = useRef(isRestoring);\n useEffect(() => {\n const wasRestoring = wasRestoringRef.current;\n wasRestoringRef.current = isRestoring;\n if (wasRestoring && !isRestoring) {\n return scrollToBottomWhileLayoutSettles();\n }\n }, [isRestoring, scrollToBottomWhileLayoutSettles]);\n\n // Auto-scroll on new messages or queued messages (only if near bottom)\n useEffect(() => {\n const el = scrollRef.current;\n if (el && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [messages, queuedMessages, scrollToBottomAfterPaint]);\n\n useEffect(() => {\n if (!isRunning && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [isRunning, scrollToBottomAfterPaint]);\n\n // Continuous auto-scroll while streaming (only if near bottom)\n useEffect(() => {\n if (!isRunning) return;\n const el = scrollRef.current;\n if (!el) return;\n const interval = setInterval(() => {\n if (isNearBottomRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n }, 100);\n return () => clearInterval(interval);\n }, [isRunning]);\n\n const { isDevMode: cpDevMode } = useDevMode(apiUrl);\n const checkpointCtx = useMemo(\n () => ({ apiUrl, devMode: cpDevMode, threadId }),\n [apiUrl, cpDevMode, threadId],\n );\n const messageActionsCtx = useMemo(() => ({ onForkChat }), [onForkChat]);\n const lastMessageLoopLimit = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getLoopLimitMetadata(last);\n }, [messages]);\n const lastMessageRunError = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getRunErrorMetadata(last);\n }, [messages]);\n const lastUserText = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") return getMessageText(messages[i]);\n }\n return \"\";\n }, [messages]);\n const latestMessage = messages[messages.length - 1];\n const latestMessageRole = latestMessage?.role;\n const latestAssistantWasPlan =\n latestMessageRole === \"assistant\" &&\n getRequestModeMetadata(latestMessage) === \"plan\";\n const showPlanModeCallout =\n execMode === \"plan\" &&\n !planModeDisabled &&\n !isComposerDisabled &&\n !showRunningInUI;\n const canImplementPlan = showPlanModeCallout && latestAssistantWasPlan;\n const handleImplementPlan = useCallback(() => {\n onExecModeChange?.(\"build\");\n void addToQueue(\n \"Implement the plan.\",\n undefined,\n undefined,\n undefined,\n \"act\",\n );\n }, [addToQueue, onExecModeChange]);\n const handleSwitchToAct = useCallback(() => {\n onExecModeChange?.(\"build\");\n }, [onExecModeChange]);\n const visibleLoopLimit = showContinue\n ? (loopLimitInfo ?? lastMessageLoopLimit ?? {})\n : lastMessageLoopLimit;\n const visibleRunError = runErrorInfo ?? lastMessageRunError;\n const visibleRunErrorKey = visibleRunError\n ? `${visibleRunError.runId ?? \"\"}:${visibleRunError.errorCode ?? \"\"}:${visibleRunError.message}`\n : null;\n const shouldShowRunError =\n !!visibleRunError &&\n !showRunningInUI &&\n visibleRunErrorKey !== dismissedRunErrorKey &&\n !(\n userStoppedRunRef.current &&\n Date.now() - userStoppedRunRef.current.at < 10_000 &&\n (!userStoppedRunRef.current.runId ||\n !visibleRunError.runId ||\n userStoppedRunRef.current.runId === visibleRunError.runId)\n );\n\n return (\n <CheckpointContext.Provider value={checkpointCtx}>\n <MessageActionsContext.Provider value={messageActionsCtx}>\n <ChatRunningContext.Provider value={isRunning}>\n <div\n className={cn(\n \"relative flex flex-1 flex-col h-full min-h-0 text-foreground\",\n className,\n )}\n onDragEnter={handleChatDragEnter}\n onDragOver={handleChatDragOver}\n onDragLeave={handleChatDragLeave}\n onDrop={handleChatDrop}\n >\n {dropActive && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center rounded-md border-2 border-dashed border-primary/70 bg-primary/5 backdrop-blur-[1px]\"\n >\n <span className=\"rounded-md bg-background/90 px-3 py-1.5 text-xs font-medium text-foreground shadow-sm\">\n Drop to attach\n </span>\n </div>\n )}\n {showHeader && (\n <div className=\"flex h-11 shrink-0 items-center justify-between border-b border-border px-4\">\n <span className=\"text-[13px] font-medium text-muted-foreground\">\n Agent\n </span>\n <div className=\"flex items-center gap-1\">\n {onSwitchToCli && (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={onSwitchToCli}\n aria-label=\"Switch to CLI\"\n className=\"flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent\"\n >\n <IconTerminal className=\"h-3.5 w-3.5\" />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>Switch to CLI</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n )}\n\n {/* Messages area */}\n <div\n ref={scrollRef}\n className=\"flex-1 overflow-y-auto overflow-x-hidden min-h-0\"\n >\n {authError ? (\n <div className=\"flex flex-col items-center justify-center h-full px-4 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10\">\n <IconLock className=\"h-5 w-5 text-destructive\" />\n </div>\n <div className=\"text-center max-w-[280px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {authSessionAvailable\n ? \"Chat session needs refresh\"\n : authError.sessionExpired\n ? \"Session expired\"\n : \"Authentication required\"}\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {authSessionAvailable\n ? \"You're signed in, but this chat connection needs to reconnect.\"\n : authError.sessionExpired\n ? \"Your session may have expired. Log out and log back in to reconnect.\"\n : \"You need to log in to use the agent.\"}\n </p>\n </div>\n <div className=\"flex gap-2\">\n {!authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={() => {\n const ret =\n window.location.pathname + window.location.search;\n window.location.href =\n agentNativePath(\"/_agent-native/sign-in\") +\n `?return=${encodeURIComponent(ret)}`;\n }}\n className=\"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n >\n Log in\n </button>\n )}\n {authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={async () => {\n try {\n await fetch(\n agentNativePath(\"/_agent-native/auth/logout\"),\n {\n method: \"POST\",\n },\n );\n } catch {}\n window.location.reload();\n }}\n className=\"text-xs text-destructive hover:text-destructive/80 px-3 py-1.5 rounded-md border border-destructive/30 hover:bg-destructive/10\"\n >\n Log out\n </button>\n )}\n <button\n onClick={() => {\n setAuthError(null);\n window.location.reload();\n }}\n className={\n authSessionAvailable\n ? \"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n : \"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent\"\n }\n >\n Refresh chat\n </button>\n </div>\n </div>\n ) : missingApiKey && messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full px-2\">\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n </div>\n ) : isRestoring ? (\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"flex justify-end\">\n <div className=\"h-8 w-32 rounded-lg bg-muted animate-pulse\" />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"h-4 w-48 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-64 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-40 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ) : messages.length === 0 && !isReconnecting ? (\n <div className=\"flex flex-col items-center justify-center gap-4 py-16 px-4 h-full\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground text-center max-w-[240px]\">\n {emptyStateText ?? \"How can I help you?\"}\n </p>\n {emptyStateAddon}\n {suggestions && suggestions.length > 0 && (\n <div className=\"flex flex-col gap-1.5 w-full max-w-[280px]\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: suggestion }],\n });\n }}\n className=\"w-full rounded-lg border border-border px-3 py-2 text-left text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n <div className=\"agent-thread-content flex flex-col gap-4 px-4 py-4\">\n <AssistantMessageListErrorBoundary\n resetKey={messageListResetKey}\n >\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n AssistantMessage,\n }}\n />\n </AssistantMessageListErrorBoundary>\n {missingApiKey && (\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n )}\n {visibleLoopLimit && !showRunningInUI && (\n <LoopLimitContinueCard\n info={visibleLoopLimit}\n onContinue={() => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n addToQueue(\"Continue from where you left off.\");\n }}\n />\n )}\n {shouldShowRunError && visibleRunError && (\n <RunErrorRecoveryCard\n info={visibleRunError}\n onContinue={() => {\n setRunErrorInfo(null);\n addToQueue(\n \"Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. Prefer dedicated app actions over raw database edits when they exist.\",\n );\n }}\n onRetry={() => {\n setRunErrorInfo(null);\n addToQueue(\n lastUserText\n ? `Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\\n\\nOriginal request:\\n\\n${lastUserText}`\n : \"Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\",\n );\n }}\n onFork={onForkChat}\n onDismiss={() => {\n if (visibleRunErrorKey) {\n setDismissedRunErrorKey(visibleRunErrorKey);\n }\n setRunErrorInfo(null);\n }}\n />\n )}\n {(isReconnecting || reconnectFrozen) &&\n reconnectContent.length > 0 && (\n <ReconnectStreamMessage content={reconnectContent} />\n )}\n {/* Always show the thinking indicator while the agent is working,\n including during reconnect. The indicator sits BELOW any\n already-streamed reconnect content so the user sees both\n \"what it did so far\" and \"it's still working\". Swap the label\n to \"Reconnecting\" during reconnect so the user knows the\n system is actively recovering, not just stuck. */}\n {showRunningInUI && (\n <>\n <ActivitySteps steps={activitySteps} />\n <ThinkingIndicator\n label={\n isReconnecting\n ? \"Reconnecting\"\n : (activityLabel ?? \"Thinking\")\n }\n />\n </>\n )}\n {queuedMessages.map((msg) => {\n const displayText = msg.text\n .replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\")\n .trim();\n return (\n <div key={msg.id} className=\"flex justify-end group\">\n <div className=\"relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide\">\n <IconClock className=\"h-3 w-3\" />\n Queued\n </div>\n {displayText}\n {msg.images && msg.images.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1.5\">\n {msg.images.map((img, j) => (\n <img\n key={j}\n src={img}\n alt=\"\"\n className=\"h-12 w-12 rounded object-cover border border-border/50\"\n />\n ))}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() =>\n setQueuedMessages((prev) =>\n prev.filter((m) => m.id !== msg.id),\n )\n }\n aria-label=\"Remove from queue\"\n className=\"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm\"\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Scroll to bottom button */}\n {showScrollToBottom && (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n type=\"button\"\n onClick={scrollToBottom}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\"\n aria-label=\"Scroll to bottom\"\n >\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n )}\n\n {composerSlot}\n {showPlanModeCallout && (\n <PlanModeCallout\n canImplementPlan={canImplementPlan}\n onImplementPlan={handleImplementPlan}\n onSwitchToAct={handleSwitchToAct}\n />\n )}\n <SelectionAttachedPill />\n {/* Input area */}\n <div\n className={cn(\n \"agent-composer-area shrink-0 px-3 py-2\",\n missingApiKey && \"cursor-pointer\",\n isComposerDisabled && \"opacity-70\",\n )}\n onClick={\n missingApiKey\n ? () => setMissingKeyBouncePulse((p) => p + 1)\n : undefined\n }\n >\n <ComposerPrimitive.Root className=\"flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring\">\n <ComposerAttachmentPreviewStrip />\n <TiptapComposer\n focusRef={tiptapRef}\n disabled={isComposerDisabled}\n placeholder={\n missingApiKey\n ? \"Connect an AI engine above to start chatting…\"\n : composerDisabled\n ? (composerDisabledPlaceholder ??\n \"Open Desktop to use this chat.\")\n : isRunning\n ? queuedMessages.length > 0\n ? `${queuedMessages.length} queued — type another...`\n : \"Queue a message...\"\n : undefined\n }\n onSubmit={\n isRunning\n ? (text, references, attachments) =>\n void addToQueue(\n text,\n undefined,\n references.length > 0 ? references : undefined,\n attachments,\n )\n : undefined\n }\n onSlashCommand={onSlashCommand}\n execMode={execMode}\n onExecModeChange={onExecModeChange}\n planModeDisabled={planModeDisabled}\n planModeDisabledReason={planModeDisabledReason}\n selectedModel={selectedModel ?? defaultModel}\n selectedEffort={selectedEffort}\n availableModels={availableModels}\n onModelChange={onModelChange}\n onEffortChange={onEffortChange}\n draftScope={threadId || tabId}\n interceptBuildRequestsForBuilder\n extraActionButton={\n showRunningInUI ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n // Nuclear stop: flip forceStopped so isRunning is false\n // immediately. This unblocks submission even if the\n // runtime or reconnect state is stuck.\n setForceStopped(true);\n const activeRun = getActiveRun();\n const runIdToAbort =\n reconnectRunIdRef.current ?? activeRun?.runId;\n userStoppedRunRef.current = {\n at: Date.now(),\n ...(runIdToAbort\n ? { runId: runIdToAbort }\n : {}),\n };\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n if (runIdToAbort) {\n fetch(\n `${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`,\n { method: \"POST\" },\n ).catch(() => {});\n }\n\n if (isReconnecting) {\n reconnectAbortRef.current?.abort();\n reconnectAbortRef.current = null;\n reconnectRunIdRef.current = null;\n setIsReconnecting(false);\n setReconnectFrozen(reconnectContent.length > 0);\n }\n\n threadRuntime.cancelRun();\n\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: {\n isRunning: false,\n tabId: tabId || threadId,\n },\n }),\n );\n }}\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80\"\n >\n <IconPlayerStop className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Stop generating</TooltipContent>\n </Tooltip>\n ) : undefined\n }\n />\n </ComposerPrimitive.Root>\n </div>\n </div>\n </ChatRunningContext.Provider>\n </MessageActionsContext.Provider>\n </CheckpointContext.Provider>\n );\n});\n\nexport const AssistantChat = forwardRef<\n AssistantChatHandle,\n AssistantChatProps\n>(function AssistantChat(\n {\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n tabId,\n browserTabId,\n threadId,\n contextScope,\n ...props\n },\n ref,\n) {\n const modelRef = useRef<string | undefined>(props.selectedModel);\n modelRef.current = props.selectedModel;\n const engineRef = useRef<string | undefined>(props.selectedEngine);\n engineRef.current = props.selectedEngine;\n const effortRef = useRef<ReasoningEffort | undefined>(props.selectedEffort);\n effortRef.current = props.selectedEffort;\n const execModeRef = useRef<\"build\" | \"plan\" | undefined>(props.execMode);\n execModeRef.current = props.execMode;\n const scopeRef = useRef<ChatThreadScope | null | undefined>(contextScope);\n scopeRef.current = contextScope;\n\n const adapter = useMemo(\n () =>\n createAgentChatAdapter({\n apiUrl,\n tabId,\n threadId,\n modelRef,\n engineRef,\n effortRef,\n execModeRef,\n browserTabId,\n scopeRef,\n }),\n [apiUrl, tabId, threadId, browserTabId],\n );\n const attachmentAdapter = useMemo(\n () =>\n new CompositeAttachmentAdapter([\n new DownscalingImageAttachmentAdapter(),\n new BinaryDocumentAttachmentAdapter(),\n new TextAttachmentAdapter(),\n ]),\n [],\n );\n const runtime = useLocalRuntime(adapter, {\n adapters: { attachments: attachmentAdapter },\n });\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n <ThreadPrimitive.Root className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n <AssistantUiStaleIndexErrorBoundary\n resetKey={`${tabId ?? \"\"}:${threadId ?? \"\"}`}\n componentName=\"AssistantChat\"\n >\n <AssistantChatInner\n ref={ref}\n {...props}\n apiUrl={apiUrl}\n tabId={tabId}\n threadId={threadId}\n />\n </AssistantUiStaleIndexErrorBoundary>\n </ThreadPrimitive.Root>\n </AssistantRuntimeProvider>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"file":"AssistantChat.js","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n AssistantRuntimeProvider,\n useLocalRuntime,\n useThreadRuntime,\n useThread,\n useAui,\n useComposer,\n useComposerRuntime,\n useMessageRuntime,\n ThreadPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n} from \"@assistant-ui/react\";\nimport type {\n AttachmentAdapter,\n CompleteAttachment,\n PendingAttachment,\n ToolCallMessagePartProps,\n Attachment,\n} from \"@assistant-ui/react\";\nimport { CompositeAttachmentAdapter } from \"@assistant-ui/react\";\nimport { MarkdownTextPrimitive } from \"@assistant-ui/react-markdown\";\nimport ReactMarkdown, { defaultUrlTransform } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { createAgentChatAdapter } from \"./agent-chat-adapter.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport type {\n ChatThreadScope,\n ChatThreadSnapshot,\n} from \"./use-chat-threads.js\";\nimport { getActiveRun } from \"./active-run-state.js\";\nimport {\n AgentAutoContinueSignal,\n type ContentPart,\n readSSEStreamRaw,\n} from \"./sse-event-processor.js\";\nimport { captureError, trackEvent } from \"./analytics.js\";\nimport { cn } from \"./utils.js\";\nimport { TextAttachmentAdapter } from \"./composer/attachment-accept.js\";\nimport { AgentTaskCard } from \"./AgentTaskCard.js\";\nimport { ConnectBuilderCard } from \"./ConnectBuilderCard.js\";\nimport { useBuilderConnectFlow } from \"./settings/useBuilderStatus.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./components/ui/dropdown-menu.js\";\nimport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport {\n BUILDER_SPACE_SETTINGS_URL,\n NEW_CHAT_ACTION_HREF,\n} from \"./error-format.js\";\nimport { ThumbsFeedback } from \"./observability/ThumbsFeedback.js\";\nimport {\n TiptapComposer,\n type TiptapComposerHandle,\n} from \"./composer/TiptapComposer.js\";\nimport type { Reference } from \"./composer/types.js\";\nimport { isPastedTextAttachmentName } from \"./composer/pasted-text.js\";\nimport { PastedTextChip } from \"./composer/PastedTextChip.js\";\nimport {\n IconMessage,\n IconX,\n IconPlayerStop,\n IconCheck,\n IconChevronDown,\n IconCopy,\n IconTerminal,\n IconLoader2,\n IconCircleX,\n IconSquareFilled,\n IconClock,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconLock,\n IconArrowBackUp,\n IconExternalLink,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconGauge,\n IconArrowRight,\n IconSettings,\n IconAlertTriangle,\n IconRefresh,\n IconPlayerPlay,\n IconClipboardList,\n IconSearch,\n IconArrowsMaximize,\n IconArrowsMinimize,\n IconPlus,\n} from \"@tabler/icons-react\";\n\nclass DownscalingImageAttachmentAdapter implements AttachmentAdapter {\n public accept = \"image/*\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"image\",\n name: state.file.name,\n contentType: state.file.type,\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"image\",\n image: await getImageFileDataURL(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nclass BinaryDocumentAttachmentAdapter implements AttachmentAdapter {\n public accept = \"application/pdf,.pdf\";\n\n public async add(state: { file: File }): Promise<PendingAttachment> {\n return {\n id: state.file.name,\n type: \"document\",\n name: state.file.name,\n contentType: inferDocumentContentType(state.file),\n file: state.file,\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n }\n\n public async send(\n attachment: PendingAttachment,\n ): Promise<CompleteAttachment> {\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: attachment.name,\n data: await getFileDataURL(attachment.file),\n mimeType: inferDocumentContentType(attachment.file),\n },\n ],\n };\n }\n\n public async remove() {\n // noop\n }\n}\n\nfunction inferDocumentContentType(file: File): string {\n if (file.type) return file.type;\n if (file.name.toLowerCase().endsWith(\".pdf\")) return \"application/pdf\";\n return \"application/octet-stream\";\n}\n\nfunction getFileDataURL(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n}\n\n// Anthropic / OpenAI vision inputs choke on multi-megabyte images, and\n// base64-encoding a raw screenshot eats enough heap to crash the composer\n// (PayloadTooLarge / \"Maximum call stack\" in serializers). Downscale large\n// images on the client before we ever serialize them.\nconst MAX_IMAGE_BYTES = 4 * 1024 * 1024;\nconst MAX_IMAGE_DIMENSION = 2048;\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to decode pasted image\"));\n img.src = url;\n });\n}\n\nasync function getImageFileDataURL(file: File): Promise<string> {\n if (file.size <= MAX_IMAGE_BYTES) {\n return getFileDataURL(file);\n }\n if (typeof document === \"undefined\" || typeof Image === \"undefined\") {\n return getFileDataURL(file);\n }\n const objectUrl = URL.createObjectURL(file);\n try {\n const img = await loadImage(objectUrl);\n const ratio = Math.min(\n MAX_IMAGE_DIMENSION / img.naturalWidth,\n MAX_IMAGE_DIMENSION / img.naturalHeight,\n 1,\n );\n const width = Math.max(1, Math.round(img.naturalWidth * ratio));\n const height = Math.max(1, Math.round(img.naturalHeight * ratio));\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return getFileDataURL(file);\n }\n ctx.drawImage(img, 0, 0, width, height);\n const useJpeg =\n file.type !== \"image/png\" || file.size > MAX_IMAGE_BYTES * 2;\n return canvas.toDataURL(useJpeg ? \"image/jpeg\" : \"image/png\", 0.85);\n } catch {\n return getFileDataURL(file);\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\ntype QueuedAttachment = CompleteAttachment;\ntype AgentRequestMode = \"act\" | \"plan\";\n\nfunction createUserMessageRunConfig(\n references?: Reference[],\n requestMode?: AgentRequestMode,\n) {\n const custom: { references?: Reference[]; requestMode?: AgentRequestMode } =\n {};\n if (references && references.length > 0) {\n custom.references = references;\n }\n if (requestMode) {\n custom.requestMode = requestMode;\n }\n return Object.keys(custom).length > 0 ? { runConfig: { custom } } : {};\n}\n\nfunction escapeQueuedAttachmentAttribute(value: string): string {\n return value.replace(/&/g, \"&\").replace(/\"/g, \""\");\n}\n\nfunction isTextLikeFile(file: File): boolean {\n if (file.type.startsWith(\"text/\")) return true;\n if (file.type === \"application/json\") return true;\n return /\\.(txt|md|markdown|csv|json|yaml|yml)$/i.test(file.name);\n}\n\nfunction textFileAttachmentEnvelope(file: File, text: string): string {\n const contentType = file.type || \"text/plain\";\n return `<attachment name=\"${escapeQueuedAttachmentAttribute(file.name)}\" contentType=\"${escapeQueuedAttachmentAttribute(contentType)}\">\\n${text}\\n</attachment>`;\n}\n\nfunction serializeAttachmentContentPart(\n part: Record<string, unknown>,\n): QueuedAttachment[\"content\"][number] | null {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n return { type: \"image\", image: part.image };\n }\n if (part.type === \"text\" && typeof part.text === \"string\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"file\" && typeof part.data === \"string\") {\n return {\n type: \"file\",\n data: part.data,\n mimeType:\n typeof part.mimeType === \"string\"\n ? part.mimeType\n : \"application/octet-stream\",\n ...(typeof part.filename === \"string\" ? { filename: part.filename } : {}),\n };\n }\n return null;\n}\n\nasync function serializeQueuedAttachments(\n attachments?: ReadonlyArray<unknown>,\n): Promise<QueuedAttachment[] | undefined> {\n const queued: QueuedAttachment[] = [];\n for (const raw of attachments ?? []) {\n const attachment = raw as Partial<Attachment> & { file?: File };\n const name = attachment.name || attachment.file?.name || \"attachment\";\n const id = attachment.id || name;\n const type = attachment.type || \"file\";\n const contentType = attachment.contentType || attachment.file?.type;\n\n if (Array.isArray(attachment.content) && attachment.content.length > 0) {\n const content = attachment.content\n .map((part) =>\n serializeAttachmentContentPart(part as Record<string, unknown>),\n )\n .filter((part): part is QueuedAttachment[\"content\"][number] => !!part);\n if (content.length > 0) {\n queued.push({\n id,\n type,\n name,\n contentType,\n status: { type: \"complete\" },\n content,\n });\n }\n continue;\n }\n\n if (typeof File !== \"undefined\" && attachment.file instanceof File) {\n const file = attachment.file;\n if (file.type.startsWith(\"image/\")) {\n queued.push({\n id,\n type: \"image\",\n name,\n contentType: file.type,\n status: { type: \"complete\" },\n content: [{ type: \"image\", image: await getImageFileDataURL(file) }],\n });\n } else if (isTextLikeFile(file)) {\n queued.push({\n id,\n type: \"file\",\n name,\n contentType: file.type || \"text/plain\",\n status: { type: \"complete\" },\n content: [\n {\n type: \"text\",\n text: textFileAttachmentEnvelope(file, await file.text()),\n },\n ],\n });\n } else {\n queued.push({\n id,\n type: \"document\",\n name,\n contentType: inferDocumentContentType(file),\n status: { type: \"complete\" },\n content: [\n {\n type: \"file\",\n filename: file.name,\n data: await getFileDataURL(file),\n mimeType: inferDocumentContentType(file),\n },\n ],\n });\n }\n }\n }\n\n return queued.length > 0 ? queued : undefined;\n}\n\n// ─── Markdown Text ──────────────────────────────────────────────────────────\n\nconst markdownStyles = `\n.agent-markdown > :first-child { margin-top: 0; }\n.agent-markdown > :last-child { margin-bottom: 0; }\n.agent-markdown p { margin: 0.5em 0; }\n.agent-markdown ul, .agent-markdown ol { margin: 0.5em 0; padding-left: 1.5em; }\n.agent-markdown li { margin: 0.2em 0; }\n.agent-markdown li > p { margin: 0; }\n.agent-markdown h1 { font-size: 1.25em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h2 { font-size: 1.125em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown h3 { font-size: 1em; font-weight: 600; margin: 0.75em 0 0.25em; }\n.agent-markdown strong { font-weight: 600; }\n.agent-markdown em { font-style: italic; }\n.agent-markdown code { font-size: 0.875em; padding: 0.15em 0.35em; border-radius: 0.25em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre { margin: 0.5em 0; padding: 0.75em 1em; border-radius: 0.375em; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); overflow-x: auto; border: 1px solid hsl(var(--border, 0 0% 80%)); }\n.agent-markdown pre code { padding: 0; background: transparent; font-size: 0.8125em; color: inherit; border: none; }\n.agent-markdown-shiki { margin: 0.5em 0; border-radius: 0.375em; overflow: hidden; font-size: 0.8125em; }\n.agent-markdown-shiki pre { margin: 0; padding: 0.75em 1em; overflow-x: auto; background: var(--shiki-light-bg); color: var(--shiki-light); }\n.agent-markdown-shiki pre code { background: transparent; padding: 0; font-size: inherit; color: inherit; }\n.agent-markdown-shiki pre span { color: var(--shiki-light); background: var(--shiki-light-bg); }\n.dark .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); }\n.dark .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); }\n@media (prefers-color-scheme: dark) { :root:not(.light) .agent-markdown-shiki pre { background: var(--shiki-dark-bg); color: var(--shiki-dark); } :root:not(.light) .agent-markdown-shiki pre span { color: var(--shiki-dark); background: var(--shiki-dark-bg); } }\n.agent-tool-code .agent-markdown-shiki { margin: 0; border-radius: 0; min-width: max-content; }\n.agent-tool-code .agent-markdown-shiki pre { padding: 0.75rem; border: 0; background: transparent; }\n.agent-tool-code .agent-markdown-shiki pre span { background: transparent; }\n.agent-tool-code pre { margin: 0; min-width: max-content; padding: 0.75rem; background: transparent; color: inherit; }\n.agent-tool-code mark { border-radius: 0.1875rem; background: rgba(245, 158, 11, 0.25); color: inherit; }\n.agent-markdown hr { border: none; border-top: 1px solid hsl(var(--border, 0 0% 20%)); margin: 0.75em 0; }\n.agent-markdown a { text-decoration: underline; text-underline-offset: 2px; }\n.agent-markdown a.agent-markdown-cta { text-decoration: none; }\n.agent-markdown blockquote { border-left: 2px solid hsl(var(--border, 0 0% 20%)); padding-left: 0.75em; margin: 0.5em 0; opacity: 0.8; }\n.agent-markdown table { border-collapse: collapse; margin: 0.5em 0; font-size: 0.875em; }\n.agent-markdown th, .agent-markdown td { border: 1px solid hsl(var(--border, 0 0% 20%)); padding: 0.35em 0.65em; text-align: left; }\n.agent-markdown th { font-weight: 600; background: hsl(var(--muted, 0 0% 15%)); color: hsl(var(--foreground, 0 0% 90%)); }\n`;\n\n/**\n * Pending selection context — written to application_state when the user\n * presses Cmd+I with text selected on the page. The agent's next turn picks\n * it up via the `selectionContextPromise` in production-agent. The pill\n * below tells the user the context is attached and lets them clear it.\n */\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\nconst ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;\nconst ACTIVE_RUN_POLL_INTERVAL_MS = 150;\n\ntype ActiveRunLookup = {\n active?: boolean;\n runId?: string;\n threadId?: string;\n status?: string;\n heartbeatAt?: number | null;\n};\n\nfunction activeRunLooksStale(runInfo: ActiveRunLookup): boolean {\n const heartbeatAt =\n typeof runInfo.heartbeatAt === \"number\" ? runInfo.heartbeatAt : null;\n return (\n runInfo.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000\n );\n}\n\nfunction repoHasAssistantMessage(repo: any): boolean {\n return repo?.messages?.some(\n (m: { message?: { role?: string }; role?: string }) =>\n (m.message?.role ?? m.role) === \"assistant\",\n );\n}\n\nfunction getRepoMessages(repo: any): any[] {\n return Array.isArray(repo?.messages) ? repo.messages : [];\n}\n\nfunction getRepoMessage(entry: any): any {\n return entry?.message ?? entry;\n}\n\nfunction isAssistantMessageTerminal(message: any): boolean {\n const statusType =\n message?.status && typeof message.status === \"object\"\n ? message.status.type\n : undefined;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nfunction repoTextLength(repo: any): number {\n let length = 0;\n for (const entry of getRepoMessages(repo)) {\n const message = getRepoMessage(entry);\n const content = message?.content;\n if (typeof content === \"string\") {\n length += content.length;\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part?.type === \"text\" && typeof part.text === \"string\") {\n length += part.text.length;\n }\n }\n }\n }\n return length;\n}\n\nfunction repoTerminalAssistantCount(repo: any): number {\n return getRepoMessages(repo).filter((entry) => {\n const message = getRepoMessage(entry);\n return message?.role === \"assistant\" && isAssistantMessageTerminal(message);\n }).length;\n}\n\nfunction shouldImportServerThreadData(currentRepo: any, incomingRepo: any) {\n const incomingCount = getRepoMessages(incomingRepo).length;\n if (incomingCount === 0) return false;\n\n const currentCount = getRepoMessages(currentRepo).length;\n if (currentCount === 0) return true;\n if (incomingCount < currentCount) return false;\n\n if (incomingCount === currentCount) {\n const currentTerminalAssistants = repoTerminalAssistantCount(currentRepo);\n const incomingTerminalAssistants = repoTerminalAssistantCount(incomingRepo);\n if (incomingTerminalAssistants < currentTerminalAssistants) {\n return false;\n }\n if (\n incomingTerminalAssistants <= currentTerminalAssistants &&\n repoTextLength(incomingRepo) < repoTextLength(currentRepo)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction clearPendingSelection() {\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n {\n method: \"DELETE\",\n keepalive: true,\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new CustomEvent(\"agent-panel:selection-cleared\"));\n }\n}\n\nasync function waitForThreadRunToClear(apiUrl: string, threadId?: string) {\n if (!threadId) return;\n const deadline = Date.now() + ACTIVE_RUN_CLEAR_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (res.ok) {\n const info = await res.json();\n const heartbeatAt =\n typeof info?.heartbeatAt === \"number\" ? info.heartbeatAt : null;\n const stale =\n info?.status === \"running\" &&\n heartbeatAt != null &&\n Date.now() - heartbeatAt > 5000;\n if (!info?.active || info?.status !== \"running\" || stale) return;\n }\n } catch {\n // Transient poll failure — try again until the short grace period ends.\n }\n\n await new Promise((resolve) =>\n window.setTimeout(resolve, ACTIVE_RUN_POLL_INTERVAL_MS),\n );\n }\n}\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nfunction MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\nfunction SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n clearPendingSelection();\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\nlet stylesInjected = false;\nfunction injectMarkdownStyles() {\n if (stylesInjected || typeof document === \"undefined\") return;\n stylesInjected = true;\n const style = document.createElement(\"style\");\n style.textContent = markdownStyles;\n document.head.appendChild(style);\n}\n\nfunction extractCodeText(child: React.ReactNode): string {\n if (typeof child === \"string\") return child;\n if (Array.isArray(child)) return child.map(extractCodeText).join(\"\");\n if (React.isValidElement(child)) {\n const props = child.props as { children?: React.ReactNode };\n return extractCodeText(props.children);\n }\n return \"\";\n}\n\n// Lazy-loaded shiki highlighter using the fine-grained API so we only ship\n// the languages and themes we actually use (instead of shiki's full ~30 MB\n// bundle of every grammar). This is required to keep the Cloudflare Pages\n// Functions bundle under the 25 MiB limit.\ntype ShikiHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n};\n\nlet highlighterLoader: Promise<ShikiHighlighter> | null = null;\nfunction loadHighlighter(): Promise<ShikiHighlighter> {\n if (!highlighterLoader) {\n highlighterLoader = (async () => {\n const [{ createHighlighterCore }, { createOnigurumaEngine }] =\n await Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/oniguruma\"),\n ]);\n return createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light-default.mjs\"),\n import(\"shiki/themes/github-dark-default.mjs\"),\n ],\n langs: [\n import(\"shiki/langs/javascript.mjs\"),\n import(\"shiki/langs/typescript.mjs\"),\n import(\"shiki/langs/jsx.mjs\"),\n import(\"shiki/langs/tsx.mjs\"),\n import(\"shiki/langs/json.mjs\"),\n import(\"shiki/langs/css.mjs\"),\n import(\"shiki/langs/html.mjs\"),\n import(\"shiki/langs/markdown.mjs\"),\n import(\"shiki/langs/bash.mjs\"),\n import(\"shiki/langs/shellscript.mjs\"),\n import(\"shiki/langs/python.mjs\"),\n import(\"shiki/langs/yaml.mjs\"),\n import(\"shiki/langs/sql.mjs\"),\n ],\n engine: createOnigurumaEngine(import(\"shiki/wasm\")),\n }) as unknown as Promise<ShikiHighlighter>;\n })().catch((error) => {\n // Reset on failure so a future code block can retry instead of\n // silently failing forever on a stale chunk / network blip.\n highlighterLoader = null;\n throw error;\n });\n }\n return highlighterLoader;\n}\n\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n// Map a few common aliases to languages we bundled above.\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\nfunction HighlightedCodeBlock({ code, lang }: { code: string; lang: string }) {\n const [html, setHtml] = useState<string | null>(null);\n useEffect(() => {\n let cancelled = false;\n loadHighlighter()\n .then((highlighter) => {\n const requested = (lang || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const finalLang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang: finalLang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelled) setHtml(out);\n })\n .catch(() => {\n // Unknown language or other shiki failure — fall back to plain pre.\n if (!cancelled) setHtml(null);\n });\n return () => {\n cancelled = true;\n };\n }, [code, lang]);\n\n if (html) {\n return (\n <div\n className=\"agent-markdown-shiki\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n return (\n <pre>\n <code className={lang ? `language-${lang}` : undefined}>{code}</code>\n </pre>\n );\n}\n\nconst CTA_BUTTON_CLASSES =\n \"agent-markdown-cta mt-1 inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background no-underline shadow-sm transition-colors hover:bg-foreground/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background cursor-pointer\";\n\nconst markdownComponents = {\n a(props: React.AnchorHTMLAttributes<HTMLAnchorElement>) {\n const {\n href,\n children,\n className,\n rel: _rel,\n target: _target,\n ...rest\n } = props;\n if (href === NEW_CHAT_ACTION_HREF) {\n // In-app action: dispatch a CustomEvent that MultiTabAssistantChat\n // listens for and opens a new chat tab. Not an external navigation.\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n window.dispatchEvent(new CustomEvent(\"agent-chat:new-chat\"));\n }}\n className={cn(CTA_BUTTON_CLASSES, className)}\n >\n <IconPlus size={13} strokeWidth={2} aria-hidden=\"true\" />\n <span>{children}</span>\n </button>\n );\n }\n const isBuilderCta = isBuilderErrorCtaHref(href);\n if (!isBuilderCta) {\n return (\n <a href={href} className={className} {...rest}>\n {children}\n </a>\n );\n }\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(CTA_BUTTON_CLASSES, className)}\n {...rest}\n >\n <span>{children}</span>\n <IconExternalLink size={13} strokeWidth={2} aria-hidden=\"true\" />\n </a>\n );\n },\n pre(props: React.HTMLAttributes<HTMLPreElement>) {\n const { children, ...rest } = props;\n if (React.isValidElement(children)) {\n const childProps = children.props as {\n className?: string;\n children?: React.ReactNode;\n };\n const className = childProps.className || \"\";\n if (/\\blanguage-embed\\b/.test(className)) {\n const body = extractCodeText(childProps.children);\n const parsed = parseEmbedBody(body);\n return (\n <IframeEmbed {...(parsed as Parameters<typeof IframeEmbed>[0])} />\n );\n }\n const langMatch = className.match(/\\blanguage-([\\w+-]+)\\b/);\n if (langMatch) {\n const code = extractCodeText(childProps.children).replace(/\\n$/, \"\");\n return <HighlightedCodeBlock code={code} lang={langMatch[1]} />;\n }\n }\n return <pre {...rest}>{children}</pre>;\n },\n};\n\nfunction isBuilderErrorCtaHref(href: string | undefined): boolean {\n if (!href) return false;\n try {\n const url = new URL(href);\n if (url.protocol !== \"https:\" || url.hostname !== \"builder.io\") {\n return false;\n }\n return (\n url.href === BUILDER_SPACE_SETTINGS_URL ||\n url.pathname === \"/account/billing\" ||\n /^\\/app\\/organizations\\/[^/]+\\/billing$/.test(url.pathname)\n );\n } catch {\n return false;\n }\n}\n\n// react-markdown's defaultUrlTransform strips href values whose protocol\n// isn't on its safe list (https, mailto, etc.). Our in-app pseudo-href\n// `agent-native:new-chat` would be blanked out by that, so let it through\n// while delegating every other URL to the default transform for sanitization.\nfunction markdownUrlTransform(value: string): string {\n if (value === NEW_CHAT_ACTION_HREF) return value;\n return defaultUrlTransform(value);\n}\n\nfunction MarkdownText() {\n useEffect(() => {\n injectMarkdownStyles();\n }, []);\n return (\n <MarkdownTextPrimitive\n smooth\n className=\"agent-markdown break-words\"\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n />\n );\n}\n\n// ─── Composer Attachment Preview ─────────────────────────────────────────────\n\nfunction getImageAttachmentSrc(attachment: Attachment): string | null {\n if (attachment.type !== \"image\") return null;\n\n if (\"file\" in attachment && attachment.file) {\n return URL.createObjectURL(attachment.file);\n }\n\n const imagePart = attachment.content?.find((part) => part.type === \"image\");\n return imagePart && \"image\" in imagePart ? imagePart.image : null;\n}\n\nfunction ComposerAttachmentPreviewCard({\n attachment,\n onRemove,\n}: {\n attachment: Attachment;\n onRemove: (id: string) => void;\n}) {\n const [imageSrc, setImageSrc] = useState<string | null>(null);\n\n useEffect(() => {\n const nextSrc = getImageAttachmentSrc(attachment);\n setImageSrc(nextSrc);\n\n return () => {\n if (nextSrc?.startsWith(\"blob:\")) {\n URL.revokeObjectURL(nextSrc);\n }\n };\n }, [attachment]);\n\n if (isPastedTextAttachmentName(attachment.name)) {\n return <PastedTextChip attachment={attachment} onRemove={onRemove} />;\n }\n\n const isImage = !!imageSrc;\n\n return (\n <div\n className={cn(\n \"group relative overflow-hidden border border-border/70 bg-muted/50 text-foreground\",\n isImage\n ? \"h-20 w-20 rounded-xl shadow-[0_12px_30px_-18px_rgba(0,0,0,0.7)]\"\n : \"inline-flex max-w-[220px] items-center gap-2 rounded-lg px-2.5 py-2 text-xs\",\n )}\n >\n {isImage ? (\n <>\n <img\n src={imageSrc}\n alt={attachment.name}\n className=\"h-full w-full object-cover\"\n />\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent px-2 py-1.5\">\n <div className=\"truncate text-[10px] font-medium text-white/95\">\n {attachment.name}\n </div>\n </div>\n </>\n ) : (\n <>\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-background text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\">\n {attachment.name.split(\".\").pop() || \"file\"}\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{attachment.name}</div>\n <div className=\"text-[11px] text-muted-foreground\">\n {attachment.contentType || attachment.type}\n </div>\n </div>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => onRemove(attachment.id)}\n className={cn(\n \"absolute flex h-6 w-6 items-center justify-center rounded-full border border-border/60 bg-background/95 text-muted-foreground shadow-sm transition hover:text-foreground\",\n isImage\n ? \"right-1.5 top-1.5 opacity-100 md:opacity-0 md:group-hover:opacity-100\"\n : \"right-1.5 top-1.5\",\n )}\n aria-label={`Remove ${attachment.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\nfunction ComposerAttachmentPreviewStrip() {\n const attachments = useComposer((state) => state.attachments);\n const aui = useAui();\n\n const handleRemove = useCallback(\n (id: string) => {\n void aui.composer().attachment({ id }).remove();\n },\n [aui],\n );\n\n if (attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 px-2 pt-2\">\n {attachments.map((attachment) => (\n <ComposerAttachmentPreviewCard\n key={attachment.id}\n attachment={attachment}\n onRemove={handleRemove}\n />\n ))}\n </div>\n );\n}\n\n// Provides the parent's combined running state to tool-call renderers so they\n// can stop spinning when the user clicks stop. `thread.isRunning` alone misses\n// the force-stopped case; `part.result === undefined` alone ignores stop.\nconst ChatRunningContext = React.createContext(false);\n\n// ─── Tool Call Display ──────────────────────────────────────────────────────\n// Shared presentational component for rendering a tool call pill + result.\n// Used by both the normal message path (ToolCallFallback) and the reconnect\n// stream path (ReconnectStreamMessage). All state is passed as props — no\n// assistant-ui hooks here.\n\ntype ToolDetailSection = \"input\" | \"result\";\ntype ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction toolArgsPreview(args: Record<string, unknown>): string {\n return Object.entries(args)\n .map(([key, value]) => {\n const singleLine = stringifyToolValue(value).replace(/\\s+/g, \" \").trim();\n const preview =\n singleLine.length > 96 ? `${singleLine.slice(0, 96)}...` : singleLine;\n return `${key}=${preview}`;\n })\n .join(\", \");\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nfunction toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nfunction toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countTextMatches(text: string, query: string): number {\n const needle = query.trim();\n if (!needle) return 0;\n return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), \"gi\")))\n .length;\n}\n\nfunction renderHighlightedSearchText(\n text: string,\n query: string,\n): React.ReactNode {\n const needle = query.trim();\n if (!needle) return text;\n const regex = new RegExp(escapeRegExp(needle), \"gi\");\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text))) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n if (match[0].length === 0) regex.lastIndex += 1;\n }\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return parts;\n}\n\nfunction ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {\n const [expanded, setExpanded] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const matchCount = useMemo(\n () => countTextMatches(payload.text, search),\n [payload.text, search],\n );\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(payload.copyText);\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <div className=\"rounded-md border border-border/50 bg-background/60\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-[11px] font-medium text-foreground/85\">\n {payload.title}\n </span>\n {payload.lang !== \"text\" && (\n <span className=\"shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground\">\n {payload.lang}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setSearchOpen((v) => !v)}\n aria-label={`Search ${payload.title.toLowerCase()}`}\n aria-pressed={searchOpen}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\",\n searchOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSearch size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={expanded ? \"Shrink code viewer\" : \"Expand code viewer\"}\n aria-pressed={expanded}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {expanded ? (\n <IconArrowsMinimize size={12} />\n ) : (\n <IconArrowsMaximize size={12} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n {searchOpen && (\n <div className=\"flex items-center gap-2 border-b border-border/50 px-2.5 py-2\">\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Find\"\n className=\"h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring\"\n />\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {search.trim() ? matchCount : \"\"}\n </span>\n </div>\n )}\n <div\n className={cn(\n \"agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground\",\n expanded ? \"max-h-[70vh]\" : \"max-h-72\",\n )}\n >\n {search.trim() ? (\n <pre>\n <code>{renderHighlightedSearchText(payload.text, search)}</code>\n </pre>\n ) : (\n <HighlightedCodeBlock code={payload.text} lang={payload.lang} />\n )}\n </div>\n </div>\n );\n}\n\nfunction activityTrailFromMetadata(message: unknown): ActivityStep[] {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { activityTrail?: unknown };\n activityTrail?: unknown;\n }\n | undefined;\n const raw = meta?.custom?.activityTrail ?? meta?.activityTrail;\n if (!Array.isArray(raw)) return [];\n return raw\n .map((item, index): ActivityStep | null => {\n if (!item || typeof item !== \"object\") return null;\n const label = (item as { label?: unknown }).label;\n const tool = (item as { tool?: unknown }).tool;\n if (typeof label !== \"string\" || !label.trim()) return null;\n return {\n id: `trail-${index}-${label}`,\n label: label.trim(),\n ...(typeof tool === \"string\" && tool.trim()\n ? { tool: tool.trim() }\n : {}),\n };\n })\n .filter((item): item is ActivityStep => item !== null);\n}\n\nfunction RunActivityTrail({ steps }: { steps: ActivityStep[] }) {\n const [open, setOpen] = useState(false);\n if (steps.length === 0) return null;\n const visibleSteps = steps.slice(-6);\n return (\n <div className=\"mt-1.5\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n size={12}\n className={cn(\"transition-transform\", open && \"rotate-180\")}\n />\n Steps\n </button>\n {open && (\n <div className=\"mt-1 rounded-md border border-border/60 bg-muted/25 px-2.5 py-2 text-[11px] text-muted-foreground\">\n <div className=\"space-y-1\">\n {visibleSteps.map((step) => (\n <div key={step.id} className=\"flex min-w-0 items-center gap-2\">\n <IconCheck className=\"h-3 w-3 shrink-0 text-emerald-500\" />\n <span className=\"truncate\">{step.label}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n isRunning,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n isRunning: boolean;\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const argsStr = isAgentCall ? \"\" : toolArgsPreview(args);\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : toolName;\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n\n return (\n <div className=\"my-1 overflow-hidden\">\n <button\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n )}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"h-3 w-3 text-destructive\" />\n ) : result !== undefined ? (\n <IconCheck className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <IconSquareFilled className=\"h-3 w-3 text-muted-foreground\" />\n )}\n </span>\n <span className=\"truncate min-w-0\">\n <span className=\"font-medium\">{displayName}</span>\n {argsStr && <span className=\"opacity-60 ml-1\">({argsStr})</span>}\n </span>\n {canExpand && (\n <IconChevronDown\n className={cn(\n \"ml-auto h-3 w-3 shrink-0 opacity-40\",\n isExpanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n {isExpanded && isAgentCall && hasStreamText && (\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </ReactMarkdown>\n </div>\n )}\n {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (\n <div className=\"mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground\">\n {inputPayload && <ToolDetailViewer payload={inputPayload} />}\n {resultPayload && <ToolDetailViewer payload={resultPayload} />}\n </div>\n )}\n </div>\n );\n}\n\nfunction ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n}: ToolCallMessagePartProps) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning = result === undefined && chatRunning;\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n isRunning={isRunning}\n />\n );\n}\n\n// ─── Reconnect Stream Message ───────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nfunction ReconnectStreamMessage({ content }: { content: ContentPart[] }) {\n const endRef = useRef<HTMLDivElement>(null);\n const chatRunning = React.useContext(ChatRunningContext);\n\n useEffect(() => {\n endRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }, [content]);\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <div\n key={`reconnect-text-${i}`}\n className=\"agent-markdown break-words\"\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {part.text}\n </ReactMarkdown>\n </div>\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n isRunning={part.result === undefined && chatRunning}\n />\n );\n }\n return null;\n })}\n <div ref={endRef} />\n </div>\n </div>\n );\n}\n\n// ─── Message Components ─────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\nexport function displayableUserMessageText(text: string): string {\n return text.replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\").trim();\n}\n\nexport function isAssistantUiStaleIndexError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /^tapClientLookup: Index \\d+ out of bounds \\(length: \\d+\\)$/.test(\n message,\n );\n}\n\ntype AssistantUiStaleIndexErrorBoundaryProps = {\n resetKey: string;\n componentName?: string;\n children: React.ReactNode;\n};\n\ntype AssistantUiStaleIndexErrorBoundaryState = {\n error: Error | null;\n retryToken: number;\n};\n\nexport class AssistantUiStaleIndexErrorBoundary extends React.Component<\n AssistantUiStaleIndexErrorBoundaryProps,\n AssistantUiStaleIndexErrorBoundaryState\n> {\n state: AssistantUiStaleIndexErrorBoundaryState = {\n error: null,\n retryToken: 0,\n };\n\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n static getDerivedStateFromError(\n error: unknown,\n ): Partial<AssistantUiStaleIndexErrorBoundaryState> {\n return {\n error: error instanceof Error ? error : new Error(String(error ?? \"\")),\n };\n }\n\n componentDidCatch(error: unknown, info: React.ErrorInfo) {\n if (!isAssistantUiStaleIndexError(error)) return;\n\n captureError(error, {\n tags: {\n component: this.props.componentName ?? \"AssistantChat\",\n recoverable: \"assistant-ui-stale-message-index\",\n },\n extra: {\n resetKey: this.props.resetKey,\n componentStack: info.componentStack,\n },\n });\n\n if (this.retryTimer) return;\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.setState((state) => {\n if (!state.error || !isAssistantUiStaleIndexError(state.error)) {\n return null;\n }\n return { error: null, retryToken: state.retryToken + 1 };\n });\n }, 0);\n }\n\n componentDidUpdate(prevProps: AssistantUiStaleIndexErrorBoundaryProps) {\n if (\n this.state.error &&\n isAssistantUiStaleIndexError(this.state.error) &&\n prevProps.resetKey !== this.props.resetKey\n ) {\n this.setState((state) => ({\n error: null,\n retryToken: state.retryToken + 1,\n }));\n }\n }\n\n componentWillUnmount() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n\n render() {\n if (this.state.error) {\n if (!isAssistantUiStaleIndexError(this.state.error)) {\n throw this.state.error;\n }\n return null;\n }\n\n return (\n <React.Fragment key={`${this.props.resetKey}:${this.state.retryToken}`}>\n {this.props.children}\n </React.Fragment>\n );\n }\n}\n\nexport function AssistantMessageListErrorBoundary({\n resetKey,\n children,\n}: {\n resetKey: string;\n children: React.ReactNode;\n}) {\n return (\n <AssistantUiStaleIndexErrorBoundary\n resetKey={resetKey}\n componentName=\"AssistantMessageList\"\n >\n {children}\n </AssistantUiStaleIndexErrorBoundary>\n );\n}\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" && \"image\" in p && !!p.image,\n );\n if (imagePart) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imagePart.image}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const hasDisplayableText =\n message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false;\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n {timestamp && (\n <div className=\"mt-1 flex justify-end\">\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\nconst CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nconst MessageActionsContext = React.createContext<{\n onForkChat?: () => void;\n} | null>(null);\n\nfunction MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n navigator.clipboard.writeText(text);\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n navigator.clipboard.writeText(runId);\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const activityTrail = activityTrailFromMetadata(msg);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const isComplete = !isLast || !chatRunning;\n const cpCtx = React.useContext(CheckpointContext);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: any[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find((cp: any) => cp.runId === runId);\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ checkpointId: checkpoint.id }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: {\n Fallback: ToolCallFallback,\n },\n }}\n />\n </div>\n {isComplete && activityTrail.length > 0 && (\n <RunActivityTrail steps={activityTrail} />\n )}\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Thinking Indicator ─────────────────────────────────────────────────────\n\ninterface ActivityStep {\n id: string;\n label: string;\n tool?: string;\n}\n\nfunction ActivitySteps({ steps }: { steps: ActivityStep[] }) {\n if (steps.length === 0) return null;\n const visibleSteps = steps.slice(-4);\n return (\n <div\n className=\"max-w-[85%] rounded-md border border-border/60 bg-muted/30 px-2.5 py-2 text-xs text-muted-foreground\"\n aria-live=\"polite\"\n >\n <div className=\"space-y-1\">\n {visibleSteps.map((step, index) => {\n const isCurrent = index === visibleSteps.length - 1;\n return (\n <div key={step.id} className=\"flex min-w-0 items-center gap-2\">\n {isCurrent ? (\n <IconLoader2 className=\"h-3 w-3 shrink-0 animate-spin\" />\n ) : (\n <IconCheck className=\"h-3 w-3 shrink-0 text-emerald-500\" />\n )}\n <span className=\"truncate\">{step.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ThinkingIndicator({ label = \"Thinking\" }: { label?: string } = {}) {\n const [dots, setDots] = useState(0);\n useEffect(() => {\n const interval = setInterval(() => {\n setDots((d) => (d + 1) % 4);\n }, 400);\n return () => clearInterval(interval);\n }, []);\n return (\n <div className=\"flex items-center text-muted-foreground\">\n <span className=\"text-xs\">\n {label}\n {\".\".repeat(dots)}\n </span>\n </div>\n );\n}\n\n// ─── Builder.io Connect CTA (shared by setup + usage-limit cards) ───────────\n//\n// Renders a single row with left-aligned copy and a right-aligned action.\n// Click opens the Builder CLI-auth popup via the shared\n// `useBuilderConnectFlow` hook (which owns the synchronous window.open,\n// the 2s status poll, and the focus-refresh). On success the hook broadcasts\n// a config-change event and this card clears its local `missingApiKey` gate\n// so the user can start chatting without a full-page reload.\n//\n// Desktop note: when this component runs inside the Electron shell, the\n// window.open call is intercepted by the main process's webview popup handler,\n// which opens the flow in an Electron BrowserWindow that shares the webview's\n// session. See packages/desktop-app/src/main/index.ts.\n\nfunction BuilderConnectCta({\n variant = \"primary\",\n onConnected,\n}: {\n variant?: \"primary\" | \"compact\";\n onConnected?: () => void;\n}) {\n const { configured, orgName, connecting, error, start } =\n useBuilderConnectFlow({\n trackingSource: \"assistant_chat_builder_cta\",\n onConnected,\n });\n\n const containerClass =\n variant === \"compact\"\n ? \"rounded-md border border-border px-3 py-2.5\"\n : \"flex items-center gap-3 rounded-md border border-border px-3 py-3\";\n\n if (configured) {\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">Builder.io</div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5\">\n {orgName ? `Connected — ${orgName}` : \"Connected\"}\n </p>\n </div>\n <span className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-emerald-500/10 px-2 py-0.5 text-[10px] font-medium text-emerald-500\">\n <IconCheck size={10} />\n Connected\n </span>\n </div>\n );\n }\n\n return (\n <div className={containerClass}>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">\n Connect Builder.io\n </div>\n <p className=\"text-[11px] text-muted-foreground mt-0.5 max-w-[220px]\">\n Free credits for LLM, hosting, and more — no API key needed\n </p>\n {error && <p className=\"mt-1 text-[10px] text-destructive\">{error}</p>}\n </div>\n <button\n type=\"button\"\n onClick={start}\n disabled={connecting}\n className=\"ml-auto inline-flex items-center gap-1 shrink-0 rounded-md bg-foreground px-3 py-1.5 text-[11px] font-medium no-underline text-background hover:opacity-90 disabled:opacity-60 disabled:cursor-wait\"\n aria-busy={connecting}\n >\n {connecting ? (\n <>\n <IconLoader2 size={10} className=\"animate-spin\" />\n Waiting…\n </>\n ) : (\n <>\n Connect\n <IconExternalLink size={10} />\n </>\n )}\n </button>\n </div>\n );\n}\n\n// ─── Builder Setup Card ─────────────────────────────────────────────────────\n\nfunction BuilderSetupCard({\n onConnected,\n bouncePulse,\n}: {\n onConnected?: () => void;\n bouncePulse?: number;\n}) {\n const openSettings = useCallback(() => {\n try {\n window.location.hash = \"llm\";\n } catch {}\n window.dispatchEvent(new CustomEvent(\"agent-panel:open-settings\"));\n }, []);\n\n const cardRef = useRef<HTMLDivElement>(null);\n // Replay the bounce keyframe each time bouncePulse increments. Toggling the\n // class off-then-on (with a forced reflow) restarts the animation even when\n // the value changes back-to-back.\n useEffect(() => {\n if (!bouncePulse) return;\n const el = cardRef.current;\n if (!el) return;\n el.classList.remove(\"animate-bounce-once\");\n void el.offsetWidth;\n el.classList.add(\"animate-bounce-once\");\n }, [bouncePulse]);\n\n return (\n <div\n ref={cardRef}\n className=\"mx-4 my-6 rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-4.5 w-4.5 text-muted-foreground\" />\n </div>\n <div>\n <h3 className=\"text-sm font-medium text-foreground\">\n Turn on the AI assistant\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n One click to connect Builder for free hosted access — no API keys\n needed.\n </p>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <BuilderConnectCta onConnected={onConnected} />\n <div className=\"text-center\">\n <button\n type=\"button\"\n onClick={openSettings}\n className=\"text-[11px] text-muted-foreground underline-offset-2 hover:text-foreground hover:underline\"\n >\n Or add your own API key\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Loop Limit Continue Card ───────────────────────────────────────────────\n\ntype LoopLimitInfo = { maxIterations?: number };\ntype RunErrorInfo = {\n message: string;\n details?: string;\n errorCode?: string;\n runId?: string;\n recoverable?: boolean;\n};\n\ninterface AgentLoopSettingsResponse {\n maxIterations: number;\n defaultMaxIterations: number;\n minMaxIterations: number;\n maxMaxIterations: number;\n scope: \"org\" | \"user\" | \"default\";\n source: \"org\" | \"user\" | \"env\" | \"default\";\n canUpdate: boolean;\n orgName?: string | null;\n role?: string | null;\n}\n\nfunction getLoopLimitMetadata(message: unknown): LoopLimitInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { loopLimit?: LoopLimitInfo };\n loopLimit?: LoopLimitInfo;\n }\n | undefined;\n const loopLimit = meta?.custom?.loopLimit ?? meta?.loopLimit;\n if (!loopLimit || typeof loopLimit !== \"object\") return null;\n return {\n ...(typeof loopLimit.maxIterations === \"number\"\n ? { maxIterations: loopLimit.maxIterations }\n : {}),\n };\n}\n\nfunction getRunErrorMetadata(message: unknown): RunErrorInfo | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { runError?: RunErrorInfo; runId?: unknown };\n runError?: RunErrorInfo;\n runId?: unknown;\n }\n | undefined;\n const runError = meta?.custom?.runError ?? meta?.runError;\n if (!runError || typeof runError !== \"object\") return null;\n const messageText =\n typeof runError.message === \"string\" ? runError.message : \"\";\n if (!messageText) return null;\n const runId =\n typeof runError.runId === \"string\"\n ? runError.runId\n : typeof meta?.custom?.runId === \"string\"\n ? meta.custom.runId\n : typeof meta?.runId === \"string\"\n ? meta.runId\n : undefined;\n return {\n message: messageText,\n ...(typeof runError.details === \"string\"\n ? { details: runError.details }\n : {}),\n ...(typeof runError.errorCode === \"string\"\n ? { errorCode: runError.errorCode }\n : {}),\n ...(runId ? { runId } : {}),\n ...(runError.recoverable ? { recoverable: true } : {}),\n };\n}\n\nfunction getRequestModeMetadata(message: unknown): AgentRequestMode | null {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: { requestMode?: unknown };\n requestMode?: unknown;\n }\n | undefined;\n const requestMode = meta?.custom?.requestMode ?? meta?.requestMode;\n return requestMode === \"act\" || requestMode === \"plan\" ? requestMode : null;\n}\n\nfunction isBuilderReconnectRunError(info: RunErrorInfo): boolean {\n const code = (info.errorCode ?? \"\").toLowerCase();\n const message = info.message.toLowerCase();\n const isAuthCode =\n code === \"authentication_error\" ||\n code === \"unauthorized\" ||\n code === \"http_401\" ||\n code === \"http_403\";\n return (\n code === \"builder_auth_error\" ||\n message.includes(\"builder authentication failed\") ||\n (isAuthCode && message.includes(\"invalid token\"))\n );\n}\n\nfunction isProviderQueryRunError(info: RunErrorInfo): boolean {\n const text = [info.errorCode, info.message, info.details]\n .filter(Boolean)\n .join(\"\\n\")\n .toLowerCase();\n return (\n text.includes(\"bigquery\") ||\n text.includes(\"sql\") ||\n text.includes(\"query\") ||\n text.includes(\"schema\") ||\n text.includes(\"syntax\") ||\n text.includes(\"unknown column\") ||\n text.includes(\"unknown table\") ||\n text.includes(\"type mismatch\")\n );\n}\n\nfunction getMessageText(message: unknown): string {\n const msg = (message as { message?: unknown })?.message ?? message;\n const content = (msg as { content?: unknown })?.content;\n if (Array.isArray(content)) {\n return content\n .filter((p: any) => p?.type === \"text\" && typeof p.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\\n\")\n .trim();\n }\n return typeof content === \"string\" ? content.trim() : \"\";\n}\n\nfunction RunErrorRecoveryCard({\n info,\n onContinue,\n onRetry,\n onFork,\n onDismiss,\n}: {\n info: RunErrorInfo;\n onContinue: () => void;\n onRetry: () => void;\n onFork?: () => void;\n onDismiss: () => void;\n}) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n const builderReconnect = useBuilderConnectFlow({\n trackingSource: \"assistant_chat_reconnect_error\",\n });\n const canRecover = info.recoverable === true;\n const shouldShowBuilderReconnect = isBuilderReconnectRunError(info);\n const isQueryError = isProviderQueryRunError(info);\n const copyLabel =\n info.runId || info.errorCode || info.details ? \"Copy debug\" : \"Copy\";\n const copyDetails = useCallback(() => {\n const text = [\n info.message,\n info.errorCode ? `Code: ${info.errorCode}` : \"\",\n info.runId ? `Run: ${info.runId}` : \"\",\n info.details ? `Details:\\n${info.details}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n }, [info]);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] p-3 text-sm\">\n <div className=\"flex items-start gap-2\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-700 dark:text-amber-300\">\n <IconAlertTriangle size={14} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-foreground\">\n {canRecover\n ? \"The agent stopped before finishing\"\n : \"The agent hit an error\"}\n </div>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {info.message}\n </p>\n {shouldShowBuilderReconnect && (\n <p className=\"mt-2 text-xs leading-relaxed text-muted-foreground\">\n The current Builder.io or model-provider credential was rejected.\n Reconnect Builder.io, then retry this message.\n </p>\n )}\n {(info.runId || info.errorCode || info.details) && (\n <button\n type=\"button\"\n onClick={() => setDetailsOpen((v) => !v)}\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n size={12}\n className={cn(\n \"transition-transform\",\n detailsOpen && \"rotate-180\",\n )}\n />\n Details\n </button>\n )}\n {detailsOpen && (\n <div className=\"mt-2 rounded-md border border-border/60 bg-background/70 p-2 font-mono text-[11px] leading-relaxed text-muted-foreground\">\n {info.runId && <div>run: {info.runId}</div>}\n {info.errorCode && <div>code: {info.errorCode}</div>}\n {info.details && (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n {info.details}\n </pre>\n )}\n </div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onDismiss}\n aria-label=\"Dismiss\"\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n <IconX size={14} />\n </button>\n </div>\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {shouldShowBuilderReconnect && (\n <button\n type=\"button\"\n onClick={builderReconnect.start}\n disabled={builderReconnect.connecting}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:cursor-wait disabled:opacity-70\"\n >\n {builderReconnect.connecting ? (\n <IconLoader2 size={13} className=\"animate-spin\" />\n ) : (\n <IconExternalLink size={13} />\n )}\n {builderReconnect.connecting\n ? \"Connecting Builder.io\"\n : \"Reconnect Builder.io\"}\n </button>\n )}\n {canRecover && (\n <>\n <button\n type=\"button\"\n onClick={onContinue}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Continue\n </button>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconRefresh size={13} />\n {isQueryError ? \"Diagnose and retry\" : \"Retry\"}\n </button>\n </>\n )}\n {canRecover && onFork && (\n <button\n type=\"button\"\n onClick={onFork}\n title=\"Fork this conversation into a separate chat thread.\"\n aria-label=\"Fork this conversation into a separate chat thread\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n <IconGitFork size={13} />\n Fork chat\n </button>\n )}\n <button\n type=\"button\"\n onClick={copyDetails}\n className=\"ml-auto inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-xs font-medium text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n >\n {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}\n {copied ? \"Copied\" : copyLabel}\n </button>\n </div>\n {shouldShowBuilderReconnect && builderReconnect.error && (\n <p className=\"mt-2 text-xs leading-relaxed text-red-500\">\n {builderReconnect.error}\n </p>\n )}\n </div>\n );\n}\n\nfunction LoopLimitContinueCard({\n info,\n onContinue,\n}: {\n info: LoopLimitInfo;\n onContinue: () => void;\n}) {\n const [settings, setSettings] = useState<AgentLoopSettingsResponse | null>(\n null,\n );\n const [value, setValue] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const load = useCallback(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/agent-loop-settings\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data: AgentLoopSettingsResponse | null) => {\n if (cancelled || !data) return;\n setSettings(data);\n setValue(String(data.maxIterations));\n })\n .catch(() => {\n if (!cancelled) setValue(String(info.maxIterations ?? \"\"));\n });\n return () => {\n cancelled = true;\n };\n }, [info.maxIterations]);\n\n useEffect(() => load(), [load]);\n\n const currentLimit = settings?.maxIterations ?? info.maxIterations;\n const numericValue = Number(value);\n const hasPendingChange =\n !!settings &&\n settings.canUpdate &&\n Number.isInteger(numericValue) &&\n numericValue !== settings.maxIterations;\n const scopeLabel =\n settings?.scope === \"org\"\n ? settings.orgName\n ? `${settings.orgName} org`\n : \"org\"\n : \"your account\";\n\n const saveLimit = useCallback(async (): Promise<boolean> => {\n if (!settings?.canUpdate) return false;\n setSaving(true);\n setSaved(false);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/agent-loop-settings\"),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ maxIterations: numericValue }),\n },\n );\n const body = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(body?.error ?? `Save failed (${res.status})`);\n }\n setSettings(body as AgentLoopSettingsResponse);\n setValue(String((body as AgentLoopSettingsResponse).maxIterations));\n setSaved(true);\n window.dispatchEvent(\n new CustomEvent(\"agent-loop-settings:changed\", { detail: body }),\n );\n setTimeout(() => setSaved(false), 2000);\n return true;\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Save failed\");\n return false;\n } finally {\n setSaving(false);\n }\n }, [numericValue, settings?.canUpdate]);\n\n const handleContinue = useCallback(async () => {\n if (hasPendingChange) {\n const ok = await saveLimit();\n if (!ok) return;\n }\n onContinue();\n }, [hasPendingChange, onContinue, saveLimit]);\n\n const openSettings = useCallback(() => {\n try {\n window.location.hash = \"agent-limits\";\n } catch {}\n window.dispatchEvent(new CustomEvent(\"agent-panel:open-settings\"));\n }, []);\n\n return (\n <div className=\"rounded-lg border border-amber-500/25 bg-amber-500/[0.06] px-3 py-3 shadow-sm\">\n <div className=\"flex items-start gap-2.5\">\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-amber-500/10 text-amber-600 dark:text-amber-400\">\n <IconGauge size={14} />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">\n Step limit reached\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n The agent used{\" \"}\n {currentLimit\n ? `${currentLimit.toLocaleString()} steps`\n : \"all available steps\"}\n . Keep going in a fresh turn, or raise the {scopeLabel} limit first.\n </p>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-end gap-2\">\n <label className=\"min-w-[116px] flex-1 space-y-1\">\n <span className=\"text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Max steps\n </span>\n <input\n type=\"number\"\n min={settings?.minMaxIterations ?? 1}\n max={settings?.maxMaxIterations ?? 1000}\n value={value}\n disabled={!settings?.canUpdate || saving}\n onChange={(e) => {\n setValue(e.target.value);\n setError(null);\n }}\n className=\"h-8 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none focus:ring-1 focus:ring-ring disabled:opacity-60\"\n />\n </label>\n <button\n type=\"button\"\n onClick={saveLimit}\n disabled={!hasPendingChange || saving}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-foreground hover:bg-accent disabled:opacity-50\"\n >\n {saving ? (\n <IconLoader2 size={12} className=\"animate-spin\" />\n ) : saved ? (\n <IconCheck size={12} />\n ) : (\n \"Save\"\n )}\n </button>\n <button\n type=\"button\"\n onClick={openSettings}\n className=\"inline-flex h-8 items-center gap-1 rounded-md border border-border px-2.5 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <IconSettings size={12} />\n Settings\n </button>\n <button\n type=\"button\"\n onClick={handleContinue}\n disabled={saving}\n className=\"ml-auto inline-flex h-8 items-center gap-1 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90 disabled:opacity-60\"\n >\n {hasPendingChange ? \"Save and keep going\" : \"Keep going\"}\n <IconArrowRight size={12} />\n </button>\n </div>\n\n {settings && !settings.canUpdate && (\n <p className=\"mt-2 text-[11px] text-muted-foreground\">\n Only organization owners and admins can change this limit.\n </p>\n )}\n {error && <p className=\"mt-2 text-[11px] text-destructive\">{error}</p>}\n </div>\n );\n}\n\nfunction PlanModeCallout({\n canImplementPlan,\n onImplementPlan,\n onSwitchToAct,\n}: {\n canImplementPlan: boolean;\n onImplementPlan: () => void;\n onSwitchToAct: () => void;\n}) {\n return (\n <div className=\"shrink-0 px-3 pt-2\">\n <div className=\"rounded-lg border border-blue-500/25 bg-blue-500/[0.06] px-3 py-2.5 shadow-sm\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-blue-500/10 text-blue-600 dark:text-blue-300\">\n <IconClipboardList size={15} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {canImplementPlan ? \"Plan ready\" : \"Plan mode is on\"}\n </p>\n <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">\n {canImplementPlan\n ? \"Switch to Act and run the proposed plan.\"\n : \"The next turn will stay read-only until you switch to Act.\"}\n </p>\n </div>\n {canImplementPlan ? (\n <button\n type=\"button\"\n onClick={onImplementPlan}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-foreground px-3 text-xs font-medium text-background hover:opacity-90\"\n >\n <IconPlayerPlay size={13} />\n Implement Plan\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onSwitchToAct}\n className=\"inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Act\n <IconArrowRight size={13} />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface AssistantChatHandle {\n /** Programmatically send a message into this chat */\n sendMessage(text: string): void;\n /** Queue a message to send after the current run finishes */\n queueMessage(text: string): void;\n /** Whether the chat is currently running */\n isRunning(): boolean;\n /** Focus the composer input */\n focusComposer(): void;\n /** Export the currently visible client-side thread for operations like fork. */\n exportThreadSnapshot(): ChatThreadSnapshot | null;\n}\n\nexport interface AssistantChatProps {\n /** API endpoint URL. Default: \"/_agent-native/agent-chat\" */\n apiUrl?: string;\n /** Stable tab identifier passed to the adapter for event correlation */\n tabId?: string;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /** Thread ID for SQL-backed persistence. When set, messages are loaded from and saved to the server. */\n threadId?: string;\n /** Resource scope to include with chat requests for server-side context. */\n contextScope?: ChatThreadScope | null;\n /** Placeholder text for empty state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Optional content rendered in the empty state, above the suggestion buttons.\n * Used by MultiTabAssistantChat to surface \"previous chats for this design\"\n * when the current thread is empty but the scope has other threads. */\n emptyStateAddon?: React.ReactNode;\n /** Whether to show the header bar. Default: true */\n showHeader?: boolean;\n /** CSS class for the outer container */\n className?: string;\n /** Callback when user clicks \"Use CLI\" button */\n onSwitchToCli?: () => void;\n /** Callback when message count changes */\n onMessageCountChange?: (count: number) => void;\n /** Callback to save thread data to the server (provided by useChatThreads) */\n onSaveThread?: (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => void;\n /** Callback to generate a title from the first user message */\n onGenerateTitle?: (threadId: string, message: string) => void;\n /** Optional content rendered just above the composer input */\n composerSlot?: React.ReactNode;\n /** Disable the composer for capability-gated surfaces while still showing history. */\n composerDisabled?: boolean;\n /** Placeholder to show while the composer is disabled by the host surface. */\n composerDisabledPlaceholder?: string;\n /** When true, skip the restore skeleton (used for freshly created threads with no messages) */\n isNewThread?: boolean;\n /** Called when a slash command (e.g. /clear, /help) is executed */\n onSlashCommand?: (command: string) => void;\n /** Current execution mode (build/plan) */\n execMode?: \"build\" | \"plan\";\n /** Callback to change execution mode */\n onExecModeChange?: (mode: \"build\" | \"plan\") => void;\n /** Disable Plan mode while leaving Act mode available. */\n planModeDisabled?: boolean;\n /** Explanation shown next to the disabled Plan option. */\n planModeDisabledReason?: string;\n /** Selected model override for this conversation (undefined = use server default) */\n selectedModel?: string;\n /** Default model from server config (shown in picker when no override is set) */\n defaultModel?: string;\n /** Selected engine override for this conversation */\n selectedEngine?: string;\n /** Selected reasoning effort override for this conversation */\n selectedEffort?: ReasoningEffort;\n /** Available engine/model list for the model picker */\n availableModels?: Array<{\n engine: string;\n label: string;\n models: string[];\n configured: boolean;\n }>;\n /** Callback when user picks a model from the picker */\n onModelChange?: (model: string, engine: string) => void;\n /** Callback when user picks a reasoning effort from the picker */\n onEffortChange?: (effort: ReasoningEffort) => void;\n /** Callback when user clicks \"Fork Chat\" in the message actions menu */\n onForkChat?: () => void;\n}\n\nexport const CHAT_STORAGE_PREFIX = \"agent-chat:\";\n\n/** Remove persisted chat for a given tabId (or \"default\"). */\nexport function clearChatStorage(tabId?: string) {\n try {\n sessionStorage.removeItem(`${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`);\n } catch {}\n}\n\n/**\n * Ensure all messages in a thread repository have required fields.\n * assistant-ui accesses `message.metadata.submittedFeedback` and\n * `lastMessage.status.type` without null-checking, so server-constructed\n * messages missing these fields crash.\n */\nfunction ensureMessageMetadata(repo: any): any {\n if (!repo?.messages || !Array.isArray(repo.messages)) return repo;\n for (const entry of repo.messages) {\n // Handle both wrapped ({ message: { ... } }) and flat ({ role, ... }) formats\n const msg = entry?.message ?? entry;\n if (!msg) continue;\n if (!msg.metadata) {\n msg.metadata = {};\n }\n if (msg.role === \"assistant\") {\n const statusType =\n msg.status && typeof msg.status === \"object\"\n ? (msg.status as { type?: unknown }).type\n : undefined;\n const isTerminal =\n statusType === \"complete\" || statusType === \"incomplete\";\n if (!isTerminal) {\n const runError =\n msg.metadata?.custom?.runError ?? msg.metadata?.runError;\n msg.status = runError\n ? { type: \"incomplete\", reason: \"error\" }\n : { type: \"complete\", reason: \"stop\" };\n }\n }\n }\n return repo;\n}\n\n// Re-export for backwards compatibility\nimport {\n extractThreadMeta,\n normalizeThreadRepository,\n} from \"../agent/thread-data-builder.js\";\nexport { extractThreadMeta };\n\nconst AssistantChatInner = forwardRef<\n AssistantChatHandle,\n AssistantChatProps & { apiUrl: string }\n>(function AssistantChatInner(\n {\n emptyStateText,\n suggestions,\n emptyStateAddon,\n showHeader = true,\n onSwitchToCli,\n className,\n apiUrl,\n tabId,\n threadId,\n onMessageCountChange,\n onSaveThread,\n onGenerateTitle,\n composerSlot,\n composerDisabled = false,\n composerDisabledPlaceholder,\n isNewThread,\n onSlashCommand,\n execMode,\n onExecModeChange,\n planModeDisabled,\n planModeDisabledReason,\n selectedModel,\n defaultModel,\n selectedEngine,\n selectedEffort,\n availableModels,\n onModelChange,\n onEffortChange,\n onForkChat,\n },\n ref,\n) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const thread = useThread();\n const threadRuntime = useThreadRuntime();\n const composerRuntime = useComposerRuntime();\n const isRuntimeRunning = thread.isRunning;\n const messages = thread.messages;\n const messageListResetKey = useMemo(\n () => messages.map((message) => message.id).join(\"|\"),\n [messages],\n );\n\n // Chat-wide drag-and-drop: users expect to drop a file anywhere on the agent\n // sidebar (thread, header, composer) and have it attach — same as ChatGPT,\n // Claude.ai, Linear, Slack, etc. Tiptap's own `handleDrop` only fires inside\n // the contenteditable; drops on the message thread or the composer\n // attachment strip otherwise navigate to the file (browser default), which\n // is why \"upload does nothing\" — the chat refreshes to the dropped image.\n const [dropActive, setDropActive] = useState(false);\n const dropDepthRef = useRef(0);\n const handleChatDragEnter = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n dropDepthRef.current += 1;\n setDropActive(true);\n }, []);\n const handleChatDragOver = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n }, []);\n const handleChatDragLeave = useCallback((e: React.DragEvent) => {\n if (!Array.from(e.dataTransfer?.types ?? []).includes(\"Files\")) return;\n dropDepthRef.current = Math.max(0, dropDepthRef.current - 1);\n if (dropDepthRef.current === 0) setDropActive(false);\n }, []);\n const handleChatDrop = useCallback(\n (e: React.DragEvent) => {\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n dropDepthRef.current = 0;\n setDropActive(false);\n // Mirror TiptapComposer's paste/drop name-uniqueness so consecutive\n // screenshots (all named `image.png`) don't collide on the\n // SimpleImageAttachmentAdapter id.\n const attachments = files.map((file) => {\n if (!file.type.startsWith(\"image/\")) return file;\n const uniqueName = `${Date.now()}-${Math.random().toString(36).slice(2)}-${file.name}`;\n return new File([file], uniqueName, { type: file.type });\n });\n void Promise.all(\n attachments.map((file) => composerRuntime.addAttachment(file)),\n ).catch((error) => {\n console.error(\"Error adding dropped chat attachment:\", error);\n });\n },\n [composerRuntime],\n );\n\n // Patch the underlying assistant-ui MessageRepository so addOrUpdateMessage\n // can't throw \"Parent message not found\" mid-run. assistant-ui calls\n // `repository.clear()` from `runtime.import()` and from `resetHead(null)`,\n // and on a few async paths (history-adapter load, branch reset, repeat\n // imports) the repo can be cleared between the `append` that added the\n // user message and the `performRoundtrip` call that tries to record the\n // assistant placeholder against that user message's id. The internal-bug\n // throw turns into an unhandled rejection that Sentry captures from the\n // images.agent-native.com prompt composer (AGENT-NATIVE-BROWSER-18). Fix\n // it by relinking to the current head whenever the requested parent has\n // gone missing instead of throwing.\n useEffect(() => {\n const repo = (threadRuntime as any)?.__internal_threadBinding?.getState?.()\n ?.repository as\n | { addOrUpdateMessage?: (parentId: any, message: any) => void }\n | undefined;\n if (!repo || typeof repo.addOrUpdateMessage !== \"function\") return;\n const patched = repo as any;\n if (patched.__agentNativePatched) return;\n patched.__agentNativePatched = true;\n const original = repo.addOrUpdateMessage.bind(repo);\n repo.addOrUpdateMessage = function (parentId: any, message: any) {\n try {\n return original(parentId, message);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (parentId && msg.includes(\"Parent message not found\")) {\n const fallbackParent = (this as any).head?.current?.id ?? null;\n if (fallbackParent && fallbackParent !== parentId) {\n return original(fallbackParent, message);\n }\n return original(null, message);\n }\n throw err;\n }\n };\n }, [threadRuntime]);\n const [missingApiKey, setMissingApiKey] = useState(false);\n const isComposerDisabled = missingApiKey || composerDisabled;\n // Increments each time the user clicks the (disabled) composer while no LLM\n // is connected — `BuilderSetupCard` watches this to replay a one-shot bounce.\n const [missingKeyBouncePulse, setMissingKeyBouncePulse] = useState(0);\n const [authError, setAuthError] = useState<{\n sessionExpired?: boolean;\n } | null>(null);\n const [authSessionAvailable, setAuthSessionAvailable] = useState(false);\n const [queuedMessages, setQueuedMessages] = useState<\n Array<{\n id: string;\n text: string;\n images?: string[];\n attachments?: QueuedAttachment[];\n references?: Reference[];\n requestMode?: AgentRequestMode;\n }>\n >([]);\n // Tracks the JSON of the last queue we successfully persisted so the\n // debounced save effect can skip no-op writes (e.g. restore-from-server\n // on mount, or queue state that hasn't actually changed).\n const lastPersistedQueueRef = useRef<string>(\"[]\");\n const [showContinue, setShowContinue] = useState(false);\n const [loopLimitInfo, setLoopLimitInfo] = useState<LoopLimitInfo | null>(\n null,\n );\n const [runErrorInfo, setRunErrorInfo] = useState<RunErrorInfo | null>(null);\n const [dismissedRunErrorKey, setDismissedRunErrorKey] = useState<\n string | null\n >(null);\n const userStoppedRunRef = useRef<{\n at: number;\n runId?: string;\n } | null>(null);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [reconnectContent, setReconnectContent] = useState<ContentPart[]>([]);\n const [activityLabel, setActivityLabel] = useState<string | null>(null);\n const activityStepIdCounter = useRef(0);\n // When stop is clicked during reconnect, keep content visible (don't wipe it)\n const [reconnectFrozen, setReconnectFrozen] = useState(false);\n const reconnectRunIdRef = useRef<string | null>(null);\n const reconnectAbortRef = useRef<AbortController | null>(null);\n // Nuclear stop: user clicked stop. Clears the stop button/indicator AND\n // lets new submissions go through immediately — prevents the \"stuck\n // queueing forever\" state where isReconnecting or isRuntimeRunning gets\n // wedged (e.g. after a tab refresh + stop during reconnect).\n const [forceStopped, setForceStopped] = useState(false);\n // Real running state — drives submission/queue gating. Treat reconnecting\n // to an active run the same as running, UNLESS the user has explicitly\n // clicked stop (forceStopped).\n const isRunning = !forceStopped && (isRuntimeRunning || isReconnecting);\n // UI-only running state — drives the stop button and thinking indicator.\n const showRunningInUI = isRunning;\n const wasRunningRef = useRef(false);\n const lastBroadcastRunningRef = useRef(isRunning);\n const tiptapRef = useRef<TiptapComposerHandle>(null);\n const [activitySteps, setActivitySteps] = useState<ActivityStep[]>([]);\n\n useEffect(() => {\n if (lastBroadcastRunningRef.current === isRunning) return;\n lastBroadcastRunningRef.current = isRunning;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning, tabId: tabId || threadId },\n }),\n );\n }, [isRunning, tabId, threadId]);\n\n // ─── Chat persistence ──────────────────────────────────────────────\n const hasRestoredRef = useRef(false);\n const [isRestoring, setIsRestoring] = useState(!!threadId && !isNewThread);\n const onSaveThreadRef = useRef(onSaveThread);\n onSaveThreadRef.current = onSaveThread;\n const onGenerateTitleRef = useRef(onGenerateTitle);\n onGenerateTitleRef.current = onGenerateTitle;\n const titleGeneratedRef = useRef(false);\n\n const importThreadData = useCallback(\n (threadData: unknown, options?: { markTitleGenerated?: boolean }): any => {\n const repo = normalizeThreadRepository(\n typeof threadData === \"string\" ? JSON.parse(threadData) : threadData,\n );\n if (repo?.messages?.length > 0) {\n let shouldImport = true;\n try {\n shouldImport = shouldImportServerThreadData(\n normalizeThreadRepository(threadRuntime.export()),\n repo,\n );\n } catch {\n shouldImport = true;\n }\n if (shouldImport) {\n if (options?.markTitleGenerated) {\n titleGeneratedRef.current = true;\n }\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n if (Array.isArray(repo?.queuedMessages)) {\n setQueuedMessages(repo.queuedMessages);\n lastPersistedQueueRef.current = JSON.stringify(repo.queuedMessages);\n }\n return repo;\n },\n [threadRuntime],\n );\n\n const refreshThreadFromServer = useCallback(async (): Promise<any | null> => {\n if (!threadId) return null;\n try {\n const refreshRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!refreshRes.ok) return null;\n const refreshData = await refreshRes.json();\n if (!refreshData.threadData) return null;\n return importThreadData(refreshData.threadData);\n } catch {\n return null;\n }\n }, [apiUrl, importThreadData, threadId]);\n\n const wasRecentlyStoppedRun = useCallback((runId?: string): boolean => {\n const stopped = userStoppedRunRef.current;\n return Boolean(\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !runId || stopped.runId === runId),\n );\n }, []);\n\n const startReconnectToRun = useCallback(\n (runInfo: ActiveRunLookup): boolean => {\n if (!threadId || !runInfo.runId || runInfo.status !== \"running\") {\n return false;\n }\n const runId = String(runInfo.runId);\n if (wasRecentlyStoppedRun(runId)) return false;\n if (reconnectRunIdRef.current === runId) return true;\n\n reconnectRunIdRef.current = runId;\n setIsReconnecting(true);\n setReconnectFrozen(false);\n setReconnectContent([]);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: true, tabId: tabId || threadId },\n }),\n );\n\n const abortCtrl = new AbortController();\n reconnectAbortRef.current = abortCtrl;\n\n const watchdog = setInterval(async () => {\n try {\n const res = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) {\n abortCtrl.abort();\n clearInterval(watchdog);\n return;\n }\n const info = (await res.json()) as ActiveRunLookup;\n if (info.status !== \"running\" || activeRunLooksStale(info)) {\n abortCtrl.abort();\n clearInterval(watchdog);\n }\n } catch {\n // Network blip — keep polling.\n }\n }, 1000);\n\n let reconnectTimedOut = false;\n const maxReconnectTimer = setTimeout(() => {\n reconnectTimedOut = true;\n abortCtrl.abort();\n clearInterval(watchdog);\n }, 20_000);\n\n const streamReconnect = async () => {\n let noProgressDuringReconnect = false;\n let latestContent: ContentPart[] = [];\n try {\n const sseRes = await fetch(\n `${apiUrl}/runs/${encodeURIComponent(runId)}/events?after=0`,\n { signal: abortCtrl.signal },\n );\n if (sseRes.ok && sseRes.body) {\n const content: ContentPart[] = [];\n latestContent = content;\n const toolCallCounter = { value: 0 };\n\n let rafPending = false;\n let latestSnapshot: ContentPart[] = [];\n const scheduleUpdate = (snapshot: ContentPart[]) => {\n latestSnapshot = snapshot;\n if (rafPending) return;\n rafPending = true;\n requestAnimationFrame(() => {\n rafPending = false;\n setReconnectContent(latestSnapshot);\n });\n };\n\n await readSSEStreamRaw(\n sseRes.body,\n content,\n toolCallCounter,\n tabId,\n scheduleUpdate,\n );\n setReconnectContent([...content]);\n }\n } catch (err) {\n if (\n err instanceof AgentAutoContinueSignal &&\n err.reason === \"no_progress\"\n ) {\n noProgressDuringReconnect = true;\n } else if (\n reconnectTimedOut &&\n err instanceof Error &&\n err.name === \"AbortError\"\n ) {\n noProgressDuringReconnect = true;\n }\n } finally {\n clearInterval(watchdog);\n clearTimeout(maxReconnectTimer);\n }\n\n if (noProgressDuringReconnect && reconnectRunIdRef.current === runId) {\n captureError(new Error(\"agent-chat:reconnect_no_progress\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"reconnect_no_progress\",\n reconnectTimedOut: String(reconnectTimedOut),\n },\n extra: {\n runId,\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n contentLength: latestContent.length,\n },\n });\n try {\n await fetch(`${apiUrl}/runs/${encodeURIComponent(runId)}/abort`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason: \"no_progress\" }),\n });\n } catch {\n // Best effort — the important part is unwinding the UI.\n }\n setReconnectContent([...latestContent]);\n setReconnectFrozen(latestContent.length > 0);\n setRunErrorInfo({\n message:\n \"The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.\",\n errorCode: \"reconnect_no_progress\",\n recoverable: true,\n runId,\n });\n setDismissedRunErrorKey(null);\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n return;\n }\n\n setReconnectFrozen(true);\n let loaded = false;\n for (let attempt = 0; attempt < 10; attempt++) {\n await new Promise((r) => setTimeout(r, 500));\n if (reconnectRunIdRef.current !== runId) break;\n const repo = await refreshThreadFromServer();\n if (repoHasAssistantMessage(repo)) {\n setReconnectContent([]);\n setReconnectFrozen(false);\n loaded = true;\n break;\n }\n }\n\n if (reconnectRunIdRef.current === runId) {\n reconnectAbortRef.current = null;\n setIsReconnecting(false);\n reconnectRunIdRef.current = null;\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: false, tabId: tabId || threadId },\n }),\n );\n }\n if (!loaded) {\n await refreshThreadFromServer();\n }\n };\n\n void streamReconnect();\n return true;\n },\n [apiUrl, refreshThreadFromServer, tabId, threadId, wasRecentlyStoppedRun],\n );\n\n const reconnectActiveRunForThread =\n useCallback(async (): Promise<boolean> => {\n if (!threadId) return false;\n try {\n const runRes = await fetch(\n `${apiUrl}/runs/active?threadId=${encodeURIComponent(threadId)}`,\n );\n if (!runRes.ok) return false;\n const runInfo = (await runRes.json()) as ActiveRunLookup;\n if (\n !runInfo.active ||\n runInfo.status !== \"running\" ||\n activeRunLooksStale(runInfo)\n ) {\n await refreshThreadFromServer();\n return false;\n }\n return startReconnectToRun(runInfo);\n } catch {\n return false;\n }\n }, [apiUrl, refreshThreadFromServer, startReconnectToRun, threadId]);\n\n // Restore messages from server on mount (when threadId is set). The\n // server is the single source of truth — we don't hydrate from localStorage\n // first, so what the user sees in the chat panel always matches what the\n // history list (and the agent) sees on disk.\n useEffect(() => {\n if (hasRestoredRef.current) return;\n hasRestoredRef.current = true;\n\n if (threadId) {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n );\n if (!res.ok) return;\n const data = await res.json();\n if (data.threadData) {\n importThreadData(data.threadData, { markTitleGenerated: true });\n }\n // Also skip title generation if thread already has a title\n if (data.title) {\n titleGeneratedRef.current = true;\n }\n\n // Check if there's an active run for this thread (e.g. after hot\n // reload), and reconnect to it if it is still running.\n await reconnectActiveRunForThread();\n } catch {\n // Start fresh\n } finally {\n setIsRestoring(false);\n }\n })();\n } else {\n // Legacy: restore from sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n const saved = sessionStorage.getItem(storageKey);\n if (saved) {\n const repo = JSON.parse(saved);\n if (repo?.messages?.length > 0) {\n threadRuntime.import(ensureMessageMetadata(repo));\n }\n }\n } catch {}\n setIsRestoring(false);\n }\n }, [\n threadId,\n tabId,\n apiUrl,\n threadRuntime,\n importThreadData,\n reconnectActiveRunForThread,\n ]);\n\n // If assistant-ui stops the local runtime while the background server run is\n // still alive, immediately switch into the same reconnect path used after a\n // reload. Otherwise the composer unlocks, the next send hits a 409, and the\n // user sees \"still working\" even though the UI stopped updating.\n const prevRuntimeRunningForReconnectRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRuntimeRunning = prevRuntimeRunningForReconnectRef.current;\n prevRuntimeRunningForReconnectRef.current = isRuntimeRunning;\n if (\n !wasRuntimeRunning ||\n isRuntimeRunning ||\n !threadId ||\n forceStopped ||\n isReconnecting ||\n wasRecentlyStoppedRun()\n ) {\n return;\n }\n\n let cancelled = false;\n const timer = window.setTimeout(() => {\n if (!cancelled) {\n void reconnectActiveRunForThread();\n }\n }, 250);\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n forceStopped,\n isReconnecting,\n isRuntimeRunning,\n reconnectActiveRunForThread,\n threadId,\n wasRecentlyStoppedRun,\n ]);\n\n // Generate a title when the first user message is sent\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (titleGeneratedRef.current) return;\n if (messages.length === 0) return;\n\n const firstUserMsg = messages.find((m) => m.role === \"user\");\n if (!firstUserMsg) return;\n\n // Extract text from the first user message\n const text =\n \"content\" in firstUserMsg\n ? Array.isArray(firstUserMsg.content)\n ? firstUserMsg.content\n .filter((p: any) => p.type === \"text\")\n .map((p: any) => p.text)\n .join(\" \")\n : typeof firstUserMsg.content === \"string\"\n ? firstUserMsg.content\n : \"\"\n : \"\";\n\n if (!text.trim()) return;\n titleGeneratedRef.current = true;\n if (threadId) {\n onGenerateTitleRef.current?.(threadId, text.trim());\n }\n }, [messages, threadId]);\n\n // Periodically save thread data while the agent is running so refreshes\n // don't lose messages. Saves every 5 seconds while running.\n const savedTitleRef = useRef(\"\");\n const lastSaveTimeRef = useRef(0);\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (!isRunning) return;\n if (messages.length === 0) return;\n if (!threadId || !onSaveThreadRef.current) return;\n\n const now = Date.now();\n const timeSinceLastSave = now - lastSaveTimeRef.current;\n if (timeSinceLastSave < 5000) return;\n\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n\n lastSaveTimeRef.current = now;\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n }, [messages, isRunning, threadId, threadRuntime]);\n\n // Persist full thread data after each completed response\n useEffect(() => {\n if (!hasRestoredRef.current) return;\n if (isRunning) return;\n if (messages.length === 0) return;\n\n const repo = threadRuntime.export();\n\n if (threadId && onSaveThreadRef.current) {\n // Save to server via the hook callback\n const { title, preview } = extractThreadMeta(repo);\n savedTitleRef.current = title;\n onSaveThreadRef.current(threadId, {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n });\n } else {\n // Legacy: save to sessionStorage\n const storageKey = `${CHAT_STORAGE_PREFIX}${tabId || \"default\"}`;\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(repo));\n } catch {}\n }\n }, [messages, isRunning, threadId, tabId, threadRuntime]);\n\n useEffect(() => {\n onMessageCountChange?.(messages.length);\n }, [messages.length, onMessageCountChange]);\n\n // Persist queued messages to the server so they survive reloads. Debounced\n // to 300ms so typing-and-queuing-rapidly doesn't hammer the endpoint.\n // Stores them in thread_data.queuedMessages via POST /threads/:id/queued.\n useEffect(() => {\n if (!threadId) return;\n if (!hasRestoredRef.current) return;\n const serialized = JSON.stringify(queuedMessages);\n if (serialized === lastPersistedQueueRef.current) return;\n const timer = setTimeout(() => {\n (async () => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/queued`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ queuedMessages }),\n },\n );\n if (res.ok) {\n lastPersistedQueueRef.current = serialized;\n }\n } catch {\n // Best-effort — next queue change will retry.\n }\n })();\n }, 300);\n return () => clearTimeout(timer);\n }, [queuedMessages, threadId, apiUrl]);\n\n // Listen for missing API key events from the adapter\n useEffect(() => {\n const handler = () => setMissingApiKey(true);\n window.addEventListener(\"agent-chat:missing-api-key\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:missing-api-key\", handler);\n }, []);\n\n const handleBuilderConnected = useCallback(() => {\n setMissingApiKey(false);\n }, []);\n\n // Check on mount and whenever SettingsPanel dispatches\n // `agent-engine:configured-changed` so the gate flips live without reload.\n useEffect(() => {\n let cancelled = false;\n const check = async () => {\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/agent-engine/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ]);\n if (cancelled) return;\n // All three status endpoints failed — avoid flashing the gate on a\n // transient network error.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return;\n }\n const keys = (envKeys ?? []) as Array<{\n key: string;\n configured: boolean;\n }>;\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n builderStatus?.configured === true ||\n engineStatus?.configured === true;\n setMissingApiKey(!anyConfigured);\n };\n check();\n window.addEventListener(\"agent-engine:configured-changed\", check);\n return () => {\n cancelled = true;\n window.removeEventListener(\"agent-engine:configured-changed\", check);\n };\n }, []);\n\n // Listen for auth error events from the adapter\n const checkAuthSession = useCallback(async () => {\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/auth/session\"), {\n cache: \"no-store\",\n });\n if (!res.ok) return false;\n const data = await res.json().catch(() => null);\n const hasSession = !!data && !data.error;\n setAuthSessionAvailable(hasSession);\n if (hasSession) {\n setAuthError(null);\n }\n return hasSession;\n } catch {\n return false;\n }\n }, []);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as\n | {\n reason?: string;\n tabId?: string;\n threadId?: string;\n }\n | undefined;\n const eventTabId =\n typeof detail?.tabId === \"string\" ? detail.tabId : null;\n const eventThreadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : null;\n if (\n (eventTabId || eventThreadId) &&\n eventTabId !== tabId &&\n eventThreadId !== threadId\n ) {\n return;\n }\n setAuthSessionAvailable(false);\n setAuthError({ sessionExpired: detail?.reason === \"session-expired\" });\n void checkAuthSession();\n };\n window.addEventListener(\"agent-chat:auth-error\", handler);\n return () => window.removeEventListener(\"agent-chat:auth-error\", handler);\n }, [checkAuthSession, tabId, threadId]);\n\n useEffect(() => {\n if (!authError) return;\n // Auto-recovery (`checkAuthSession`) runs immediately + at 250ms. If the\n // card is still showing 3 seconds later, recovery failed and the user\n // is about to hit \"Refresh chat\" — that's the \"Reload UI required\"\n // symptom we want signal on.\n const stuckCapture = window.setTimeout(() => {\n captureError(new Error(\"agent-chat:auth_error_card_stuck\"), {\n tags: {\n context: \"agent-native-chat\",\n errorCode: \"auth_error_card\",\n sessionAvailable: String(authSessionAvailable),\n sessionExpired: String(!!authError.sessionExpired),\n },\n extra: {\n threadId: threadId ?? null,\n tabId: tabId ?? null,\n },\n });\n }, 3000);\n const handler = () => void checkAuthSession();\n const timer = window.setTimeout(handler, 250);\n window.addEventListener(\"focus\", handler);\n window.addEventListener(\"agent-engine:configured-changed\", handler);\n return () => {\n window.clearTimeout(stuckCapture);\n window.clearTimeout(timer);\n window.removeEventListener(\"focus\", handler);\n window.removeEventListener(\"agent-engine:configured-changed\", handler);\n };\n }, [authError, authSessionAvailable, checkAuthSession, tabId, threadId]);\n\n // Listen for loop-limit events from the adapter\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!tabId || detail?.tabId === tabId) {\n setLoopLimitInfo({\n ...(typeof detail?.maxIterations === \"number\"\n ? { maxIterations: detail.maxIterations }\n : {}),\n });\n setShowContinue(true);\n }\n };\n window.addEventListener(\"agent-chat:loop-limit\", handler);\n return () => window.removeEventListener(\"agent-chat:loop-limit\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as RunErrorInfo & {\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (!detail?.message) return;\n const stopped = userStoppedRunRef.current;\n if (\n stopped &&\n Date.now() - stopped.at < 10_000 &&\n (!stopped.runId || !detail.runId || stopped.runId === detail.runId)\n ) {\n return;\n }\n setRunErrorInfo({\n message: detail.message,\n ...(detail.details ? { details: detail.details } : {}),\n ...(detail.errorCode ? { errorCode: detail.errorCode } : {}),\n ...(detail.runId ? { runId: detail.runId } : {}),\n ...(detail.recoverable ? { recoverable: detail.recoverable } : {}),\n });\n setDismissedRunErrorKey(null);\n };\n window.addEventListener(\"agent-chat:run-error\", handler);\n return () => window.removeEventListener(\"agent-chat:run-error\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as {\n label?: string;\n tool?: string;\n tabId?: string;\n };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n if (typeof detail?.label === \"string\" && detail.label.trim()) {\n const label = detail.label.trim();\n const tool = detail.tool?.trim() || undefined;\n setActivityLabel(label);\n setActivitySteps((prev) => {\n const last = prev[prev.length - 1];\n if (last?.label === label && last.tool === tool) return prev;\n return [\n ...prev,\n {\n id: `${Date.now()}-${++activityStepIdCounter.current}`,\n label,\n ...(tool ? { tool } : {}),\n },\n ].slice(-6);\n });\n }\n };\n window.addEventListener(\"agent-chat:activity\", handler);\n return () => window.removeEventListener(\"agent-chat:activity\", handler);\n }, [tabId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail as { tabId?: string };\n if (tabId && detail?.tabId && detail.tabId !== tabId) return;\n setActivityLabel(null);\n setActivitySteps([]);\n };\n window.addEventListener(\"agent-chat:activity-clear\", handler);\n return () =>\n window.removeEventListener(\"agent-chat:activity-clear\", handler);\n }, [tabId]);\n\n useEffect(() => {\n if (!showRunningInUI) {\n setActivityLabel(null);\n setActivitySteps([]);\n }\n }, [showRunningInUI]);\n\n // Auto-dequeue: when agent finishes running, send the next queued message\n useEffect(() => {\n if (wasRunningRef.current && !isRunning && queuedMessages.length > 0) {\n const [next, ...rest] = queuedMessages;\n setQueuedMessages(rest);\n // Small delay to let the runtime settle after completion\n setTimeout(() => {\n void (async () => {\n // In serverless/cross-isolate deployments the client can receive the\n // terminal SSE event a beat before SQL has marked the previous run\n // complete. Starting the queued turn during that window can reconnect\n // to the old run and replay the old answer under the new prompt.\n await waitForThreadRunToClear(apiUrl, threadId);\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; image: string }\n > = [{ type: \"text\", text: next.text }];\n if (next.images) {\n for (const img of next.images) {\n content.push({ type: \"image\", image: img });\n }\n }\n threadRuntime.append({\n role: \"user\",\n content,\n ...(next.attachments && next.attachments.length > 0\n ? { attachments: next.attachments }\n : {}),\n ...createUserMessageRunConfig(next.references, next.requestMode),\n } as Parameters<typeof threadRuntime.append>[0]);\n })();\n }, 100);\n }\n wasRunningRef.current = isRunning;\n }, [apiUrl, isRunning, queuedMessages, threadId, threadRuntime]);\n\n // Clear frozen reconnect content + forceStopped only on the false→true\n // transition of isRuntimeRunning (i.e. a NEW run is actually starting).\n // Reacting to \"isRuntimeRunning is currently true\" would clear the\n // nuclear-stop flag immediately after the user clicks stop, since\n // cancellation is async and isRuntimeRunning is still true at that moment.\n const prevIsRuntimeRunningRef = useRef(isRuntimeRunning);\n useEffect(() => {\n const wasRunning = prevIsRuntimeRunningRef.current;\n prevIsRuntimeRunningRef.current = isRuntimeRunning;\n if (isRuntimeRunning && !wasRunning) {\n if (reconnectFrozen) {\n setReconnectFrozen(false);\n setReconnectContent([]);\n }\n if (forceStopped) {\n setForceStopped(false);\n }\n }\n }, [isRuntimeRunning, reconnectFrozen, forceStopped]);\n\n // Same transition guard for isReconnecting: only clear forceStopped on\n // the false→true edge (a new reconnect starting on page load).\n const prevIsReconnectingRef = useRef(isReconnecting);\n useEffect(() => {\n const wasReconnecting = prevIsReconnectingRef.current;\n prevIsReconnectingRef.current = isReconnecting;\n if (isReconnecting && !wasReconnecting && forceStopped) {\n setForceStopped(false);\n }\n }, [isReconnecting, forceStopped]);\n\n const addToQueue = useCallback(\n async (\n text: string,\n images?: string[],\n references?: Reference[],\n attachments?: ReadonlyArray<unknown>,\n requestMode?: AgentRequestMode,\n ) => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n setActivityLabel(null);\n setActivitySteps([]);\n userStoppedRunRef.current = null;\n // Selection context attached via Cmd+I is one-shot — clear it as soon\n // as the user actually sends a message so it can't be re-used.\n clearPendingSelection();\n // Sending a message is an explicit user action — always anchor to the\n // bottom so the new message and any reply land in view, even if the\n // user had scrolled up to read history. The sticky-bottom override\n // exists to stop streaming from yanking the viewport, not to swallow\n // direct sends.\n isNearBottomRef.current = true;\n setShowScrollToBottom(false);\n const queuedAttachments = await serializeQueuedAttachments(attachments);\n // Snapshot the exec mode at enqueue time when the caller didn't\n // pass an explicit override. Without this, a plan-mode message that\n // sits in the queue runs as 'act' if the user flips the global toggle\n // before the queue flushes — turning a read-only message into a write.\n const effectiveRequestMode: AgentRequestMode | undefined =\n requestMode ??\n (execMode === \"plan\"\n ? \"plan\"\n : execMode === \"build\"\n ? \"act\"\n : undefined);\n if (isRunning) {\n setQueuedMessages((prev) => [\n ...prev,\n {\n id:\n typeof crypto !== \"undefined\" && crypto.randomUUID\n ? crypto.randomUUID()\n : `q-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n text,\n images,\n attachments: queuedAttachments,\n references,\n requestMode: effectiveRequestMode,\n },\n ]);\n } else {\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; image: string }\n > = [{ type: \"text\", text }];\n if (images) {\n for (const img of images) {\n content.push({ type: \"image\", image: img });\n }\n }\n threadRuntime.append({\n role: \"user\",\n content,\n ...(queuedAttachments && queuedAttachments.length > 0\n ? { attachments: queuedAttachments }\n : {}),\n ...createUserMessageRunConfig(references, effectiveRequestMode),\n } as Parameters<typeof threadRuntime.append>[0]);\n }\n },\n [execMode, isRunning, threadRuntime],\n );\n\n // Expose imperative handle\n useImperativeHandle(\n ref,\n () => ({\n sendMessage(text: string) {\n addToQueue(text);\n },\n queueMessage(text: string) {\n addToQueue(text);\n },\n isRunning() {\n return thread.isRunning;\n },\n focusComposer() {\n tiptapRef.current?.focus();\n },\n exportThreadSnapshot() {\n if (messages.length === 0) return null;\n const repo = threadRuntime.export();\n const { title, preview } = extractThreadMeta(repo);\n return {\n threadData: JSON.stringify(repo),\n title,\n preview,\n messageCount: messages.length,\n };\n },\n }),\n [addToQueue, messages.length, thread.isRunning, threadRuntime],\n );\n\n // Track whether user has scrolled away from bottom\n const isNearBottomRef = useRef(true);\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n function onScroll() {\n if (!el) return;\n const threshold = 40;\n const nearBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n isNearBottomRef.current = nearBottom;\n setShowScrollToBottom(!nearBottom && messages.length > 0);\n }\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, [messages.length]);\n\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n isNearBottomRef.current = true;\n setShowScrollToBottom(false);\n }\n }, []);\n\n const scrollToBottomAfterPaint = useCallback(() => {\n scrollToBottom();\n requestAnimationFrame(() => {\n scrollToBottom();\n requestAnimationFrame(scrollToBottom);\n });\n setTimeout(scrollToBottom, 80);\n }, [scrollToBottom]);\n\n const scrollToBottomWhileLayoutSettles = useCallback(() => {\n scrollToBottomAfterPaint();\n const el = scrollRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return undefined;\n\n let stopped = false;\n const observer = new ResizeObserver(() => {\n if (!stopped) scrollToBottom();\n });\n observer.observe(el);\n const timeout = window.setTimeout(() => {\n stopped = true;\n observer.disconnect();\n scrollToBottom();\n }, 1600);\n\n return () => {\n stopped = true;\n window.clearTimeout(timeout);\n observer.disconnect();\n };\n }, [scrollToBottom, scrollToBottomAfterPaint]);\n\n // Scroll to bottom when a restored thread finishes loading\n const wasRestoringRef = useRef(isRestoring);\n useEffect(() => {\n const wasRestoring = wasRestoringRef.current;\n wasRestoringRef.current = isRestoring;\n if (wasRestoring && !isRestoring) {\n return scrollToBottomWhileLayoutSettles();\n }\n }, [isRestoring, scrollToBottomWhileLayoutSettles]);\n\n // Auto-scroll on new messages or queued messages (only if near bottom)\n useEffect(() => {\n const el = scrollRef.current;\n if (el && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [messages, queuedMessages, scrollToBottomAfterPaint]);\n\n useEffect(() => {\n if (!isRunning && isNearBottomRef.current) {\n scrollToBottomAfterPaint();\n }\n }, [isRunning, scrollToBottomAfterPaint]);\n\n // Continuous auto-scroll while streaming (only if near bottom)\n useEffect(() => {\n if (!isRunning) return;\n const el = scrollRef.current;\n if (!el) return;\n const interval = setInterval(() => {\n if (isNearBottomRef.current) {\n el.scrollTop = el.scrollHeight;\n }\n }, 100);\n return () => clearInterval(interval);\n }, [isRunning]);\n\n const { isDevMode: cpDevMode } = useDevMode(apiUrl);\n const checkpointCtx = useMemo(\n () => ({ apiUrl, devMode: cpDevMode, threadId }),\n [apiUrl, cpDevMode, threadId],\n );\n const messageActionsCtx = useMemo(() => ({ onForkChat }), [onForkChat]);\n const lastMessageLoopLimit = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getLoopLimitMetadata(last);\n }, [messages]);\n const lastMessageRunError = useMemo(() => {\n const last = messages[messages.length - 1];\n if (!last || last.role !== \"assistant\") return null;\n return getRunErrorMetadata(last);\n }, [messages]);\n const lastUserText = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") return getMessageText(messages[i]);\n }\n return \"\";\n }, [messages]);\n const latestMessage = messages[messages.length - 1];\n const latestMessageRole = latestMessage?.role;\n const latestAssistantWasPlan =\n latestMessageRole === \"assistant\" &&\n getRequestModeMetadata(latestMessage) === \"plan\";\n const showPlanModeCallout =\n execMode === \"plan\" &&\n !planModeDisabled &&\n !isComposerDisabled &&\n !showRunningInUI;\n const canImplementPlan = showPlanModeCallout && latestAssistantWasPlan;\n const handleImplementPlan = useCallback(() => {\n onExecModeChange?.(\"build\");\n void addToQueue(\n \"Implement the plan.\",\n undefined,\n undefined,\n undefined,\n \"act\",\n );\n }, [addToQueue, onExecModeChange]);\n const handleSwitchToAct = useCallback(() => {\n onExecModeChange?.(\"build\");\n }, [onExecModeChange]);\n const visibleLoopLimit = showContinue\n ? (loopLimitInfo ?? lastMessageLoopLimit ?? {})\n : lastMessageLoopLimit;\n const visibleRunError = runErrorInfo ?? lastMessageRunError;\n const visibleRunErrorKey = visibleRunError\n ? `${visibleRunError.runId ?? \"\"}:${visibleRunError.errorCode ?? \"\"}:${visibleRunError.message}`\n : null;\n const shouldShowRunError =\n !!visibleRunError &&\n !showRunningInUI &&\n visibleRunErrorKey !== dismissedRunErrorKey &&\n !(\n userStoppedRunRef.current &&\n Date.now() - userStoppedRunRef.current.at < 10_000 &&\n (!userStoppedRunRef.current.runId ||\n !visibleRunError.runId ||\n userStoppedRunRef.current.runId === visibleRunError.runId)\n );\n\n return (\n <CheckpointContext.Provider value={checkpointCtx}>\n <MessageActionsContext.Provider value={messageActionsCtx}>\n <ChatRunningContext.Provider value={isRunning}>\n <div\n className={cn(\n \"relative flex flex-1 flex-col h-full min-h-0 text-foreground\",\n className,\n )}\n onDragEnter={handleChatDragEnter}\n onDragOver={handleChatDragOver}\n onDragLeave={handleChatDragLeave}\n onDrop={handleChatDrop}\n >\n {dropActive && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center rounded-md border-2 border-dashed border-primary/70 bg-primary/5 backdrop-blur-[1px]\"\n >\n <span className=\"rounded-md bg-background/90 px-3 py-1.5 text-xs font-medium text-foreground shadow-sm\">\n Drop to attach\n </span>\n </div>\n )}\n {showHeader && (\n <div className=\"flex h-11 shrink-0 items-center justify-between border-b border-border px-4\">\n <span className=\"text-[13px] font-medium text-muted-foreground\">\n Agent\n </span>\n <div className=\"flex items-center gap-1\">\n {onSwitchToCli && (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={onSwitchToCli}\n aria-label=\"Switch to CLI\"\n className=\"flex items-center gap-1 text-[12px] text-muted-foreground hover:text-foreground px-2 py-1 rounded-md hover:bg-accent\"\n >\n <IconTerminal className=\"h-3.5 w-3.5\" />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>Switch to CLI</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n )}\n\n {/* Messages area */}\n <div\n ref={scrollRef}\n className=\"flex-1 overflow-y-auto overflow-x-hidden min-h-0\"\n >\n {authError ? (\n <div className=\"flex flex-col items-center justify-center h-full px-4 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-destructive/10\">\n <IconLock className=\"h-5 w-5 text-destructive\" />\n </div>\n <div className=\"text-center max-w-[280px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n {authSessionAvailable\n ? \"Chat session needs refresh\"\n : authError.sessionExpired\n ? \"Session expired\"\n : \"Authentication required\"}\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {authSessionAvailable\n ? \"You're signed in, but this chat connection needs to reconnect.\"\n : authError.sessionExpired\n ? \"Your session may have expired. Log out and log back in to reconnect.\"\n : \"You need to log in to use the agent.\"}\n </p>\n </div>\n <div className=\"flex gap-2\">\n {!authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={() => {\n const ret =\n window.location.pathname + window.location.search;\n window.location.href =\n agentNativePath(\"/_agent-native/sign-in\") +\n `?return=${encodeURIComponent(ret)}`;\n }}\n className=\"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n >\n Log in\n </button>\n )}\n {authError.sessionExpired && !authSessionAvailable && (\n <button\n onClick={async () => {\n try {\n await fetch(\n agentNativePath(\"/_agent-native/auth/logout\"),\n {\n method: \"POST\",\n },\n );\n } catch {}\n window.location.reload();\n }}\n className=\"text-xs text-destructive hover:text-destructive/80 px-3 py-1.5 rounded-md border border-destructive/30 hover:bg-destructive/10\"\n >\n Log out\n </button>\n )}\n <button\n onClick={() => {\n setAuthError(null);\n window.location.reload();\n }}\n className={\n authSessionAvailable\n ? \"text-xs text-background bg-foreground hover:opacity-90 px-3 py-1.5 rounded-md\"\n : \"text-xs text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md border border-border hover:bg-accent\"\n }\n >\n Refresh chat\n </button>\n </div>\n </div>\n ) : missingApiKey && messages.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full px-2\">\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n </div>\n ) : isRestoring ? (\n <div className=\"flex flex-col gap-3 p-4\">\n <div className=\"flex justify-end\">\n <div className=\"h-8 w-32 rounded-lg bg-muted animate-pulse\" />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"h-4 w-48 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-64 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-40 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n ) : messages.length === 0 && !isReconnecting ? (\n <div className=\"flex flex-col items-center justify-center gap-4 py-16 px-4 h-full\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconMessage className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground text-center max-w-[240px]\">\n {emptyStateText ?? \"How can I help you?\"}\n </p>\n {emptyStateAddon}\n {suggestions && suggestions.length > 0 && (\n <div className=\"flex flex-col gap-1.5 w-full max-w-[280px]\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n onClick={() => {\n threadRuntime.append({\n role: \"user\",\n content: [{ type: \"text\", text: suggestion }],\n });\n }}\n className=\"w-full rounded-lg border border-border px-3 py-2 text-left text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n <div className=\"agent-thread-content flex flex-col gap-4 px-4 py-4\">\n <AssistantMessageListErrorBoundary\n resetKey={messageListResetKey}\n >\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n AssistantMessage,\n }}\n />\n </AssistantMessageListErrorBoundary>\n {missingApiKey && (\n <BuilderSetupCard\n onConnected={handleBuilderConnected}\n bouncePulse={missingKeyBouncePulse}\n />\n )}\n {visibleLoopLimit && !showRunningInUI && (\n <LoopLimitContinueCard\n info={visibleLoopLimit}\n onContinue={() => {\n setShowContinue(false);\n setLoopLimitInfo(null);\n addToQueue(\"Continue from where you left off.\");\n }}\n />\n )}\n {shouldShowRunError && visibleRunError && (\n <RunErrorRecoveryCard\n info={visibleRunError}\n onContinue={() => {\n setRunErrorInfo(null);\n addToQueue(\n \"Continue from where you stopped. Use the partial work above, verify what succeeded, and finish the original request. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. Prefer dedicated app actions over raw database edits when they exist.\",\n );\n }}\n onRetry={() => {\n setRunErrorInfo(null);\n addToQueue(\n lastUserText\n ? `Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\\n\\nOriginal request:\\n\\n${lastUserText}`\n : \"Retry the previous request from a clean approach. Do not rerun the exact same failed tool input unless the failure was transient or the user explicitly asked for an exact rerun. If a provider query failed because of schema, syntax, or type mismatch, diagnose the error and adjust the query first.\",\n );\n }}\n onFork={onForkChat}\n onDismiss={() => {\n if (visibleRunErrorKey) {\n setDismissedRunErrorKey(visibleRunErrorKey);\n }\n setRunErrorInfo(null);\n }}\n />\n )}\n {(isReconnecting || reconnectFrozen) &&\n reconnectContent.length > 0 && (\n <ReconnectStreamMessage content={reconnectContent} />\n )}\n {/* Always show the thinking indicator while the agent is working,\n including during reconnect. The indicator sits BELOW any\n already-streamed reconnect content so the user sees both\n \"what it did so far\" and \"it's still working\". Swap the label\n to \"Reconnecting\" during reconnect so the user knows the\n system is actively recovering, not just stuck. */}\n {showRunningInUI && (\n <>\n <ActivitySteps steps={activitySteps} />\n <ThinkingIndicator\n label={\n isReconnecting\n ? \"Reconnecting\"\n : (activityLabel ?? \"Thinking\")\n }\n />\n </>\n )}\n {queuedMessages.map((msg) => {\n const displayText = msg.text\n .replace(/<context>[\\s\\S]*?<\\/context>\\n?/g, \"\")\n .trim();\n return (\n <div key={msg.id} className=\"flex justify-end group\">\n <div className=\"relative max-w-[85%] rounded-lg bg-accent/50 text-foreground/60 px-3 py-2 text-sm leading-relaxed whitespace-pre-wrap break-words\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground mb-1 font-medium uppercase tracking-wide\">\n <IconClock className=\"h-3 w-3\" />\n Queued\n </div>\n {displayText}\n {msg.images && msg.images.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1.5\">\n {msg.images.map((img, j) => (\n <img\n key={j}\n src={img}\n alt=\"\"\n className=\"h-12 w-12 rounded object-cover border border-border/50\"\n />\n ))}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() =>\n setQueuedMessages((prev) =>\n prev.filter((m) => m.id !== msg.id),\n )\n }\n aria-label=\"Remove from queue\"\n className=\"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 group-hover:opacity-100 focus-visible:opacity-100 hover:text-foreground hover:bg-accent shadow-sm\"\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Scroll to bottom button */}\n {showScrollToBottom && (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n type=\"button\"\n onClick={scrollToBottom}\n className=\"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\"\n aria-label=\"Scroll to bottom\"\n >\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </button>\n </div>\n )}\n\n {composerSlot}\n {showPlanModeCallout && (\n <PlanModeCallout\n canImplementPlan={canImplementPlan}\n onImplementPlan={handleImplementPlan}\n onSwitchToAct={handleSwitchToAct}\n />\n )}\n <SelectionAttachedPill />\n {/* Input area */}\n <div\n className={cn(\n \"agent-composer-area shrink-0 px-3 py-2\",\n missingApiKey && \"cursor-pointer\",\n isComposerDisabled && \"opacity-70\",\n )}\n onClick={\n missingApiKey\n ? () => setMissingKeyBouncePulse((p) => p + 1)\n : undefined\n }\n >\n <ComposerPrimitive.Root className=\"flex flex-col rounded-lg border border-input bg-background focus-within:ring-1 focus-within:ring-ring\">\n <ComposerAttachmentPreviewStrip />\n <TiptapComposer\n focusRef={tiptapRef}\n disabled={isComposerDisabled}\n placeholder={\n missingApiKey\n ? \"Connect an AI engine above to start chatting…\"\n : composerDisabled\n ? (composerDisabledPlaceholder ??\n \"Open Desktop to use this chat.\")\n : isRunning\n ? queuedMessages.length > 0\n ? `${queuedMessages.length} queued — type another...`\n : \"Queue a message...\"\n : undefined\n }\n onSubmit={\n isRunning\n ? (text, references, attachments) =>\n void addToQueue(\n text,\n undefined,\n references.length > 0 ? references : undefined,\n attachments,\n )\n : undefined\n }\n onSlashCommand={onSlashCommand}\n execMode={execMode}\n onExecModeChange={onExecModeChange}\n planModeDisabled={planModeDisabled}\n planModeDisabledReason={planModeDisabledReason}\n selectedModel={selectedModel ?? defaultModel}\n selectedEffort={selectedEffort}\n availableModels={availableModels}\n onModelChange={onModelChange}\n onEffortChange={onEffortChange}\n draftScope={threadId || tabId}\n interceptBuildRequestsForBuilder\n extraActionButton={\n showRunningInUI ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => {\n // Nuclear stop: flip forceStopped so isRunning is false\n // immediately. This unblocks submission even if the\n // runtime or reconnect state is stuck.\n setForceStopped(true);\n const activeRun = getActiveRun();\n const runIdToAbort =\n reconnectRunIdRef.current ?? activeRun?.runId;\n userStoppedRunRef.current = {\n at: Date.now(),\n ...(runIdToAbort\n ? { runId: runIdToAbort }\n : {}),\n };\n setRunErrorInfo(null);\n setDismissedRunErrorKey(null);\n if (runIdToAbort) {\n fetch(\n `${apiUrl}/runs/${encodeURIComponent(runIdToAbort)}/abort`,\n { method: \"POST\" },\n ).catch(() => {});\n }\n\n if (isReconnecting) {\n reconnectAbortRef.current?.abort();\n reconnectAbortRef.current = null;\n reconnectRunIdRef.current = null;\n setIsReconnecting(false);\n setReconnectFrozen(reconnectContent.length > 0);\n }\n\n threadRuntime.cancelRun();\n\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: {\n isRunning: false,\n tabId: tabId || threadId,\n },\n }),\n );\n }}\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md bg-muted text-foreground hover:bg-muted/80\"\n >\n <IconPlayerStop className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Stop generating</TooltipContent>\n </Tooltip>\n ) : undefined\n }\n />\n </ComposerPrimitive.Root>\n </div>\n </div>\n </ChatRunningContext.Provider>\n </MessageActionsContext.Provider>\n </CheckpointContext.Provider>\n );\n});\n\nexport const AssistantChat = forwardRef<\n AssistantChatHandle,\n AssistantChatProps\n>(function AssistantChat(\n {\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n tabId,\n browserTabId,\n threadId,\n contextScope,\n ...props\n },\n ref,\n) {\n const modelRef = useRef<string | undefined>(props.selectedModel);\n modelRef.current = props.selectedModel;\n const engineRef = useRef<string | undefined>(props.selectedEngine);\n engineRef.current = props.selectedEngine;\n const effortRef = useRef<ReasoningEffort | undefined>(props.selectedEffort);\n effortRef.current = props.selectedEffort;\n const execModeRef = useRef<\"build\" | \"plan\" | undefined>(props.execMode);\n execModeRef.current = props.execMode;\n const scopeRef = useRef<ChatThreadScope | null | undefined>(contextScope);\n scopeRef.current = contextScope;\n\n const adapter = useMemo(\n () =>\n createAgentChatAdapter({\n apiUrl,\n tabId,\n threadId,\n modelRef,\n engineRef,\n effortRef,\n execModeRef,\n browserTabId,\n scopeRef,\n }),\n [apiUrl, tabId, threadId, browserTabId],\n );\n const attachmentAdapter = useMemo(\n () =>\n new CompositeAttachmentAdapter([\n new DownscalingImageAttachmentAdapter(),\n new BinaryDocumentAttachmentAdapter(),\n new TextAttachmentAdapter(),\n ]),\n [],\n );\n const runtime = useLocalRuntime(adapter, {\n adapters: { attachments: attachmentAdapter },\n });\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n <ThreadPrimitive.Root className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n <AssistantUiStaleIndexErrorBoundary\n resetKey={`${tabId ?? \"\"}:${threadId ?? \"\"}`}\n componentName=\"AssistantChat\"\n >\n <AssistantChatInner\n ref={ref}\n {...props}\n apiUrl={apiUrl}\n tabId={tabId}\n threadId={threadId}\n />\n </AssistantUiStaleIndexErrorBoundary>\n </ThreadPrimitive.Root>\n </AssistantRuntimeProvider>\n );\n});\n"]}
|