@cntyclub/agent-react 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/file-support.ts","../src/components/agent-image-lightbox.tsx","../src/components/agent-voice-recorder.tsx","../src/components/agent-composer.tsx","../src/message-group.ts","../src/components/chat-scroller.tsx","../src/components/copy-button.tsx","../src/components/message-item.tsx","../src/components/thinking-indicator.tsx","../src/table-format.tsx","../src/tool-presentation.ts","../src/components/document-card.tsx","../src/components/task-checklist.tsx","../src/components/tool-activity-group.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/use-always-approve.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["limit","React","React2","jsxs","motion","jsx","acceptAttribute","React3","cn","XIcon","Fragment","Button","callId","React4","React5","CheckIcon","React6","FileTextIcon","React7","ThinkingOrb","UUID_RE","React8","React9","Spinner","ChevronDownIcon","React10","Tooltip","TooltipTrigger","TooltipContent","Maximize2Icon","Trash2Icon","ChatMessage","React12","storageKey","React13","AnimatePresence"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentPublicConfig,\n AgentStreamEvent,\n ChatResponse,\n ConversationSummary,\n} from \"./types\";\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n // FormData bodies (file uploads) must not carry a manual Content-Type — the\n // browser sets the multipart boundary itself.\n const isFormData = typeof FormData !== \"undefined\" && options.body instanceof FormData;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(url, {\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n /** Upload a recorded voice clip and get back the transcribed text. */\n transcribe(audio: Blob): Promise<{ text: string }> {\n const type = audio.type || \"audio/webm\";\n const ext = type.includes(\"mp4\") ? \"mp4\" : type.includes(\"ogg\") ? \"ogg\" : type.includes(\"wav\") ? \"wav\" : \"webm\";\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"audio\", audio, `recording.${ext}`);\n return this.request<{ text: string }>(\"/agent-mode/transcribe/\", {\n body: form,\n method: \"POST\",\n });\n }\n\n sendMessage(\n message: string,\n conversationId?: string | null,\n files?: File[],\n ): Promise<ChatResponse> {\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n return this.request<ChatResponse>(\"/agent-mode/chat/\", { body: form, method: \"POST\" });\n }\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n // ------------------------------------------------------------- streaming\n\n /** POST a chat turn and yield parsed SSE events as they stream in. */\n async streamMessage(\n message: string,\n conversationId: string | null | undefined,\n files: File[] | undefined,\n onEvent: (event: AgentStreamEvent) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n let body: BodyInit;\n const headers = await this.streamHeaders();\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n body = form; // browser sets multipart Content-Type\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify({\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n });\n }\n await this.consumeStream(\"/agent-mode/chat/stream/\", { body, headers, signal }, onEvent);\n }\n\n /** POST an approval decision and yield the continued reply as SSE events. */\n async streamResolveApproval(\n callId: string,\n approve: boolean,\n onEvent: (event: AgentStreamEvent) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n const headers = await this.streamHeaders();\n headers[\"Content-Type\"] = \"application/json\";\n await this.consumeStream(\n `/agent-mode/approvals/${callId}/resolve/stream/`,\n {\n body: JSON.stringify({ approve, client_id: this.config.clientId }),\n headers,\n signal,\n },\n onEvent,\n );\n }\n\n private async streamHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n return {\n // Include application/json so DRF content-negotiation always finds a match.\n Accept: \"text/event-stream, application/json\",\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n }\n\n private async consumeStream(\n path: string,\n init: { body: BodyInit; headers: Record<string, string>; signal?: AbortSignal },\n onEvent: (event: AgentStreamEvent) => void,\n ): Promise<void> {\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n const response = await fetch(url, {\n body: init.body,\n headers: init.headers,\n method: \"POST\",\n signal: init.signal,\n });\n\n if (!response.ok || !response.body) {\n let detail = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as Record<string, unknown>;\n detail = (payload.detail as string) || (payload.message as string) || detail;\n } catch {\n // non-JSON / empty body\n }\n throw new AgentApiError(detail, response.status || 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n // SSE frames are separated by a blank line; each `data:` line holds JSON.\n const flushFrame = (frame: string) => {\n const dataLines = frame\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart());\n if (dataLines.length === 0) return;\n const raw = dataLines.join(\"\\n\");\n try {\n onEvent(JSON.parse(raw) as AgentStreamEvent);\n } catch {\n // Ignore comment/keepalive frames (e.g. \": open\") and malformed lines.\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n flushFrame(buffer.slice(0, boundary));\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim()) flushFrame(buffer);\n }\n\n listConversations(): Promise<{ conversations: ConversationSummary[] }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(conversationId: string): Promise<{\n conversation: ConversationSummary;\n messages: ChatResponse[\"messages\"];\n pending_approvals: ChatResponse[\"pending_approvals\"];\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`);\n }\n\n deleteConversation(conversationId: string): Promise<void> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n}\n","import type { AgentConfig } from \"./types\";\n\n/** Text formats the model can read directly. */\nexport const DEFAULT_ACCEPT = [\".txt\", \".md\", \".markdown\", \".csv\", \".tsv\", \".log\", \".docx\"];\n\n/** Image formats accepted when the agent has a Vision provider (screenshot → description). */\nexport const IMAGE_ACCEPT = [\".png\", \".jpg\", \".jpeg\", \".webp\", \".gif\"];\n\nexport const DEFAULT_MAX_SIZE_MB = 5;\nexport const DEFAULT_IMAGE_MAX_SIZE_MB = 10;\n\n/**\n * Backend-driven media capabilities for the agent (from GET /agent-mode/config/).\n * Vision/voice are gated by the backend — the agent must have the matching provider\n * configured — so these come from the fetched config, not the local AgentConfig.\n */\nexport interface MediaCapabilities {\n visionEnabled?: boolean;\n visionMaxMb?: number;\n}\n\nexport function fileUploadEnabled(config: AgentConfig): boolean {\n return config.fileUpload?.enabled !== false;\n}\n\n/** Text extensions the agent accepts (empty when text upload is disabled). */\nexport function textExtensions(config: AgentConfig): string[] {\n if (!fileUploadEnabled(config)) return [];\n const accept = config.fileUpload?.accept;\n return accept && accept.length > 0 ? accept.map((ext) => ext.toLowerCase()) : DEFAULT_ACCEPT;\n}\n\n/** Every extension the composer accepts — text (if enabled) plus images (if vision on). */\nexport function acceptedExtensions(config: AgentConfig, caps?: MediaCapabilities): string[] {\n const extensions = [...textExtensions(config)];\n if (caps?.visionEnabled) extensions.push(...IMAGE_ACCEPT);\n return extensions;\n}\n\nexport function maxSizeMb(config: AgentConfig): number {\n return config.fileUpload?.maxSizeMb ?? DEFAULT_MAX_SIZE_MB;\n}\n\n/** Whether attaching anything is possible: text upload OR image (vision) upload. */\nexport function attachmentsEnabled(config: AgentConfig, caps?: MediaCapabilities): boolean {\n return fileUploadEnabled(config) || Boolean(caps?.visionEnabled);\n}\n\n/** The `accept` attribute value for a native file input. */\nexport function acceptAttribute(config: AgentConfig, caps?: MediaCapabilities): string {\n return acceptedExtensions(config, caps).join(\",\");\n}\n\nfunction extensionOf(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot >= 0 ? filename.slice(dot).toLowerCase() : \"\";\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\") || IMAGE_ACCEPT.includes(extensionOf(file.name));\n}\n\n/** Validate a picked/dropped/pasted file against the accepted formats and size. */\nexport function validateFile(config: AgentConfig, file: File, caps?: MediaCapabilities): string | null {\n if (isImageFile(file)) {\n if (!caps?.visionEnabled) {\n return `“${file.name}” is an image — this assistant can’t accept images.`;\n }\n const limit = caps.visionMaxMb ?? DEFAULT_IMAGE_MAX_SIZE_MB;\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n }\n\n const extensions = textExtensions(config);\n if (!fileUploadEnabled(config)) {\n return `“${file.name}” can’t be attached — file upload is disabled for this assistant.`;\n }\n if (!extensions.includes(extensionOf(file.name))) {\n return `“${file.name}” isn’t a supported file. Allowed: ${extensions.join(\", \")}.`;\n }\n const limit = maxSizeMb(config);\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (!bytes && bytes !== 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","\"use client\";\n\nimport { cn } from \"@cntyclub/ui-react\";\nimport { XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface AgentImageLightboxProps {\n /** Image URL to show full-size, or null when closed. */\n src: string | null;\n alt?: string;\n onClose: () => void;\n}\n\n/**\n * Full-size image viewer rendered in a portal on `document.body`, so it escapes\n * the (small) widget bounds and fills the whole viewport. Click the backdrop, the\n * close button, or press Esc to dismiss.\n */\nexport function AgentImageLightbox({ src, alt, onClose }: AgentImageLightboxProps) {\n React.useEffect(() => {\n if (!src) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [src, onClose]);\n\n if (typeof document === \"undefined\") return null;\n\n return createPortal(\n <AnimatePresence>\n {src ? (\n <motion.div\n animate={{ opacity: 1 }}\n aria-modal=\"true\"\n className={cn(\n \"fixed inset-0 z-[2147483000] flex items-center justify-center bg-black/80 p-6 backdrop-blur-sm\",\n )}\n exit={{ opacity: 0 }}\n initial={{ opacity: 0 }}\n onClick={onClose}\n role=\"dialog\"\n transition={{ duration: 0.15 }}\n >\n <button\n aria-label=\"Close image\"\n className=\"absolute top-4 right-4 flex size-10 cursor-pointer items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20 [&_svg]:size-5\"\n onClick={onClose}\n type=\"button\"\n >\n <XIcon />\n </button>\n <motion.img\n alt={alt ?? \"Attached image\"}\n animate={{ scale: 1, opacity: 1 }}\n className=\"max-h-full max-w-full rounded-lg object-contain shadow-2xl\"\n exit={{ scale: 0.96, opacity: 0 }}\n initial={{ scale: 0.96, opacity: 0 }}\n onClick={(event) => event.stopPropagation()}\n src={src}\n transition={{ duration: 0.15 }}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { Button, ThinkingOrb } from \"@cntyclub/ui-react\";\nimport { CheckIcon, PauseIcon, PlayIcon, SquareIcon, Trash2Icon } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nexport interface AgentVoiceRecorderProps {\n /** Hard cap in seconds — recording auto-stops here (backend source of truth). */\n maxSeconds: number;\n /** Send the recorded clip for transcription; resolves to the transcript text. */\n transcribe: (audio: Blob) => Promise<string>;\n /** Confirmed + transcribed: hand the text back to the composer (append). */\n onDone: (text: string) => void;\n /** Cancelled (trash) or recording failed — return to the normal composer. */\n onCancel: () => void;\n /** Surface a user-facing error (mic denied, transcription failed). */\n onError: (message: string) => void;\n}\n\ntype Phase = \"recording\" | \"review\" | \"transcribing\";\n\n/**\n * Fixed bar geometry for the live level meter, in CSS px. The bars keep this\n * exact (thin) width at every panel width — a wider panel shows MORE bars, not\n * fatter ones, so the meter stays delicate in fullscreen Agent Mode.\n */\nconst BAR_WIDTH = 2;\nconst BAR_GAP = 3;\n/** Level-history capacity, in samples (= bars). Plenty for any panel width. */\nconst MAX_BARS = 1024;\n/** How many bars at the left (oldest) edge fade out so the strip ends softly. */\nconst FADE_BARS = 12;\n\nfunction formatClock(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction pickMimeType(): string {\n if (typeof MediaRecorder === \"undefined\") return \"\";\n for (const type of [\"audio/webm\", \"audio/mp4\", \"audio/ogg\"]) {\n if (MediaRecorder.isTypeSupported(type)) return type;\n }\n return \"\";\n}\n\n/**\n * In-composer voice capture. Mounts already \"recording\" (the mic button in the\n * composer starts it): shows a live timer that auto-stops at `maxSeconds`, then a\n * review bar (play back · confirm · cancel). Confirm transcribes and appends the\n * text to the composer; cancel/trash discards and returns to typing. The audio is\n * never uploaded except on confirm, and the backend never persists it.\n */\nexport function AgentVoiceRecorder({ maxSeconds, transcribe, onDone, onCancel, onError }: AgentVoiceRecorderProps) {\n const [phase, setPhase] = React.useState<Phase>(\"recording\");\n const [elapsed, setElapsed] = React.useState(0);\n const [playing, setPlaying] = React.useState(false);\n\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const chunksRef = React.useRef<Blob[]>([]);\n const blobRef = React.useRef<Blob | null>(null);\n const audioUrlRef = React.useRef<string | null>(null);\n const audioRef = React.useRef<HTMLAudioElement | null>(null);\n const timerRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n // Live level meter (ChatGPT-style scrolling bars).\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null);\n const audioContextRef = React.useRef<AudioContext | null>(null);\n const analyserRef = React.useRef<AnalyserNode | null>(null);\n const rafRef = React.useRef<number | null>(null);\n const levelsRef = React.useRef<number[]>(new Array(MAX_BARS).fill(0));\n // Latest onError without retriggering the start effect.\n const onErrorRef = React.useRef(onError);\n onErrorRef.current = onError;\n\n const stopMeter = React.useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n analyserRef.current = null;\n const ctx = audioContextRef.current;\n audioContextRef.current = null;\n if (ctx && ctx.state !== \"closed\") void ctx.close().catch(() => {});\n }, []);\n\n const stopTracks = React.useCallback(() => {\n streamRef.current?.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n stopMeter();\n }, [stopMeter]);\n\n // Tap the mic stream through a Web-Audio analyser and animate a scrolling\n // bar meter driven by the live signal amplitude (like ChatGPT's voice input).\n const startMeter = React.useCallback((stream: MediaStream) => {\n const Ctor: typeof AudioContext | undefined =\n typeof window === \"undefined\"\n ? undefined\n : window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Ctor) return;\n let context: AudioContext;\n try {\n context = new Ctor();\n } catch {\n return;\n }\n audioContextRef.current = context;\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.75;\n source.connect(analyser);\n analyserRef.current = analyser;\n levelsRef.current = new Array(MAX_BARS).fill(0);\n\n const buffer = new Uint8Array(analyser.fftSize);\n\n const draw = () => {\n const canvas = canvasRef.current;\n const activeAnalyser = analyserRef.current;\n if (!canvas || !activeAnalyser) return;\n const ctx2d = canvas.getContext(\"2d\");\n if (!ctx2d) return;\n\n activeAnalyser.getByteTimeDomainData(buffer);\n let sumSquares = 0;\n for (let i = 0; i < buffer.length; i += 1) {\n const centered = (buffer[i] - 128) / 128;\n sumSquares += centered * centered;\n }\n const rms = Math.sqrt(sumSquares / buffer.length);\n // Boost + clamp so quiet speech still reads without clipping the loud end.\n const level = Math.min(1, rms * 3.2);\n\n const levels = levelsRef.current;\n levels.push(level);\n levels.shift();\n\n const dpr = Math.min(2, typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1);\n const cssWidth = canvas.clientWidth || 1;\n const cssHeight = canvas.clientHeight || 1;\n const pxWidth = Math.round(cssWidth * dpr);\n const pxHeight = Math.round(cssHeight * dpr);\n if (canvas.width !== pxWidth) canvas.width = pxWidth;\n if (canvas.height !== pxHeight) canvas.height = pxHeight;\n\n ctx2d.clearRect(0, 0, pxWidth, pxHeight);\n ctx2d.fillStyle = getComputedStyle(canvas).color || \"currentColor\";\n\n // Fixed-width thin bars; the count adapts to the canvas width, so a\n // wider panel shows more history instead of stretching the bars.\n const barWidth = BAR_WIDTH * dpr;\n const slot = (BAR_WIDTH + BAR_GAP) * dpr;\n const count = Math.max(1, Math.min(MAX_BARS, Math.floor((pxWidth + BAR_GAP * dpr) / slot)));\n const midY = pxHeight / 2;\n const minBar = barWidth; // silence renders as a small round dot\n const maxBar = pxHeight * 0.92;\n const radius = barWidth / 2;\n\n for (let i = 0; i < count; i += 1) {\n // Newest sample sits flush at the right edge; older bars march left.\n const value = levels[levels.length - count + i];\n const barHeight = Math.max(minBar, value * maxBar);\n const x = pxWidth - barWidth - (count - 1 - i) * slot;\n const y = midY - barHeight / 2;\n // Soft fade on the oldest few bars so the strip ends gently.\n ctx2d.globalAlpha = Math.min(1, (i + 1) / FADE_BARS);\n if (typeof ctx2d.roundRect === \"function\") {\n ctx2d.beginPath();\n ctx2d.roundRect(x, y, barWidth, barHeight, Math.min(radius, barHeight / 2));\n ctx2d.fill();\n } else {\n ctx2d.fillRect(x, y, barWidth, barHeight);\n }\n }\n ctx2d.globalAlpha = 1;\n\n rafRef.current = requestAnimationFrame(draw);\n };\n\n rafRef.current = requestAnimationFrame(draw);\n }, []);\n\n // Begin capturing on mount; clean everything up on unmount.\n React.useEffect(() => {\n let cancelled = false;\n\n void (async () => {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n onErrorRef.current(\"Voice recording isn't supported in this browser.\");\n onCancel();\n return;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n streamRef.current = stream;\n startMeter(stream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n recorderRef.current = recorder;\n chunksRef.current = [];\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) chunksRef.current.push(event.data);\n };\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: mimeType || \"audio/webm\" });\n blobRef.current = blob;\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current);\n audioUrlRef.current = URL.createObjectURL(blob);\n setPhase(\"review\");\n };\n recorder.start();\n timerRef.current = setInterval(() => {\n setElapsed((current) => {\n const next = current + 1;\n if (next >= maxSeconds) stopRecording();\n return next;\n });\n }, 1000);\n } catch {\n onErrorRef.current(\"Microphone access was blocked. Enable it to record.\");\n onCancel();\n }\n })();\n\n return () => {\n cancelled = true;\n stopTracks();\n if (recorderRef.current && recorderRef.current.state !== \"inactive\") {\n try {\n recorderRef.current.stop();\n } catch {\n /* already stopped */\n }\n }\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function stopRecording() {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n const recorder = recorderRef.current;\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n stopTracks();\n }\n\n const togglePlayback = () => {\n const audio = audioRef.current;\n if (!audio) return;\n if (audio.paused) {\n void audio.play();\n setPlaying(true);\n } else {\n audio.pause();\n setPlaying(false);\n }\n };\n\n const confirm = async () => {\n const blob = blobRef.current;\n if (!blob || blob.size === 0) {\n onError(\"The recording was empty.\");\n onCancel();\n return;\n }\n setPhase(\"transcribing\");\n try {\n const text = await transcribe(blob);\n onDone(text.trim());\n } catch {\n onError(\"Transcription failed. Please try again.\");\n setPhase(\"review\");\n }\n };\n\n return (\n <motion.div\n animate={{ opacity: 1, y: 0 }}\n className=\"flex min-h-8 flex-1 items-center gap-2 px-1\"\n initial={{ opacity: 0, y: 4 }}\n transition={{ duration: 0.15 }}\n >\n {phase === \"recording\" ? (\n <>\n <span className=\"flex shrink-0 items-center gap-2 text-sm\">\n <motion.span\n animate={{ opacity: [1, 0.35, 1] }}\n className=\"size-2.5 rounded-full bg-destructive\"\n transition={{ duration: 1.2, repeat: Infinity }}\n />\n <span className=\"font-medium tabular-nums\">{formatClock(elapsed)}</span>\n </span>\n {/* Live signal meter — scrolls right-to-left; color follows text-foreground. */}\n <canvas aria-hidden className=\"h-6 min-w-0 flex-1 text-foreground/70\" ref={canvasRef} />\n <Button aria-label=\"Discard recording\" onClick={onCancel} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n <Trash2Icon />\n </Button>\n <Button aria-label=\"Stop recording\" onClick={stopRecording} size=\"icon-sm\" type=\"button\">\n <SquareIcon />\n </Button>\n </>\n ) : null}\n\n {phase === \"review\" ? (\n <>\n {/* Hidden audio element drives playback of the recorded clip. */}\n <audio onEnded={() => setPlaying(false)} ref={audioRef} src={audioUrlRef.current ?? undefined} />\n <Button aria-label={playing ? \"Pause\" : \"Play recording\"} onClick={togglePlayback} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n {playing ? <PauseIcon /> : <PlayIcon />}\n </Button>\n <span className=\"text-muted-foreground text-sm tabular-nums\">{formatClock(elapsed)}</span>\n <span className=\"flex-1\" />\n <Button aria-label=\"Discard recording\" onClick={onCancel} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n <Trash2Icon />\n </Button>\n <Button aria-label=\"Use recording\" className=\"rounded-full before:rounded-full\" onClick={() => void confirm()} size=\"icon-sm\" type=\"button\">\n <CheckIcon />\n </Button>\n </>\n ) : null}\n\n {phase === \"transcribing\" ? (\n <span className=\"flex flex-1 items-center gap-2 text-muted-foreground text-sm\">\n {/* Stock monochrome \"working\" orb — auto light/dark ink. */}\n <ThinkingOrb className=\"shrink-0\" size={20} speed={1} state=\"working\" />\n Transcribing…\n </span>\n ) : null}\n </motion.div>\n );\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { ArrowUpIcon, FileTextIcon, MicIcon, PaperclipIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes, isImageFile } from \"../file-support\";\nimport { AgentImageLightbox } from \"./agent-image-lightbox\";\nimport { AgentVoiceRecorder } from \"./agent-voice-recorder\";\n\nexport interface AgentComposerProps {\n value: string;\n onValueChange: (value: string) => void;\n /** Submit the trimmed text plus any staged files. */\n onSubmit: (text: string) => void;\n /** Hard-disable the input entirely (e.g. a pending approval must be resolved). */\n disabled?: boolean;\n /**\n * A reply is in progress. The textarea stays enabled and focused so the user\n * can start writing their next message, but submitting is blocked until done.\n */\n busy?: boolean;\n placeholder?: string;\n className?: string;\n /** File upload wiring. Omit `onPickFiles` to hide the attach button. */\n files: File[];\n onPickFiles?: (files: File[]) => void;\n onRemoveFile?: (index: number) => void;\n acceptAttribute?: string;\n /** Voice dictation. Provide `onTranscribe` (and enable) to show the mic. */\n voiceEnabled?: boolean;\n voiceMaxSeconds?: number;\n onTranscribe?: (audio: Blob) => Promise<string>;\n /** Surface a mic/transcription error to the panel's error banner. */\n onError?: (message: string) => void;\n}\n\n/** Append dictated text to what's already typed, inserting a space when needed. */\nfunction appendText(current: string, addition: string): string {\n if (!addition) return current;\n if (!current) return addition;\n return /\\s$/.test(current) ? current + addition : `${current} ${addition}`;\n}\n\n/**\n * Chat composer with attachment + voice support: auto-growing textarea, an attach\n * (paperclip) button, staged-file chips (images shown first as thumbnails), a mic\n * button, and a send button. Enter submits, Shift+Enter inserts a newline. Images\n * can also be pasted from the clipboard. While recording, the input row is replaced\n * by the voice recorder.\n */\nexport function AgentComposer({\n acceptAttribute,\n busy,\n className,\n disabled,\n files,\n onError,\n onPickFiles,\n onRemoveFile,\n onSubmit,\n onTranscribe,\n onValueChange,\n placeholder = \"Ask anything…\",\n value,\n voiceEnabled,\n voiceMaxSeconds = 600,\n}: AgentComposerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [recording, setRecording] = React.useState(false);\n const [lightboxSrc, setLightboxSrc] = React.useState<string | null>(null);\n const canSubmit = !disabled && !busy && (value.trim().length > 0 || files.length > 0);\n const voiceAvailable = Boolean(voiceEnabled && onTranscribe);\n\n const submit = React.useCallback(() => {\n if (!canSubmit) return;\n onSubmit(value.trim());\n textareaRef.current?.focus();\n }, [canSubmit, onSubmit, value]);\n\n React.useEffect(() => {\n if (!disabled) textareaRef.current?.focus();\n }, [disabled]);\n\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 144)}px`;\n }, [value]);\n\n // Object URLs for image thumbnails; revoked when the staged set changes.\n const previews = React.useMemo(\n () =>\n files.map((file, originalIndex) => {\n const image = isImageFile(file);\n return { file, image, originalIndex, url: image ? URL.createObjectURL(file) : null };\n }),\n [files],\n );\n React.useEffect(\n () => () => {\n previews.forEach((preview) => preview.url && URL.revokeObjectURL(preview.url));\n },\n [previews],\n );\n // Images first, keeping each file's original index for removal.\n const ordered = React.useMemo(\n () => [...previews].sort((a, b) => Number(b.image) - Number(a.image)),\n [previews],\n );\n\n const handlePick = (event: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(event.target.files ?? []);\n if (picked.length) onPickFiles?.(picked);\n event.target.value = \"\"; // allow re-picking the same file\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!onPickFiles) return;\n const images = Array.from(event.clipboardData?.files ?? []).filter((file) => file.type.startsWith(\"image/\"));\n if (images.length) {\n event.preventDefault();\n onPickFiles(images);\n }\n };\n\n const finishRecording = (text: string) => {\n setRecording(false);\n if (text) onValueChange(appendText(value, text));\n // Refocus after the recorder unmounts.\n setTimeout(() => textareaRef.current?.focus(), 0);\n };\n\n return (\n <form\n className={cn(\"shrink-0 bg-background p-3 pt-1.5\", className)}\n data-slot=\"agent-composer\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n <div\n className={cn(\n \"flex flex-col gap-1.5 rounded-2xl border border-input bg-popover p-1.5 shadow-xs transition-[border-color,box-shadow] duration-150 focus-within:border-ring/64 focus-within:ring-2 focus-within:ring-ring/24 dark:bg-input/32\",\n disabled && \"opacity-64\",\n )}\n >\n {files.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5 px-1 pt-1\">\n {ordered.map((preview) =>\n preview.image && preview.url ? (\n <span className=\"group relative\" key={`${preview.file.name}-${preview.originalIndex}`}>\n <button\n aria-label={`Preview ${preview.file.name}`}\n className=\"block size-14 cursor-zoom-in overflow-hidden rounded-lg border border-border/72\"\n onClick={() => setLightboxSrc(preview.url)}\n type=\"button\"\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img alt={preview.file.name} className=\"size-full object-cover\" src={preview.url} />\n </button>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${preview.file.name}`}\n className=\"-right-1.5 -top-1.5 absolute flex size-5 cursor-pointer items-center justify-center rounded-full border border-border bg-background text-muted-foreground shadow-sm hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(preview.originalIndex)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ) : (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 py-1 pr-1 pl-2 text-xs\"\n key={`${preview.file.name}-${preview.originalIndex}`}\n >\n <FileTextIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{preview.file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(preview.file.size)}</span>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${preview.file.name}`}\n className=\"flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground hover:bg-background hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(preview.originalIndex)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ),\n )}\n </div>\n ) : null}\n\n {recording && onTranscribe ? (\n <AgentVoiceRecorder\n maxSeconds={voiceMaxSeconds}\n onCancel={() => {\n setRecording(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }}\n onDone={finishRecording}\n onError={(message) => onError?.(message)}\n transcribe={onTranscribe}\n />\n ) : (\n <div className=\"flex items-end gap-1.5\">\n {onPickFiles ? (\n <>\n <input\n accept={acceptAttribute}\n className=\"hidden\"\n multiple\n onChange={handlePick}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n aria-label=\"Attach files\"\n className=\"shrink-0 self-center\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <PaperclipIcon />\n </Button>\n </>\n ) : null}\n\n <textarea\n className=\"max-h-36 min-h-8 flex-1 resize-none self-center bg-transparent py-1.5 pl-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n disabled={disabled}\n onChange={(event) => onValueChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n }}\n onPaste={onPickFiles ? handlePaste : undefined}\n placeholder={placeholder}\n ref={textareaRef}\n rows={1}\n value={value}\n />\n\n {voiceAvailable ? (\n <Button\n aria-label=\"Record voice\"\n className=\"shrink-0 self-center\"\n disabled={disabled}\n onClick={() => setRecording(true)}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <MicIcon />\n </Button>\n ) : null}\n\n <Button\n aria-label=\"Send message\"\n className=\"shrink-0 rounded-full before:rounded-full\"\n disabled={!canSubmit}\n size=\"icon-sm\"\n type=\"submit\"\n >\n <ArrowUpIcon />\n </Button>\n </div>\n )}\n </div>\n\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </form>\n );\n}\n","import type { AgentMessage, MessageBlock } from \"./types\";\n\n/** One tool invocation inside a tool-activity group. */\nexport interface ToolStep {\n /** Provider tool-call id (matches assistant tool_call ↔ tool result). */\n callId: string;\n name: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\";\n /** Capped, pretty-printed raw result (for the JSON detail view). */\n result?: string;\n /** Structured blocks (tables) derived from the result. */\n blocks?: MessageBlock[];\n}\n\nexport type RenderItem =\n | { kind: \"user\"; key: string; message: AgentMessage }\n | { kind: \"assistant-text\"; key: string; message: AgentMessage }\n | { kind: \"tool-activity\"; key: string; steps: ToolStep[] };\n\n/**\n * Collapse the raw message stream into render items: user bubbles, assistant\n * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant\n * tool_calls + their tool results) fold into a single group so a run of ten\n * lookups shows as one collapsible block instead of ten stacked chips.\n *\n * An assistant message that carries visible text flushes the current group and\n * emits a text bubble before starting any new tool steps.\n */\nexport function groupMessages(messages: AgentMessage[]): RenderItem[] {\n const items: RenderItem[] = [];\n\n let group: ToolStep[] | null = null;\n let groupKey = \"\";\n const stepIndexByCallId = new Map<string, number>();\n\n const flush = () => {\n if (group && group.length > 0) {\n items.push({ key: `tools-${groupKey}`, kind: \"tool-activity\", steps: group });\n }\n group = null;\n groupKey = \"\";\n stepIndexByCallId.clear();\n };\n\n for (const message of messages) {\n if (message.role === \"user\") {\n flush();\n // `client_key` (when present) survives the optimistic→server id swap,\n // so the bubble's key — and DOM node — stays stable across it.\n items.push({ key: message.client_key ?? message.id, kind: \"user\", message });\n continue;\n }\n\n if (message.role === \"assistant\") {\n const hasText = Boolean(message.content && message.content.trim());\n if (hasText) {\n flush();\n items.push({ key: message.client_key ?? message.id, kind: \"assistant-text\", message });\n }\n for (const toolCall of message.tool_calls ?? []) {\n const callId = toolCall.id ?? `${message.id}-${toolCall.name}`;\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n stepIndexByCallId.set(callId, group.length);\n group.push({\n args: (toolCall.arguments ?? {}) as Record<string, unknown>,\n callId,\n name: toolCall.name ?? \"tool\",\n status: \"running\",\n });\n }\n continue;\n }\n\n // Tool result: attach to its pending step, or open a group if orphaned.\n const callId = message.tool_call_id ?? \"\";\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n const existingIndex = callId ? stepIndexByCallId.get(callId) : undefined;\n if (existingIndex !== undefined) {\n const step = group[existingIndex];\n step.status = \"done\";\n step.result = message.result || step.result;\n step.blocks = message.blocks ?? step.blocks;\n } else {\n group.push({\n args: {},\n blocks: message.blocks,\n callId: callId || message.id,\n name: message.tool_name ?? \"tool\",\n result: message.result,\n status: \"done\",\n });\n }\n }\n\n flush();\n return items;\n}\n","\"use client\";\n\nimport { cn } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\nexport type ChatScrollerProps = React.ComponentProps<\"div\">;\n\n/**\n * Scrollable message viewport that stays pinned to the bottom while content\n * grows — including token-by-token streaming, where text is appended to the\n * SAME message rather than adding new ones.\n *\n * Why not the UI kit's ChatMessages autoScroll: that container uses CSS\n * `scroll-smooth`, so a programmatic jump to the bottom emits intermediate\n * `scroll` events mid-animation whose distance-from-bottom is large, which\n * flips its \"pinned\" flag to false — after the first delta it stops following.\n * Here we scroll INSTANTLY (no smooth), so the only resulting scroll event is\n * at the true bottom and the pin holds for the whole stream. The user can still\n * scroll up to read history (that unpins), and scrolling back down re-pins.\n */\nexport function ChatScroller({ children, className, ...props }: ChatScrollerProps) {\n const viewportRef = React.useRef<HTMLDivElement>(null);\n const pinnedRef = React.useRef(true);\n\n const handleScroll = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const distanceFromBottom = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight;\n pinnedRef.current = distanceFromBottom < 64;\n }, []);\n\n // Runs after every commit (no dep array): the panel re-renders on each\n // streamed delta, so this keeps the viewport glued to the bottom while pinned.\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || !pinnedRef.current) return;\n viewport.scrollTop = viewport.scrollHeight; // instant — see note above\n });\n\n return (\n <div\n className={cn(\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-4\", className)}\n data-slot=\"chat-scroller\"\n onScroll={handleScroll}\n ref={viewportRef}\n {...props}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from \"@cntyclub/ui-react\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nexport interface CopyButtonProps {\n /** The text copied to the clipboard (the assistant reply's raw markdown). */\n text: string;\n className?: string;\n}\n\n/** Small ghost icon button that copies `text` and briefly flips to a check. */\nexport function CopyButton({ className, text }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const copy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n return; // clipboard blocked (insecure context / denied) — no-op\n }\n setCopied(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 1500);\n }, [text]);\n\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={copied ? \"Copied\" : \"Copy message\"}\n className={cn(\"text-muted-foreground\", className)}\n onClick={copy}\n size=\"icon-xs\"\n type=\"button\"\n variant=\"ghost\"\n >\n {copied ? <CheckIcon className=\"text-success\" /> : <CopyIcon />}\n </Button>\n }\n />\n <TooltipContent>{copied ? \"Copied!\" : \"Copy\"}</TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { ChatMessage, ChatMessageBubble, cn, Markdown } from \"@cntyclub/ui-react\";\nimport { FileTextIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { IMAGE_ACCEPT } from \"../file-support\";\nimport type { AgentMessage } from \"../types\";\nimport { AgentImageLightbox } from \"./agent-image-lightbox\";\nimport { CopyButton } from \"./copy-button\";\n\nconst isImageAttachment = (format: string) => IMAGE_ACCEPT.includes(`.${format.toLowerCase()}`);\n\n/**\n * Renders a user or assistant *text* message. Tool activity (assistant\n * tool_calls and tool results) is grouped and rendered by `ToolActivityGroup`\n * via `groupMessages`, so this component ignores tool messages.\n */\nexport function MessageItem({ message }: { message: AgentMessage }) {\n const [lightboxSrc, setLightboxSrc] = React.useState<string | null>(null);\n\n if (message.role === \"user\") {\n const attachments = message.attachments ?? [];\n const images = attachments.filter((a) => isImageAttachment(a.format) && a.url);\n const others = attachments.filter((a) => !isImageAttachment(a.format) || !a.url);\n return (\n <ChatMessage className=\"group\" from=\"user\">\n {images.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {images.map((attachment) => (\n <button\n aria-label={`Preview ${attachment.filename}`}\n className=\"block size-20 cursor-zoom-in overflow-hidden rounded-lg border border-border/72\"\n key={attachment.id}\n onClick={() => setLightboxSrc(attachment.url ?? null)}\n type=\"button\"\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img alt={attachment.filename} className=\"size-full object-cover\" src={attachment.url ?? undefined} />\n </button>\n ))}\n </div>\n ) : null}\n {others.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {others.map((attachment) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 px-2 py-1 text-muted-foreground text-xs\"\n key={attachment.id}\n >\n <FileTextIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{attachment.filename}</span>\n </span>\n ))}\n </div>\n ) : null}\n {/* `whitespace-pre-wrap` so the user's own line breaks survive (the bubble\n otherwise collapses newlines to spaces). Trailing/leading blank lines\n are already stripped at submit via `.trim()` in the composer. */}\n {message.content ? (\n <ChatMessageBubble className=\"whitespace-pre-wrap\" from=\"user\">\n {message.content}\n </ChatMessageBubble>\n ) : null}\n {/* Copy the user's own message. Hover/focus-revealed, right-aligned to\n match the user bubble's side. */}\n {message.content ? (\n <div\n className={cn(\n \"mt-0.5 flex justify-end opacity-0 transition-opacity\",\n \"group-hover:opacity-100 focus-within:opacity-100\",\n )}\n >\n <CopyButton text={message.content} />\n </div>\n ) : null}\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n if (!message.content || !message.content.trim()) return null;\n return (\n <ChatMessage className=\"group\" from=\"assistant\">\n <ChatMessageBubble from=\"assistant\">\n {/* Click any image the markdown rendered (e.g. an avatar/logo shown in\n a table cell) to open it full-size. The <img> tags belong to the\n library's Markdown component, so we catch the click via delegation\n as it bubbles up. `cursor-zoom-in` hints it's tappable. */}\n <div\n className=\"[&_img]:cursor-zoom-in [&_img]:rounded-md\"\n onClick={(event) => {\n const target = event.target as HTMLElement;\n if (target.tagName !== \"IMG\") return;\n const src = (target as HTMLImageElement).currentSrc || (target as HTMLImageElement).src;\n if (src) setLightboxSrc(src);\n }}\n role=\"presentation\"\n >\n <Markdown>{message.content}</Markdown>\n </div>\n </ChatMessageBubble>\n {/* Copy the full reply (raw markdown). Hidden until the message is\n hovered/focused so it doesn't clutter the thread. Left-aligned under\n the bubble, matching the assistant bubble's side. */}\n <div\n className={cn(\n \"mt-0.5 flex opacity-0 transition-opacity\",\n \"group-hover:opacity-100 focus-within:opacity-100\",\n )}\n >\n <CopyButton text={message.content} />\n </div>\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </ChatMessage>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport { AuroraText, cn, ThinkingOrb } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\n/** Words cycled beside the typing dots so the wait feels alive (Claude-style). */\nconst DEFAULT_PHRASES = [\n \"Thinking\",\n \"Working on it\",\n \"Looking that up\",\n \"Reading the data\",\n \"Putting it together\",\n \"Almost there\",\n];\n\nexport interface ThinkingIndicatorProps {\n /** Override the rotating phrases. */\n phrases?: string[];\n /** Milliseconds each phrase stays before rotating. Default 1800. */\n intervalMs?: number;\n className?: string;\n}\n\n/**\n * A muted \"typing\" bubble: a monochrome thinking orb plus an aurora-gradient\n * phrase that rotates every ~1.8s, so a long tool run reads as active progress\n * instead of a frozen \"…\". The aurora treatment lives on the TEXT only — the\n * orb keeps the stock theme ink.\n */\nexport function ThinkingIndicator({ className, intervalMs = 1800, phrases }: ThinkingIndicatorProps) {\n const words = phrases && phrases.length ? phrases : DEFAULT_PHRASES;\n const [index, setIndex] = React.useState(0);\n\n React.useEffect(() => {\n // Reset when the phrase set changes so we never index out of range.\n setIndex(0);\n const timer = setInterval(() => {\n setIndex((current) => (current + 1) % words.length);\n }, intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, words]);\n\n return (\n <div\n aria-label=\"Assistant is working\"\n className={cn(\n \"fade-in-0 flex w-fit animate-in items-center gap-2 rounded-2xl rounded-bl-md bg-muted px-3.5 py-2.5 duration-200\",\n className,\n )}\n data-slot=\"thinking-indicator\"\n role=\"status\"\n >\n {/* Stock monochrome \"solving\" orb — auto light/dark ink. */}\n <ThinkingOrb className=\"shrink-0\" size={20} speed={0.7} state=\"solving\" />\n <span\n className=\"fade-in-0 animate-in text-xs font-medium duration-300\"\n // Re-key so the fade replays on each word change.\n key={index}\n >\n {/* Animated RGB gradient phrase (CSS-only, light enough for mobile).\n No trailing \"…\" — the spinning ring already carries the motion. */}\n <AuroraText>{words[index]}</AuroraText>\n </span>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","import type { DescribeToolCall, ToolCallDescription, ToolCallDetail } from \"./types\";\n\n/** \"business_target_company_tags_apply\" → \"target company tags apply\". */\nexport function humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Keys that are meaningless to a human reader — identifiers and storage keys.\n * These are hidden from the default argument facts (the user complained that\n * \"company_id\" / \"slug\" tell them nothing).\n */\nfunction isTechnicalKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"client_id\" ||\n lower === \"slug\" ||\n lower.endsWith(\"_id\") ||\n lower.endsWith(\"_ids\") ||\n lower.endsWith(\"_key\") ||\n lower.endsWith(\"_slug\") ||\n lower.endsWith(\"_uuid\") ||\n lower === \"uuid\" ||\n lower.endsWith(\"_s3_key\") ||\n lower === \"embedding\"\n );\n}\n\n/** A value that is itself just an identifier (bare UUID) carries no meaning. */\nfunction isTechnicalValue(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value.trim());\n}\n\n/** \"target_company\" → \"Target company\". */\nfunction humanizeKey(key: string): string {\n const spaced = key.replaceAll(\"_\", \" \").trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) {\n const items = value\n .filter((item) => !isTechnicalValue(item))\n .map((item) => formatValue(item));\n return items.length ? items.join(\", \") : `${value.length} item${value.length === 1 ? \"\" : \"s\"}`;\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"name\", \"title\", \"label\", \"email\"]) {\n if (typeof record[key] === \"string\") return record[key] as string;\n }\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Derive human-readable facts from raw arguments, dropping technical keys and\n * bare-identifier values. Long strings are truncated for the card.\n */\nexport function deriveDetails(args: Record<string, unknown>): ToolCallDetail[] {\n const details: ToolCallDetail[] = [];\n for (const [key, value] of Object.entries(args ?? {})) {\n if (isTechnicalKey(key)) continue;\n if (isTechnicalValue(value)) continue;\n if (value === \"\" || value === null || value === undefined) continue;\n const formatted = formatValue(value);\n if (!formatted || formatted === \"—\") continue;\n details.push({ label: humanizeKey(key), value: formatted.length > 140 ? `${formatted.slice(0, 140)}…` : formatted });\n }\n return details;\n}\n\nexport interface ResolvedToolPresentation {\n title: string;\n summary: string | null;\n details: ToolCallDetail[];\n}\n\n/**\n * Resolve how a tool call should be shown: prefer the host app's\n * `describeToolCall`, then fall back to a humanized name plus the non-technical\n * arguments so approvals and the tool log always read conceptually.\n */\nexport function resolveToolPresentation(\n describe: DescribeToolCall | undefined,\n toolName: string,\n args: Record<string, unknown>,\n): ResolvedToolPresentation {\n let description: ToolCallDescription | null | undefined;\n try {\n description = describe?.(toolName, args ?? {});\n } catch {\n description = null;\n }\n\n const title = description?.title?.trim() || humanizeToolName(toolName);\n const summary = description?.summary?.trim() || null;\n\n let details = description?.details ?? [];\n const wantsDerived = description?.showDerivedDetails ?? description?.details === undefined;\n if (details.length === 0 && wantsDerived) {\n details = deriveDetails(args ?? {});\n }\n\n return { details, summary, title };\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { DownloadIcon, FileTextIcon, Maximize2Icon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\nimport type { DocumentBlock } from \"../types\";\n\nfunction DownloadButton({ block, size = \"sm\" }: { block: DocumentBlock; size?: \"sm\" | \"icon-sm\" }) {\n if (!block.download_url) {\n return (\n <Button disabled size={size} variant=\"outline\">\n {size === \"icon-sm\" ? <DownloadIcon /> : <><DownloadIcon /> Download</>}\n </Button>\n );\n }\n return (\n <Button\n render={\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a download={block.filename} href={block.download_url} rel=\"noopener noreferrer\" target=\"_blank\" />\n }\n size={size}\n variant={size === \"icon-sm\" ? \"outline\" : \"default\"}\n >\n <DownloadIcon />\n {size === \"icon-sm\" ? null : \"Download\"}\n </Button>\n );\n}\n\n/** Fullscreen preview overlay (viewport-fixed) with a download action. */\nfunction DocumentViewer({ block, onClose }: { block: DocumentBlock; onClose: () => void }) {\n React.useEffect(() => {\n const onKey = (event: KeyboardEvent) => event.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div aria-modal=\"true\" className=\"fixed inset-0 z-[60] flex flex-col bg-background\" role=\"dialog\">\n <div className=\"flex shrink-0 items-center gap-2 border-border/72 border-b px-4 py-3\">\n <FileTextIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <DownloadButton block={block} />\n <Button aria-label=\"Close preview\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n <pre className=\"mx-auto max-w-3xl whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-foreground\">\n {block.preview || \"(no preview available — download to view)\"}\n {block.preview_truncated ? \"\\n\\n… preview truncated. Download for the full file.\" : \"\"}\n </pre>\n </div>\n </div>\n );\n}\n\n/**\n * Renders a generated document: a compact card with a short preview, an\n * expand-to-fullscreen button, and a download button. Clicking the preview or\n * expand opens the fullscreen viewer (download sits top-right there too).\n */\nexport function DocumentCard({ block }: { block: DocumentBlock }) {\n const [open, setOpen] = React.useState(false);\n const previewLines = (block.preview || \"\").split(\"\\n\").slice(0, 6).join(\"\\n\");\n\n return (\n <div className=\"w-full max-w-full overflow-hidden rounded-xl border border-border bg-card shadow-xs\">\n <div className=\"flex items-center gap-2 border-border/72 border-b px-3 py-2\">\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-primary/8 text-primary [&_svg]:size-4\">\n <FileTextIcon />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <Button aria-label=\"Preview\" onClick={() => setOpen(true)} size=\"icon-sm\" variant=\"ghost\">\n <Maximize2Icon />\n </Button>\n <DownloadButton block={block} size=\"icon-sm\" />\n </div>\n {previewLines ? (\n <button\n className={cn(\n \"block w-full cursor-pointer px-3 py-2 text-left transition-colors hover:bg-accent/40\",\n )}\n onClick={() => setOpen(true)}\n type=\"button\"\n >\n <pre className=\"max-h-28 overflow-hidden whitespace-pre-wrap break-words font-mono text-[11px] leading-snug text-muted-foreground\">\n {previewLines}\n </pre>\n </button>\n ) : null}\n {open ? <DocumentViewer block={block} onClose={() => setOpen(false)} /> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { Checkbox, cn, Spinner } from \"@cntyclub/ui-react\";\nimport { ListChecksIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { TaskItem } from \"../types\";\n\n/**\n * A read-only checklist of the steps the agent is working through (Claude-style\n * to-dos). The user cannot toggle items — the agent drives the state via the\n * `update_tasks` tool.\n */\nexport function TaskChecklist({ tasks }: { tasks: TaskItem[] }) {\n if (!tasks || tasks.length === 0) return null;\n const done = tasks.filter((task) => task.status === \"done\").length;\n\n return (\n <div className=\"w-full max-w-full rounded-xl border border-border bg-card p-3 shadow-xs\">\n <div className=\"mb-2 flex items-center gap-1.5 font-medium text-sm\">\n <ListChecksIcon className=\"size-4 text-muted-foreground\" />\n Tasks\n <span className=\"ml-auto text-muted-foreground text-xs\">\n {done}/{tasks.length}\n </span>\n </div>\n <ul className=\"flex flex-col gap-1.5\">\n {tasks.map((task, index) => (\n <li className=\"flex items-center gap-2 text-sm\" key={`${index}-${task.title}`}>\n {task.status === \"in_progress\" ? (\n <span className=\"flex size-4 shrink-0 items-center justify-center [&_svg]:size-3.5\">\n <Spinner />\n </span>\n ) : (\n <Checkbox\n aria-hidden\n checked={task.status === \"done\"}\n className=\"pointer-events-none shrink-0\"\n readOnly\n tabIndex={-1}\n />\n )}\n <span\n className={cn(\n \"min-w-0\",\n task.status === \"done\" && \"text-muted-foreground line-through\",\n task.status === \"in_progress\" && \"font-medium\",\n )}\n >\n {task.title}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n ChatToolChip,\n DataTablePaged,\n cn,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, ChevronDownIcon, CodeIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport { humanizeToolName, resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, MessageBlock, TableBlock } from \"../types\";\nimport type { ToolStep } from \"../message-group\";\nimport { DocumentCard } from \"./document-card\";\nimport { TaskChecklist } from \"./task-checklist\";\n\n/** Renders the visible output blocks of a step (tables, documents, checklists). */\nfunction StepBlocks({ blocks, stepKey }: { blocks: MessageBlock[] | undefined; stepKey: string }) {\n const visible = (blocks ?? []).filter(\n (block) => block.type === \"table\" || block.type === \"document\" || block.type === \"tasks\",\n );\n if (visible.length === 0) return null;\n return (\n <>\n {visible.map((block, index) => {\n const key = `${stepKey}-block-${index}`;\n if (block.type === \"document\") {\n return <DocumentCard block={block} key={key} />;\n }\n if (block.type === \"tasks\") {\n return <TaskChecklist key={key} tasks={block.tasks} />;\n }\n const table = block as TableBlock;\n const { columns, rows } = toDisplayTable(table);\n return (\n <div className=\"w-full max-w-full\" key={key}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof table.pagination?.count === \"number\" ? (table.pagination.count as number) : table.row_count\n }\n />\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RawJsonDisclosure({ result }: { result: string }) {\n return (\n <Collapsible className=\"mt-1.5\">\n <CollapsibleTrigger className=\"group flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground\">\n <CodeIcon className=\"size-3\" />\n <span>Raw JSON</span>\n <ChevronDownIcon className=\"size-3 transition-transform group-data-[panel-open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-1 max-h-64 overflow-auto rounded-lg bg-muted p-2 font-mono text-[11px] leading-snug text-muted-foreground\">\n {result}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n );\n}\n\nfunction StepDetail({\n describeToolCall,\n step,\n}: {\n describeToolCall?: DescribeToolCall;\n step: ToolStep;\n}) {\n const { details, summary, title } = resolveToolPresentation(describeToolCall, step.name, step.args);\n return (\n <div className=\"rounded-lg border border-border/72 bg-card p-2.5\">\n <div className=\"flex items-center gap-1.5 font-medium text-sm\">\n {step.status === \"running\" ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-success\" />\n )}\n {title}\n </div>\n {summary ? <p className=\"mt-0.5 text-muted-foreground text-xs\">{summary}</p> : null}\n {details.length > 0 ? (\n <dl className=\"mt-1.5 space-y-0.5 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {step.result ? <RawJsonDisclosure result={step.result} /> : null}\n </div>\n );\n}\n\nexport interface ToolActivityGroupProps {\n steps: ToolStep[];\n describeToolCall?: DescribeToolCall;\n}\n\n/**\n * A collapsed run of tool activity. Normally shows just the latest step as a\n * chip with a disclosure toggle; expanding reveals every step in plain language\n * with a per-step raw-JSON dropdown. Result tables always render below so the\n * data the user asked for is never hidden behind the toggle.\n */\nexport function ToolActivityGroup({ describeToolCall, steps }: ToolActivityGroupProps) {\n const [open, setOpen] = React.useState(false);\n if (steps.length === 0) return null;\n\n const last = steps[steps.length - 1];\n const anyRunning = steps.some((step) => step.status === \"running\");\n const lastTitle =\n resolveToolPresentation(describeToolCall, last.name, last.args).title || humanizeToolName(last.name);\n const chipLabel = anyRunning ? `${lastTitle}…` : steps.length > 1 ? lastTitle : `${lastTitle} finished`;\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <Collapsible onOpenChange={setOpen} open={open}>\n <CollapsibleTrigger\n render={\n <ChatToolChip\n className=\"cursor-pointer pr-2 hover:bg-muted\"\n icon={\n anyRunning ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon />\n )\n }\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"truncate\">{chipLabel}</span>\n {steps.length > 1 ? (\n <span className=\"rounded-full bg-background px-1.5 text-[10px] text-foreground/72\">\n {steps.length} steps\n </span>\n ) : null}\n <ChevronDownIcon className={cn(\"size-3 transition-transform\", open && \"rotate-180\")} />\n </span>\n </ChatToolChip>\n }\n />\n <CollapsiblePanel>\n <div className=\"mt-2 flex flex-col gap-1.5\">\n {steps.map((step) => (\n <StepDetail describeToolCall={describeToolCall} key={step.callId} step={step} />\n ))}\n </div>\n </CollapsiblePanel>\n </Collapsible>\n\n {steps.map((step) => (\n <StepBlocks blocks={step.blocks} key={`${step.callId}-blocks`} stepKey={step.callId} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Group,\n Menu,\n MenuItem,\n MenuPopup,\n MenuTrigger,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { CheckCheckIcon, ChevronDownIcon, ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, PendingApproval } from \"../types\";\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n /** Host-app hook that turns the tool call into plain language. */\n describeToolCall?: DescribeToolCall;\n /** Remember this tool and auto-approve it from now on. */\n onAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. Arguments are\n * shown in plain language (technical ids/keys hidden, or a host-provided\n * description) so the user understands exactly what will change. The primary\n * action is a split button: \"Approve\" once, or \"Always approve\" this tool.\n */\nexport function ToolApprovalCard({\n approval,\n describeToolCall,\n onAlwaysApprove,\n onResolve,\n resolving,\n}: ToolApprovalCardProps) {\n const { details, summary, title } = resolveToolPresentation(\n describeToolCall,\n approval.tool_name,\n (approval.arguments ?? {}) as Record<string, unknown>,\n );\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n {summary ?? (\n <>\n The assistant wants to <span className=\"font-medium text-foreground\">{title.toLowerCase()}</span> — this\n will change your data.\n </>\n )}\n </p>\n {details.length > 0 && (\n <dl className=\"mt-2 space-y-1 rounded-lg bg-muted p-2 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words font-medium text-foreground\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n )}\n <ChatToolCardActions>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, false)} size=\"sm\" variant=\"outline\">\n Decline\n </Button>\n <Group>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n <Menu>\n <MenuTrigger\n render={\n <Button aria-label=\"More approve options\" disabled={resolving} size=\"icon-sm\" variant=\"default\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <MenuPopup align=\"end\">\n <MenuItem\n onClick={() => {\n onAlwaysApprove(approval.tool_name);\n onResolve(approval.id, true);\n }}\n >\n <CheckCheckIcon />\n Always approve “{title}”\n </MenuItem>\n </MenuPopup>\n </Menu>\n </Group>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatMessage,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatSuggestion,\n ChatSuggestions,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n ChevronsRightIcon,\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadCloudIcon,\n XIcon,\n} from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { acceptAttribute, attachmentsEnabled, validateFile, type MediaCapabilities } from \"../file-support\";\nimport { groupMessages } from \"../message-group\";\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { AgentComposer } from \"./agent-composer\";\nimport { ChatScroller } from \"./chat-scroller\";\nimport { MessageItem } from \"./message-item\";\nimport { ThinkingIndicator } from \"./thinking-indicator\";\nimport { ToolActivityGroup } from \"./tool-activity-group\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n /** Remember a write tool and auto-approve its future prompts. */\n onAlwaysApprove: (toolName: string) => void;\n /** Message id to render a \"New messages\" divider before (arrived while closed). */\n newMessageAnchorId?: string | null;\n /**\n * Render the close control as a \"collapse to the right\" affordance (two right\n * chevrons) instead of an ✕. Used by the docked presentation, where closing\n * collapses the panel to the side rather than dismissing a dialog.\n */\n collapseToSide?: boolean;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n collapseToSide,\n config,\n newMessageAnchorId,\n onAlwaysApprove,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n const [files, setFiles] = React.useState<File[]>([]);\n const [uploadError, setUploadError] = React.useState<string | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const dragDepth = React.useRef(0);\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n // Vision/voice are gated by the backend (the agent must have the matching\n // provider configured); read them from the fetched config.\n const caps: MediaCapabilities = {\n visionEnabled: chat.agentInfo?.vision_enabled,\n visionMaxMb: chat.agentInfo?.vision_max_file_mb,\n };\n const uploadEnabled = attachmentsEnabled(config, caps);\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const addFiles = React.useCallback(\n (incoming: File[]) => {\n const accepted: File[] = [];\n let rejection: string | null = null;\n for (const file of incoming) {\n const error = validateFile(config, file, caps);\n if (error) {\n rejection = error;\n continue;\n }\n accepted.push(file);\n }\n setUploadError(rejection);\n if (accepted.length) setFiles((current) => [...current, ...accepted].slice(0, 10));\n },\n [config, caps.visionEnabled, caps.visionMaxMb],\n );\n\n const removeFile = React.useCallback((index: number) => {\n setFiles((current) => current.filter((_, i) => i !== index));\n }, []);\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n const staged = files;\n setDraft(\"\");\n setFiles([]);\n setUploadError(null);\n void chat.send(text, staged);\n },\n [chat, files],\n );\n\n // ----- drag-and-drop file upload -----\n const onDragEnter = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled || !event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current += 1;\n setDragging(true);\n },\n [uploadEnabled],\n );\n const onDragLeave = React.useCallback((event: React.DragEvent) => {\n if (!event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current = Math.max(0, dragDepth.current - 1);\n if (dragDepth.current === 0) setDragging(false);\n }, []);\n const onDrop = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled) return;\n event.preventDefault();\n dragDepth.current = 0;\n setDragging(false);\n const dropped = Array.from(event.dataTransfer?.files ?? []);\n if (dropped.length) addFiles(dropped);\n },\n [addFiles, uploadEnabled],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n // While streaming, once the assistant's text bubble has started filling in we\n // hide the \"Thinking…\" dots (they'd otherwise sit under the live reply). Show\n // them whenever we're busy and the reply hasn't started yet.\n const lastMessage = chat.messages[chat.messages.length - 1];\n const replyStreaming = lastMessage?.role === \"assistant\" && Boolean(lastMessage.content);\n const showThinking = busy && !replyStreaming;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={uploadEnabled ? (event) => event.preventDefault() : undefined}\n onDrop={onDrop}\n >\n {dragging && view === \"chat\" ? (\n <div className=\"pointer-events-none absolute inset-0 z-40 flex flex-col items-center justify-center gap-2 bg-background/85 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2 rounded-2xl border-2 border-primary/40 border-dashed px-8 py-6 text-center\">\n <UploadCloudIcon className=\"size-8 text-primary\" />\n <div className=\"font-medium text-sm\">Drop files to attach</div>\n <div className=\"text-muted-foreground text-xs\">{acceptAttribute(config, caps).replaceAll(\",\", \" · \")}</div>\n </div>\n </div>\n ) : null}\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button\n aria-label={collapseToSide ? \"Collapse agent\" : \"Close\"}\n onClick={onClose}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {collapseToSide ? <ChevronsRightIcon /> : <XIcon />}\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatScroller className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {(() => {\n const grouped = groupMessages(chat.messages);\n const anchorKey = newMessageAnchorId\n ? grouped.find(\n (it) => it.kind !== \"tool-activity\" && it.message.id === newMessageAnchorId,\n )?.key\n : undefined;\n return grouped.map((item) => (\n <React.Fragment key={item.key}>\n {item.key === anchorKey ? <NewMessagesDivider /> : null}\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n >\n {item.kind === \"tool-activity\" ? (\n <ChatMessage from=\"assistant\">\n <ToolActivityGroup\n describeToolCall={config.describeToolCall}\n steps={item.steps}\n />\n </ChatMessage>\n ) : (\n <MessageItem message={item.message} />\n )}\n </motion.div>\n </React.Fragment>\n ));\n })()}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n describeToolCall={config.describeToolCall}\n key={approval.id}\n onAlwaysApprove={onAlwaysApprove}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {showThinking ? <ThinkingIndicator /> : null}\n </>\n )}\n </ChatScroller>\n\n {chat.error || uploadError ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error ?? uploadError}</span>\n <button\n className=\"shrink-0 cursor-pointer font-medium\"\n onClick={() => {\n chat.clearError();\n setUploadError(null);\n }}\n type=\"button\"\n >\n Dismiss\n </button>\n </div>\n ) : null}\n\n <AgentComposer\n acceptAttribute={acceptAttribute(config, caps)}\n busy={busy}\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={chat.pendingApprovals.length > 0}\n files={files}\n onError={setUploadError}\n onPickFiles={uploadEnabled ? addFiles : undefined}\n onRemoveFile={removeFile}\n onSubmit={handleSubmit}\n onTranscribe={chat.transcribe}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n voiceEnabled={chat.agentInfo?.voice_enabled}\n voiceMaxSeconds={chat.agentInfo?.voice_max_seconds}\n />\n </Chat>\n )}\n </div>\n );\n}\n\n/** Messenger-style divider marking where messages that arrived while the widget\n * was closed begin. */\nfunction NewMessagesDivider() {\n return (\n <div className=\"my-1 flex items-center gap-2\" aria-label=\"New messages\">\n <span className=\"h-px flex-1 bg-border\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">\n New messages\n </span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n AgentStreamEvent,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\n/** Prefix marking a locally-added user message not yet echoed back by the server. */\nconst OPTIMISTIC_ID_PREFIX = \"optimistic-\";\n/** Prefix for the transient assistant bubble that fills in while text streams. */\nconst STREAMING_ID_PREFIX = \"streaming-\";\n\nlet optimisticCounter = 0;\nlet streamingCounter = 0;\n\nfunction buildOptimisticUserMessage(text: string, files?: File[]): AgentMessage {\n optimisticCounter += 1;\n const attachments = (files ?? []).map((file, index) => ({\n id: `${OPTIMISTIC_ID_PREFIX}att-${optimisticCounter}-${index}`,\n filename: file.name,\n format: file.name.split(\".\").pop()?.toLowerCase() ?? \"file\",\n size_bytes: file.size,\n }));\n return {\n id: `${OPTIMISTIC_ID_PREFIX}${optimisticCounter}`,\n role: \"user\",\n content: text,\n created_at: new Date().toISOString(),\n ...(attachments.length ? { attachments } : {}),\n } as AgentMessage;\n}\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n /** Increments each time the transcript is loaded/replaced wholesale\n * (open a saved conversation, start a new chat). Not bumped by live sends. */\n conversationEpoch: number;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n}\n\nexport interface AgentChatActions {\n send: (text: string, files?: File[]) => Promise<void>;\n transcribe: (audio: Blob) => Promise<string>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<ConversationSummary[]>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n // Bumped only when the transcript is loaded/replaced wholesale — opening a\n // saved conversation or starting a new chat. Live sends never touch it. The\n // widget uses it to re-baseline page-follow so restoring a past conversation\n // never navigates; only tool calls that arrive afterwards do.\n const [conversationEpoch, setConversationEpoch] = React.useState(0);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n // The server now returns the real persisted user message (with its\n // real id) alongside the reply. Swap it for the optimistic\n // placeholder, carrying the placeholder's id as `client_key` so the\n // bubble keeps its React key and doesn't remount (blink).\n const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const optimistic = current.filter((message) => message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const seen = new Set(settled.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n const placeholder = optimistic[optimistic.length - 1];\n if (placeholder) {\n const echoIndex = fresh.findIndex((message) => message.role === \"user\");\n if (echoIndex !== -1) {\n fresh[echoIndex] = { ...fresh[echoIndex], client_key: placeholder.client_key ?? placeholder.id };\n }\n }\n return [...settled, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n // Apply one streamed SSE event to state. `ctx.streamingId` tracks the transient\n // assistant bubble that text deltas fill in until its finalized message arrives.\n const handleStreamEvent = React.useCallback(\n (event: AgentStreamEvent, ctx: { streamingId: string | null }) => {\n switch (event.type) {\n case \"conversation\":\n setConversationId(event.conversation_id);\n break;\n case \"user_message\":\n setMessages((current) => {\n const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n if (settled.some((message) => message.id === event.message.id)) return settled;\n // Swap the in-flight placeholder — the LAST optimistic message —\n // in place (not remove + append): carrying its id as `client_key`\n // keeps the bubble's React key stable, so the DOM node survives\n // and the entry animation doesn't replay — no blink on send.\n // Stale placeholders left behind by earlier FAILED sends are\n // dropped, otherwise they'd linger as phantom duplicates.\n const optimistic = current.filter((message) => message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const placeholder = optimistic[optimistic.length - 1];\n if (!placeholder) return [...settled, event.message];\n return current\n .filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX) || message.id === placeholder.id)\n .map((message) =>\n message.id === placeholder.id\n ? { ...event.message, client_key: placeholder.client_key ?? placeholder.id }\n : message,\n );\n });\n break;\n case \"text_delta\": {\n if (!ctx.streamingId) {\n streamingCounter += 1;\n ctx.streamingId = `${STREAMING_ID_PREFIX}${streamingCounter}`;\n const bubble: AgentMessage = {\n id: ctx.streamingId,\n role: \"assistant\",\n content: event.delta,\n created_at: new Date().toISOString(),\n } as AgentMessage;\n setMessages((current) => [...current, bubble]);\n } else {\n const id = ctx.streamingId;\n setMessages((current) =>\n current.map((message) =>\n message.id === id ? { ...message, content: (message.content ?? \"\") + event.delta } : message,\n ),\n );\n }\n break;\n }\n case \"assistant_message\": {\n const streamingId = ctx.streamingId;\n ctx.streamingId = null;\n setMessages((current) => {\n if (current.some((message) => message.id === event.message.id)) {\n return streamingId ? current.filter((message) => message.id !== streamingId) : current;\n }\n // Finalize the streamed bubble in place, keeping its id as the\n // render key — replacing it with a freshly-keyed message would\n // remount the whole reply and replay the fade-in (a visible blink).\n if (streamingId) {\n const index = current.findIndex((message) => message.id === streamingId);\n if (index !== -1) {\n const next = [...current];\n next[index] = { ...event.message, client_key: streamingId };\n return next;\n }\n }\n return [...current, event.message];\n });\n break;\n }\n case \"tool_result\":\n setMessages((current) => {\n const seen = new Set(current.map((message) => message.id));\n return seen.has(event.message.id) ? current : [...current, event.message];\n });\n break;\n case \"pending_approvals\":\n setPendingApprovals(event.approvals ?? []);\n break;\n case \"error\":\n setError(event.message);\n break;\n case \"done\":\n if (event.conversation_id) setConversationId(event.conversation_id);\n if (event.pending_approvals) setPendingApprovals(event.pending_approvals);\n break;\n }\n },\n [],\n );\n\n const streamingEnabled = config.streaming !== false && typeof ReadableStream !== \"undefined\";\n\n const send = React.useCallback(\n async (text: string, files?: File[]) => {\n if (sending) return;\n if (!text.trim() && !(files && files.length)) return;\n setSending(true);\n setError(null);\n // Show the user's message immediately (then the typing indicator), rather\n // than waiting for the whole tool loop to finish before it appears.\n setMessages((current) => [...current, buildOptimisticUserMessage(text, files)]);\n try {\n if (streamingEnabled) {\n const ctx = { streamingId: null as string | null };\n let started = false;\n try {\n await client.streamMessage(text, conversationId, files, (event) => {\n started = true;\n handleStreamEvent(event, ctx);\n });\n return;\n } catch (err) {\n // Mid-stream failure: surface it. Failure to start: fall back below.\n if (started) throw err;\n }\n }\n const response = await client.sendMessage(text, conversationId, files);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, handleStreamEvent, sending, streamingEnabled],\n );\n\n const transcribe = React.useCallback(\n async (audio: Blob): Promise<string> => {\n const { text } = await client.transcribe(audio);\n return text;\n },\n [client],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n if (streamingEnabled) {\n const ctx = { streamingId: null as string | null };\n let started = false;\n try {\n await client.streamResolveApproval(callId, approve, (event) => {\n started = true;\n handleStreamEvent(event, ctx);\n });\n return;\n } catch (err) {\n if (started) throw err;\n }\n }\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, handleStreamEvent, resolvingApprovalId, streamingEnabled],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n setConversationEpoch((e) => e + 1);\n }, []);\n\n const refreshConversations = React.useCallback(async (): Promise<ConversationSummary[]> => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n return list;\n } catch (err) {\n handleFailure(err);\n return [];\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n setConversationEpoch((e) => e + 1);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n conversationId,\n conversationEpoch,\n conversations,\n deleteConversation,\n error,\n messages,\n newChat,\n openConversation,\n pendingApprovals,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n transcribe,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst STORAGE_PREFIX = \"cc-agent-always-approve:\";\n\nfunction storageKey(clientId: string): string {\n return `${STORAGE_PREFIX}${clientId || \"default\"}`;\n}\n\nfunction readStored(clientId: string): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(storageKey(clientId));\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? new Set(parsed.filter((v): v is string => typeof v === \"string\")) : new Set();\n } catch {\n return new Set();\n }\n}\n\nexport interface AlwaysApproveStore {\n /** Whether the user chose to always approve this tool for this agent. */\n isAlwaysApproved: (toolName: string) => boolean;\n /** Remember to auto-approve this tool from now on (persisted per agent). */\n setAlwaysApprove: (toolName: string) => void;\n /** Stop auto-approving this tool. */\n clearAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Per-agent \"always approve\" memory for write tools, persisted in localStorage\n * (keyed by client id). Once a tool is trusted the panel auto-resolves its\n * future approval prompts instead of asking again.\n */\nexport function useAlwaysApprove(clientId: string): AlwaysApproveStore {\n const [approved, setApproved] = React.useState<Set<string>>(() => new Set());\n\n // Load once mounted (localStorage is unavailable during SSR).\n React.useEffect(() => {\n setApproved(readStored(clientId));\n }, [clientId]);\n\n const persist = React.useCallback(\n (next: Set<string>) => {\n setApproved(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey(clientId), JSON.stringify([...next]));\n } catch {\n // Ignore quota/availability errors — trust simply won't persist.\n }\n },\n [clientId],\n );\n\n const isAlwaysApproved = React.useCallback((toolName: string) => approved.has(toolName), [approved]);\n\n const setAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (approved.has(toolName)) return;\n const next = new Set(approved);\n next.add(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n const clearAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (!approved.has(toolName)) return;\n const next = new Set(approved);\n next.delete(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };\n}\n","\"use client\";\n\nimport { cn, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { SparklesIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { useAlwaysApprove } from \"../use-always-approve\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * How the panel is presented:\n * - `\"floating\"` (default): a launcher button + a popup/fullscreen panel,\n * positioned by the widget itself (fixed to a screen corner).\n * - `\"docked\"`: no launcher; the panel fills its parent element so the host\n * can place it in the layout (e.g. a resizable side pane on desktop, or a\n * fullscreen overlay on smaller screens). Open state is controlled by the\n * host via `open`/`onOpenChange`. Page-follow navigation stays enabled so\n * the agent can drive the main view alongside the chat.\n */\n presentation?: \"floating\" | \"docked\";\n}\n\n/** Only \"final\" assistant/tool messages count as unread (skip streaming stubs). */\nfunction isUnreadable(message: AgentMessage): boolean {\n if (message.id.startsWith(\"streaming-\")) return false;\n return message.role === \"assistant\" || message.role === \"tool\";\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button. While closed, it surfaces what the agent\n * is doing — a live \"Thinking… / Calling tools…\" ticker, an unread badge when\n * a reply finished, and an \"approval needed\" chip when a write is waiting.\n * - Open on desktop: a popup panel that can expand to fullscreen (\"Agent Mode\").\n * - Open on mobile: fullscreen.\n *\n * Open/close and fullscreen transitions are animated (scale from the launcher\n * corner; size morph between popup and fullscreen). All colors come from the\n * host app's UI-kit theme tokens.\n */\nexport function AgentWidget({\n config,\n onOpenChange,\n open: controlledOpen,\n presentation = \"floating\",\n}: AgentWidgetProps) {\n const behavior = config.behavior ?? {};\n const position = config.appearance?.position ?? \"bottom-right\";\n const isControlled = controlledOpen !== undefined;\n const isDocked = presentation === \"docked\";\n const storageKey = `cc-agent-open:${config.clientId}`;\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n // Becomes true once the initial bootstrap (load last conversation, resolve\n // initial open) has settled. Controlled widgets have no bootstrap, so they\n // start \"done\" immediately. Used to hold off the unread baseline until the\n // loaded history is in place.\n const [bootstrapDone, setBootstrapDone] = React.useState(isControlled);\n\n const persist = React.useCallback(\n (next: boolean) => {\n if (isControlled || !behavior.persistOpenState) return;\n try {\n window.localStorage.setItem(storageKey, next ? \"1\" : \"0\");\n } catch {\n /* ignore storage errors */\n }\n },\n [behavior.persistOpenState, isControlled, storageKey],\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n persist(next);\n onOpenChange?.(next);\n },\n [onOpenChange, persist],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", { defaultSSRValue: true, ssr: true });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n const alwaysApprove = useAlwaysApprove(config.clientId);\n const { messages, pendingApprovals, resolveApproval, resolvingApprovalId, sending } = chat;\n\n // ----- bootstrap: load last conversation, then resolve initial open -----\n // Runs once (uncontrolled only). Waits for the conversation list, loads the\n // most recent conversation into the chat, and only then auto-opens — so the\n // panel never flashes empty before its history arrives.\n const bootRef = React.useRef(false);\n React.useEffect(() => {\n if (bootRef.current) return;\n // Controlled *floating* widgets skip bootstrap. Docked widgets are\n // controlled too, but still load their last conversation so history is\n // there the moment they dock — we just never auto-open them (the host\n // owns the open state).\n if (isControlled && !isDocked) return;\n bootRef.current = true;\n let cancelled = false;\n void (async () => {\n if (behavior.openLastConversation !== false) {\n const list = await chat.refreshConversations();\n if (cancelled) return;\n if (list.length) await chat.openConversation(list[0].id);\n if (cancelled) return;\n }\n if (!isControlled) {\n let shouldOpen = behavior.initialOpen ?? false;\n if (behavior.persistOpenState) {\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored !== null) shouldOpen = stored === \"1\"; // persisted choice wins\n } catch {\n /* ignore storage errors */\n }\n }\n if (shouldOpen) {\n setUncontrolledOpen(true);\n onOpenChange?.(true);\n }\n }\n setBootstrapDone(true);\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ----- unread tracking (badge + \"new message\" divider) -----\n // The last conversation's history is loaded on mount; none of it is \"unread\".\n // We set the seen baseline to whatever is present once bootstrap settles, so\n // the badge stays empty on load and only rises for replies that arrive\n // afterwards while the widget is closed.\n const seenCountRef = React.useRef(0);\n const [baselined, setBaselined] = React.useState(false);\n const [anchorId, setAnchorId] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (baselined || !bootstrapDone) return;\n seenCountRef.current = messages.length; // everything present at load = seen\n setBaselined(true);\n }, [baselined, bootstrapDone, messages.length]);\n\n React.useEffect(() => {\n if (open) {\n // Opening: if messages arrived while closed, drop a divider before the\n // first of them, then mark everything seen.\n if (messages.length > seenCountRef.current) {\n const firstUnread = messages[seenCountRef.current];\n setAnchorId(firstUnread && isUnreadable(firstUnread) ? firstUnread.id : null);\n }\n seenCountRef.current = messages.length;\n }\n }, [open, messages]);\n\n const unreadCount =\n open || !baselined ? 0 : messages.slice(seenCountRef.current).filter(isUnreadable).length;\n\n // ----- live \"what's it doing\" status while closed -----\n const workLabel = React.useMemo(() => {\n if (!sending) return null;\n const last = messages[messages.length - 1];\n if (last?.role === \"tool\") return \"Calling tools…\";\n if (last?.role === \"assistant\" && (last.tool_calls?.length ?? 0) > 0) return \"Calling tools…\";\n return \"Thinking…\";\n }, [sending, messages]);\n\n const approvalWaiting = pendingApprovals.length > 0;\n\n // ----- auto-approve trusted write tools -----\n const { isAlwaysApproved } = alwaysApprove;\n React.useEffect(() => {\n if (resolvingApprovalId) return;\n const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));\n if (target) void resolveApproval(target.id, true);\n }, [pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);\n\n // ----- live page refresh after successful writes -----\n const firedWriteIds = React.useRef<Set<string>>(new Set());\n const { onWriteSuccess } = config;\n React.useEffect(() => {\n if (!onWriteSuccess) return;\n for (const message of messages) {\n if (message.role !== \"tool\" || !message.is_write || message.tool_status !== \"success\") continue;\n if (firedWriteIds.current.has(message.id)) continue;\n firedWriteIds.current.add(message.id);\n const args = findToolArguments(messages, message);\n onWriteSuccess({ arguments: args, toolName: message.tool_name ?? \"\" });\n }\n }, [messages, onWriteSuccess]);\n\n // ----- page-follow navigation (popup mode only) -----\n // Only tool calls that arrive LIVE in the current session drive navigation.\n // Opening the agent (which restores the last conversation) or switching to a\n // saved conversation must NOT yank the page to whatever that transcript last\n // looked at. We track the chat's `conversationEpoch` — bumped only on a\n // wholesale transcript load — and on each new epoch we adopt the current tail\n // tool call as the baseline WITHOUT navigating; only tool calls appended\n // afterwards (a live send) trigger page-follow.\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const navEpochRef = React.useRef<number>(-1);\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n\n // New transcript loaded (open/restore/switch/new chat): baseline to its\n // tail and bail — restoring a conversation never navigates.\n if (navEpochRef.current !== chat.conversationEpoch) {\n navEpochRef.current = chat.conversationEpoch;\n lastNavigatedMessageId.current = latest?.id ?? null;\n return;\n }\n\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (!path) return;\n const scrollTo = typeof mapping.scrollTo === \"function\" ? mapping.scrollTo(args) : mapping.scrollTo;\n // The host skips the push when already on `path` (no reload) and scrolls to\n // the working section either way.\n config.navigate(path, { scrollTo: scrollTo ?? null });\n }, [chat.conversationEpoch, config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n const transformOrigin = position === \"bottom-left\" ? \"bottom left\" : \"bottom right\";\n const launcherHidden = open || config.appearance?.hideLauncher || isDocked;\n\n return (\n <TooltipProvider>\n {/* Launcher (closed state) */}\n <AnimatePresence>\n {!launcherHidden ? (\n <motion.div\n key=\"agent-launcher\"\n initial={{ opacity: 0, scale: 0.6 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.6 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 24 }}\n style={{ transformOrigin }}\n className={cn(\n \"fixed z-50 flex flex-col items-end gap-2\",\n position === \"bottom-left\"\n ? \"bottom-4 left-4 items-start sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n >\n {/* Status / approval chips — appear one at a time above the button. */}\n <AnimatePresence mode=\"popLayout\">\n {approvalWaiting ? (\n <StatusChip key=\"approval\" tone=\"warning\" pulse>\n Approval needed\n </StatusChip>\n ) : workLabel ? (\n <StatusChip key={workLabel} tone=\"muted\">\n {workLabel}\n </StatusChip>\n ) : null}\n </AnimatePresence>\n\n <div className=\"relative\">\n <button\n type=\"button\"\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n className=\"flex size-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg outline-none transition-transform hover:scale-105 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <SparklesIcon className=\"size-6\" />\n </button>\n {/* Unread badge — a finished reply the user hasn't seen yet. */}\n <AnimatePresence>\n {unreadCount > 0 ? (\n <motion.span\n key=\"badge\"\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n transition={{ type: \"spring\", stiffness: 500, damping: 20 }}\n className=\"absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-red-500 px-1 text-xs font-semibold text-white shadow-md ring-2 ring-background\"\n aria-label={`${unreadCount} new message${unreadCount === 1 ? \"\" : \"s\"}`}\n >\n {unreadCount > 9 ? \"9+\" : unreadCount}\n </motion.span>\n ) : null}\n </AnimatePresence>\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n\n {/* Docked panel — fills the host-provided container (open state). */}\n {isDocked ? (\n <AnimatePresence>\n {open ? (\n <motion.div\n key=\"agent-docked\"\n initial={{ opacity: 0, x: 28 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 28 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 30 }}\n className=\"flex h-full w-full flex-col overflow-hidden bg-background\"\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode={false}\n chat={chat}\n className=\"flex-1\"\n collapseToSide\n config={config}\n newMessageAnchorId={anchorId}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => {}}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>\n ) : (\n <>\n {/* Panel (open state) */}\n <AnimatePresence>\n {open ? (\n <motion.div\n key=\"agent-panel\"\n layout\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 28 }}\n style={{\n transformOrigin,\n ...(fullscreen\n ? {}\n : {\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }),\n }}\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden bg-background\",\n fullscreen\n ? \"inset-0\"\n : cn(\n \"rounded-2xl border border-border shadow-2xl\",\n position === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n ),\n )}\n role=\"dialog\"\n aria-modal={fullscreen ? \"true\" : undefined}\n >\n <AgentPanel\n agentMode={fullscreen && agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n newMessageAnchorId={anchorId}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>\n </>\n )}\n </TooltipProvider>\n );\n}\n\n/** Small status pill that floats above the launcher, animating in/out. */\nfunction StatusChip({\n children,\n tone,\n pulse,\n}: {\n children: React.ReactNode;\n tone: \"muted\" | \"warning\";\n pulse?: boolean;\n}) {\n return (\n <motion.div\n layout\n initial={{ opacity: 0, y: 6, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 6, scale: 0.9 }}\n transition={{ duration: 0.18 }}\n className={cn(\n \"flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium shadow-sm\",\n tone === \"warning\"\n ? \"border-warning bg-warning-surface text-warning-foreground\"\n : \"border-border bg-card text-secondary-foreground\",\n )}\n >\n {pulse ? <span className=\"size-1.5 rounded-full bg-warning-foreground\" /> : (\n <span className=\"flex gap-0.5\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </span>\n )}\n {children}\n </motion.div>\n );\n}\n\nfunction Dot({ delay }: { delay: number }) {\n return (\n <motion.span\n className=\"size-1.5 rounded-full bg-current opacity-60\"\n animate={{ opacity: [0.2, 1, 0.2] }}\n transition={{ duration: 1, repeat: Infinity, delay }}\n />\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/realtime-client.ts","../src/file-support.ts","../src/components/agent-image-lightbox.tsx","../src/components/agent-voice-recorder.tsx","../src/components/agent-composer.tsx","../src/message-group.ts","../src/components/chat-scroller.tsx","../src/use-smooth-text.ts","../src/components/copy-button.tsx","../src/components/message-item.tsx","../src/components/thinking-indicator.tsx","../src/table-format.tsx","../src/tool-presentation.ts","../src/components/document-card.tsx","../src/components/task-checklist.tsx","../src/components/tool-activity-group.tsx","../src/components/tool-approval-card.tsx","../src/components/agent-panel.tsx","../src/use-agent-chat.ts","../src/use-always-approve.ts","../src/components/agent-widget.tsx","../src/config.ts"],"names":["limit","React","React2","jsxs","motion","jsx","acceptAttribute","React3","cn","XIcon","Fragment","Button","callId","React4","React5","React6","CheckIcon","React7","FileTextIcon","React8","ThinkingOrb","UUID_RE","React9","React10","Spinner","ChevronDownIcon","React11","Tooltip","TooltipTrigger","TooltipContent","Maximize2Icon","Trash2Icon","ChatMessage","React13","storageKey","React14","AnimatePresence"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n AgentStreamEvent,\n ChatResponse,\n CollabConversationSummary,\n ContextItem,\n ContextMeterData,\n ConversationFile,\n ConversationMyState,\n ConversationParticipant,\n ConversationSummary,\n PendingApproval,\n SearchResult,\n SendOptions,\n} from \"./types\";\n\n/** Extra fields the collaboration-aware chat request accepts. */\nfunction collabBody(options?: SendOptions): Record<string, unknown> {\n if (!options) return {};\n const body: Record<string, unknown> = {};\n if (options.idempotencyKey) body.idempotency_key = options.idempotencyKey;\n if (options.replyToId) body.reply_to_id = options.replyToId;\n if (options.threadRootId) body.thread_root_id = options.threadRootId;\n if (options.mentionUserIds?.length) body.mention_user_ids = options.mentionUserIds;\n return body;\n}\n\n/** Mirror the collab fields onto a multipart form (file uploads). */\nfunction appendCollab(form: FormData, options?: SendOptions): void {\n if (!options) return;\n if (options.idempotencyKey) form.append(\"idempotency_key\", options.idempotencyKey);\n if (options.replyToId) form.append(\"reply_to_id\", options.replyToId);\n if (options.threadRootId) form.append(\"thread_root_id\", options.threadRootId);\n for (const id of options.mentionUserIds ?? []) form.append(\"mention_user_ids\", id);\n}\n\nexport class AgentApiError extends Error {\n status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = \"AgentApiError\";\n this.status = status;\n }\n}\n\n/**\n * Thin fetch client for the Country Club Agent Mode API.\n *\n * Every request carries the agent client_id (query param — also used by the\n * backend's per-agent CORS middleware, including on preflights) and the\n * logged-in user's bearer token.\n */\nexport class AgentApiClient {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n private async request<T>(\n path: string,\n options: { method?: string; body?: unknown } = {},\n ): Promise<T> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n // FormData bodies (file uploads) must not carry a manual Content-Type — the\n // browser sets the multipart boundary itself.\n const isFormData = typeof FormData !== \"undefined\" && options.body instanceof FormData;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n if (!isFormData) headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(url, {\n body:\n options.body === undefined\n ? undefined\n : isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.status === 204) return undefined as T;\n\n let payload: Record<string, unknown> = {};\n try {\n payload = (await response.json()) as Record<string, unknown>;\n } catch {\n // Non-JSON error body — fall through to the status check.\n }\n\n if (!response.ok) {\n const detail =\n (payload.detail as string) ||\n (payload.message as string) ||\n `Request failed (${response.status})`;\n throw new AgentApiError(detail, response.status);\n }\n return payload as T;\n }\n\n getConfig(): Promise<AgentPublicConfig> {\n return this.request<AgentPublicConfig>(\"/agent-mode/config/\");\n }\n\n /** Upload a recorded voice clip and get back the transcribed text. */\n transcribe(audio: Blob): Promise<{ text: string }> {\n const type = audio.type || \"audio/webm\";\n const ext = type.includes(\"mp4\") ? \"mp4\" : type.includes(\"ogg\") ? \"ogg\" : type.includes(\"wav\") ? \"wav\" : \"webm\";\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"audio\", audio, `recording.${ext}`);\n return this.request<{ text: string }>(\"/agent-mode/transcribe/\", {\n body: form,\n method: \"POST\",\n });\n }\n\n sendMessage(\n message: string,\n conversationId?: string | null,\n files?: File[],\n options?: SendOptions,\n ): Promise<ChatResponse> {\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n appendCollab(form, options);\n return this.request<ChatResponse>(\"/agent-mode/chat/\", { body: form, method: \"POST\" });\n }\n return this.request<ChatResponse>(\"/agent-mode/chat/\", {\n body: {\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n ...collabBody(options),\n },\n method: \"POST\",\n });\n }\n\n resolveApproval(callId: string, approve: boolean): Promise<ChatResponse> {\n return this.request<ChatResponse>(`/agent-mode/approvals/${callId}/resolve/`, {\n body: { approve, client_id: this.config.clientId },\n method: \"POST\",\n });\n }\n\n // ------------------------------------------------------------- streaming\n\n /** POST a chat turn and yield parsed SSE events as they stream in. */\n async streamMessage(\n message: string,\n conversationId: string | null | undefined,\n files: File[] | undefined,\n onEvent: (event: AgentStreamEvent) => void,\n signal?: AbortSignal,\n options?: SendOptions,\n ): Promise<void> {\n let body: BodyInit;\n const headers = await this.streamHeaders();\n if (files && files.length > 0) {\n const form = new FormData();\n form.append(\"client_id\", this.config.clientId);\n form.append(\"message\", message);\n if (conversationId) form.append(\"conversation_id\", conversationId);\n for (const file of files) form.append(\"files\", file, file.name);\n appendCollab(form, options);\n body = form; // browser sets multipart Content-Type\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify({\n client_id: this.config.clientId,\n conversation_id: conversationId ?? null,\n message,\n ...collabBody(options),\n });\n }\n await this.consumeStream(\"/agent-mode/chat/stream/\", { body, headers, signal }, onEvent);\n }\n\n /** POST an approval decision and yield the continued reply as SSE events. */\n async streamResolveApproval(\n callId: string,\n approve: boolean,\n onEvent: (event: AgentStreamEvent) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n const headers = await this.streamHeaders();\n headers[\"Content-Type\"] = \"application/json\";\n await this.consumeStream(\n `/agent-mode/approvals/${callId}/resolve/stream/`,\n {\n body: JSON.stringify({ approve, client_id: this.config.clientId }),\n headers,\n signal,\n },\n onEvent,\n );\n }\n\n private async streamHeaders(): Promise<Record<string, string>> {\n const token = await this.config.getAccessToken();\n if (!token) {\n throw new AgentApiError(\"You need to be signed in to use the assistant.\", 401);\n }\n return {\n // Include application/json so DRF content-negotiation always finds a match.\n Accept: \"text/event-stream, application/json\",\n Authorization: `Bearer ${token}`,\n \"X-Agent-Client-Id\": this.config.clientId,\n };\n }\n\n private async consumeStream(\n path: string,\n init: { body: BodyInit; headers: Record<string, string>; signal?: AbortSignal },\n onEvent: (event: AgentStreamEvent) => void,\n ): Promise<void> {\n const base = this.config.apiBaseUrl.replace(/\\/$/, \"\");\n const separator = path.includes(\"?\") ? \"&\" : \"?\";\n const url = `${base}${path}${separator}client_id=${encodeURIComponent(this.config.clientId)}`;\n\n const response = await fetch(url, {\n body: init.body,\n headers: init.headers,\n method: \"POST\",\n signal: init.signal,\n });\n\n if (!response.ok || !response.body) {\n let detail = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as Record<string, unknown>;\n detail = (payload.detail as string) || (payload.message as string) || detail;\n } catch {\n // non-JSON / empty body\n }\n throw new AgentApiError(detail, response.status || 0);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n // SSE frames are separated by a blank line; each `data:` line holds JSON.\n const flushFrame = (frame: string) => {\n const dataLines = frame\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trimStart());\n if (dataLines.length === 0) return;\n const raw = dataLines.join(\"\\n\");\n try {\n onEvent(JSON.parse(raw) as AgentStreamEvent);\n } catch {\n // Ignore comment/keepalive frames (e.g. \": open\") and malformed lines.\n }\n };\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n flushFrame(buffer.slice(0, boundary));\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim()) flushFrame(buffer);\n }\n\n listConversations(): Promise<{\n conversations: CollabConversationSummary[];\n has_more?: boolean;\n }> {\n return this.request(\"/agent-mode/conversations/\");\n }\n\n getConversation(\n conversationId: string,\n options?: { beforeSeq?: number; limit?: number },\n ): Promise<{\n conversation: CollabConversationSummary & {\n last_seq: number;\n can_toggle_visibility: boolean;\n can_go_private: boolean;\n };\n messages: AgentMessage[];\n has_more?: boolean;\n oldest_seq?: number | null;\n context_meter?: ContextMeterData;\n context_items?: ContextItem[];\n participants?: ConversationParticipant[];\n my_state?: ConversationMyState;\n pending_approvals: PendingApproval[];\n }> {\n const qs = new URLSearchParams();\n if (options?.beforeSeq != null) qs.set(\"before_seq\", String(options.beforeSeq));\n if (options?.limit != null) qs.set(\"limit\", String(options.limit));\n const suffix = qs.toString() ? `?${qs.toString()}` : \"\";\n return this.request(`/agent-mode/conversations/${conversationId}/${suffix}`);\n }\n\n /** Soft-delete (creator/admin) or leave (member). Never a hard delete. */\n deleteConversation(conversationId: string): Promise<{ status: string; action?: string }> {\n return this.request(`/agent-mode/conversations/${conversationId}/`, {\n method: \"DELETE\",\n });\n }\n\n // ------------------------------------------------------------- collaboration\n\n setVisibility(\n conversationId: string,\n visibility: \"private\" | \"public\",\n scope?: { scopeType?: \"event\" | \"team\"; scopeEventId?: string },\n ): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/visibility/`, {\n method: \"POST\",\n body: {\n client_id: this.config.clientId,\n visibility,\n scope_type: scope?.scopeType ?? \"none\",\n scope_event_id: scope?.scopeEventId,\n },\n });\n }\n\n listParticipants(conversationId: string): Promise<{ participants: ConversationParticipant[] }> {\n return this.request(`/agent-mode/conversations/${conversationId}/participants/`);\n }\n\n markRead(conversationId: string, seq: number): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/read/`, {\n method: \"POST\",\n body: { client_id: this.config.clientId, seq },\n });\n }\n\n saveDraft(conversationId: string, text: string): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/draft/`, {\n method: \"POST\",\n body: { client_id: this.config.clientId, text },\n });\n }\n\n setFlags(\n conversationId: string,\n flags: { muted?: boolean; pinned?: boolean; archived?: boolean },\n ): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/flags/`, {\n method: \"POST\",\n body: { client_id: this.config.clientId, ...flags },\n });\n }\n\n listFiles(conversationId: string): Promise<{ files: ConversationFile[] }> {\n return this.request(`/agent-mode/conversations/${conversationId}/files/`);\n }\n\n summarize(conversationId: string): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/summarize/`, {\n method: \"POST\",\n body: { client_id: this.config.clientId },\n });\n }\n\n listContext(conversationId: string): Promise<{\n context_items: ContextItem[];\n context_meter: ContextMeterData;\n }> {\n return this.request(`/agent-mode/conversations/${conversationId}/context/`);\n }\n\n pinContext(\n conversationId: string,\n item: { kind: ContextItem[\"kind\"]; label: string; refType?: string; refId?: string },\n ): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/context/`, {\n method: \"POST\",\n body: {\n client_id: this.config.clientId,\n kind: item.kind,\n label: item.label,\n ref_type: item.refType,\n ref_id: item.refId,\n },\n });\n }\n\n editMessage(\n conversationId: string,\n messageId: string,\n message: string,\n ): Promise<{ message_data?: AgentMessage }> {\n return this.request(`/agent-mode/conversations/${conversationId}/messages/${messageId}/`, {\n method: \"PATCH\",\n body: { client_id: this.config.clientId, message },\n });\n }\n\n deleteMessage(conversationId: string, messageId: string): Promise<Record<string, unknown>> {\n return this.request(`/agent-mode/conversations/${conversationId}/messages/${messageId}/`, {\n method: \"DELETE\",\n });\n }\n\n search(query: string, limit = 20): Promise<{ results: SearchResult[]; query: string }> {\n const qs = new URLSearchParams({ query, limit: String(limit) });\n return this.request(`/agent-mode/search/?${qs.toString()}`);\n }\n\n getToolTrust(): Promise<{ trusted_tools: string[] }> {\n return this.request(\"/agent-mode/tool-trust/\");\n }\n\n setToolTrust(toolName: string, trusted: boolean): Promise<Record<string, unknown>> {\n return this.request(\"/agent-mode/tool-trust/\", {\n method: \"POST\",\n body: { client_id: this.config.clientId, tool_name: toolName, trusted },\n });\n }\n}\n","import type { AgentConfig, AgentRealtimeEvent } from \"./types\";\n\nexport type RealtimeStatus = \"connecting\" | \"open\" | \"closed\";\n\ninterface RealtimeHandlers {\n onEvent: (event: AgentRealtimeEvent) => void;\n onStatus?: (status: RealtimeStatus) => void;\n}\n\n/**\n * WebSocket client for one collaborative conversation\n * (`ws/agent-mode/conversations/<id>/`).\n *\n * Auth mirrors the HTTP surface: the JWT rides as `?token=` and the agent as\n * `?client_id=`. On every (re)connect the client sends `{action:\"sync\"}` with the\n * highest `seq` it has seen so the server replays anything missed — the socket is\n * never trusted to be gap-free. Reconnects use capped exponential backoff. All of\n * this is best-effort: if the socket never opens, the widget still works over HTTP\n * and the meter/history stay correct on the next fetch.\n */\nexport class AgentRealtimeClient {\n private config: AgentConfig;\n private conversationId: string;\n private handlers: RealtimeHandlers;\n private socket: WebSocket | null = null;\n private lastSeq = 0;\n private closed = false;\n private retries = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: AgentConfig, conversationId: string, handlers: RealtimeHandlers, lastSeq = 0) {\n this.config = config;\n this.conversationId = conversationId;\n this.handlers = handlers;\n this.lastSeq = lastSeq;\n }\n\n async connect(): Promise<void> {\n if (this.closed || typeof WebSocket === \"undefined\") return;\n const url = await this.buildUrl();\n if (!url) return;\n this.handlers.onStatus?.(\"connecting\");\n let socket: WebSocket;\n try {\n socket = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.socket = socket;\n\n socket.onopen = () => {\n this.retries = 0;\n this.handlers.onStatus?.(\"open\");\n // Close any gap accumulated while disconnected.\n this.send({ action: \"sync\", last_seq: this.lastSeq });\n };\n socket.onmessage = (raw) => {\n let event: AgentRealtimeEvent;\n try {\n event = JSON.parse(raw.data) as AgentRealtimeEvent;\n } catch {\n return;\n }\n this.trackSeq(event);\n this.handlers.onEvent(event);\n };\n socket.onclose = () => {\n this.handlers.onStatus?.(\"closed\");\n if (!this.closed) this.scheduleReconnect();\n };\n socket.onerror = () => {\n // Let onclose drive reconnection.\n try {\n socket.close();\n } catch {\n /* noop */\n }\n };\n }\n\n /** Advance the local high-water mark so a reconnect replays only the true gap. */\n private trackSeq(event: AgentRealtimeEvent): void {\n if (event.type === \"sync\") {\n if (typeof event.last_seq === \"number\") this.lastSeq = Math.max(this.lastSeq, event.last_seq);\n } else if (event.type === \"message\" || event.type === \"message_edited\") {\n const seq = event.message?.seq;\n if (typeof seq === \"number\") this.lastSeq = Math.max(this.lastSeq, seq);\n }\n }\n\n setLastSeq(seq: number): void {\n if (seq > this.lastSeq) this.lastSeq = seq;\n }\n\n sendTyping(isTyping: boolean): void {\n this.send({ action: \"typing\", is_typing: isTyping });\n }\n\n markRead(seq: number): void {\n this.setLastSeq(seq);\n this.send({ action: \"read\", seq });\n }\n\n requestSync(): void {\n this.send({ action: \"sync\", last_seq: this.lastSeq });\n }\n\n close(): void {\n this.closed = true;\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n if (this.socket) {\n try {\n this.socket.close();\n } catch {\n /* noop */\n }\n this.socket = null;\n }\n }\n\n private send(payload: Record<string, unknown>): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify(payload));\n } catch {\n /* noop */\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.retries += 1;\n const delay = Math.min(30_000, 1_000 * 2 ** Math.min(this.retries, 5));\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect();\n }, delay);\n }\n\n private async buildUrl(): Promise<string | null> {\n const token = await this.config.getAccessToken();\n if (!token) return null;\n const base = (this.config.realtime?.baseUrl ?? this.config.apiBaseUrl)\n .replace(/\\/$/, \"\")\n .replace(/^http/, \"ws\");\n const params = new URLSearchParams({\n client_id: this.config.clientId,\n token,\n last_seq: String(this.lastSeq),\n });\n return `${base}/ws/agent-mode/conversations/${this.conversationId}/?${params.toString()}`;\n }\n}\n","import type { AgentConfig } from \"./types\";\n\n/** Text formats the model can read directly. */\nexport const DEFAULT_ACCEPT = [\".txt\", \".md\", \".markdown\", \".csv\", \".tsv\", \".log\", \".docx\"];\n\n/** Image formats accepted when the agent has a Vision provider (screenshot → description). */\nexport const IMAGE_ACCEPT = [\".png\", \".jpg\", \".jpeg\", \".webp\", \".gif\"];\n\nexport const DEFAULT_MAX_SIZE_MB = 5;\nexport const DEFAULT_IMAGE_MAX_SIZE_MB = 10;\n\n/**\n * Backend-driven media capabilities for the agent (from GET /agent-mode/config/).\n * Vision/voice are gated by the backend — the agent must have the matching provider\n * configured — so these come from the fetched config, not the local AgentConfig.\n */\nexport interface MediaCapabilities {\n visionEnabled?: boolean;\n visionMaxMb?: number;\n}\n\nexport function fileUploadEnabled(config: AgentConfig): boolean {\n return config.fileUpload?.enabled !== false;\n}\n\n/** Text extensions the agent accepts (empty when text upload is disabled). */\nexport function textExtensions(config: AgentConfig): string[] {\n if (!fileUploadEnabled(config)) return [];\n const accept = config.fileUpload?.accept;\n return accept && accept.length > 0 ? accept.map((ext) => ext.toLowerCase()) : DEFAULT_ACCEPT;\n}\n\n/** Every extension the composer accepts — text (if enabled) plus images (if vision on). */\nexport function acceptedExtensions(config: AgentConfig, caps?: MediaCapabilities): string[] {\n const extensions = [...textExtensions(config)];\n if (caps?.visionEnabled) extensions.push(...IMAGE_ACCEPT);\n return extensions;\n}\n\nexport function maxSizeMb(config: AgentConfig): number {\n return config.fileUpload?.maxSizeMb ?? DEFAULT_MAX_SIZE_MB;\n}\n\n/** Whether attaching anything is possible: text upload OR image (vision) upload. */\nexport function attachmentsEnabled(config: AgentConfig, caps?: MediaCapabilities): boolean {\n return fileUploadEnabled(config) || Boolean(caps?.visionEnabled);\n}\n\n/** The `accept` attribute value for a native file input. */\nexport function acceptAttribute(config: AgentConfig, caps?: MediaCapabilities): string {\n return acceptedExtensions(config, caps).join(\",\");\n}\n\nfunction extensionOf(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot >= 0 ? filename.slice(dot).toLowerCase() : \"\";\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\") || IMAGE_ACCEPT.includes(extensionOf(file.name));\n}\n\n/** Validate a picked/dropped/pasted file against the accepted formats and size. */\nexport function validateFile(config: AgentConfig, file: File, caps?: MediaCapabilities): string | null {\n if (isImageFile(file)) {\n if (!caps?.visionEnabled) {\n return `“${file.name}” is an image — this assistant can’t accept images.`;\n }\n const limit = caps.visionMaxMb ?? DEFAULT_IMAGE_MAX_SIZE_MB;\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n }\n\n const extensions = textExtensions(config);\n if (!fileUploadEnabled(config)) {\n return `“${file.name}” can’t be attached — file upload is disabled for this assistant.`;\n }\n if (!extensions.includes(extensionOf(file.name))) {\n return `“${file.name}” isn’t a supported file. Allowed: ${extensions.join(\", \")}.`;\n }\n const limit = maxSizeMb(config);\n if (file.size > limit * 1024 * 1024) {\n return `“${file.name}” is too large (max ${limit} MB).`;\n }\n return null;\n}\n\nexport function formatBytes(bytes: number | undefined): string {\n if (!bytes && bytes !== 0) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","\"use client\";\n\nimport { cn } from \"@cntyclub/ui-react\";\nimport { XIcon } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport interface AgentImageLightboxProps {\n /** Image URL to show full-size, or null when closed. */\n src: string | null;\n alt?: string;\n onClose: () => void;\n}\n\n/**\n * Full-size image viewer rendered in a portal on `document.body`, so it escapes\n * the (small) widget bounds and fills the whole viewport. Click the backdrop, the\n * close button, or press Esc to dismiss.\n */\nexport function AgentImageLightbox({ src, alt, onClose }: AgentImageLightboxProps) {\n React.useEffect(() => {\n if (!src) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [src, onClose]);\n\n if (typeof document === \"undefined\") return null;\n\n return createPortal(\n <AnimatePresence>\n {src ? (\n <motion.div\n animate={{ opacity: 1 }}\n aria-modal=\"true\"\n className={cn(\n \"fixed inset-0 z-[2147483000] flex items-center justify-center bg-black/80 p-6 backdrop-blur-sm\",\n )}\n exit={{ opacity: 0 }}\n initial={{ opacity: 0 }}\n onClick={onClose}\n role=\"dialog\"\n transition={{ duration: 0.15 }}\n >\n <button\n aria-label=\"Close image\"\n className=\"absolute top-4 right-4 flex size-10 cursor-pointer items-center justify-center rounded-full bg-white/10 text-white transition-colors hover:bg-white/20 [&_svg]:size-5\"\n onClick={onClose}\n type=\"button\"\n >\n <XIcon />\n </button>\n <motion.img\n alt={alt ?? \"Attached image\"}\n animate={{ scale: 1, opacity: 1 }}\n className=\"max-h-full max-w-full rounded-lg object-contain shadow-2xl\"\n exit={{ scale: 0.96, opacity: 0 }}\n initial={{ scale: 0.96, opacity: 0 }}\n onClick={(event) => event.stopPropagation()}\n src={src}\n transition={{ duration: 0.15 }}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { Button, ThinkingOrb } from \"@cntyclub/ui-react\";\nimport { CheckIcon, PauseIcon, PlayIcon, SquareIcon, Trash2Icon } from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nexport interface AgentVoiceRecorderProps {\n /** Hard cap in seconds — recording auto-stops here (backend source of truth). */\n maxSeconds: number;\n /** Send the recorded clip for transcription; resolves to the transcript text. */\n transcribe: (audio: Blob) => Promise<string>;\n /** Confirmed + transcribed: hand the text back to the composer (append). */\n onDone: (text: string) => void;\n /** Cancelled (trash) or recording failed — return to the normal composer. */\n onCancel: () => void;\n /** Surface a user-facing error (mic denied, transcription failed). */\n onError: (message: string) => void;\n}\n\ntype Phase = \"recording\" | \"review\" | \"transcribing\";\n\n/**\n * Fixed bar geometry for the live level meter, in CSS px. The bars keep this\n * exact (thin) width at every panel width — a wider panel shows MORE bars, not\n * fatter ones, so the meter stays delicate in fullscreen Agent Mode.\n */\nconst BAR_WIDTH = 2;\nconst BAR_GAP = 3;\n/** Level-history capacity, in samples (= bars). Plenty for any panel width. */\nconst MAX_BARS = 1024;\n/** How many bars at the left (oldest) edge fade out so the strip ends softly. */\nconst FADE_BARS = 12;\n\nfunction formatClock(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}:${String(seconds).padStart(2, \"0\")}`;\n}\n\nfunction pickMimeType(): string {\n if (typeof MediaRecorder === \"undefined\") return \"\";\n for (const type of [\"audio/webm\", \"audio/mp4\", \"audio/ogg\"]) {\n if (MediaRecorder.isTypeSupported(type)) return type;\n }\n return \"\";\n}\n\n/**\n * In-composer voice capture. Mounts already \"recording\" (the mic button in the\n * composer starts it): shows a live timer that auto-stops at `maxSeconds`, then a\n * review bar (play back · confirm · cancel). Confirm transcribes and appends the\n * text to the composer; cancel/trash discards and returns to typing. The audio is\n * never uploaded except on confirm, and the backend never persists it.\n */\nexport function AgentVoiceRecorder({ maxSeconds, transcribe, onDone, onCancel, onError }: AgentVoiceRecorderProps) {\n const [phase, setPhase] = React.useState<Phase>(\"recording\");\n const [elapsed, setElapsed] = React.useState(0);\n const [playing, setPlaying] = React.useState(false);\n\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const chunksRef = React.useRef<Blob[]>([]);\n const blobRef = React.useRef<Blob | null>(null);\n const audioUrlRef = React.useRef<string | null>(null);\n const audioRef = React.useRef<HTMLAudioElement | null>(null);\n const timerRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n // Live level meter (ChatGPT-style scrolling bars).\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null);\n const audioContextRef = React.useRef<AudioContext | null>(null);\n const analyserRef = React.useRef<AnalyserNode | null>(null);\n const rafRef = React.useRef<number | null>(null);\n const levelsRef = React.useRef<number[]>(new Array(MAX_BARS).fill(0));\n // Latest onError without retriggering the start effect.\n const onErrorRef = React.useRef(onError);\n onErrorRef.current = onError;\n\n const stopMeter = React.useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n analyserRef.current = null;\n const ctx = audioContextRef.current;\n audioContextRef.current = null;\n if (ctx && ctx.state !== \"closed\") void ctx.close().catch(() => {});\n }, []);\n\n const stopTracks = React.useCallback(() => {\n streamRef.current?.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n stopMeter();\n }, [stopMeter]);\n\n // Tap the mic stream through a Web-Audio analyser and animate a scrolling\n // bar meter driven by the live signal amplitude (like ChatGPT's voice input).\n const startMeter = React.useCallback((stream: MediaStream) => {\n const Ctor: typeof AudioContext | undefined =\n typeof window === \"undefined\"\n ? undefined\n : window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!Ctor) return;\n let context: AudioContext;\n try {\n context = new Ctor();\n } catch {\n return;\n }\n audioContextRef.current = context;\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.75;\n source.connect(analyser);\n analyserRef.current = analyser;\n levelsRef.current = new Array(MAX_BARS).fill(0);\n\n const buffer = new Uint8Array(analyser.fftSize);\n\n const draw = () => {\n const canvas = canvasRef.current;\n const activeAnalyser = analyserRef.current;\n if (!canvas || !activeAnalyser) return;\n const ctx2d = canvas.getContext(\"2d\");\n if (!ctx2d) return;\n\n activeAnalyser.getByteTimeDomainData(buffer);\n let sumSquares = 0;\n for (let i = 0; i < buffer.length; i += 1) {\n const centered = (buffer[i] - 128) / 128;\n sumSquares += centered * centered;\n }\n const rms = Math.sqrt(sumSquares / buffer.length);\n // Boost + clamp so quiet speech still reads without clipping the loud end.\n const level = Math.min(1, rms * 3.2);\n\n const levels = levelsRef.current;\n levels.push(level);\n levels.shift();\n\n const dpr = Math.min(2, typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1);\n const cssWidth = canvas.clientWidth || 1;\n const cssHeight = canvas.clientHeight || 1;\n const pxWidth = Math.round(cssWidth * dpr);\n const pxHeight = Math.round(cssHeight * dpr);\n if (canvas.width !== pxWidth) canvas.width = pxWidth;\n if (canvas.height !== pxHeight) canvas.height = pxHeight;\n\n ctx2d.clearRect(0, 0, pxWidth, pxHeight);\n ctx2d.fillStyle = getComputedStyle(canvas).color || \"currentColor\";\n\n // Fixed-width thin bars; the count adapts to the canvas width, so a\n // wider panel shows more history instead of stretching the bars.\n const barWidth = BAR_WIDTH * dpr;\n const slot = (BAR_WIDTH + BAR_GAP) * dpr;\n const count = Math.max(1, Math.min(MAX_BARS, Math.floor((pxWidth + BAR_GAP * dpr) / slot)));\n const midY = pxHeight / 2;\n const minBar = barWidth; // silence renders as a small round dot\n const maxBar = pxHeight * 0.92;\n const radius = barWidth / 2;\n\n for (let i = 0; i < count; i += 1) {\n // Newest sample sits flush at the right edge; older bars march left.\n const value = levels[levels.length - count + i];\n const barHeight = Math.max(minBar, value * maxBar);\n const x = pxWidth - barWidth - (count - 1 - i) * slot;\n const y = midY - barHeight / 2;\n // Soft fade on the oldest few bars so the strip ends gently.\n ctx2d.globalAlpha = Math.min(1, (i + 1) / FADE_BARS);\n if (typeof ctx2d.roundRect === \"function\") {\n ctx2d.beginPath();\n ctx2d.roundRect(x, y, barWidth, barHeight, Math.min(radius, barHeight / 2));\n ctx2d.fill();\n } else {\n ctx2d.fillRect(x, y, barWidth, barHeight);\n }\n }\n ctx2d.globalAlpha = 1;\n\n rafRef.current = requestAnimationFrame(draw);\n };\n\n rafRef.current = requestAnimationFrame(draw);\n }, []);\n\n // Begin capturing on mount; clean everything up on unmount.\n React.useEffect(() => {\n let cancelled = false;\n\n void (async () => {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n onErrorRef.current(\"Voice recording isn't supported in this browser.\");\n onCancel();\n return;\n }\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n streamRef.current = stream;\n startMeter(stream);\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n recorderRef.current = recorder;\n chunksRef.current = [];\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) chunksRef.current.push(event.data);\n };\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: mimeType || \"audio/webm\" });\n blobRef.current = blob;\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current);\n audioUrlRef.current = URL.createObjectURL(blob);\n setPhase(\"review\");\n };\n recorder.start();\n timerRef.current = setInterval(() => {\n setElapsed((current) => {\n const next = current + 1;\n if (next >= maxSeconds) stopRecording();\n return next;\n });\n }, 1000);\n } catch {\n onErrorRef.current(\"Microphone access was blocked. Enable it to record.\");\n onCancel();\n }\n })();\n\n return () => {\n cancelled = true;\n stopTracks();\n if (recorderRef.current && recorderRef.current.state !== \"inactive\") {\n try {\n recorderRef.current.stop();\n } catch {\n /* already stopped */\n }\n }\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function stopRecording() {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n const recorder = recorderRef.current;\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n stopTracks();\n }\n\n const togglePlayback = () => {\n const audio = audioRef.current;\n if (!audio) return;\n if (audio.paused) {\n void audio.play();\n setPlaying(true);\n } else {\n audio.pause();\n setPlaying(false);\n }\n };\n\n const confirm = async () => {\n const blob = blobRef.current;\n if (!blob || blob.size === 0) {\n onError(\"The recording was empty.\");\n onCancel();\n return;\n }\n setPhase(\"transcribing\");\n try {\n const text = await transcribe(blob);\n onDone(text.trim());\n } catch {\n onError(\"Transcription failed. Please try again.\");\n setPhase(\"review\");\n }\n };\n\n return (\n <motion.div\n animate={{ opacity: 1, y: 0 }}\n className=\"flex min-h-8 flex-1 items-center gap-2 px-1\"\n initial={{ opacity: 0, y: 4 }}\n transition={{ duration: 0.15 }}\n >\n {phase === \"recording\" ? (\n <>\n <span className=\"flex shrink-0 items-center gap-2 text-sm\">\n <motion.span\n animate={{ opacity: [1, 0.35, 1] }}\n className=\"size-2.5 rounded-full bg-destructive\"\n transition={{ duration: 1.2, repeat: Infinity }}\n />\n <span className=\"font-medium tabular-nums\">{formatClock(elapsed)}</span>\n </span>\n {/* Live signal meter — scrolls right-to-left; color follows text-foreground. */}\n <canvas aria-hidden className=\"h-6 min-w-0 flex-1 text-foreground/70\" ref={canvasRef} />\n <Button aria-label=\"Discard recording\" onClick={onCancel} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n <Trash2Icon />\n </Button>\n <Button aria-label=\"Stop recording\" onClick={stopRecording} size=\"icon-sm\" type=\"button\">\n <SquareIcon />\n </Button>\n </>\n ) : null}\n\n {phase === \"review\" ? (\n <>\n {/* Hidden audio element drives playback of the recorded clip. */}\n <audio onEnded={() => setPlaying(false)} ref={audioRef} src={audioUrlRef.current ?? undefined} />\n <Button aria-label={playing ? \"Pause\" : \"Play recording\"} onClick={togglePlayback} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n {playing ? <PauseIcon /> : <PlayIcon />}\n </Button>\n <span className=\"text-muted-foreground text-sm tabular-nums\">{formatClock(elapsed)}</span>\n <span className=\"flex-1\" />\n <Button aria-label=\"Discard recording\" onClick={onCancel} size=\"icon-sm\" type=\"button\" variant=\"ghost\">\n <Trash2Icon />\n </Button>\n <Button aria-label=\"Use recording\" className=\"rounded-full before:rounded-full\" onClick={() => void confirm()} size=\"icon-sm\" type=\"button\">\n <CheckIcon />\n </Button>\n </>\n ) : null}\n\n {phase === \"transcribing\" ? (\n <span className=\"flex flex-1 items-center gap-2 text-muted-foreground text-sm\">\n {/* Stock monochrome \"working\" orb — auto light/dark ink. */}\n <ThinkingOrb className=\"shrink-0\" size={20} speed={1} state=\"working\" />\n Transcribing…\n </span>\n ) : null}\n </motion.div>\n );\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { ArrowUpIcon, FileTextIcon, MicIcon, PaperclipIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes, isImageFile } from \"../file-support\";\nimport { AgentImageLightbox } from \"./agent-image-lightbox\";\nimport { AgentVoiceRecorder } from \"./agent-voice-recorder\";\n\nexport interface AgentComposerProps {\n value: string;\n onValueChange: (value: string) => void;\n /** Submit the trimmed text plus any staged files. */\n onSubmit: (text: string) => void;\n /** Hard-disable the input entirely (e.g. a pending approval must be resolved). */\n disabled?: boolean;\n /**\n * A reply is in progress. The textarea stays enabled and focused so the user\n * can start writing their next message, but submitting is blocked until done.\n */\n busy?: boolean;\n placeholder?: string;\n className?: string;\n /** File upload wiring. Omit `onPickFiles` to hide the attach button. */\n files: File[];\n onPickFiles?: (files: File[]) => void;\n onRemoveFile?: (index: number) => void;\n acceptAttribute?: string;\n /** Voice dictation. Provide `onTranscribe` (and enable) to show the mic. */\n voiceEnabled?: boolean;\n voiceMaxSeconds?: number;\n onTranscribe?: (audio: Blob) => Promise<string>;\n /** Surface a mic/transcription error to the panel's error banner. */\n onError?: (message: string) => void;\n}\n\n/** Append dictated text to what's already typed, inserting a space when needed. */\nfunction appendText(current: string, addition: string): string {\n if (!addition) return current;\n if (!current) return addition;\n return /\\s$/.test(current) ? current + addition : `${current} ${addition}`;\n}\n\n/**\n * Chat composer with attachment + voice support: auto-growing textarea, an attach\n * (paperclip) button, staged-file chips (images shown first as thumbnails), a mic\n * button, and a send button. Enter submits, Shift+Enter inserts a newline. Images\n * can also be pasted from the clipboard. While recording, the input row is replaced\n * by the voice recorder.\n */\nexport function AgentComposer({\n acceptAttribute,\n busy,\n className,\n disabled,\n files,\n onError,\n onPickFiles,\n onRemoveFile,\n onSubmit,\n onTranscribe,\n onValueChange,\n placeholder = \"Ask anything…\",\n value,\n voiceEnabled,\n voiceMaxSeconds = 600,\n}: AgentComposerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [recording, setRecording] = React.useState(false);\n const [lightboxSrc, setLightboxSrc] = React.useState<string | null>(null);\n const canSubmit = !disabled && !busy && (value.trim().length > 0 || files.length > 0);\n const voiceAvailable = Boolean(voiceEnabled && onTranscribe);\n\n const submit = React.useCallback(() => {\n if (!canSubmit) return;\n onSubmit(value.trim());\n textareaRef.current?.focus();\n }, [canSubmit, onSubmit, value]);\n\n React.useEffect(() => {\n if (!disabled) textareaRef.current?.focus();\n }, [disabled]);\n\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, 144)}px`;\n }, [value]);\n\n // Object URLs for image thumbnails; revoked when the staged set changes.\n const previews = React.useMemo(\n () =>\n files.map((file, originalIndex) => {\n const image = isImageFile(file);\n return { file, image, originalIndex, url: image ? URL.createObjectURL(file) : null };\n }),\n [files],\n );\n React.useEffect(\n () => () => {\n previews.forEach((preview) => preview.url && URL.revokeObjectURL(preview.url));\n },\n [previews],\n );\n // Images first, keeping each file's original index for removal.\n const ordered = React.useMemo(\n () => [...previews].sort((a, b) => Number(b.image) - Number(a.image)),\n [previews],\n );\n\n const handlePick = (event: React.ChangeEvent<HTMLInputElement>) => {\n const picked = Array.from(event.target.files ?? []);\n if (picked.length) onPickFiles?.(picked);\n event.target.value = \"\"; // allow re-picking the same file\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!onPickFiles) return;\n const images = Array.from(event.clipboardData?.files ?? []).filter((file) => file.type.startsWith(\"image/\"));\n if (images.length) {\n event.preventDefault();\n onPickFiles(images);\n }\n };\n\n const finishRecording = (text: string) => {\n setRecording(false);\n if (text) onValueChange(appendText(value, text));\n // Refocus after the recorder unmounts.\n setTimeout(() => textareaRef.current?.focus(), 0);\n };\n\n return (\n <form\n className={cn(\"shrink-0 bg-background p-3 pt-1.5\", className)}\n data-slot=\"agent-composer\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n >\n <div\n className={cn(\n \"flex flex-col gap-1.5 rounded-2xl border border-input bg-popover p-1.5 shadow-xs transition-[border-color,box-shadow] duration-150 focus-within:border-ring/64 focus-within:ring-2 focus-within:ring-ring/24 dark:bg-input/32\",\n disabled && \"opacity-64\",\n )}\n >\n {files.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5 px-1 pt-1\">\n {ordered.map((preview) =>\n preview.image && preview.url ? (\n <span className=\"group relative\" key={`${preview.file.name}-${preview.originalIndex}`}>\n <button\n aria-label={`Preview ${preview.file.name}`}\n className=\"block size-14 cursor-zoom-in overflow-hidden rounded-lg border border-border/72\"\n onClick={() => setLightboxSrc(preview.url)}\n type=\"button\"\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img alt={preview.file.name} className=\"size-full object-cover\" src={preview.url} />\n </button>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${preview.file.name}`}\n className=\"-right-1.5 -top-1.5 absolute flex size-5 cursor-pointer items-center justify-center rounded-full border border-border bg-background text-muted-foreground shadow-sm hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(preview.originalIndex)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ) : (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 py-1 pr-1 pl-2 text-xs\"\n key={`${preview.file.name}-${preview.originalIndex}`}\n >\n <FileTextIcon className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{preview.file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(preview.file.size)}</span>\n {onRemoveFile ? (\n <button\n aria-label={`Remove ${preview.file.name}`}\n className=\"flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground hover:bg-background hover:text-foreground [&_svg]:size-3\"\n onClick={() => onRemoveFile(preview.originalIndex)}\n type=\"button\"\n >\n <XIcon />\n </button>\n ) : null}\n </span>\n ),\n )}\n </div>\n ) : null}\n\n {recording && onTranscribe ? (\n <AgentVoiceRecorder\n maxSeconds={voiceMaxSeconds}\n onCancel={() => {\n setRecording(false);\n setTimeout(() => textareaRef.current?.focus(), 0);\n }}\n onDone={finishRecording}\n onError={(message) => onError?.(message)}\n transcribe={onTranscribe}\n />\n ) : (\n <div className=\"flex items-end gap-1.5\">\n {onPickFiles ? (\n <>\n <input\n accept={acceptAttribute}\n className=\"hidden\"\n multiple\n onChange={handlePick}\n ref={inputRef}\n type=\"file\"\n />\n <Button\n aria-label=\"Attach files\"\n className=\"shrink-0 self-center\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <PaperclipIcon />\n </Button>\n </>\n ) : null}\n\n <textarea\n className=\"max-h-36 min-h-8 flex-1 resize-none self-center bg-transparent py-1.5 pl-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n disabled={disabled}\n onChange={(event) => onValueChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n }}\n onPaste={onPickFiles ? handlePaste : undefined}\n placeholder={placeholder}\n ref={textareaRef}\n rows={1}\n value={value}\n />\n\n {voiceAvailable ? (\n <Button\n aria-label=\"Record voice\"\n className=\"shrink-0 self-center\"\n disabled={disabled}\n onClick={() => setRecording(true)}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <MicIcon />\n </Button>\n ) : null}\n\n <Button\n aria-label=\"Send message\"\n className=\"shrink-0 rounded-full before:rounded-full\"\n disabled={!canSubmit}\n size=\"icon-sm\"\n type=\"submit\"\n >\n <ArrowUpIcon />\n </Button>\n </div>\n )}\n </div>\n\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </form>\n );\n}\n","import type { AgentMessage, MessageBlock } from \"./types\";\n\n/** One tool invocation inside a tool-activity group. */\nexport interface ToolStep {\n /** Provider tool-call id (matches assistant tool_call ↔ tool result). */\n callId: string;\n name: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\";\n /** Capped, pretty-printed raw result (for the JSON detail view). */\n result?: string;\n /** Structured blocks (tables) derived from the result. */\n blocks?: MessageBlock[];\n}\n\nexport type RenderItem =\n | { kind: \"user\"; key: string; message: AgentMessage }\n | { kind: \"assistant-text\"; key: string; message: AgentMessage }\n | { kind: \"tool-activity\"; key: string; steps: ToolStep[] };\n\n/**\n * Collapse the raw message stream into render items: user bubbles, assistant\n * text bubbles, and *grouped* tool activity. Consecutive tool calls (assistant\n * tool_calls + their tool results) fold into a single group so a run of ten\n * lookups shows as one collapsible block instead of ten stacked chips.\n *\n * An assistant message that carries visible text flushes the current group and\n * emits a text bubble before starting any new tool steps.\n */\nexport function groupMessages(messages: AgentMessage[]): RenderItem[] {\n const items: RenderItem[] = [];\n\n let group: ToolStep[] | null = null;\n let groupKey = \"\";\n const stepIndexByCallId = new Map<string, number>();\n\n const flush = () => {\n if (group && group.length > 0) {\n items.push({ key: `tools-${groupKey}`, kind: \"tool-activity\", steps: group });\n }\n group = null;\n groupKey = \"\";\n stepIndexByCallId.clear();\n };\n\n for (const message of messages) {\n if (message.role === \"user\") {\n flush();\n // `client_key` (when present) survives the optimistic→server id swap,\n // so the bubble's key — and DOM node — stays stable across it.\n items.push({ key: message.client_key ?? message.id, kind: \"user\", message });\n continue;\n }\n\n if (message.role === \"assistant\") {\n const hasText = Boolean(message.content && message.content.trim());\n if (hasText) {\n flush();\n items.push({ key: message.client_key ?? message.id, kind: \"assistant-text\", message });\n }\n for (const toolCall of message.tool_calls ?? []) {\n const callId = toolCall.id ?? `${message.id}-${toolCall.name}`;\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n stepIndexByCallId.set(callId, group.length);\n group.push({\n args: (toolCall.arguments ?? {}) as Record<string, unknown>,\n callId,\n name: toolCall.name ?? \"tool\",\n status: \"running\",\n });\n }\n continue;\n }\n\n // Tool result: attach to its pending step, or open a group if orphaned.\n const callId = message.tool_call_id ?? \"\";\n if (!group) {\n group = [];\n groupKey = message.id;\n }\n const existingIndex = callId ? stepIndexByCallId.get(callId) : undefined;\n if (existingIndex !== undefined) {\n const step = group[existingIndex];\n step.status = \"done\";\n step.result = message.result || step.result;\n step.blocks = message.blocks ?? step.blocks;\n } else {\n group.push({\n args: {},\n blocks: message.blocks,\n callId: callId || message.id,\n name: message.tool_name ?? \"tool\",\n result: message.result,\n status: \"done\",\n });\n }\n }\n\n flush();\n return items;\n}\n","\"use client\";\n\nimport { cn } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\nexport type ChatScrollerProps = React.ComponentProps<\"div\">;\n\n/**\n * Scrollable message viewport that stays pinned to the bottom while content\n * grows — including token-by-token streaming, where text is appended to the\n * SAME message rather than adding new ones.\n *\n * Why not the UI kit's ChatMessages autoScroll: that container uses CSS\n * `scroll-smooth`, so a programmatic jump to the bottom emits intermediate\n * `scroll` events mid-animation whose distance-from-bottom is large, which\n * flips its \"pinned\" flag to false — after the first delta it stops following.\n * Here we scroll INSTANTLY (no smooth), so the only resulting scroll event is\n * at the true bottom and the pin holds for the whole stream. The user can still\n * scroll up to read history (that unpins), and scrolling back down re-pins.\n */\nexport function ChatScroller({ children, className, ...props }: ChatScrollerProps) {\n const viewportRef = React.useRef<HTMLDivElement>(null);\n const pinnedRef = React.useRef(true);\n\n const handleScroll = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const distanceFromBottom = viewport.scrollHeight - viewport.scrollTop - viewport.clientHeight;\n pinnedRef.current = distanceFromBottom < 64;\n }, []);\n\n // Runs after every commit (no dep array): the panel re-renders on each\n // streamed delta, so this keeps the viewport glued to the bottom while pinned.\n React.useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport || !pinnedRef.current) return;\n viewport.scrollTop = viewport.scrollHeight; // instant — see note above\n });\n\n return (\n <div\n className={cn(\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-4\", className)}\n data-slot=\"chat-scroller\"\n onScroll={handleScroll}\n ref={viewportRef}\n {...props}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\n/**\n * Minimum characters revealed per 60fps-frame — the floor speed once the\n * displayed text has nearly caught up to the target (keeps the tail from\n * crawling).\n */\nconst MIN_CHARS_PER_FRAME = 2;\n/**\n * Fraction of the remaining gap consumed each 60fps-frame. Because the step is\n * proportional to how far behind we are, a big chunk arriving at once is swept\n * in quickly (fast) while the reveal still eases out smoothly (clean); it also\n * self-balances during a live stream — the further behind, the faster it types.\n */\nconst CATCH_UP = 0.22;\n\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = React.useState(\n () => typeof matchMedia !== \"undefined\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n );\n React.useEffect(() => {\n if (typeof matchMedia === \"undefined\") return;\n const mq = matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = (event: MediaQueryListEvent) => setReduced(event.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n return reduced;\n}\n\n/**\n * A smooth \"typewriter\" over streamed text.\n *\n * Given the full text accumulated so far (`target`) and whether this message is\n * the live one (`animate`), returns the slice that should currently be shown.\n * The displayed length eases toward `target.length` on each animation frame —\n * fast, but soft enough that chunks don't pop in all at once.\n *\n * - Historical / non-live messages (`animate` false) render in full instantly.\n * - Once a message has started animating it keeps draining to the end even\n * after `animate` flips false (stream finished), so the tail never snaps.\n * - `target` is treated as append-only (streamed text only grows); a shrink\n * clamps the cursor down rather than re-typing.\n * - Honors `prefers-reduced-motion` (renders in full, no animation).\n */\nexport function useSmoothText(target: string, animate: boolean): string {\n const prefersReduced = usePrefersReducedMotion();\n const enabled = animate && !prefersReduced;\n\n const [count, setCount] = React.useState(() => (enabled ? 0 : target.length));\n const countRef = React.useRef(count);\n countRef.current = count;\n // Latches true on the first render this message ever animates, so it finishes\n // typing even after `enabled` drops back to false at stream end.\n const everEnabled = React.useRef(enabled);\n if (enabled) everEnabled.current = true;\n\n React.useEffect(() => {\n // Never-animated (historical or reduced motion): mirror the target exactly.\n if (!everEnabled.current) {\n if (countRef.current !== target.length) setCount(target.length);\n return;\n }\n if (countRef.current > target.length) {\n setCount(target.length);\n return;\n }\n if (countRef.current >= target.length) return;\n\n let raf = 0;\n let last = performance.now();\n const tick = (now: number) => {\n const dt = Math.min(64, now - last); // clamp long gaps (tab was hidden)\n last = now;\n const frames = dt / (1000 / 60);\n const gap = target.length - countRef.current;\n const step = Math.max(MIN_CHARS_PER_FRAME * frames, gap * CATCH_UP * frames);\n const next = Math.min(target.length, countRef.current + step);\n countRef.current = next;\n setCount(next);\n if (next < target.length) raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [target, enabled]);\n\n return everEnabled.current ? target.slice(0, Math.floor(count)) : target;\n}\n","\"use client\";\n\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from \"@cntyclub/ui-react\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nexport interface CopyButtonProps {\n /** The text copied to the clipboard (the assistant reply's raw markdown). */\n text: string;\n className?: string;\n}\n\n/** Small ghost icon button that copies `text` and briefly flips to a check. */\nexport function CopyButton({ className, text }: CopyButtonProps) {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n const copy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n return; // clipboard blocked (insecure context / denied) — no-op\n }\n setCopied(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 1500);\n }, [text]);\n\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={copied ? \"Copied\" : \"Copy message\"}\n className={cn(\"text-muted-foreground\", className)}\n onClick={copy}\n size=\"icon-xs\"\n type=\"button\"\n variant=\"ghost\"\n >\n {copied ? <CheckIcon className=\"text-success\" /> : <CopyIcon />}\n </Button>\n }\n />\n <TooltipContent>{copied ? \"Copied!\" : \"Copy\"}</TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { ChatMessage, ChatMessageBubble, cn, Markdown } from \"@cntyclub/ui-react\";\nimport { FileTextIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { IMAGE_ACCEPT } from \"../file-support\";\nimport type { AgentMessage } from \"../types\";\nimport { useSmoothText } from \"../use-smooth-text\";\nimport { AgentImageLightbox } from \"./agent-image-lightbox\";\nimport { CopyButton } from \"./copy-button\";\n\nconst isImageAttachment = (format: string) => IMAGE_ACCEPT.includes(`.${format.toLowerCase()}`);\n\n/**\n * Renders a user or assistant *text* message. Tool activity (assistant\n * tool_calls and tool results) is grouped and rendered by `ToolActivityGroup`\n * via `groupMessages`, so this component ignores tool messages.\n *\n * `animate` marks the live reply currently streaming in: its text reveals with\n * a smooth typewriter (see `useSmoothText`) instead of popping in per chunk.\n */\nexport function MessageItem({ animate = false, message }: { animate?: boolean; message: AgentMessage }) {\n const [lightboxSrc, setLightboxSrc] = React.useState<string | null>(null);\n // Called unconditionally (before the role branches) to keep hook order stable.\n const displayed = useSmoothText(message.content ?? \"\", animate && message.role === \"assistant\");\n\n if (message.role === \"user\") {\n const attachments = message.attachments ?? [];\n const images = attachments.filter((a) => isImageAttachment(a.format) && a.url);\n const others = attachments.filter((a) => !isImageAttachment(a.format) || !a.url);\n return (\n <ChatMessage className=\"group\" from=\"user\">\n {images.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {images.map((attachment) => (\n <button\n aria-label={`Preview ${attachment.filename}`}\n className=\"block size-20 cursor-zoom-in overflow-hidden rounded-lg border border-border/72\"\n key={attachment.id}\n onClick={() => setLightboxSrc(attachment.url ?? null)}\n type=\"button\"\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img alt={attachment.filename} className=\"size-full object-cover\" src={attachment.url ?? undefined} />\n </button>\n ))}\n </div>\n ) : null}\n {others.length > 0 ? (\n <div className=\"flex flex-wrap justify-end gap-1.5\">\n {others.map((attachment) => (\n <span\n className=\"flex max-w-52 items-center gap-1.5 rounded-lg border border-border/72 bg-muted/48 px-2 py-1 text-muted-foreground text-xs\"\n key={attachment.id}\n >\n <FileTextIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{attachment.filename}</span>\n </span>\n ))}\n </div>\n ) : null}\n {/* `whitespace-pre-wrap` so the user's own line breaks survive (the bubble\n otherwise collapses newlines to spaces). Trailing/leading blank lines\n are already stripped at submit via `.trim()` in the composer. */}\n {message.content ? (\n <ChatMessageBubble className=\"whitespace-pre-wrap\" from=\"user\">\n {message.content}\n </ChatMessageBubble>\n ) : null}\n {/* Copy the user's own message. Hover/focus-revealed, right-aligned to\n match the user bubble's side. */}\n {message.content ? (\n <div\n className={cn(\n \"mt-0.5 flex justify-end opacity-0 transition-opacity\",\n \"group-hover:opacity-100 focus-within:opacity-100\",\n )}\n >\n <CopyButton text={message.content} />\n </div>\n ) : null}\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </ChatMessage>\n );\n }\n\n if (message.role === \"assistant\") {\n if (!message.content || !message.content.trim()) return null;\n return (\n <ChatMessage className=\"group\" from=\"assistant\">\n <ChatMessageBubble from=\"assistant\">\n {/* Click any image the markdown rendered (e.g. an avatar/logo shown in\n a table cell) to open it full-size. The <img> tags belong to the\n library's Markdown component, so we catch the click via delegation\n as it bubbles up. `cursor-zoom-in` hints it's tappable. */}\n <div\n className=\"[&_img]:cursor-zoom-in [&_img]:rounded-md\"\n onClick={(event) => {\n const target = event.target as HTMLElement;\n if (target.tagName !== \"IMG\") return;\n const src = (target as HTMLImageElement).currentSrc || (target as HTMLImageElement).src;\n if (src) setLightboxSrc(src);\n }}\n role=\"presentation\"\n >\n <Markdown>{displayed}</Markdown>\n </div>\n </ChatMessageBubble>\n {/* Copy the full reply (raw markdown). Hidden until the message is\n hovered/focused so it doesn't clutter the thread. Left-aligned under\n the bubble, matching the assistant bubble's side. */}\n <div\n className={cn(\n \"mt-0.5 flex opacity-0 transition-opacity\",\n \"group-hover:opacity-100 focus-within:opacity-100\",\n )}\n >\n <CopyButton text={message.content} />\n </div>\n <AgentImageLightbox onClose={() => setLightboxSrc(null)} src={lightboxSrc} />\n </ChatMessage>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport { AuroraText, cn, ThinkingOrb } from \"@cntyclub/ui-react\";\nimport * as React from \"react\";\n\n/** Words cycled beside the typing dots so the wait feels alive (Claude-style). */\nconst DEFAULT_PHRASES = [\n \"Thinking\",\n \"Working on it\",\n \"Looking that up\",\n \"Reading the data\",\n \"Putting it together\",\n \"Almost there\",\n];\n\nexport interface ThinkingIndicatorProps {\n /** Override the rotating phrases. */\n phrases?: string[];\n /** Milliseconds each phrase stays before rotating. Default 1800. */\n intervalMs?: number;\n className?: string;\n}\n\n/**\n * A muted \"typing\" bubble: a monochrome thinking orb plus an aurora-gradient\n * phrase that rotates every ~1.8s, so a long tool run reads as active progress\n * instead of a frozen \"…\". The aurora treatment lives on the TEXT only — the\n * orb keeps the stock theme ink.\n */\nexport function ThinkingIndicator({ className, intervalMs = 1800, phrases }: ThinkingIndicatorProps) {\n const words = phrases && phrases.length ? phrases : DEFAULT_PHRASES;\n const [index, setIndex] = React.useState(0);\n\n React.useEffect(() => {\n // Reset when the phrase set changes so we never index out of range.\n setIndex(0);\n const timer = setInterval(() => {\n setIndex((current) => (current + 1) % words.length);\n }, intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, words]);\n\n return (\n <div\n aria-label=\"Assistant is working\"\n className={cn(\n \"fade-in-0 flex w-fit animate-in items-center gap-2 rounded-2xl rounded-bl-md bg-muted px-3.5 py-2.5 duration-200\",\n className,\n )}\n data-slot=\"thinking-indicator\"\n role=\"status\"\n >\n {/* Stock monochrome \"solving\" orb — auto light/dark ink. */}\n <ThinkingOrb className=\"shrink-0\" size={20} speed={0.7} state=\"solving\" />\n {/* Animated RGB gradient phrase. AuroraText stays mounted (no `key` on\n it) so its gradient sweeps continuously instead of resetting on every\n word change; a faster `speed` makes the color movement obvious. Only\n the inner word span is re-keyed, so the fade still replays per word\n while the sweep keeps running. */}\n <span className=\"text-xs font-medium\">\n <AuroraText speed={2.2}>\n <span className=\"fade-in-0 inline-block animate-in duration-300\" key={index}>\n {words[index]}\n </span>\n </AuroraText>\n </span>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport type { TableBlock } from \"./types\";\n\n/**\n * Turns a raw result-table block from the backend into something a person\n * actually wants to read:\n *\n * - drops plumbing columns (ids, slugs, foreign-key refs, s3 keys, embeddings)\n * that mean nothing to a human,\n * - renders image URLs as thumbnails and other URLs as links,\n * - flattens nested objects/arrays (e.g. `{\"total\": 247, \"customer\": 0}` or\n * `[{\"id\": …, \"name\": \"SaaS\"}]`) into a readable phrase instead of raw JSON,\n * - surfaces the identity columns (name/title/email) first.\n *\n * All of this is presentation-only and lives in the widget on purpose: the\n * backend still keeps the full payload (ids and all) in the model's tool\n * context so follow-up actions can reference rows by id.\n */\n\n/** A column ready for `DataTablePaged`: stable key + human-facing label. */\nexport interface DisplayColumn {\n key: string;\n label: string;\n}\n\nexport interface DisplayTable {\n columns: DisplayColumn[];\n rows: Record<string, React.ReactNode>[];\n}\n\n// Exact column names that are plumbing, never information a person reads.\nconst NOISE_KEYS = new Set([\n \"id\",\n \"pk\",\n \"uuid\",\n \"slug\",\n \"object_id\",\n \"external_id\",\n \"client_id\",\n \"content_type\",\n \"provider_call_id\",\n \"tool_call_id\",\n]);\n\n// Column-name shapes that are always internal references or secrets.\nconst NOISE_PATTERNS = [\n /_id$/i,\n /_ids$/i,\n /_key$/i,\n /_hash$/i,\n /embedding/i,\n /vector/i,\n /password/i,\n /secret/i,\n /(^|_)token(_|$)/i,\n];\n\nconst IMAGE_KEY = /(image|logo|avatar|photo|picture|icon|thumbnail|banner|cover|headshot)/i;\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg|avif)(\\?|$)/i;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T|$)/;\nconst URL_RE = /^https?:\\/\\//i;\n// Identity columns worth reading first, in priority order.\nconst PRIORITY_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\"];\n// Keys checked when reducing an object/array-of-objects to a single label.\nconst LABEL_KEYS = [\"name\", \"title\", \"label\", \"full_name\", \"email\", \"code\"];\n\nfunction isUuid(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value);\n}\n\nfunction humanize(key: string): string {\n const text = key.replace(/_/g, \" \").trim();\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/** A column is noise if its name looks internal or every value is a UUID. */\nfunction isNoiseColumn(key: string, rows: Record<string, unknown>[]): boolean {\n if (NOISE_KEYS.has(key.toLowerCase())) return true;\n if (NOISE_PATTERNS.some((pattern) => pattern.test(key))) return true;\n const values = rows\n .map((row) => row[key])\n .filter((value) => value !== null && value !== undefined && value !== \"\");\n return values.length > 0 && values.every(isUuid);\n}\n\nfunction pickLabel(obj: Record<string, unknown>): string | null {\n for (const key of LABEL_KEYS) {\n const value = obj[key];\n if (typeof value === \"string\" && value.trim()) return value;\n if (typeof value === \"number\") return String(value);\n }\n return null;\n}\n\n/** `{total: 247, customer: 0}` → \"Total 247 · Customer 0\"; prefers a name/title. */\nfunction formatObject(obj: Record<string, unknown>): string {\n const label = pickLabel(obj);\n if (label) return label;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined || value === \"\") continue;\n if (typeof value === \"object\") continue; // keep it shallow and readable\n parts.push(`${humanize(key)} ${value}`);\n if (parts.length >= 6) break;\n }\n return parts.join(\" · \") || \"—\";\n}\n\n/** `[{name: \"SaaS\"}, {name: \"Fintech\"}]` → \"SaaS, Fintech (+N more)\". */\nfunction formatArray(arr: unknown[]): string {\n const items = arr\n .map((item) => {\n if (item === null || item === undefined) return \"\";\n if (Array.isArray(item)) return \"\";\n if (typeof item === \"object\") return pickLabel(item as Record<string, unknown>) ?? \"\";\n return String(item);\n })\n .filter(Boolean);\n if (items.length === 0) return \"—\";\n const shown = items.slice(0, 8);\n const extra = items.length - shown.length;\n return shown.join(\", \") + (extra > 0 ? ` +${extra} more` : \"\");\n}\n\nfunction renderScalar(key: string, value: string | number | boolean): React.ReactNode {\n if (typeof value !== \"string\") return value; // number | boolean → table handles\n\n const text = value.trim();\n if (URL_RE.test(text) && (IMAGE_EXT.test(text) || IMAGE_KEY.test(key))) {\n return (\n <img\n alt={humanize(key)}\n className=\"h-9 w-9 rounded-md border border-border object-cover\"\n loading=\"lazy\"\n src={text}\n />\n );\n }\n if (URL_RE.test(text)) {\n let label = text;\n try {\n label = new URL(text).hostname.replace(/^www\\./, \"\");\n } catch {\n // keep the full string if it isn't a parseable URL\n }\n return (\n <a\n className=\"text-primary underline underline-offset-2\"\n href={text}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n {label}\n </a>\n );\n }\n if (ISO_DATE_RE.test(text)) {\n const date = new Date(text);\n if (!Number.isNaN(date.getTime())) return date.toLocaleDateString();\n }\n return text;\n}\n\nfunction formatCellValue(key: string, value: unknown): React.ReactNode {\n if (value === null || value === undefined || value === \"\") return value; // table → \"—\"\n if (Array.isArray(value)) return formatArray(value);\n if (typeof value === \"object\") return formatObject(value as Record<string, unknown>);\n return renderScalar(key, value as string | number | boolean);\n}\n\n/** Build clean, human-facing columns + rows from a raw result-table block. */\nexport function toDisplayTable(block: TableBlock): DisplayTable {\n const rows = block.rows ?? [];\n const kept = (block.columns ?? []).filter((key) => !isNoiseColumn(key, rows));\n // If filtering wiped everything (e.g. a table of pure ids), keep the original\n // columns rather than render an empty table.\n const columnKeys = kept.length > 0 ? kept : block.columns ?? [];\n\n const ordered = [...columnKeys].sort((a, b) => {\n const ra = PRIORITY_KEYS.indexOf(a.toLowerCase());\n const rb = PRIORITY_KEYS.indexOf(b.toLowerCase());\n const pa = ra === -1 ? PRIORITY_KEYS.length : ra;\n const pb = rb === -1 ? PRIORITY_KEYS.length : rb;\n if (pa !== pb) return pa - pb;\n return columnKeys.indexOf(a) - columnKeys.indexOf(b); // stable otherwise\n });\n\n const columns: DisplayColumn[] = ordered.map((key) => ({ key, label: humanize(key) }));\n const displayRows = rows.map((row) => {\n const out: Record<string, React.ReactNode> = {};\n for (const key of ordered) out[key] = formatCellValue(key, row[key]);\n return out;\n });\n\n return { columns, rows: displayRows };\n}\n","import type { DescribeToolCall, ToolCallDescription, ToolCallDetail } from \"./types\";\n\n/** \"business_target_company_tags_apply\" → \"target company tags apply\". */\nexport function humanizeToolName(toolName: string): string {\n return toolName.replace(/^[a-z]+_/, \"\").replaceAll(\"_\", \" \");\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Keys that are meaningless to a human reader — identifiers and storage keys.\n * These are hidden from the default argument facts (the user complained that\n * \"company_id\" / \"slug\" tell them nothing).\n */\nfunction isTechnicalKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n lower === \"id\" ||\n lower === \"client_id\" ||\n lower === \"slug\" ||\n lower.endsWith(\"_id\") ||\n lower.endsWith(\"_ids\") ||\n lower.endsWith(\"_key\") ||\n lower.endsWith(\"_slug\") ||\n lower.endsWith(\"_uuid\") ||\n lower === \"uuid\" ||\n lower.endsWith(\"_s3_key\") ||\n lower === \"embedding\"\n );\n}\n\n/** A value that is itself just an identifier (bare UUID) carries no meaning. */\nfunction isTechnicalValue(value: unknown): boolean {\n return typeof value === \"string\" && UUID_RE.test(value.trim());\n}\n\n/** \"target_company\" → \"Target company\". */\nfunction humanizeKey(key: string): string {\n const spaced = key.replaceAll(\"_\", \" \").trim();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (Array.isArray(value)) {\n const items = value\n .filter((item) => !isTechnicalValue(item))\n .map((item) => formatValue(item));\n return items.length ? items.join(\", \") : `${value.length} item${value.length === 1 ? \"\" : \"s\"}`;\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"name\", \"title\", \"label\", \"email\"]) {\n if (typeof record[key] === \"string\") return record[key] as string;\n }\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Derive human-readable facts from raw arguments, dropping technical keys and\n * bare-identifier values. Long strings are truncated for the card.\n */\nexport function deriveDetails(args: Record<string, unknown>): ToolCallDetail[] {\n const details: ToolCallDetail[] = [];\n for (const [key, value] of Object.entries(args ?? {})) {\n if (isTechnicalKey(key)) continue;\n if (isTechnicalValue(value)) continue;\n if (value === \"\" || value === null || value === undefined) continue;\n const formatted = formatValue(value);\n if (!formatted || formatted === \"—\") continue;\n details.push({ label: humanizeKey(key), value: formatted.length > 140 ? `${formatted.slice(0, 140)}…` : formatted });\n }\n return details;\n}\n\nexport interface ResolvedToolPresentation {\n title: string;\n summary: string | null;\n details: ToolCallDetail[];\n}\n\n/**\n * Resolve how a tool call should be shown: prefer the host app's\n * `describeToolCall`, then fall back to a humanized name plus the non-technical\n * arguments so approvals and the tool log always read conceptually.\n */\nexport function resolveToolPresentation(\n describe: DescribeToolCall | undefined,\n toolName: string,\n args: Record<string, unknown>,\n): ResolvedToolPresentation {\n let description: ToolCallDescription | null | undefined;\n try {\n description = describe?.(toolName, args ?? {});\n } catch {\n description = null;\n }\n\n const title = description?.title?.trim() || humanizeToolName(toolName);\n const summary = description?.summary?.trim() || null;\n\n let details = description?.details ?? [];\n const wantsDerived = description?.showDerivedDetails ?? description?.details === undefined;\n if (details.length === 0 && wantsDerived) {\n details = deriveDetails(args ?? {});\n }\n\n return { details, summary, title };\n}\n","\"use client\";\n\nimport { Button, cn } from \"@cntyclub/ui-react\";\nimport { DownloadIcon, FileTextIcon, Maximize2Icon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { formatBytes } from \"../file-support\";\nimport type { DocumentBlock } from \"../types\";\n\nfunction DownloadButton({ block, size = \"sm\" }: { block: DocumentBlock; size?: \"sm\" | \"icon-sm\" }) {\n if (!block.download_url) {\n return (\n <Button disabled size={size} variant=\"outline\">\n {size === \"icon-sm\" ? <DownloadIcon /> : <><DownloadIcon /> Download</>}\n </Button>\n );\n }\n return (\n <Button\n render={\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a download={block.filename} href={block.download_url} rel=\"noopener noreferrer\" target=\"_blank\" />\n }\n size={size}\n variant={size === \"icon-sm\" ? \"outline\" : \"default\"}\n >\n <DownloadIcon />\n {size === \"icon-sm\" ? null : \"Download\"}\n </Button>\n );\n}\n\n/** Fullscreen preview overlay (viewport-fixed) with a download action. */\nfunction DocumentViewer({ block, onClose }: { block: DocumentBlock; onClose: () => void }) {\n React.useEffect(() => {\n const onKey = (event: KeyboardEvent) => event.key === \"Escape\" && onClose();\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div aria-modal=\"true\" className=\"fixed inset-0 z-[60] flex flex-col bg-background\" role=\"dialog\">\n <div className=\"flex shrink-0 items-center gap-2 border-border/72 border-b px-4 py-3\">\n <FileTextIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <DownloadButton block={block} />\n <Button aria-label=\"Close preview\" onClick={onClose} size=\"icon-sm\" variant=\"ghost\">\n <XIcon />\n </Button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n <pre className=\"mx-auto max-w-3xl whitespace-pre-wrap break-words font-mono text-xs leading-relaxed text-foreground\">\n {block.preview || \"(no preview available — download to view)\"}\n {block.preview_truncated ? \"\\n\\n… preview truncated. Download for the full file.\" : \"\"}\n </pre>\n </div>\n </div>\n );\n}\n\n/**\n * Renders a generated document: a compact card with a short preview, an\n * expand-to-fullscreen button, and a download button. Clicking the preview or\n * expand opens the fullscreen viewer (download sits top-right there too).\n */\nexport function DocumentCard({ block }: { block: DocumentBlock }) {\n const [open, setOpen] = React.useState(false);\n const previewLines = (block.preview || \"\").split(\"\\n\").slice(0, 6).join(\"\\n\");\n\n return (\n <div className=\"w-full max-w-full overflow-hidden rounded-xl border border-border bg-card shadow-xs\">\n <div className=\"flex items-center gap-2 border-border/72 border-b px-3 py-2\">\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-lg bg-primary/8 text-primary [&_svg]:size-4\">\n <FileTextIcon />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-sm\">{block.title || block.filename}</div>\n <div className=\"text-muted-foreground text-xs uppercase\">\n {block.format}\n {block.size_bytes ? ` · ${formatBytes(block.size_bytes)}` : \"\"}\n </div>\n </div>\n <Button aria-label=\"Preview\" onClick={() => setOpen(true)} size=\"icon-sm\" variant=\"ghost\">\n <Maximize2Icon />\n </Button>\n <DownloadButton block={block} size=\"icon-sm\" />\n </div>\n {previewLines ? (\n <button\n className={cn(\n \"block w-full cursor-pointer px-3 py-2 text-left transition-colors hover:bg-accent/40\",\n )}\n onClick={() => setOpen(true)}\n type=\"button\"\n >\n <pre className=\"max-h-28 overflow-hidden whitespace-pre-wrap break-words font-mono text-[11px] leading-snug text-muted-foreground\">\n {previewLines}\n </pre>\n </button>\n ) : null}\n {open ? <DocumentViewer block={block} onClose={() => setOpen(false)} /> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { Checkbox, cn, Spinner } from \"@cntyclub/ui-react\";\nimport { ListChecksIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { TaskItem } from \"../types\";\n\n/**\n * A read-only checklist of the steps the agent is working through (Claude-style\n * to-dos). The user cannot toggle items — the agent drives the state via the\n * `update_tasks` tool.\n */\nexport function TaskChecklist({ tasks }: { tasks: TaskItem[] }) {\n if (!tasks || tasks.length === 0) return null;\n const done = tasks.filter((task) => task.status === \"done\").length;\n\n return (\n <div className=\"w-full max-w-full rounded-xl border border-border bg-card p-3 shadow-xs\">\n <div className=\"mb-2 flex items-center gap-1.5 font-medium text-sm\">\n <ListChecksIcon className=\"size-4 text-muted-foreground\" />\n Tasks\n <span className=\"ml-auto text-muted-foreground text-xs\">\n {done}/{tasks.length}\n </span>\n </div>\n <ul className=\"flex flex-col gap-1.5\">\n {tasks.map((task, index) => (\n <li className=\"flex items-center gap-2 text-sm\" key={`${index}-${task.title}`}>\n {task.status === \"in_progress\" ? (\n <span className=\"flex size-4 shrink-0 items-center justify-center [&_svg]:size-3.5\">\n <Spinner />\n </span>\n ) : (\n <Checkbox\n aria-hidden\n checked={task.status === \"done\"}\n className=\"pointer-events-none shrink-0\"\n readOnly\n tabIndex={-1}\n />\n )}\n <span\n className={cn(\n \"min-w-0\",\n task.status === \"done\" && \"text-muted-foreground line-through\",\n task.status === \"in_progress\" && \"font-medium\",\n )}\n >\n {task.title}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n ChatToolChip,\n DataTablePaged,\n cn,\n} from \"@cntyclub/ui-react\";\nimport { CheckIcon, ChevronDownIcon, CodeIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { toDisplayTable } from \"../table-format\";\nimport { humanizeToolName, resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, MessageBlock, TableBlock } from \"../types\";\nimport type { ToolStep } from \"../message-group\";\nimport { DocumentCard } from \"./document-card\";\nimport { TaskChecklist } from \"./task-checklist\";\n\n/** Renders the visible output blocks of a step (tables, documents, checklists). */\nfunction StepBlocks({ blocks, stepKey }: { blocks: MessageBlock[] | undefined; stepKey: string }) {\n const visible = (blocks ?? []).filter(\n (block) => block.type === \"table\" || block.type === \"document\" || block.type === \"tasks\",\n );\n if (visible.length === 0) return null;\n return (\n <>\n {visible.map((block, index) => {\n const key = `${stepKey}-block-${index}`;\n if (block.type === \"document\") {\n return <DocumentCard block={block} key={key} />;\n }\n if (block.type === \"tasks\") {\n return <TaskChecklist key={key} tasks={block.tasks} />;\n }\n const table = block as TableBlock;\n const { columns, rows } = toDisplayTable(table);\n return (\n <div className=\"w-full max-w-full\" key={key}>\n <DataTablePaged\n columns={columns}\n pageSize={8}\n rows={rows}\n totalCount={\n typeof table.pagination?.count === \"number\" ? (table.pagination.count as number) : table.row_count\n }\n />\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RawJsonDisclosure({ result }: { result: string }) {\n return (\n <Collapsible className=\"mt-1.5\">\n <CollapsibleTrigger className=\"group flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground\">\n <CodeIcon className=\"size-3\" />\n <span>Raw JSON</span>\n <ChevronDownIcon className=\"size-3 transition-transform group-data-[panel-open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <pre className=\"mt-1 max-h-64 overflow-auto rounded-lg bg-muted p-2 font-mono text-[11px] leading-snug text-muted-foreground\">\n {result}\n </pre>\n </CollapsiblePanel>\n </Collapsible>\n );\n}\n\nfunction StepDetail({\n describeToolCall,\n step,\n}: {\n describeToolCall?: DescribeToolCall;\n step: ToolStep;\n}) {\n const { details, summary, title } = resolveToolPresentation(describeToolCall, step.name, step.args);\n return (\n <div className=\"rounded-lg border border-border/72 bg-card p-2.5\">\n <div className=\"flex items-center gap-1.5 font-medium text-sm\">\n {step.status === \"running\" ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon className=\"size-3.5 text-success\" />\n )}\n {title}\n </div>\n {summary ? <p className=\"mt-0.5 text-muted-foreground text-xs\">{summary}</p> : null}\n {details.length > 0 ? (\n <dl className=\"mt-1.5 space-y-0.5 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {step.result ? <RawJsonDisclosure result={step.result} /> : null}\n </div>\n );\n}\n\nexport interface ToolActivityGroupProps {\n steps: ToolStep[];\n describeToolCall?: DescribeToolCall;\n}\n\n/**\n * A collapsed run of tool activity. Normally shows just the latest step as a\n * chip with a disclosure toggle; expanding reveals every step in plain language\n * with a per-step raw-JSON dropdown. Result tables always render below so the\n * data the user asked for is never hidden behind the toggle.\n */\nexport function ToolActivityGroup({ describeToolCall, steps }: ToolActivityGroupProps) {\n const [open, setOpen] = React.useState(false);\n if (steps.length === 0) return null;\n\n const last = steps[steps.length - 1];\n const anyRunning = steps.some((step) => step.status === \"running\");\n const lastTitle =\n resolveToolPresentation(describeToolCall, last.name, last.args).title || humanizeToolName(last.name);\n const chipLabel = anyRunning ? `${lastTitle}…` : steps.length > 1 ? lastTitle : `${lastTitle} finished`;\n\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <Collapsible onOpenChange={setOpen} open={open}>\n <CollapsibleTrigger\n render={\n <ChatToolChip\n className=\"cursor-pointer pr-2 hover:bg-muted\"\n icon={\n anyRunning ? (\n <span className=\"size-1.5 animate-pulse rounded-full bg-warning\" />\n ) : (\n <CheckIcon />\n )\n }\n >\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"truncate\">{chipLabel}</span>\n {steps.length > 1 ? (\n <span className=\"rounded-full bg-background px-1.5 text-[10px] text-foreground/72\">\n {steps.length} steps\n </span>\n ) : null}\n <ChevronDownIcon className={cn(\"size-3 transition-transform\", open && \"rotate-180\")} />\n </span>\n </ChatToolChip>\n }\n />\n <CollapsiblePanel>\n <div className=\"mt-2 flex flex-col gap-1.5\">\n {steps.map((step) => (\n <StepDetail describeToolCall={describeToolCall} key={step.callId} step={step} />\n ))}\n </div>\n </CollapsiblePanel>\n </Collapsible>\n\n {steps.map((step) => (\n <StepBlocks blocks={step.blocks} key={`${step.callId}-blocks`} stepKey={step.callId} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n ChatToolCard,\n ChatToolCardActions,\n ChatToolCardHeader,\n Group,\n Menu,\n MenuItem,\n MenuPopup,\n MenuTrigger,\n Spinner,\n} from \"@cntyclub/ui-react\";\nimport { CheckCheckIcon, ChevronDownIcon, ShieldAlertIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { resolveToolPresentation } from \"../tool-presentation\";\nimport type { DescribeToolCall, PendingApproval } from \"../types\";\n\nexport interface ToolApprovalCardProps {\n approval: PendingApproval;\n resolving: boolean;\n onResolve: (callId: string, approve: boolean) => void;\n /** Host-app hook that turns the tool call into plain language. */\n describeToolCall?: DescribeToolCall;\n /** Remember this tool and auto-approve it from now on. */\n onAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Approval prompt for a write action the agent wants to perform. Arguments are\n * shown in plain language (technical ids/keys hidden, or a host-provided\n * description) so the user understands exactly what will change. The primary\n * action is a split button: \"Approve\" once, or \"Always approve\" this tool.\n */\nexport function ToolApprovalCard({\n approval,\n describeToolCall,\n onAlwaysApprove,\n onResolve,\n resolving,\n}: ToolApprovalCardProps) {\n const { details, summary, title } = resolveToolPresentation(\n describeToolCall,\n approval.tool_name,\n (approval.arguments ?? {}) as Record<string, unknown>,\n );\n\n return (\n <ChatToolCard className=\"border-warning/40\">\n <ChatToolCardHeader>\n <ShieldAlertIcon className=\"size-4 text-warning\" />\n Approval needed\n </ChatToolCardHeader>\n <p className=\"mt-1 text-muted-foreground\">\n {summary ?? (\n <>\n The assistant wants to <span className=\"font-medium text-foreground\">{title.toLowerCase()}</span> — this\n will change your data.\n </>\n )}\n </p>\n {details.length > 0 && (\n <dl className=\"mt-2 space-y-1 rounded-lg bg-muted p-2 text-xs\">\n {details.map((detail) => (\n <div className=\"flex gap-2\" key={detail.label}>\n <dt className=\"shrink-0 text-muted-foreground\">{detail.label}</dt>\n <dd className=\"min-w-0 break-words font-medium text-foreground\">{detail.value}</dd>\n </div>\n ))}\n </dl>\n )}\n <ChatToolCardActions>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, false)} size=\"sm\" variant=\"outline\">\n Decline\n </Button>\n <Group>\n <Button disabled={resolving} onClick={() => onResolve(approval.id, true)} size=\"sm\">\n {resolving ? <Spinner /> : null}\n Approve\n </Button>\n <Menu>\n <MenuTrigger\n render={\n <Button aria-label=\"More approve options\" disabled={resolving} size=\"icon-sm\" variant=\"default\">\n <ChevronDownIcon />\n </Button>\n }\n />\n <MenuPopup align=\"end\">\n <MenuItem\n onClick={() => {\n onAlwaysApprove(approval.tool_name);\n onResolve(approval.id, true);\n }}\n >\n <CheckCheckIcon />\n Always approve “{title}”\n </MenuItem>\n </MenuPopup>\n </Menu>\n </Group>\n </ChatToolCardActions>\n </ChatToolCard>\n );\n}\n","\"use client\";\n\nimport {\n Button,\n Chat,\n ChatEmptyState,\n ChatEmptyStateDescription,\n ChatEmptyStateIcon,\n ChatEmptyStateTitle,\n ChatMessage,\n ChatHeader,\n ChatHeaderActions,\n ChatHeaderAvatar,\n ChatHeaderTitle,\n ChatSuggestion,\n ChatSuggestions,\n cn,\n ContextMeter,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@cntyclub/ui-react\";\nimport {\n ChevronsRightIcon,\n HistoryIcon,\n Maximize2Icon,\n Minimize2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadCloudIcon,\n XIcon,\n} from \"lucide-react\";\nimport { motion } from \"motion/react\";\nimport * as React from \"react\";\n\nimport { acceptAttribute, attachmentsEnabled, validateFile, type MediaCapabilities } from \"../file-support\";\nimport { groupMessages } from \"../message-group\";\nimport type { AgentChatActions, AgentChatState } from \"../use-agent-chat\";\nimport type { AgentConfig } from \"../types\";\nimport { AgentComposer } from \"./agent-composer\";\nimport { ChatScroller } from \"./chat-scroller\";\nimport { MessageItem } from \"./message-item\";\nimport { ThinkingIndicator } from \"./thinking-indicator\";\nimport { ToolActivityGroup } from \"./tool-activity-group\";\nimport { ToolApprovalCard } from \"./tool-approval-card\";\n\n/** Human tooltip for the context meter, by fill state. */\nfunction contextMeterLabel(meter: NonNullable<AgentChatState[\"contextMeter\"]>): string {\n const pct = Math.round(meter.pct * 100);\n if (meter.state === \"full\") return `Context full (${pct}%) — start a new chat to continue`;\n if (meter.state === \"summarizing\") return `Context ${pct}% — summarizing older messages`;\n return `Context ${pct}% used`;\n}\n\nexport interface AgentPanelProps {\n config: AgentConfig;\n chat: AgentChatState & AgentChatActions;\n /** Fullscreen \"Agent Mode\" is active. */\n agentMode: boolean;\n /** Hide the expand button (mobile is always fullscreen). */\n canToggleAgentMode: boolean;\n onToggleAgentMode: () => void;\n onClose: () => void;\n /** Remember a write tool and auto-approve its future prompts. */\n onAlwaysApprove: (toolName: string) => void;\n /** Message id to render a \"New messages\" divider before (arrived while closed). */\n newMessageAnchorId?: string | null;\n /**\n * Render the close control as a \"collapse to the right\" affordance (two right\n * chevrons) instead of an ✕. Used by the docked presentation, where closing\n * collapses the panel to the side rather than dismissing a dialog.\n */\n collapseToSide?: boolean;\n className?: string;\n}\n\n/**\n * The chat surface shared by the popup panel and fullscreen Agent Mode.\n * Header (title, history, new chat, expand/collapse, close) + messages + input.\n */\nexport function AgentPanel({\n agentMode,\n canToggleAgentMode,\n chat,\n className,\n collapseToSide,\n config,\n newMessageAnchorId,\n onAlwaysApprove,\n onClose,\n onToggleAgentMode,\n}: AgentPanelProps) {\n const [draft, setDraft] = React.useState(\"\");\n const [view, setView] = React.useState<\"chat\" | \"history\">(\"chat\");\n const [files, setFiles] = React.useState<File[]>([]);\n const [uploadError, setUploadError] = React.useState<string | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const dragDepth = React.useRef(0);\n\n const agentName = config.agentName ?? chat.agentInfo?.name ?? \"Assistant\";\n // Vision/voice are gated by the backend (the agent must have the matching\n // provider configured); read them from the fetched config.\n const caps: MediaCapabilities = {\n visionEnabled: chat.agentInfo?.vision_enabled,\n visionMaxMb: chat.agentInfo?.vision_max_file_mb,\n };\n const uploadEnabled = attachmentsEnabled(config, caps);\n const suggestions = config.suggestions ?? [\n \"What can you help me with?\",\n \"Give me a quick summary of my data.\",\n ];\n\n const addFiles = React.useCallback(\n (incoming: File[]) => {\n const accepted: File[] = [];\n let rejection: string | null = null;\n for (const file of incoming) {\n const error = validateFile(config, file, caps);\n if (error) {\n rejection = error;\n continue;\n }\n accepted.push(file);\n }\n setUploadError(rejection);\n if (accepted.length) setFiles((current) => [...current, ...accepted].slice(0, 10));\n },\n [config, caps.visionEnabled, caps.visionMaxMb],\n );\n\n const removeFile = React.useCallback((index: number) => {\n setFiles((current) => current.filter((_, i) => i !== index));\n }, []);\n\n const handleSubmit = React.useCallback(\n (text: string) => {\n const staged = files;\n setDraft(\"\");\n setFiles([]);\n setUploadError(null);\n void chat.send(text, staged);\n },\n [chat, files],\n );\n\n // ----- drag-and-drop file upload -----\n const onDragEnter = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled || !event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current += 1;\n setDragging(true);\n },\n [uploadEnabled],\n );\n const onDragLeave = React.useCallback((event: React.DragEvent) => {\n if (!event.dataTransfer?.types?.includes(\"Files\")) return;\n dragDepth.current = Math.max(0, dragDepth.current - 1);\n if (dragDepth.current === 0) setDragging(false);\n }, []);\n const onDrop = React.useCallback(\n (event: React.DragEvent) => {\n if (!uploadEnabled) return;\n event.preventDefault();\n dragDepth.current = 0;\n setDragging(false);\n const dropped = Array.from(event.dataTransfer?.files ?? []);\n if (dropped.length) addFiles(dropped);\n },\n [addFiles, uploadEnabled],\n );\n\n const openHistory = React.useCallback(() => {\n setView(\"history\");\n void chat.refreshConversations();\n }, [chat]);\n\n const busy = chat.sending || chat.resolvingApprovalId !== null;\n // While streaming, once the assistant's text bubble has started filling in we\n // hide the \"Thinking…\" dots (they'd otherwise sit under the live reply). Show\n // them whenever we're busy and the reply hasn't started yet.\n const lastMessage = chat.messages[chat.messages.length - 1];\n const replyStreaming = lastMessage?.role === \"assistant\" && Boolean(lastMessage.content);\n const showThinking = busy && !replyStreaming;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 flex-col overflow-hidden bg-background text-foreground\",\n className,\n )}\n data-slot=\"agent-panel\"\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onDragOver={uploadEnabled ? (event) => event.preventDefault() : undefined}\n onDrop={onDrop}\n >\n {dragging && view === \"chat\" ? (\n <div className=\"pointer-events-none absolute inset-0 z-40 flex flex-col items-center justify-center gap-2 bg-background/85 backdrop-blur-sm\">\n <div className=\"flex flex-col items-center gap-2 rounded-2xl border-2 border-primary/40 border-dashed px-8 py-6 text-center\">\n <UploadCloudIcon className=\"size-8 text-primary\" />\n <div className=\"font-medium text-sm\">Drop files to attach</div>\n <div className=\"text-muted-foreground text-xs\">{acceptAttribute(config, caps).replaceAll(\",\", \" · \")}</div>\n </div>\n </div>\n ) : null}\n {/* Header */}\n <ChatHeader>\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <ChatHeaderAvatar />\n <ChatHeaderTitle>\n <div className=\"truncate font-medium text-sm\">{agentName}</div>\n {config.tagline ? (\n <div className=\"truncate text-muted-foreground text-xs\">{config.tagline}</div>\n ) : null}\n </ChatHeaderTitle>\n </div>\n\n <ChatHeaderActions>\n {chat.contextMeter && chat.contextMeter.pct > 0 ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n aria-label={contextMeterLabel(chat.contextMeter)}\n className=\"mr-0.5 inline-flex cursor-default items-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n type=\"button\"\n >\n <ContextMeter\n lockAt={chat.contextMeter.lock_at}\n pct={chat.contextMeter.pct}\n size={18}\n state={chat.contextMeter.state}\n summarizeAt={chat.contextMeter.summarize_at}\n warnAt={chat.contextMeter.warn_at}\n />\n </button>\n }\n />\n <TooltipContent>{contextMeterLabel(chat.contextMeter)}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Conversation history\"\n onClick={view === \"history\" ? () => setView(\"chat\") : openHistory}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <HistoryIcon />\n </Button>\n }\n />\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"New chat\"\n onClick={() => {\n chat.newChat();\n setView(\"chat\");\n }}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n <SquarePenIcon />\n </Button>\n }\n />\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n\n {canToggleAgentMode ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label={agentMode ? \"Exit Agent Mode\" : \"Enter Agent Mode\"}\n onClick={onToggleAgentMode}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {agentMode ? <Minimize2Icon /> : <Maximize2Icon />}\n </Button>\n }\n />\n <TooltipContent>{agentMode ? \"Exit Agent Mode\" : \"Agent Mode\"}</TooltipContent>\n </Tooltip>\n ) : null}\n\n <Button\n aria-label={collapseToSide ? \"Collapse agent\" : \"Close\"}\n onClick={onClose}\n size=\"icon-sm\"\n variant=\"ghost\"\n >\n {collapseToSide ? <ChevronsRightIcon /> : <XIcon />}\n </Button>\n </ChatHeaderActions>\n </ChatHeader>\n\n {view === \"history\" ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2\">\n {chat.conversations.length === 0 ? (\n <p className=\"p-4 text-center text-muted-foreground text-sm\">\n No conversations yet.\n </p>\n ) : (\n chat.conversations.map((conversation) => (\n <div\n className=\"group flex items-center gap-1 rounded-lg hover:bg-accent\"\n key={conversation.id}\n >\n <button\n className=\"min-w-0 flex-1 cursor-pointer px-3 py-2 text-left\"\n onClick={() => {\n void chat.openConversation(conversation.id);\n setView(\"chat\");\n }}\n type=\"button\"\n >\n <span className=\"block truncate text-sm\">{conversation.title || \"Untitled\"}</span>\n <span className=\"block text-muted-foreground text-xs\">\n {new Date(conversation.updated_at).toLocaleString()}\n </span>\n </button>\n <Button\n aria-label=\"Delete conversation\"\n className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n onClick={() => void chat.deleteConversation(conversation.id)}\n size=\"icon-xs\"\n variant=\"destructive-ghost\"\n >\n <Trash2Icon />\n </Button>\n </div>\n ))\n )}\n </div>\n ) : (\n <Chat>\n <ChatScroller className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}>\n {chat.messages.length === 0 && !chat.sending ? (\n <ChatEmptyState>\n <ChatEmptyStateIcon />\n <div>\n <ChatEmptyStateTitle>Hi! I'm {agentName}.</ChatEmptyStateTitle>\n <ChatEmptyStateDescription className=\"mt-1\">\n Ask me anything about your data — I can look things up and take actions\n (with your approval).\n </ChatEmptyStateDescription>\n </div>\n <ChatSuggestions>\n {suggestions.slice(0, 4).map((suggestion, index) => (\n <ChatSuggestion\n index={index}\n key={suggestion}\n onClick={() => handleSubmit(suggestion)}\n >\n {suggestion}\n </ChatSuggestion>\n ))}\n </ChatSuggestions>\n </ChatEmptyState>\n ) : (\n <>\n {(() => {\n const grouped = groupMessages(chat.messages);\n const anchorKey = newMessageAnchorId\n ? grouped.find(\n (it) => it.kind !== \"tool-activity\" && it.message.id === newMessageAnchorId,\n )?.key\n : undefined;\n // The reply being generated right now is the last assistant\n // text bubble while we're sending — it gets the typewriter.\n // (Once the send settles the bubble keeps the same key, so\n // `useSmoothText` finishes draining on its own.)\n let liveAssistantKey: string | null = null;\n if (chat.sending) {\n for (let i = grouped.length - 1; i >= 0; i -= 1) {\n if (grouped[i].kind === \"assistant-text\") {\n liveAssistantKey = grouped[i].key;\n break;\n }\n }\n }\n return grouped.map((item) => (\n <React.Fragment key={item.key}>\n {item.key === anchorKey ? <NewMessagesDivider /> : null}\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n >\n {item.kind === \"tool-activity\" ? (\n <ChatMessage from=\"assistant\">\n <ToolActivityGroup\n describeToolCall={config.describeToolCall}\n steps={item.steps}\n />\n </ChatMessage>\n ) : (\n <MessageItem animate={item.key === liveAssistantKey} message={item.message} />\n )}\n </motion.div>\n </React.Fragment>\n ));\n })()}\n {chat.pendingApprovals.map((approval) => (\n <ToolApprovalCard\n approval={approval}\n describeToolCall={config.describeToolCall}\n key={approval.id}\n onAlwaysApprove={onAlwaysApprove}\n onResolve={(callId, approve) => void chat.resolveApproval(callId, approve)}\n resolving={chat.resolvingApprovalId === approval.id}\n />\n ))}\n {showThinking ? <ThinkingIndicator /> : null}\n </>\n )}\n </ChatScroller>\n\n {chat.error || uploadError ? (\n <div className=\"mx-3 mb-1 flex items-center justify-between gap-2 rounded-lg bg-destructive/10 px-3 py-2 text-destructive text-xs\">\n <span className=\"min-w-0 truncate\">{chat.error ?? uploadError}</span>\n <button\n className=\"shrink-0 cursor-pointer font-medium\"\n onClick={() => {\n chat.clearError();\n setUploadError(null);\n }}\n type=\"button\"\n >\n Dismiss\n </button>\n </div>\n ) : null}\n\n <AgentComposer\n acceptAttribute={acceptAttribute(config, caps)}\n busy={busy}\n className={cn(agentMode && \"mx-auto w-full max-w-3xl\")}\n disabled={chat.pendingApprovals.length > 0}\n files={files}\n onError={setUploadError}\n onPickFiles={uploadEnabled ? addFiles : undefined}\n onRemoveFile={removeFile}\n onSubmit={handleSubmit}\n onTranscribe={chat.transcribe}\n onValueChange={setDraft}\n placeholder={\n chat.pendingApprovals.length > 0\n ? \"Approve or decline the pending action first…\"\n : `Ask ${agentName}…`\n }\n value={draft}\n voiceEnabled={chat.agentInfo?.voice_enabled}\n voiceMaxSeconds={chat.agentInfo?.voice_max_seconds}\n />\n </Chat>\n )}\n </div>\n );\n}\n\n/** Messenger-style divider marking where messages that arrived while the widget\n * was closed begin. */\nfunction NewMessagesDivider() {\n return (\n <div className=\"my-1 flex items-center gap-2\" aria-label=\"New messages\">\n <span className=\"h-px flex-1 bg-border\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">\n New messages\n </span>\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { AgentApiClient, AgentApiError } from \"./api-client\";\nimport { AgentRealtimeClient } from \"./realtime-client\";\nimport type {\n AgentConfig,\n AgentMessage,\n AgentPublicConfig,\n AgentRealtimeEvent,\n AgentStreamEvent,\n ContextMeterData,\n ConversationMyState,\n ConversationParticipant,\n ConversationSummary,\n PendingApproval,\n} from \"./types\";\n\n/** Prefix marking a locally-added user message not yet echoed back by the server. */\nconst OPTIMISTIC_ID_PREFIX = \"optimistic-\";\n/** Prefix for the transient assistant bubble that fills in while text streams. */\nconst STREAMING_ID_PREFIX = \"streaming-\";\n\nlet optimisticCounter = 0;\nlet streamingCounter = 0;\n\n/** A per-message idempotency key so a resend/retry never double-posts (design §5). */\nfunction newIdempotencyKey(): string {\n try {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n } catch {\n /* fall through */\n }\n return `idem-${Date.now()}-${Math.floor(Math.random() * 1e9)}`;\n}\n\n/**\n * Merge realtime-delivered messages into the current list: dedupe by server id,\n * swap a trailing optimistic placeholder when its echo arrives (keeping the\n * bubble's key so it doesn't blink), and keep everything in server `seq` order\n * (placeholders/streaming bubbles without a seq stay newest).\n */\nfunction mergeMessages(current: AgentMessage[], incoming: AgentMessage[]): AgentMessage[] {\n if (!incoming?.length) return current;\n const settledIds = new Set(\n current.filter((m) => !m.id.startsWith(OPTIMISTIC_ID_PREFIX)).map((m) => m.id),\n );\n const additions = incoming.filter((m) => m.id && !settledIds.has(m.id));\n if (!additions.length) return current;\n\n let base = current;\n const optimistic = current.filter((m) => m.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const placeholder = optimistic[optimistic.length - 1];\n if (placeholder) {\n const echoIndex = additions.findIndex(\n (m) => m.role === \"user\" && (m.content ?? \"\") === (placeholder.content ?? \"\"),\n );\n if (echoIndex !== -1) {\n base = current.filter((m) => m.id !== placeholder.id);\n additions[echoIndex] = {\n ...additions[echoIndex],\n client_key: placeholder.client_key ?? placeholder.id,\n };\n }\n }\n\n const merged = [...base, ...additions];\n merged.sort((a, b) => {\n const sa = typeof a.seq === \"number\" ? a.seq : Number.MAX_SAFE_INTEGER;\n const sb = typeof b.seq === \"number\" ? b.seq : Number.MAX_SAFE_INTEGER;\n return sa - sb;\n });\n return merged;\n}\n\n/** Details of the currently-open conversation the widget needs beyond its messages. */\nexport interface CurrentConversation {\n id: string;\n title: string;\n visibility: \"private\" | \"public\";\n scope_type: \"none\" | \"event\" | \"team\";\n last_seq: number;\n is_creator: boolean;\n can_toggle_visibility: boolean;\n can_go_private: boolean;\n}\n\nfunction buildOptimisticUserMessage(text: string, files?: File[]): AgentMessage {\n optimisticCounter += 1;\n const attachments = (files ?? []).map((file, index) => ({\n id: `${OPTIMISTIC_ID_PREFIX}att-${optimisticCounter}-${index}`,\n filename: file.name,\n format: file.name.split(\".\").pop()?.toLowerCase() ?? \"file\",\n size_bytes: file.size,\n }));\n return {\n id: `${OPTIMISTIC_ID_PREFIX}${optimisticCounter}`,\n role: \"user\",\n content: text,\n created_at: new Date().toISOString(),\n ...(attachments.length ? { attachments } : {}),\n } as AgentMessage;\n}\n\nexport interface AgentChatState {\n agentInfo: AgentPublicConfig | null;\n conversationId: string | null;\n /** Increments each time the transcript is loaded/replaced wholesale\n * (open a saved conversation, start a new chat). Not bumped by live sends. */\n conversationEpoch: number;\n conversations: ConversationSummary[];\n messages: AgentMessage[];\n pendingApprovals: PendingApproval[];\n sending: boolean;\n resolvingApprovalId: string | null;\n error: string | null;\n /** Collaboration state for the open conversation (null until one is loaded). */\n currentConversation: CurrentConversation | null;\n /** Context-window fill for the open conversation (drives the meter). */\n contextMeter: ContextMeterData | null;\n /** Members of the open public conversation (empty for private). */\n participants: ConversationParticipant[];\n /** My per-conversation state (read position, draft, flags). */\n myState: ConversationMyState | null;\n /** Users currently typing, by id → display name (public conversations). */\n typingUsers: Record<string, string>;\n /** WebSocket connection status for the open conversation. */\n realtimeStatus: \"connecting\" | \"open\" | \"closed\" | \"idle\";\n}\n\nexport interface AgentChatActions {\n send: (text: string, files?: File[]) => Promise<void>;\n transcribe: (audio: Blob) => Promise<string>;\n resolveApproval: (callId: string, approve: boolean) => Promise<void>;\n newChat: () => void;\n openConversation: (conversationId: string) => Promise<void>;\n refreshConversations: () => Promise<ConversationSummary[]>;\n deleteConversation: (conversationId: string) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * Headless chat state for an Agent Mode agent: message history, sending,\n * pending write-tool approvals, and conversation management. UI-agnostic.\n */\nexport function useAgentChat(config: AgentConfig): AgentChatState & AgentChatActions {\n const client = React.useMemo(() => new AgentApiClient(config), [config]);\n // Latest config without re-subscribing the realtime socket every render.\n const configRef = React.useRef(config);\n configRef.current = config;\n\n const [agentInfo, setAgentInfo] = React.useState<AgentPublicConfig | null>(null);\n const [conversationId, setConversationId] = React.useState<string | null>(null);\n // Bumped only when the transcript is loaded/replaced wholesale — opening a\n // saved conversation or starting a new chat. Live sends never touch it. The\n // widget uses it to re-baseline page-follow so restoring a past conversation\n // never navigates; only tool calls that arrive afterwards do.\n const [conversationEpoch, setConversationEpoch] = React.useState(0);\n const [conversations, setConversations] = React.useState<ConversationSummary[]>([]);\n const [messages, setMessages] = React.useState<AgentMessage[]>([]);\n const [pendingApprovals, setPendingApprovals] = React.useState<PendingApproval[]>([]);\n const [sending, setSending] = React.useState(false);\n const [resolvingApprovalId, setResolvingApprovalId] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [currentConversation, setCurrentConversation] = React.useState<CurrentConversation | null>(null);\n const [contextMeter, setContextMeter] = React.useState<ContextMeterData | null>(null);\n const [participants, setParticipants] = React.useState<ConversationParticipant[]>([]);\n const [myState, setMyState] = React.useState<ConversationMyState | null>(null);\n const [typingUsers, setTypingUsers] = React.useState<Record<string, string>>({});\n const [realtimeStatus, setRealtimeStatus] = React.useState<\n \"connecting\" | \"open\" | \"closed\" | \"idle\"\n >(\"idle\");\n\n React.useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((info) => {\n if (!cancelled) setAgentInfo(info);\n })\n .catch(() => {\n // Non-fatal: the panel falls back to config-provided naming.\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n const handleFailure = React.useCallback((err: unknown) => {\n const message =\n err instanceof AgentApiError\n ? err.message\n : \"Something went wrong. Please try again.\";\n setError(message);\n }, []);\n\n const applyResponse = React.useCallback(\n (response: {\n status?: string;\n message?: string;\n conversation_id?: string;\n messages?: AgentMessage[];\n pending_approvals?: PendingApproval[];\n }) => {\n if (response.status === \"error\" && !response.messages?.length) {\n setError(response.message ?? \"The assistant could not answer.\");\n return;\n }\n if (response.conversation_id) setConversationId(response.conversation_id);\n if (response.messages?.length) {\n setMessages((current) => {\n // The server now returns the real persisted user message (with its\n // real id) alongside the reply. Swap it for the optimistic\n // placeholder, carrying the placeholder's id as `client_key` so the\n // bubble keeps its React key and doesn't remount (blink).\n const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const optimistic = current.filter((message) => message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const seen = new Set(settled.map((message) => message.id));\n const fresh = response.messages?.filter((message) => !seen.has(message.id)) ?? [];\n const placeholder = optimistic[optimistic.length - 1];\n if (placeholder) {\n const echoIndex = fresh.findIndex((message) => message.role === \"user\");\n if (echoIndex !== -1) {\n fresh[echoIndex] = { ...fresh[echoIndex], client_key: placeholder.client_key ?? placeholder.id };\n }\n }\n return [...settled, ...fresh];\n });\n }\n setPendingApprovals(response.pending_approvals ?? []);\n if (response.status === \"error\" && response.message) {\n setError(response.message);\n }\n },\n [],\n );\n\n // Apply one streamed SSE event to state. `ctx.streamingId` tracks the transient\n // assistant bubble that text deltas fill in until its finalized message arrives.\n const handleStreamEvent = React.useCallback(\n (event: AgentStreamEvent, ctx: { streamingId: string | null }) => {\n switch (event.type) {\n case \"conversation\":\n setConversationId(event.conversation_id);\n break;\n case \"user_message\":\n setMessages((current) => {\n const settled = current.filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n if (settled.some((message) => message.id === event.message.id)) return settled;\n // Swap the in-flight placeholder — the LAST optimistic message —\n // in place (not remove + append): carrying its id as `client_key`\n // keeps the bubble's React key stable, so the DOM node survives\n // and the entry animation doesn't replay — no blink on send.\n // Stale placeholders left behind by earlier FAILED sends are\n // dropped, otherwise they'd linger as phantom duplicates.\n const optimistic = current.filter((message) => message.id.startsWith(OPTIMISTIC_ID_PREFIX));\n const placeholder = optimistic[optimistic.length - 1];\n if (!placeholder) return [...settled, event.message];\n return current\n .filter((message) => !message.id.startsWith(OPTIMISTIC_ID_PREFIX) || message.id === placeholder.id)\n .map((message) =>\n message.id === placeholder.id\n ? { ...event.message, client_key: placeholder.client_key ?? placeholder.id }\n : message,\n );\n });\n break;\n case \"text_delta\": {\n if (!ctx.streamingId) {\n streamingCounter += 1;\n ctx.streamingId = `${STREAMING_ID_PREFIX}${streamingCounter}`;\n const bubble: AgentMessage = {\n id: ctx.streamingId,\n role: \"assistant\",\n content: event.delta,\n created_at: new Date().toISOString(),\n } as AgentMessage;\n setMessages((current) => [...current, bubble]);\n } else {\n const id = ctx.streamingId;\n setMessages((current) =>\n current.map((message) =>\n message.id === id ? { ...message, content: (message.content ?? \"\") + event.delta } : message,\n ),\n );\n }\n break;\n }\n case \"assistant_message\": {\n const streamingId = ctx.streamingId;\n ctx.streamingId = null;\n setMessages((current) => {\n if (current.some((message) => message.id === event.message.id)) {\n return streamingId ? current.filter((message) => message.id !== streamingId) : current;\n }\n // Finalize the streamed bubble in place, keeping its id as the\n // render key — replacing it with a freshly-keyed message would\n // remount the whole reply and replay the fade-in (a visible blink).\n if (streamingId) {\n const index = current.findIndex((message) => message.id === streamingId);\n if (index !== -1) {\n const next = [...current];\n next[index] = { ...event.message, client_key: streamingId };\n return next;\n }\n }\n return [...current, event.message];\n });\n break;\n }\n case \"tool_result\":\n setMessages((current) => {\n const seen = new Set(current.map((message) => message.id));\n return seen.has(event.message.id) ? current : [...current, event.message];\n });\n break;\n case \"pending_approvals\":\n setPendingApprovals(event.approvals ?? []);\n break;\n case \"error\":\n setError(event.message);\n break;\n case \"done\":\n if (event.conversation_id) setConversationId(event.conversation_id);\n if (event.pending_approvals) setPendingApprovals(event.pending_approvals);\n break;\n }\n },\n [],\n );\n\n // Apply one realtime (WebSocket) event to state. Best-effort: it only augments\n // what the HTTP/SSE path already maintains, and only runs for public conversations.\n const applyRealtime = React.useCallback((event: AgentRealtimeEvent) => {\n switch (event.type) {\n case \"sync\":\n setMessages((current) => mergeMessages(current, event.messages ?? []));\n break;\n case \"message\":\n setMessages((current) => mergeMessages(current, [event.message]));\n break;\n case \"message_edited\":\n setMessages((current) =>\n current.map((message) =>\n message.id === event.message.id\n ? { ...event.message, client_key: message.client_key ?? message.id }\n : message,\n ),\n );\n break;\n case \"message_deleted\":\n setMessages((current) =>\n current.map((message) =>\n message.id === event.message_id ? { ...message, deleted: true, content: \"\" } : message,\n ),\n );\n break;\n case \"typing\":\n setTypingUsers((current) => {\n const next = { ...current };\n if (event.is_typing) next[event.user_id] = event.name;\n else delete next[event.user_id];\n return next;\n });\n break;\n case \"visibility_changed\":\n setCurrentConversation((current) =>\n current ? { ...current, visibility: event.visibility } : current,\n );\n break;\n }\n }, []);\n\n // Live updates for a PUBLIC conversation: connect the WebSocket, reconcile\n // incoming messages/edits/deletes, and surface typing. Private conversations\n // are single-user — no socket, byte-identical to the pre-collaboration behavior.\n const realtimeEnabled = config.realtime?.enabled !== false;\n const isPublic = currentConversation?.visibility === \"public\";\n const baselineSeq = currentConversation?.last_seq ?? 0;\n React.useEffect(() => {\n if (!realtimeEnabled || !conversationId || !isPublic) {\n setRealtimeStatus(\"idle\");\n return;\n }\n const rt = new AgentRealtimeClient(\n configRef.current,\n conversationId,\n { onEvent: applyRealtime, onStatus: setRealtimeStatus },\n baselineSeq,\n );\n void rt.connect();\n return () => {\n rt.close();\n };\n }, [applyRealtime, baselineSeq, conversationId, isPublic, realtimeEnabled]);\n\n const streamingEnabled = config.streaming !== false && typeof ReadableStream !== \"undefined\";\n\n const send = React.useCallback(\n async (text: string, files?: File[]) => {\n if (sending) return;\n if (!text.trim() && !(files && files.length)) return;\n setSending(true);\n setError(null);\n // Show the user's message immediately (then the typing indicator), rather\n // than waiting for the whole tool loop to finish before it appears.\n setMessages((current) => [...current, buildOptimisticUserMessage(text, files)]);\n // One key for this send: if the stream drops and we fall back to the plain\n // POST (or the user retries), the server dedupes instead of double-posting.\n const idempotencyKey = newIdempotencyKey();\n try {\n if (streamingEnabled) {\n const ctx = { streamingId: null as string | null };\n let started = false;\n try {\n await client.streamMessage(\n text,\n conversationId,\n files,\n (event) => {\n started = true;\n handleStreamEvent(event, ctx);\n },\n undefined,\n { idempotencyKey },\n );\n return;\n } catch (err) {\n // Mid-stream failure: surface it. Failure to start: fall back below.\n if (started) throw err;\n }\n }\n const response = await client.sendMessage(text, conversationId, files, { idempotencyKey });\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setSending(false);\n }\n },\n [applyResponse, client, conversationId, handleFailure, handleStreamEvent, sending, streamingEnabled],\n );\n\n const transcribe = React.useCallback(\n async (audio: Blob): Promise<string> => {\n const { text } = await client.transcribe(audio);\n return text;\n },\n [client],\n );\n\n const resolveApproval = React.useCallback(\n async (callId: string, approve: boolean) => {\n if (resolvingApprovalId) return;\n setResolvingApprovalId(callId);\n setError(null);\n try {\n if (streamingEnabled) {\n const ctx = { streamingId: null as string | null };\n let started = false;\n try {\n await client.streamResolveApproval(callId, approve, (event) => {\n started = true;\n handleStreamEvent(event, ctx);\n });\n return;\n } catch (err) {\n if (started) throw err;\n }\n }\n const response = await client.resolveApproval(callId, approve);\n applyResponse(response);\n } catch (err) {\n handleFailure(err);\n } finally {\n setResolvingApprovalId(null);\n }\n },\n [applyResponse, client, handleFailure, handleStreamEvent, resolvingApprovalId, streamingEnabled],\n );\n\n const newChat = React.useCallback(() => {\n setConversationId(null);\n setMessages([]);\n setPendingApprovals([]);\n setError(null);\n setCurrentConversation(null);\n setContextMeter(null);\n setParticipants([]);\n setMyState(null);\n setTypingUsers({});\n setConversationEpoch((e) => e + 1);\n }, []);\n\n const refreshConversations = React.useCallback(async (): Promise<ConversationSummary[]> => {\n try {\n const { conversations: list } = await client.listConversations();\n setConversations(list);\n return list;\n } catch (err) {\n handleFailure(err);\n return [];\n }\n }, [client, handleFailure]);\n\n const openConversation = React.useCallback(\n async (id: string) => {\n setError(null);\n try {\n const payload = await client.getConversation(id);\n setConversationId(id);\n setMessages(payload.messages ?? []);\n setPendingApprovals(payload.pending_approvals ?? []);\n const convo = payload.conversation;\n setCurrentConversation(\n convo\n ? {\n id: convo.id,\n title: convo.title,\n visibility: convo.visibility,\n scope_type: convo.scope_type,\n last_seq: convo.last_seq,\n is_creator: convo.is_creator,\n can_toggle_visibility: convo.can_toggle_visibility,\n can_go_private: convo.can_go_private,\n }\n : null,\n );\n setContextMeter(payload.context_meter ?? null);\n setParticipants(payload.participants ?? []);\n setMyState(payload.my_state ?? null);\n setTypingUsers({});\n setConversationEpoch((e) => e + 1);\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, handleFailure],\n );\n\n const deleteConversation = React.useCallback(\n async (id: string) => {\n try {\n await client.deleteConversation(id);\n setConversations((current) => current.filter((c) => c.id !== id));\n if (conversationId === id) newChat();\n } catch (err) {\n handleFailure(err);\n }\n },\n [client, conversationId, handleFailure, newChat],\n );\n\n const clearError = React.useCallback(() => setError(null), []);\n\n return {\n agentInfo,\n clearError,\n contextMeter,\n conversationId,\n conversationEpoch,\n conversations,\n currentConversation,\n deleteConversation,\n error,\n messages,\n myState,\n newChat,\n openConversation,\n participants,\n pendingApprovals,\n realtimeStatus,\n refreshConversations,\n resolveApproval,\n resolvingApprovalId,\n send,\n sending,\n transcribe,\n typingUsers,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\nconst STORAGE_PREFIX = \"cc-agent-always-approve:\";\n\nfunction storageKey(clientId: string): string {\n return `${STORAGE_PREFIX}${clientId || \"default\"}`;\n}\n\nfunction readStored(clientId: string): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n try {\n const raw = window.localStorage.getItem(storageKey(clientId));\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? new Set(parsed.filter((v): v is string => typeof v === \"string\")) : new Set();\n } catch {\n return new Set();\n }\n}\n\nexport interface AlwaysApproveStore {\n /** Whether the user chose to always approve this tool for this agent. */\n isAlwaysApproved: (toolName: string) => boolean;\n /** Remember to auto-approve this tool from now on (persisted per agent). */\n setAlwaysApprove: (toolName: string) => void;\n /** Stop auto-approving this tool. */\n clearAlwaysApprove: (toolName: string) => void;\n}\n\n/**\n * Per-agent \"always approve\" memory for write tools, persisted in localStorage\n * (keyed by client id). Once a tool is trusted the panel auto-resolves its\n * future approval prompts instead of asking again.\n */\nexport function useAlwaysApprove(clientId: string): AlwaysApproveStore {\n const [approved, setApproved] = React.useState<Set<string>>(() => new Set());\n\n // Load once mounted (localStorage is unavailable during SSR).\n React.useEffect(() => {\n setApproved(readStored(clientId));\n }, [clientId]);\n\n const persist = React.useCallback(\n (next: Set<string>) => {\n setApproved(next);\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey(clientId), JSON.stringify([...next]));\n } catch {\n // Ignore quota/availability errors — trust simply won't persist.\n }\n },\n [clientId],\n );\n\n const isAlwaysApproved = React.useCallback((toolName: string) => approved.has(toolName), [approved]);\n\n const setAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (approved.has(toolName)) return;\n const next = new Set(approved);\n next.add(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n const clearAlwaysApprove = React.useCallback(\n (toolName: string) => {\n if (!approved.has(toolName)) return;\n const next = new Set(approved);\n next.delete(toolName);\n persist(next);\n },\n [approved, persist],\n );\n\n return { clearAlwaysApprove, isAlwaysApproved, setAlwaysApprove };\n}\n","\"use client\";\n\nimport { cn, TooltipProvider, useMediaQuery } from \"@cntyclub/ui-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { SparklesIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport type { AgentConfig, AgentMessage } from \"../types\";\nimport { useAgentChat } from \"../use-agent-chat\";\nimport { useAlwaysApprove } from \"../use-always-approve\";\nimport { AgentPanel } from \"./agent-panel\";\n\nexport interface AgentWidgetProps {\n config: AgentConfig;\n /** Controlled open state (optional). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * How the panel is presented:\n * - `\"floating\"` (default): a launcher button + a popup/fullscreen panel,\n * positioned by the widget itself (fixed to a screen corner).\n * - `\"docked\"`: no launcher; the panel fills its parent element so the host\n * can place it in the layout (e.g. a resizable side pane on desktop, or a\n * fullscreen overlay on smaller screens). Open state is controlled by the\n * host via `open`/`onOpenChange`. Page-follow navigation stays enabled so\n * the agent can drive the main view alongside the chat.\n */\n presentation?: \"floating\" | \"docked\";\n}\n\n/** Only \"final\" assistant/tool messages count as unread (skip streaming stubs). */\nfunction isUnreadable(message: AgentMessage): boolean {\n if (message.id.startsWith(\"streaming-\")) return false;\n return message.role === \"assistant\" || message.role === \"tool\";\n}\n\n/**\n * The embeddable Agent Mode widget.\n *\n * - Closed: a floating round button. While closed, it surfaces what the agent\n * is doing — a live \"Thinking… / Calling tools…\" ticker, an unread badge when\n * a reply finished, and an \"approval needed\" chip when a write is waiting.\n * - Open on desktop: a popup panel that can expand to fullscreen (\"Agent Mode\").\n * - Open on mobile: fullscreen.\n *\n * Open/close and fullscreen transitions are animated (scale from the launcher\n * corner; size morph between popup and fullscreen). All colors come from the\n * host app's UI-kit theme tokens.\n */\nexport function AgentWidget({\n config,\n onOpenChange,\n open: controlledOpen,\n presentation = \"floating\",\n}: AgentWidgetProps) {\n const behavior = config.behavior ?? {};\n const position = config.appearance?.position ?? \"bottom-right\";\n const isControlled = controlledOpen !== undefined;\n const isDocked = presentation === \"docked\";\n const storageKey = `cc-agent-open:${config.clientId}`;\n\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n // Becomes true once the initial bootstrap (load last conversation, resolve\n // initial open) has settled. Controlled widgets have no bootstrap, so they\n // start \"done\" immediately. Used to hold off the unread baseline until the\n // loaded history is in place.\n const [bootstrapDone, setBootstrapDone] = React.useState(isControlled);\n\n const persist = React.useCallback(\n (next: boolean) => {\n if (isControlled || !behavior.persistOpenState) return;\n try {\n window.localStorage.setItem(storageKey, next ? \"1\" : \"0\");\n } catch {\n /* ignore storage errors */\n }\n },\n [behavior.persistOpenState, isControlled, storageKey],\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next);\n persist(next);\n onOpenChange?.(next);\n },\n [onOpenChange, persist],\n );\n\n const [agentMode, setAgentMode] = React.useState(false);\n const isDesktop = useMediaQuery(\"(min-width: 640px)\", { defaultSSRValue: true, ssr: true });\n const fullscreen = !isDesktop || agentMode;\n\n const chat = useAgentChat(config);\n const alwaysApprove = useAlwaysApprove(config.clientId);\n const { messages, pendingApprovals, resolveApproval, resolvingApprovalId, sending } = chat;\n\n // ----- bootstrap: load last conversation, then resolve initial open -----\n // Runs once (uncontrolled only). Waits for the conversation list, loads the\n // most recent conversation into the chat, and only then auto-opens — so the\n // panel never flashes empty before its history arrives.\n const bootRef = React.useRef(false);\n React.useEffect(() => {\n if (bootRef.current) return;\n // Controlled *floating* widgets skip bootstrap. Docked widgets are\n // controlled too, but still load their last conversation so history is\n // there the moment they dock — we just never auto-open them (the host\n // owns the open state).\n if (isControlled && !isDocked) return;\n bootRef.current = true;\n let cancelled = false;\n void (async () => {\n if (behavior.openLastConversation !== false) {\n const list = await chat.refreshConversations();\n if (cancelled) return;\n if (list.length) await chat.openConversation(list[0].id);\n if (cancelled) return;\n }\n if (!isControlled) {\n let shouldOpen = behavior.initialOpen ?? false;\n if (behavior.persistOpenState) {\n try {\n const stored = window.localStorage.getItem(storageKey);\n if (stored !== null) shouldOpen = stored === \"1\"; // persisted choice wins\n } catch {\n /* ignore storage errors */\n }\n }\n if (shouldOpen) {\n setUncontrolledOpen(true);\n onOpenChange?.(true);\n }\n }\n setBootstrapDone(true);\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ----- unread tracking (badge + \"new message\" divider) -----\n // The last conversation's history is loaded on mount; none of it is \"unread\".\n // We set the seen baseline to whatever is present once bootstrap settles, so\n // the badge stays empty on load and only rises for replies that arrive\n // afterwards while the widget is closed.\n const seenCountRef = React.useRef(0);\n const [baselined, setBaselined] = React.useState(false);\n const [anchorId, setAnchorId] = React.useState<string | null>(null);\n\n React.useEffect(() => {\n if (baselined || !bootstrapDone) return;\n seenCountRef.current = messages.length; // everything present at load = seen\n setBaselined(true);\n }, [baselined, bootstrapDone, messages.length]);\n\n React.useEffect(() => {\n if (open) {\n // Opening: if messages arrived while closed, drop a divider before the\n // first of them, then mark everything seen.\n if (messages.length > seenCountRef.current) {\n const firstUnread = messages[seenCountRef.current];\n setAnchorId(firstUnread && isUnreadable(firstUnread) ? firstUnread.id : null);\n }\n seenCountRef.current = messages.length;\n }\n }, [open, messages]);\n\n const unreadCount =\n open || !baselined ? 0 : messages.slice(seenCountRef.current).filter(isUnreadable).length;\n\n // ----- live \"what's it doing\" status while closed -----\n const workLabel = React.useMemo(() => {\n if (!sending) return null;\n const last = messages[messages.length - 1];\n if (last?.role === \"tool\") return \"Calling tools…\";\n if (last?.role === \"assistant\" && (last.tool_calls?.length ?? 0) > 0) return \"Calling tools…\";\n return \"Thinking…\";\n }, [sending, messages]);\n\n const approvalWaiting = pendingApprovals.length > 0;\n\n // ----- auto-approve trusted write tools -----\n const { isAlwaysApproved } = alwaysApprove;\n React.useEffect(() => {\n if (resolvingApprovalId) return;\n const target = pendingApprovals.find((approval) => isAlwaysApproved(approval.tool_name));\n if (target) void resolveApproval(target.id, true);\n }, [pendingApprovals, resolvingApprovalId, isAlwaysApproved, resolveApproval]);\n\n // ----- live page refresh after successful writes -----\n const firedWriteIds = React.useRef<Set<string>>(new Set());\n const { onWriteSuccess } = config;\n React.useEffect(() => {\n if (!onWriteSuccess) return;\n for (const message of messages) {\n if (message.role !== \"tool\" || !message.is_write || message.tool_status !== \"success\") continue;\n if (firedWriteIds.current.has(message.id)) continue;\n firedWriteIds.current.add(message.id);\n const args = findToolArguments(messages, message);\n onWriteSuccess({ arguments: args, toolName: message.tool_name ?? \"\" });\n }\n }, [messages, onWriteSuccess]);\n\n // ----- page-follow navigation (popup mode only) -----\n // Only tool calls that arrive LIVE in the current session drive navigation.\n // Opening the agent (which restores the last conversation) or switching to a\n // saved conversation must NOT yank the page to whatever that transcript last\n // looked at. We track the chat's `conversationEpoch` — bumped only on a\n // wholesale transcript load — and on each new epoch we adopt the current tail\n // tool call as the baseline WITHOUT navigating; only tool calls appended\n // afterwards (a live send) trigger page-follow.\n const lastNavigatedMessageId = React.useRef<string | null>(null);\n const navEpochRef = React.useRef<number>(-1);\n React.useEffect(() => {\n if (!open || fullscreen || !config.navigate || !config.pages?.length) return;\n const toolMessages = messages.filter((message) => message.role === \"tool\");\n const latest = toolMessages[toolMessages.length - 1];\n\n // New transcript loaded (open/restore/switch/new chat): baseline to its\n // tail and bail — restoring a conversation never navigates.\n if (navEpochRef.current !== chat.conversationEpoch) {\n navEpochRef.current = chat.conversationEpoch;\n lastNavigatedMessageId.current = latest?.id ?? null;\n return;\n }\n\n if (!latest || latest.id === lastNavigatedMessageId.current) return;\n lastNavigatedMessageId.current = latest.id;\n const mapping = config.pages.find((page) => page.tools.includes(latest.tool_name ?? \"\"));\n if (!mapping) return;\n const args = findToolArguments(messages, latest);\n const path = mapping.buildRoute ? mapping.buildRoute(args) : mapping.route;\n if (!path) return;\n const scrollTo = typeof mapping.scrollTo === \"function\" ? mapping.scrollTo(args) : mapping.scrollTo;\n // The host skips the push when already on `path` (no reload) and scrolls to\n // the working section either way.\n config.navigate(path, { scrollTo: scrollTo ?? null });\n }, [chat.conversationEpoch, config, fullscreen, messages, open]);\n\n const closePanel = React.useCallback(() => {\n setOpen(false);\n setAgentMode(false);\n }, [setOpen]);\n\n const transformOrigin = position === \"bottom-left\" ? \"bottom left\" : \"bottom right\";\n const launcherHidden = open || config.appearance?.hideLauncher || isDocked;\n\n return (\n <TooltipProvider>\n {/* Launcher (closed state) */}\n <AnimatePresence>\n {!launcherHidden ? (\n <motion.div\n key=\"agent-launcher\"\n initial={{ opacity: 0, scale: 0.6 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.6 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 24 }}\n style={{ transformOrigin }}\n className={cn(\n \"fixed z-50 flex flex-col items-end gap-2\",\n position === \"bottom-left\"\n ? \"bottom-4 left-4 items-start sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n )}\n >\n {/* Status / approval chips — appear one at a time above the button. */}\n <AnimatePresence mode=\"popLayout\">\n {approvalWaiting ? (\n <StatusChip key=\"approval\" tone=\"warning\" pulse>\n Approval needed\n </StatusChip>\n ) : workLabel ? (\n <StatusChip key={workLabel} tone=\"muted\">\n {workLabel}\n </StatusChip>\n ) : null}\n </AnimatePresence>\n\n <div className=\"relative\">\n <button\n type=\"button\"\n aria-label=\"Open assistant\"\n onClick={() => setOpen(true)}\n className=\"flex size-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg outline-none transition-transform hover:scale-105 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n >\n <SparklesIcon className=\"size-6\" />\n </button>\n {/* Unread badge — a finished reply the user hasn't seen yet. */}\n <AnimatePresence>\n {unreadCount > 0 ? (\n <motion.span\n key=\"badge\"\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n transition={{ type: \"spring\", stiffness: 500, damping: 20 }}\n className=\"absolute -right-1 -top-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-red-500 px-1 text-xs font-semibold text-white shadow-md ring-2 ring-background\"\n aria-label={`${unreadCount} new message${unreadCount === 1 ? \"\" : \"s\"}`}\n >\n {unreadCount > 9 ? \"9+\" : unreadCount}\n </motion.span>\n ) : null}\n </AnimatePresence>\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n\n {/* Docked panel — fills the host-provided container (open state). */}\n {isDocked ? (\n <AnimatePresence>\n {open ? (\n <motion.div\n key=\"agent-docked\"\n initial={{ opacity: 0, x: 28 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 28 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 30 }}\n className=\"flex h-full w-full flex-col overflow-hidden bg-background\"\n >\n <AgentPanel\n agentMode={false}\n canToggleAgentMode={false}\n chat={chat}\n className=\"flex-1\"\n collapseToSide\n config={config}\n newMessageAnchorId={anchorId}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => {}}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>\n ) : (\n <>\n {/* Panel (open state) */}\n <AnimatePresence>\n {open ? (\n <motion.div\n key=\"agent-panel\"\n layout\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n transition={{ type: \"spring\", stiffness: 260, damping: 28 }}\n style={{\n transformOrigin,\n ...(fullscreen\n ? {}\n : {\n height: `min(${config.appearance?.panelHeight ?? 640}px, calc(100dvh - 3rem))`,\n width: `min(${config.appearance?.panelWidth ?? 400}px, calc(100vw - 2rem))`,\n }),\n }}\n className={cn(\n \"fixed z-50 flex flex-col overflow-hidden bg-background\",\n fullscreen\n ? \"inset-0\"\n : cn(\n \"rounded-2xl border border-border shadow-2xl\",\n position === \"bottom-left\"\n ? \"bottom-4 left-4 sm:bottom-6 sm:left-6\"\n : \"right-4 bottom-4 sm:right-6 sm:bottom-6\",\n ),\n )}\n role=\"dialog\"\n aria-modal={fullscreen ? \"true\" : undefined}\n >\n <AgentPanel\n agentMode={fullscreen && agentMode}\n canToggleAgentMode={isDesktop}\n chat={chat}\n className=\"flex-1\"\n config={config}\n newMessageAnchorId={anchorId}\n onAlwaysApprove={alwaysApprove.setAlwaysApprove}\n onClose={closePanel}\n onToggleAgentMode={() => setAgentMode((value) => !value)}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>\n </>\n )}\n </TooltipProvider>\n );\n}\n\n/** Small status pill that floats above the launcher, animating in/out. */\nfunction StatusChip({\n children,\n tone,\n pulse,\n}: {\n children: React.ReactNode;\n tone: \"muted\" | \"warning\";\n pulse?: boolean;\n}) {\n return (\n <motion.div\n layout\n initial={{ opacity: 0, y: 6, scale: 0.9 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 6, scale: 0.9 }}\n transition={{ duration: 0.18 }}\n className={cn(\n \"flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium shadow-sm\",\n tone === \"warning\"\n ? \"border-warning bg-warning-surface text-warning-foreground\"\n : \"border-border bg-card text-secondary-foreground\",\n )}\n >\n {pulse ? <span className=\"size-1.5 rounded-full bg-warning-foreground\" /> : (\n <span className=\"flex gap-0.5\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </span>\n )}\n {children}\n </motion.div>\n );\n}\n\nfunction Dot({ delay }: { delay: number }) {\n return (\n <motion.span\n className=\"size-1.5 rounded-full bg-current opacity-60\"\n animate={{ opacity: [0.2, 1, 0.2] }}\n transition={{ duration: 1, repeat: Infinity, delay }}\n />\n );\n}\n\n/** Look up the arguments of the assistant tool_call a tool message answers. */\nfunction findToolArguments(\n messages: AgentMessage[],\n toolMessage: AgentMessage,\n): Record<string, unknown> {\n if (!toolMessage.tool_call_id) return {};\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role !== \"assistant\" || !message.tool_calls) continue;\n const match = message.tool_calls.find((call) => call.id === toolMessage.tool_call_id);\n if (match) return match.arguments ?? {};\n }\n return {};\n}\n","import type { AgentConfig } from \"./types\";\n\n/**\n * Identity helper that gives host apps full type inference/checking when\n * declaring their agent config file.\n */\nexport function defineAgentConfig(config: AgentConfig): AgentConfig {\n return config;\n}\n"]}