@useatlas/react 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +95 -0
  2. package/dist/chunk-2WFDP7G5.js +231 -0
  3. package/dist/chunk-2WFDP7G5.js.map +1 -0
  4. package/dist/chunk-44HBZYKP.js +224 -0
  5. package/dist/chunk-44HBZYKP.js.map +1 -0
  6. package/dist/chunk-5SEVKHS5.cjs +229 -0
  7. package/dist/chunk-5SEVKHS5.cjs.map +1 -0
  8. package/dist/chunk-UIRB6L36.cjs +249 -0
  9. package/dist/chunk-UIRB6L36.cjs.map +1 -0
  10. package/dist/hooks.cjs +251 -0
  11. package/dist/hooks.cjs.map +1 -0
  12. package/dist/hooks.d.cts +132 -0
  13. package/dist/hooks.d.ts +132 -0
  14. package/dist/hooks.js +237 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.cjs +2976 -0
  17. package/dist/index.cjs.map +1 -0
  18. package/dist/index.d.cts +69 -0
  19. package/dist/index.d.ts +69 -0
  20. package/dist/index.js +2926 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/result-chart-NFAJ4IQ5.js +398 -0
  23. package/dist/result-chart-NFAJ4IQ5.js.map +1 -0
  24. package/dist/result-chart-YLCKBNV4.cjs +400 -0
  25. package/dist/result-chart-YLCKBNV4.cjs.map +1 -0
  26. package/dist/styles.css +59 -0
  27. package/dist/use-dark-mode-rFxawUv1.d.cts +123 -0
  28. package/dist/use-dark-mode-rFxawUv1.d.ts +123 -0
  29. package/dist/widget.css +2 -0
  30. package/dist/widget.js +445 -0
  31. package/package.json +113 -0
  32. package/src/components/__tests__/tool-renderers.test.tsx +239 -0
  33. package/src/components/actions/action-approval-card.tsx +296 -0
  34. package/src/components/actions/action-status-badge.tsx +50 -0
  35. package/src/components/admin/change-password-dialog.tsx +128 -0
  36. package/src/components/atlas-chat.tsx +656 -0
  37. package/src/components/chart/chart-detection.ts +318 -0
  38. package/src/components/chart/result-chart.tsx +590 -0
  39. package/src/components/chat/api-key-bar.tsx +66 -0
  40. package/src/components/chat/copy-button.tsx +25 -0
  41. package/src/components/chat/data-table.tsx +104 -0
  42. package/src/components/chat/error-banner.tsx +32 -0
  43. package/src/components/chat/explore-card.tsx +41 -0
  44. package/src/components/chat/follow-up-chips.tsx +29 -0
  45. package/src/components/chat/loading-card.tsx +10 -0
  46. package/src/components/chat/managed-auth-card.tsx +116 -0
  47. package/src/components/chat/markdown.tsx +146 -0
  48. package/src/components/chat/python-result-card.tsx +245 -0
  49. package/src/components/chat/sql-block.tsx +54 -0
  50. package/src/components/chat/sql-result-card.tsx +163 -0
  51. package/src/components/chat/starter-prompts.ts +6 -0
  52. package/src/components/chat/tool-part.tsx +106 -0
  53. package/src/components/chat/typing-indicator.tsx +22 -0
  54. package/src/components/conversations/conversation-item.tsx +135 -0
  55. package/src/components/conversations/conversation-list.tsx +69 -0
  56. package/src/components/conversations/conversation-sidebar.tsx +113 -0
  57. package/src/components/conversations/delete-confirmation.tsx +27 -0
  58. package/src/components/schema-explorer/schema-explorer.tsx +517 -0
  59. package/src/components/ui/alert-dialog.tsx +196 -0
  60. package/src/components/ui/badge.tsx +48 -0
  61. package/src/components/ui/button.tsx +64 -0
  62. package/src/components/ui/card.tsx +92 -0
  63. package/src/components/ui/dialog.tsx +158 -0
  64. package/src/components/ui/dropdown-menu.tsx +257 -0
  65. package/src/components/ui/input.tsx +21 -0
  66. package/src/components/ui/label.tsx +24 -0
  67. package/src/components/ui/scroll-area.tsx +62 -0
  68. package/src/components/ui/separator.tsx +28 -0
  69. package/src/components/ui/sheet.tsx +143 -0
  70. package/src/components/ui/table.tsx +116 -0
  71. package/src/components/ui/toggle-group.tsx +83 -0
  72. package/src/components/ui/toggle.tsx +47 -0
  73. package/src/context.tsx +85 -0
  74. package/src/env.d.ts +9 -0
  75. package/src/hooks/__tests__/provider.test.tsx +83 -0
  76. package/src/hooks/__tests__/use-atlas-auth.test.tsx +283 -0
  77. package/src/hooks/__tests__/use-atlas-chat.test.tsx +157 -0
  78. package/src/hooks/__tests__/use-atlas-conversations.test.tsx +159 -0
  79. package/src/hooks/__tests__/use-atlas-theme.test.tsx +56 -0
  80. package/src/hooks/index.ts +47 -0
  81. package/src/hooks/provider.tsx +77 -0
  82. package/src/hooks/theme-init-script.ts +17 -0
  83. package/src/hooks/use-atlas-auth.ts +131 -0
  84. package/src/hooks/use-atlas-chat.ts +102 -0
  85. package/src/hooks/use-atlas-conversations.ts +61 -0
  86. package/src/hooks/use-atlas-theme.ts +34 -0
  87. package/src/hooks/use-conversations.ts +189 -0
  88. package/src/hooks/use-dark-mode.ts +150 -0
  89. package/src/index.ts +36 -0
  90. package/src/lib/action-types.ts +11 -0
  91. package/src/lib/helpers.ts +198 -0
  92. package/src/lib/tool-renderer-types.ts +76 -0
  93. package/src/lib/types.ts +29 -0
  94. package/src/lib/utils.ts +6 -0
  95. package/src/styles.css +59 -0
  96. package/src/test-setup.ts +55 -0
  97. package/src/widget-entry.ts +20 -0
  98. package/src/widget.css +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.tsx","../src/components/chat/error-banner.tsx","../src/components/chat/api-key-bar.tsx","../src/components/chat/managed-auth-card.tsx","../src/components/chat/typing-indicator.tsx","../src/lib/helpers.ts","../src/components/chat/explore-card.tsx","../src/components/chat/loading-card.tsx","../src/components/chat/data-table.tsx","../src/components/chat/copy-button.tsx","../src/components/chat/sql-block.tsx","../src/components/chat/sql-result-card.tsx","../src/components/actions/action-status-badge.tsx","../src/components/actions/action-approval-card.tsx","../src/components/chat/python-result-card.tsx","../src/components/chat/tool-part.tsx","../src/components/chat/markdown.tsx","../src/components/chat/starter-prompts.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/chat/follow-up-chips.tsx","../src/components/ui/toggle.tsx","../src/components/ui/toggle-group.tsx","../src/components/ui/badge.tsx","../src/components/conversations/delete-confirmation.tsx","../src/components/conversations/conversation-item.tsx","../src/components/conversations/conversation-list.tsx","../src/components/conversations/conversation-sidebar.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/input.tsx","../src/components/admin/change-password-dialog.tsx","../src/components/ui/sheet.tsx","../src/components/ui/scroll-area.tsx","../src/components/ui/separator.tsx","../src/components/ui/table.tsx","../src/components/ui/card.tsx","../src/components/schema-explorer/schema-explorer.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/atlas-chat.tsx"],"names":["useMemo","jsx","useState","jsxs","useContext","useEffect","data","ResultChart","lazy","Suspense","Component","ToolPart","Fragment","memo","Markdown","cva","ToggleGroupPrimitive","Slot","Star","AlertDialogPrimitive","SheetPrimitive","ScrollAreaPrimitive","SeparatorPrimitive","DropdownMenuPrimitive","useRef","input","TableProperties"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\n/**\n * Duck-typed interface that matches better-auth's client shape.\n * Components like ManagedAuthCard call signIn/signUp/signOut and useSession().\n */\nexport interface AtlasAuthClient {\n signIn: {\n email: (opts: { email: string; password: string }) => Promise<{ error?: { message?: string } | null }>;\n };\n signUp: {\n email: (opts: { email: string; password: string; name: string }) => Promise<{ error?: { message?: string } | null }>;\n };\n signOut: () => Promise<unknown>;\n useSession: () => { data?: { user?: { email?: string } } | null; isPending?: boolean };\n}\n\nexport interface AtlasUIConfig {\n apiUrl: string;\n authClient: AtlasAuthClient;\n}\n\n/** Internal context value — includes derived `isCrossOrigin` computed by the provider. */\ninterface AtlasUIContextValue extends AtlasUIConfig {\n isCrossOrigin: boolean;\n}\n\nconst AtlasUIContext = createContext<AtlasUIContextValue | null>(null);\n\nexport function useAtlasConfig(): AtlasUIContextValue {\n const ctx = useContext(AtlasUIContext);\n if (!ctx) throw new Error(\"useAtlasConfig must be used within <AtlasUIProvider>\");\n return ctx;\n}\n\nexport function AtlasUIProvider({\n config,\n children,\n}: {\n config: AtlasUIConfig;\n children: ReactNode;\n}) {\n const isCrossOrigin = typeof window !== \"undefined\"\n && config.apiUrl !== \"\"\n && !config.apiUrl.startsWith(window.location.origin);\n return (\n <AtlasUIContext.Provider value={{ ...config, isCrossOrigin }}>\n {children}\n </AtlasUIContext.Provider>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ActionAuth — internal context for passing auth to action cards */\n/* ------------------------------------------------------------------ */\n\nexport interface ActionAuthValue {\n getHeaders: () => Record<string, string>;\n getCredentials: () => RequestCredentials;\n}\n\nconst ActionAuthContext = createContext<ActionAuthValue | null>(null);\n\n/** Returns auth helpers for action API calls, or null when no provider is present. */\nexport function useActionAuth(): ActionAuthValue | null {\n return useContext(ActionAuthContext);\n}\n\nexport function ActionAuthProvider({\n getHeaders,\n getCredentials,\n children,\n}: ActionAuthValue & { children: ReactNode }) {\n const value = useMemo(\n () => ({ getHeaders, getCredentials }),\n [getHeaders, getCredentials],\n );\n return (\n <ActionAuthContext.Provider value={value}>\n {children}\n </ActionAuthContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { parseChatError, type AuthMode } from \"../../lib/types\";\n\nexport function ErrorBanner({ error, authMode }: { error: Error; authMode: AuthMode }) {\n const info = useMemo(() => parseChatError(error, authMode), [error, authMode]);\n const [countdown, setCountdown] = useState(info.retryAfterSeconds ?? 0);\n\n useEffect(() => {\n if (!info.retryAfterSeconds) return;\n setCountdown(info.retryAfterSeconds);\n const interval = setInterval(() => {\n setCountdown((prev) => {\n if (prev <= 1) { clearInterval(interval); return 0; }\n return prev - 1;\n });\n }, 1000);\n return () => clearInterval(interval);\n }, [info.retryAfterSeconds]);\n\n const detail = info.retryAfterSeconds && countdown > 0\n ? `Try again in ${countdown} second${countdown !== 1 ? \"s\" : \"\"}.`\n : info.detail;\n\n return (\n <div className=\"mb-2 rounded-lg border border-red-300 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-400 px-4 py-3 text-sm\">\n <p className=\"font-medium\">{info.title}</p>\n {detail && <p className=\"mt-1 text-xs opacity-80\">{detail}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\n\nexport function ApiKeyBar({\n apiKey,\n onSave,\n}: {\n apiKey: string;\n onSave: (key: string) => void;\n}) {\n const [editing, setEditing] = useState(!apiKey);\n const [draft, setDraft] = useState(apiKey);\n\n if (!editing && apiKey) {\n return (\n <div className=\"flex items-center gap-2 rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2 text-xs dark:border-zinc-700 dark:bg-zinc-900\">\n <span className=\"text-zinc-500 dark:text-zinc-400\">API key configured</span>\n <button\n onClick={() => { setDraft(apiKey); setEditing(true); }}\n className=\"rounded border border-zinc-200 px-2 py-0.5 text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n Change\n </button>\n </div>\n );\n }\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n if (draft.trim()) {\n onSave(draft.trim());\n setEditing(false);\n }\n }}\n className=\"flex items-center gap-2 rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2 dark:border-zinc-700 dark:bg-zinc-900\"\n >\n <input\n type=\"password\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n placeholder=\"Enter your API key...\"\n className=\"flex-1 bg-transparent text-xs text-zinc-900 placeholder-zinc-400 outline-none dark:text-zinc-100 dark:placeholder-zinc-600\"\n autoFocus\n />\n <button\n type=\"submit\"\n disabled={!draft.trim()}\n className=\"rounded border border-zinc-200 px-2 py-0.5 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 disabled:opacity-40 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n Save\n </button>\n {apiKey && (\n <button\n type=\"button\"\n onClick={() => setEditing(false)}\n className=\"text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300\"\n >\n Cancel\n </button>\n )}\n </form>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useAtlasConfig } from \"../../context\";\n\nexport function ManagedAuthCard() {\n const { authClient } = useAtlasConfig();\n const [view, setView] = useState<\"login\" | \"signup\">(\"login\");\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(false);\n\n async function handleLogin(e: React.FormEvent) {\n e.preventDefault();\n setError(\"\");\n setLoading(true);\n try {\n const res = await authClient.signIn.email({ email, password });\n if (res.error) setError(res.error.message ?? \"Sign in failed\");\n } catch (err) {\n console.error(\"Sign in error:\", err);\n setError(err instanceof TypeError ? \"Unable to reach the server\" : \"Sign in failed\");\n } finally {\n setLoading(false);\n }\n }\n\n async function handleSignup(e: React.FormEvent) {\n e.preventDefault();\n setError(\"\");\n setLoading(true);\n try {\n const res = await authClient.signUp.email({ email, password, name: name || email.split(\"@\")[0] });\n if (res.error) setError(res.error.message ?? \"Sign up failed\");\n } catch (err) {\n console.error(\"Sign up error:\", err);\n setError(err instanceof TypeError ? \"Unable to reach the server\" : \"Sign up failed\");\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <div className=\"flex h-full items-center justify-center\">\n <div className=\"w-full max-w-sm space-y-4 rounded-lg border border-zinc-200 bg-zinc-50 p-6 dark:border-zinc-700 dark:bg-zinc-900\">\n <div className=\"text-center\">\n <h2 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100\">\n {view === \"login\" ? \"Sign in to Atlas\" : \"Create an account\"}\n </h2>\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">\n {view === \"login\" ? \"Enter your credentials to continue\" : \"Set up your Atlas account\"}\n </p>\n </div>\n\n <form onSubmit={view === \"login\" ? handleLogin : handleSignup} className=\"space-y-3\">\n {view === \"signup\" && (\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Name (optional)\"\n className=\"w-full rounded-lg border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 placeholder-zinc-400 outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder-zinc-600\"\n />\n )}\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"Email\"\n required\n className=\"w-full rounded-lg border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 placeholder-zinc-400 outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder-zinc-600\"\n />\n <input\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n required\n minLength={8}\n className=\"w-full rounded-lg border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 placeholder-zinc-400 outline-none focus:border-blue-500 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder-zinc-600\"\n />\n {error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">{error}</p>\n )}\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-500 disabled:opacity-40\"\n >\n {loading ? \"...\" : view === \"login\" ? \"Sign in\" : \"Create account\"}\n </button>\n </form>\n\n <p className=\"text-center text-xs text-zinc-500 dark:text-zinc-400\">\n {view === \"login\" ? (\n <>\n No account?{\" \"}\n <button onClick={() => { setView(\"signup\"); setError(\"\"); }} className=\"text-blue-600 hover:underline dark:text-blue-400\">\n Create one\n </button>\n </>\n ) : (\n <>\n Already have an account?{\" \"}\n <button onClick={() => { setView(\"login\"); setError(\"\"); }} className=\"text-blue-600 hover:underline dark:text-blue-400\">\n Sign in\n </button>\n </>\n )}\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nconst DELAY_1 = { animationDelay: \"150ms\" } as const;\nconst DELAY_2 = { animationDelay: \"300ms\" } as const;\n\nexport function TypingIndicator() {\n return (\n <div className=\"flex justify-start\">\n <div className=\"flex items-center gap-1 rounded-xl bg-zinc-100 px-4 py-3 dark:bg-zinc-800\">\n <span className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-zinc-400 dark:bg-zinc-500\" />\n <span\n className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-zinc-400 dark:bg-zinc-500\"\n style={DELAY_1}\n />\n <span\n className=\"h-1.5 w-1.5 animate-bounce rounded-full bg-zinc-400 dark:bg-zinc-500\"\n style={DELAY_2}\n />\n </div>\n </div>\n );\n}\n","/** Extract tool invocation input from a ToolUIPart. Returns empty object if unavailable. */\nexport function getToolArgs(part: unknown): Record<string, unknown> {\n if (part == null || typeof part !== \"object\") return {};\n const input = (part as Record<string, unknown>).input;\n if (input == null || typeof input !== \"object\") return {};\n return input as Record<string, unknown>;\n}\n\n/** Extract tool output from a ToolUIPart. Returns null if not yet available. */\nexport function getToolResult(part: unknown): unknown {\n if (part == null || typeof part !== \"object\") return null;\n return (part as Record<string, unknown>).output ?? null;\n}\n\n/** True when the tool invocation has finished successfully (state is \"output-available\"). */\nexport function isToolComplete(part: unknown): boolean {\n if (part == null || typeof part !== \"object\") return false;\n return (part as Record<string, unknown>).state === \"output-available\";\n}\n\n/** Parse a CSV string into headers + rows. Handles basic quoting and escaped quotes (\"\"). */\nexport function parseCSV(csv: string): { headers: string[]; rows: string[][] } {\n if (!csv || !csv.trim()) return { headers: [], rows: [] };\n\n const lines = csv.trim().split(\"\\n\");\n if (lines.length === 0) return { headers: [], rows: [] };\n\n function parseLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n for (let k = 0; k < line.length; k++) {\n const char = line[k];\n if (char === '\"') {\n if (inQuotes && line[k + 1] === '\"') {\n current += '\"';\n k++;\n } else {\n inQuotes = !inQuotes;\n }\n } else if (char === \",\" && !inQuotes) {\n result.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n result.push(current.trim());\n return result;\n }\n\n return {\n headers: parseLine(lines[0]),\n rows: lines\n .slice(1)\n .filter((l) => l.trim())\n .map(parseLine),\n };\n}\n\n/** Serialize columns + rows to a CSV string. Handles commas, quotes, and newlines in values. */\nexport function toCsvString(columns: string[], rows: Record<string, unknown>[]): string {\n const escape = (v: unknown) => {\n const s = v == null ? \"\" : String(v);\n return s.includes(\",\") || s.includes('\"') || s.includes(\"\\n\")\n ? `\"${s.replace(/\"/g, '\"\"')}\"`\n : s;\n };\n const header = columns.map(escape).join(\",\");\n const body = rows.map((row) => columns.map((col) => escape(row[col])).join(\",\"));\n return [header, ...body].join(\"\\n\");\n}\n\n/** Trigger a CSV download in the browser. */\nexport function downloadCSV(csv: string, filename = \"atlas-results.csv\") {\n let url: string | null = null;\n try {\n const blob = new Blob([csv], { type: \"text/csv\" });\n url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n } catch (err) {\n console.error(\"CSV download failed:\", err);\n window.alert(\"CSV download failed\");\n } finally {\n if (url) {\n const blobUrl = url;\n setTimeout(() => URL.revokeObjectURL(blobUrl), 10_000);\n }\n }\n}\n\n/** Strict ISO date pattern: YYYY-MM-DD with optional time component. */\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n/** Coerce a cell value to a typed Excel cell: numbers/booleans pass through, ISO dates become Date objects, null becomes empty string. Exported for testing. */\nexport function coerceExcelCell(v: unknown): unknown {\n if (v == null) return \"\";\n if (typeof v === \"number\" || typeof v === \"boolean\") return v;\n if (typeof v === \"string\" && ISO_DATE_RE.test(v) && !isNaN(Date.parse(v))) {\n return new Date(v);\n }\n return String(v);\n}\n\n/** Trigger an Excel (.xlsx) download in the browser. Dynamically imports xlsx to avoid bundle bloat. */\nexport async function downloadExcel(\n columns: string[],\n rows: Record<string, unknown>[],\n filename = \"atlas-results.xlsx\",\n) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let XLSX: any;\n try {\n XLSX = await import(\"xlsx\" /* webpackIgnore: true */);\n } catch (err) {\n console.error(\"Failed to load xlsx library:\", err);\n window.alert(\"Excel export is unavailable. The spreadsheet library failed to load.\");\n return;\n }\n\n let url: string | null = null;\n try {\n const data = rows.map((row) => {\n const obj: Record<string, unknown> = {};\n for (const col of columns) {\n obj[col] = coerceExcelCell(row[col]);\n }\n return obj;\n });\n const ws = XLSX.utils.json_to_sheet(data, { header: columns });\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, \"Results\");\n const wbOut = XLSX.write(wb, { bookType: \"xlsx\", type: \"array\" });\n const blob = new Blob([wbOut], {\n type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n });\n url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n } catch (err) {\n console.error(\"Excel download failed:\", err);\n const detail = err instanceof Error ? err.message : \"Unknown error\";\n window.alert(`Excel download failed: ${detail}\\n\\nYou can try the CSV download as an alternative.`);\n } finally {\n if (url) {\n const blobUrl = url;\n setTimeout(() => URL.revokeObjectURL(blobUrl), 10_000);\n }\n }\n}\n\nconst SUGGESTIONS_RE = /<suggestions>\\s*([\\s\\S]*?)\\s*<\\/suggestions>/g;\n\n/** Extract follow-up suggestions from assistant message content and return the cleaned text + suggestions.\n * All `<suggestions>` blocks are stripped; suggestions from all blocks are merged. */\nexport function parseSuggestions(content: string): { text: string; suggestions: string[] } {\n const suggestions: string[] = [];\n let match;\n while ((match = SUGGESTIONS_RE.exec(content)) !== null) {\n const lines = match[1].split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n suggestions.push(...lines);\n }\n SUGGESTIONS_RE.lastIndex = 0;\n if (suggestions.length === 0) return { text: content, suggestions: [] };\n const text = content.replace(SUGGESTIONS_RE, \"\").trimEnd();\n SUGGESTIONS_RE.lastIndex = 0;\n return { text, suggestions: suggestions.slice(0, 5) };\n}\n\n/**\n * Normalize a record-or-array field from the API into a flat array.\n * When the data is a Record, the key is merged in under `keyName`.\n * Used by both admin entity-detail and schema explorer components.\n */\nexport function normalizeList<T>(\n data: Record<string, T> | T[] | undefined,\n keyName: string,\n): (T & Record<string, unknown>)[] {\n if (!data) return [];\n if (Array.isArray(data)) return data as (T & Record<string, unknown>)[];\n return Object.entries(data).map(([key, value]) => ({ ...value, [keyName]: key }));\n}\n\n/** Format a cell value: null as em-dash, numbers with locale formatting, else stringified. */\nexport function formatCell(value: unknown): string {\n if (value == null) return \"\\u2014\";\n if (typeof value === \"number\") {\n return Number.isInteger(value)\n ? value.toLocaleString()\n : value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return String(value);\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { getToolArgs, getToolResult, isToolComplete } from \"../../lib/helpers\";\n\nexport function ExploreCard({ part }: { part: unknown }) {\n const args = getToolArgs(part);\n const result = getToolResult(part);\n const done = isToolComplete(part);\n const [open, setOpen] = useState(false);\n\n return (\n <div className=\"my-2 overflow-hidden rounded-lg border border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900\">\n <button\n onClick={() => done && setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs transition-colors hover:bg-zinc-100/60 dark:hover:bg-zinc-800/60\"\n >\n <span className=\"font-mono text-green-400\">$</span>\n <span className=\"flex-1 truncate font-mono text-zinc-700 dark:text-zinc-300\">\n {String(args.command ?? \"\")}\n </span>\n {done ? (\n <span className=\"text-zinc-400 dark:text-zinc-600\">{open ? \"\\u25BE\" : \"\\u25B8\"}</span>\n ) : (\n <span className=\"animate-pulse text-zinc-500\">running...</span>\n )}\n </button>\n {open && done && (\n <div className=\"border-t border-zinc-100 bg-white px-3 py-2 dark:border-zinc-800 dark:bg-zinc-950\">\n <pre className=\"max-h-60 overflow-auto whitespace-pre-wrap font-mono text-xs leading-relaxed text-zinc-500 dark:text-zinc-400\">\n {result != null\n ? typeof result === \"string\"\n ? result\n : JSON.stringify(result, null, 2)\n : \"(no output received)\"}\n </pre>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nexport function LoadingCard({ label }: { label: string }) {\n return (\n <div className=\"my-2 flex items-center gap-2 rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2 text-xs text-zinc-500 dark:border-zinc-700 dark:bg-zinc-900\">\n <span className=\"inline-block h-3 w-3 animate-spin rounded-full border-2 border-zinc-300 border-t-zinc-600 dark:border-zinc-600 dark:border-t-zinc-300\" />\n {label}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { formatCell } from \"../../lib/helpers\";\n\nexport function DataTable({\n columns,\n rows,\n maxRows = 10,\n}: {\n columns: string[];\n rows: (Record<string, unknown> | unknown[])[];\n maxRows?: number;\n}) {\n const [sortCol, setSortCol] = useState<number | null>(null);\n const [sortDir, setSortDir] = useState<\"asc\" | \"desc\">(\"asc\");\n\n const hasMore = rows.length > maxRows;\n\n const cell = (row: Record<string, unknown> | unknown[], colIdx: number): unknown => {\n if (Array.isArray(row)) return row[colIdx];\n return (row as Record<string, unknown>)[columns[colIdx]];\n };\n\n const handleSort = (colIdx: number) => {\n if (sortCol === colIdx) {\n if (sortDir === \"asc\") {\n setSortDir(\"desc\");\n } else {\n setSortCol(null);\n setSortDir(\"asc\");\n }\n } else {\n setSortCol(colIdx);\n setSortDir(\"asc\");\n }\n };\n\n const sorted = sortCol !== null\n ? [...rows].sort((a, b) => {\n const av = cell(a, sortCol);\n const bv = cell(b, sortCol);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const aStr = String(av).trim();\n const bStr = String(bv).trim();\n if (aStr === \"\" && bStr === \"\") return 0;\n if (aStr === \"\") return 1;\n if (bStr === \"\") return -1;\n const an = Number(aStr), bn = Number(bStr);\n if (!isNaN(an) && !isNaN(bn)) {\n return sortDir === \"asc\" ? an - bn : bn - an;\n }\n const cmp = aStr.localeCompare(bStr);\n return sortDir === \"asc\" ? cmp : -cmp;\n })\n : rows;\n const display = sorted.slice(0, maxRows);\n\n return (\n <div className=\"relative rounded-lg border border-zinc-200 dark:border-zinc-700\">\n <div className=\"overflow-x-auto [&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-zinc-300 dark:[&::-webkit-scrollbar-thumb]:bg-zinc-600\">\n <table className=\"min-w-full text-xs\">\n <thead>\n <tr className=\"border-b border-zinc-200 bg-zinc-100/80 dark:border-zinc-700 dark:bg-zinc-800/80\">\n {columns.map((col, i) => (\n <th\n key={i}\n onClick={() => handleSort(i)}\n className=\"group cursor-pointer select-none whitespace-nowrap px-3 py-2 text-left font-medium text-zinc-500 transition-colors hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200\"\n >\n {col}\n {sortCol === i\n ? sortDir === \"asc\" ? \" \\u25B2\" : \" \\u25BC\"\n : \"\"}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {display.map((row, i) => (\n <tr\n key={i}\n className={i % 2 === 0 ? \"bg-zinc-100/60 dark:bg-zinc-900/60\" : \"bg-zinc-50/30 dark:bg-zinc-900/30\"}\n >\n {columns.map((_, j) => (\n <td key={j} className=\"whitespace-nowrap px-3 py-1.5 text-zinc-700 dark:text-zinc-300\">\n {formatCell(cell(row, j))}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {hasMore && (\n <div className=\"border-t border-zinc-200 px-3 py-1.5 text-xs text-zinc-500 dark:border-zinc-700\">\n Showing {maxRows} of {rows.length} rows\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\n\nexport function CopyButton({ text, label = \"Copy\" }: { text: string; label?: string }) {\n const [state, setState] = useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\n return (\n <button\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(text);\n setState(\"copied\");\n setTimeout(() => setState(\"idle\"), 2000);\n } catch (err) {\n console.warn(\"Clipboard write failed:\", err);\n setState(\"failed\");\n setTimeout(() => setState(\"idle\"), 2000);\n }\n }}\n className=\"rounded border border-zinc-200 px-2 py-1 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n {state === \"copied\" ? \"Copied!\" : state === \"failed\" ? \"Failed\" : label}\n </button>\n );\n}\n","\"use client\";\n\nimport { useContext, useState, useEffect } from \"react\";\nimport { DarkModeContext } from \"../../hooks/use-dark-mode\";\nimport { CopyButton } from \"./copy-button\";\n\ntype SyntaxHighlighterModule = typeof import(\"react-syntax-highlighter\");\ntype StyleModule = typeof import(\"react-syntax-highlighter/dist/esm/styles/prism\");\n\nlet _cache: { Prism: SyntaxHighlighterModule[\"Prism\"]; oneDark: StyleModule[\"oneDark\"]; oneLight: StyleModule[\"oneLight\"] } | null = null;\n\nconst SQL_BLOCK_STYLE = {\n margin: 0,\n borderRadius: \"0.5rem\",\n fontSize: \"0.75rem\",\n padding: \"0.75rem 1rem\",\n} as const;\n\nexport function SQLBlock({ sql }: { sql: string }) {\n const dark = useContext(DarkModeContext);\n const [mod, setMod] = useState(_cache);\n\n useEffect(() => {\n if (_cache) return;\n Promise.all([\n import(\"react-syntax-highlighter\"),\n import(\"react-syntax-highlighter/dist/esm/styles/prism\"),\n ]).then(([sh, styles]) => {\n _cache = { Prism: sh.Prism, oneDark: styles.oneDark, oneLight: styles.oneLight };\n setMod(_cache);\n });\n }, []);\n\n return (\n <div className=\"relative\">\n {mod ? (\n <mod.Prism\n language=\"sql\"\n style={dark ? mod.oneDark : mod.oneLight}\n customStyle={SQL_BLOCK_STYLE}\n >\n {sql}\n </mod.Prism>\n ) : (\n <pre className=\"overflow-x-auto rounded-lg bg-zinc-100 p-3 text-xs dark:bg-zinc-800\">\n <code>{sql}</code>\n </pre>\n )}\n <div className=\"absolute right-2 top-2\">\n <CopyButton text={sql} label=\"Copy SQL\" />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useContext, useMemo, useState } from \"react\";\nimport { getToolArgs, getToolResult, isToolComplete, downloadCSV, downloadExcel, toCsvString } from \"../../lib/helpers\";\nimport { FileDown, FileSpreadsheet } from \"lucide-react\";\nimport { DarkModeContext } from \"../../hooks/use-dark-mode\";\nimport { detectCharts } from \"../chart/chart-detection\";\nimport { lazy, Suspense } from \"react\";\n\nconst ResultChart = lazy(() => import(\"../chart/result-chart\").then((m) => ({ default: m.ResultChart })));\nconst ChartFallback = <div className=\"h-64 animate-pulse rounded-lg bg-zinc-100 dark:bg-zinc-800\" />;\n\nimport { LoadingCard } from \"./loading-card\";\nimport { DataTable } from \"./data-table\";\nimport { SQLBlock } from \"./sql-block\";\n\n/** Convert structured rows (Record<string, unknown>[]) to string[][] for chart detection. */\nfunction toStringRows(columns: string[], rows: Record<string, unknown>[]): string[][] {\n return rows.map((row) => columns.map((col) => (row[col] == null ? \"\" : String(row[col]))));\n}\n\n\nexport function SQLResultCard({ part }: { part: unknown }) {\n const dark = useContext(DarkModeContext);\n const args = getToolArgs(part);\n const result = getToolResult(part) as Record<string, unknown> | null;\n const done = isToolComplete(part);\n const [open, setOpen] = useState(true);\n const [sqlOpen, setSqlOpen] = useState(false);\n const [viewMode, setViewMode] = useState<\"both\" | \"chart\" | \"table\">(\"both\");\n\n const columns = useMemo(\n () => (done && result?.success ? ((result.columns as string[]) ?? []) : []),\n [done, result],\n );\n const rows = useMemo(\n () => (done && result?.success ? ((result.rows as Record<string, unknown>[]) ?? []) : []),\n [done, result],\n );\n const sql = String(args.sql ?? \"\");\n\n const stringRows = useMemo(() => toStringRows(columns, rows), [columns, rows]);\n const chartResult = useMemo(\n () => (columns.length > 0 ? detectCharts(columns, stringRows) : { chartable: false as const, columns: [] }),\n [columns, stringRows],\n );\n\n if (!done) return <LoadingCard label=\"Executing query...\" />;\n\n if (!result) {\n return (\n <div className=\"my-2 rounded-lg border border-yellow-300 bg-yellow-50 text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400 px-3 py-2 text-xs\">\n Query completed but no result was returned.\n </div>\n );\n }\n\n if (!result.success) {\n return (\n <div className=\"my-2 rounded-lg border border-red-300 bg-red-50 text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-400 px-3 py-2 text-xs\">\n Query failed. Check the query and try again.\n </div>\n );\n }\n\n const hasData = columns.length > 0 && rows.length > 0;\n const showChart = chartResult.chartable && (viewMode === \"chart\" || viewMode === \"both\");\n const showTable = viewMode === \"table\" || viewMode === \"both\" || !chartResult.chartable;\n\n return (\n <div className=\"my-2 overflow-hidden rounded-lg border border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs transition-colors hover:bg-zinc-100/60 dark:hover:bg-zinc-800/60\"\n >\n <span className=\"rounded bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400 px-1.5 py-0.5 font-medium\">\n SQL\n </span>\n <span className=\"flex-1 truncate text-zinc-500 dark:text-zinc-400\">\n {String(args.explanation ?? \"Query result\")}\n </span>\n <span className=\"text-zinc-500\">\n {rows.length} row{rows.length !== 1 ? \"s\" : \"\"}\n {result.truncated ? \"+\" : \"\"}\n </span>\n <span className=\"text-zinc-400 dark:text-zinc-600\">{open ? \"\\u25BE\" : \"\\u25B8\"}</span>\n </button>\n {open && (\n <div className=\"border-t border-zinc-100 dark:border-zinc-800\">\n {hasData && chartResult.chartable && (\n <div className=\"flex gap-1 px-3 pt-2\">\n {([\"chart\", \"both\", \"table\"] as const).map((mode) => (\n <button\n key={mode}\n onClick={() => setViewMode(mode)}\n className={`rounded px-2.5 py-1 text-xs font-medium transition-colors ${\n viewMode === mode\n ? \"bg-zinc-200 text-zinc-800 dark:bg-zinc-700 dark:text-zinc-200\"\n : \"text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200\"\n }`}\n >\n {mode === \"chart\" ? \"Chart\" : mode === \"both\" ? \"Both\" : \"Table\"}\n </button>\n ))}\n </div>\n )}\n\n {hasData && showChart && (\n <div className=\"px-3 py-2\">\n <Suspense fallback={ChartFallback}>\n <ResultChart headers={columns} rows={stringRows} dark={dark} detectionResult={chartResult} />\n </Suspense>\n </div>\n )}\n\n {hasData && showTable && <DataTable columns={columns} rows={rows} />}\n\n {!hasData && (\n <div className=\"px-3 py-2 text-xs text-zinc-500 dark:text-zinc-400\">\n Query returned 0 rows.\n </div>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2 px-3 py-2\">\n {sql && (\n <button\n onClick={() => setSqlOpen(!sqlOpen)}\n className=\"rounded border border-zinc-200 px-2 py-1.5 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n {sqlOpen ? \"Hide SQL\" : \"Show SQL\"}\n </button>\n )}\n {hasData && (\n <button\n onClick={() => downloadCSV(toCsvString(columns, rows))}\n className=\"inline-flex items-center gap-1.5 rounded border border-zinc-200 px-2 py-1.5 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n title=\"Download CSV\"\n >\n <FileDown className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">CSV</span>\n </button>\n )}\n {hasData && (\n <button\n onClick={() => { downloadExcel(columns, rows).catch((err) => { console.warn(\"Excel download failed:\", err); }); }}\n className=\"inline-flex items-center gap-1.5 rounded border border-zinc-200 px-2 py-1.5 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n title=\"Download Excel\"\n >\n <FileSpreadsheet className=\"size-3.5\" />\n <span className=\"hidden sm:inline\">Excel</span>\n </button>\n )}\n </div>\n {sqlOpen && sql && (\n <div className=\"px-3 pb-2\">\n <SQLBlock sql={sql} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ActionStatus } from \"../../lib/action-types\";\n\nconst STATUS_CONFIG: Record<ActionStatus, { label: string; classes: string }> = {\n pending_approval: {\n label: \"Pending Approval\",\n classes: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-600/20 dark:text-yellow-400\",\n },\n approved: {\n label: \"Approved\",\n classes: \"bg-green-100 text-green-700 dark:bg-green-600/20 dark:text-green-400\",\n },\n executed: {\n label: \"Executed\",\n classes: \"bg-green-100 text-green-700 dark:bg-green-600/20 dark:text-green-400\",\n },\n auto_approved: {\n label: \"Auto-approved\",\n classes: \"bg-green-100 text-green-700 dark:bg-green-600/20 dark:text-green-400\",\n },\n denied: {\n label: \"Denied\",\n classes: \"bg-red-100 text-red-700 dark:bg-red-600/20 dark:text-red-400\",\n },\n failed: {\n label: \"Failed\",\n classes: \"bg-red-100 text-red-700 dark:bg-red-600/20 dark:text-red-400\",\n },\n rolled_back: {\n label: \"Rolled Back\",\n classes: \"bg-zinc-100 text-zinc-700 dark:bg-zinc-600/20 dark:text-zinc-400\",\n },\n timed_out: {\n label: \"Timed Out\",\n classes: \"bg-zinc-100 text-zinc-700 dark:bg-zinc-600/20 dark:text-zinc-400\",\n },\n};\n\nexport function ActionStatusBadge({ status }: { status: ActionStatus }) {\n const config = STATUS_CONFIG[status] ?? {\n label: status.replace(/_/g, \" \"),\n classes: \"bg-zinc-100 text-zinc-700 dark:bg-zinc-600/20 dark:text-zinc-400\",\n };\n return (\n <span className={`rounded px-1.5 py-0.5 text-xs font-medium ${config.classes}`}>\n {config.label}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { getToolArgs, getToolResult, isToolComplete } from \"../../lib/helpers\";\nimport {\n isActionToolResult,\n RESOLVED_STATUSES,\n type ActionStatus,\n type ResolvedStatus,\n type ActionApprovalResponse,\n type ActionToolResultShape,\n} from \"../../lib/action-types\";\nimport { useAtlasConfig } from \"../../context\";\nimport { useActionAuth } from \"../../context\";\nimport { LoadingCard } from \"../chat/loading-card\";\nimport { ActionStatusBadge } from \"./action-status-badge\";\n\n/* ------------------------------------------------------------------ */\n/* Safe JSON.stringify helper */\n/* ------------------------------------------------------------------ */\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch (err) {\n console.warn(\"Could not serialize action details:\", err);\n return \"[Unable to display]\";\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Card state machine */\n/* ------------------------------------------------------------------ */\n\ntype CardState =\n | { phase: \"idle\" }\n | { phase: \"submitting\"; action: \"approve\" | \"deny\" }\n | { phase: \"resolved\"; status: ResolvedStatus; result?: unknown }\n | { phase: \"error\"; message: string };\n\n/* ------------------------------------------------------------------ */\n/* Border color by status */\n/* ------------------------------------------------------------------ */\n\nfunction borderColor(status: ActionStatus): string {\n switch (status) {\n case \"pending_approval\":\n return \"border-yellow-300 dark:border-yellow-900/50\";\n case \"approved\":\n case \"executed\":\n case \"auto_approved\":\n return \"border-green-300 dark:border-green-900/50\";\n case \"denied\":\n case \"failed\":\n return \"border-red-300 dark:border-red-900/50\";\n default:\n return \"border-zinc-200 dark:border-zinc-700\";\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function ActionApprovalCard({ part }: { part: unknown }) {\n const { apiUrl } = useAtlasConfig();\n const actionAuth = useActionAuth();\n const args = getToolArgs(part);\n const rawResult = getToolResult(part);\n const done = isToolComplete(part);\n\n const [cardState, setCardState] = useState<CardState>({ phase: \"idle\" });\n const [open, setOpen] = useState(false);\n const [denyReason, setDenyReason] = useState(\"\");\n const [showDenyInput, setShowDenyInput] = useState(false);\n\n if (!done) return <LoadingCard label=\"Requesting action approval...\" />;\n\n if (!isActionToolResult(rawResult)) {\n return (\n <div className=\"my-2 rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Action result (unexpected format)\n </div>\n );\n }\n\n const toolResult: ActionToolResultShape = rawResult;\n\n // Effective status: local optimistic update wins over server result\n const effectiveStatus: ActionStatus =\n cardState.phase === \"resolved\" ? cardState.status : toolResult.status;\n\n const isPending = effectiveStatus === \"pending_approval\" && cardState.phase !== \"submitting\";\n const isSubmitting = cardState.phase === \"submitting\";\n const resolvedResult = cardState.phase === \"resolved\" ? cardState.result : toolResult.result;\n\n /* ---------------------------------------------------------------- */\n /* API helpers */\n /* ---------------------------------------------------------------- */\n\n async function callAction(endpoint: \"approve\" | \"deny\", body?: Record<string, unknown>) {\n if (!actionAuth) {\n console.warn(\"ActionApprovalCard: No ActionAuthProvider found. API calls will be sent without authentication.\");\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(actionAuth?.getHeaders() ?? {}),\n };\n const credentials = actionAuth?.getCredentials() ?? \"same-origin\";\n\n const res = await fetch(\n `${apiUrl}/api/v1/actions/${toolResult.actionId}/${endpoint}`,\n {\n method: \"POST\",\n headers,\n credentials,\n body: body ? JSON.stringify(body) : undefined,\n },\n );\n\n if (res.status === 409) {\n // Already resolved — read current status from response\n let data: ActionApprovalResponse;\n try {\n data = (await res.json()) as ActionApprovalResponse;\n } catch {\n throw new Error(\"Action was already resolved, but the response could not be read. Refresh the page.\");\n }\n const status = typeof data.status === \"string\" ? data.status as ResolvedStatus : \"failed\" as ResolvedStatus;\n const label = status.replace(/_/g, \" \");\n throw new Error(`This action was already ${label} by another user or policy.`);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"Unknown error\");\n throw new Error(`Server responded ${res.status}: ${text}`);\n }\n\n let data: ActionApprovalResponse;\n try {\n data = (await res.json()) as ActionApprovalResponse;\n } catch {\n throw new Error(\"Action succeeded, but the response could not be read. Refresh the page.\");\n }\n if (typeof data.status !== \"string\") {\n throw new Error(\"Action succeeded, but the server returned an invalid status. Refresh the page.\");\n }\n setCardState({ phase: \"resolved\", status: data.status as ResolvedStatus, result: data.result });\n }\n\n async function handleApprove() {\n setCardState({ phase: \"submitting\", action: \"approve\" });\n try {\n await callAction(\"approve\");\n } catch (err) {\n console.error(\"Action approval failed:\", err);\n const message =\n err instanceof TypeError\n ? \"Network error — could not reach the server.\"\n : err instanceof Error\n ? err.message\n : String(err);\n setCardState({ phase: \"error\", message });\n }\n }\n\n async function handleDeny() {\n setCardState({ phase: \"submitting\", action: \"deny\" });\n try {\n await callAction(\"deny\", denyReason.trim() ? { reason: denyReason.trim() } : undefined);\n } catch (err) {\n console.error(\"Action approval failed:\", err);\n const message =\n err instanceof TypeError\n ? \"Network error — could not reach the server.\"\n : err instanceof Error\n ? err.message\n : String(err);\n setCardState({ phase: \"error\", message });\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Render */\n /* ---------------------------------------------------------------- */\n\n return (\n <div className={`my-2 overflow-hidden rounded-lg border ${borderColor(effectiveStatus)} bg-zinc-50 dark:bg-zinc-900`}>\n {/* Header */}\n <button\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs transition-colors hover:bg-zinc-100/60 dark:hover:bg-zinc-800/60\"\n >\n <ActionStatusBadge status={effectiveStatus} />\n <span className=\"flex-1 truncate text-zinc-500 dark:text-zinc-400\">\n {toolResult.summary ?? String(args.description ?? \"Action\")}\n </span>\n <span className=\"text-zinc-400 dark:text-zinc-600\">{open ? \"\\u25BE\" : \"\\u25B8\"}</span>\n </button>\n\n {/* Expanded details */}\n {open && (\n <div className=\"border-t border-zinc-100 px-3 py-2 dark:border-zinc-800\">\n {toolResult.details && (\n <pre className=\"mb-2 max-h-48 overflow-auto rounded bg-zinc-100 p-2 text-xs text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400\">\n {safeStringify(toolResult.details)}\n </pre>\n )}\n {resolvedResult != null && (\n <div className=\"mb-2 rounded bg-green-50 p-2 text-xs text-green-700 dark:bg-green-900/20 dark:text-green-400\">\n <span className=\"font-medium\">Result: </span>\n {typeof resolvedResult === \"string\"\n ? resolvedResult\n : safeStringify(resolvedResult)}\n </div>\n )}\n {toolResult.error && (\n <div className=\"mb-2 rounded bg-red-50 p-2 text-xs text-red-700 dark:bg-red-900/20 dark:text-red-400\">\n <span className=\"font-medium\">Error: </span>\n {toolResult.error}\n </div>\n )}\n {toolResult.reason && RESOLVED_STATUSES.has(effectiveStatus) && (\n <div className=\"mb-2 text-xs text-zinc-500 dark:text-zinc-400\">\n <span className=\"font-medium\">Reason: </span>\n {toolResult.reason}\n </div>\n )}\n </div>\n )}\n\n {/* Approval buttons — only when pending */}\n {(isPending || isSubmitting || cardState.phase === \"error\") && (\n <div className=\"border-t border-zinc-100 px-3 py-2 dark:border-zinc-800\">\n {cardState.phase === \"error\" && (\n <p className=\"mb-2 text-xs text-red-600 dark:text-red-400\">{cardState.message}</p>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleApprove}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-1.5 rounded bg-blue-600 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-blue-500 disabled:opacity-40\"\n >\n {isSubmitting && cardState.action === \"approve\" && (\n <span className=\"inline-block h-3 w-3 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n )}\n Approve\n </button>\n\n {!showDenyInput ? (\n <button\n onClick={() => setShowDenyInput(true)}\n disabled={isSubmitting}\n className=\"rounded border border-zinc-300 px-3 py-1.5 text-xs font-medium text-zinc-600 transition-colors hover:border-zinc-400 hover:text-zinc-800 disabled:opacity-40 dark:border-zinc-600 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n Deny\n </button>\n ) : (\n <div className=\"flex flex-1 items-center gap-2\">\n <input\n value={denyReason}\n onChange={(e) => setDenyReason(e.target.value)}\n placeholder=\"Reason (optional)\"\n className=\"flex-1 rounded border border-zinc-200 bg-white px-2 py-1 text-xs text-zinc-900 placeholder-zinc-400 outline-none focus:border-red-400 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder-zinc-600\"\n disabled={isSubmitting}\n />\n <button\n onClick={handleDeny}\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-1.5 rounded bg-red-600 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-red-500 disabled:opacity-40\"\n >\n {isSubmitting && cardState.action === \"deny\" && (\n <span className=\"inline-block h-3 w-3 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n )}\n Confirm Deny\n </button>\n <button\n onClick={() => {\n setShowDenyInput(false);\n setDenyReason(\"\");\n }}\n disabled={isSubmitting}\n className=\"text-xs text-zinc-400 hover:text-zinc-600 disabled:opacity-40 dark:hover:text-zinc-300\"\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { Component, type ReactNode, type ErrorInfo, useContext, useState } from \"react\";\nimport { getToolArgs, getToolResult, isToolComplete } from \"../../lib/helpers\";\nimport { DarkModeContext } from \"../../hooks/use-dark-mode\";\nimport { LoadingCard } from \"./loading-card\";\nimport { DataTable } from \"./data-table\";\nimport type { ChartDetectionResult, ChartType } from \"../chart/chart-detection\";\nimport { lazy, Suspense } from \"react\";\n\nconst ResultChart = lazy(() => import(\"../chart/result-chart\").then((m) => ({ default: m.ResultChart })));\n\ninterface RechartsChartConfig {\n type: ChartType;\n data: Record<string, unknown>[];\n categoryKey: string;\n valueKeys: string[];\n}\n\ninterface PythonChart {\n base64: string;\n mimeType: \"image/png\";\n}\n\nconst ALLOWED_IMAGE_MIME = new Set([\"image/png\", \"image/jpeg\"]);\n\n/* ------------------------------------------------------------------ */\n/* Error boundary */\n/* ------------------------------------------------------------------ */\n\nclass PythonErrorBoundary extends Component<\n { children: ReactNode },\n { hasError: boolean; error?: Error }\n> {\n constructor(props: { children: ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"PythonResultCard rendering failed:\", error, info.componentStack);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"my-2 rounded-lg border border-red-300 bg-red-50 px-3 py-2 text-xs text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-400\">\n Python result could not be rendered: {this.state.error?.message ?? \"unknown error\"}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Main component */\n/* ------------------------------------------------------------------ */\n\nexport function PythonResultCard({ part }: { part: unknown }) {\n return (\n <PythonErrorBoundary>\n <PythonResultCardInner part={part} />\n </PythonErrorBoundary>\n );\n}\n\nfunction PythonResultCardInner({ part }: { part: unknown }) {\n const dark = useContext(DarkModeContext);\n const args = getToolArgs(part);\n const raw = getToolResult(part);\n const done = isToolComplete(part);\n const [open, setOpen] = useState(true);\n\n if (!done) return <LoadingCard label=\"Running Python...\" />;\n\n // Structural validation — result must be a non-null object\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return (\n <div className=\"my-2 rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Python executed but returned an unexpected result format.\n </div>\n );\n }\n\n const result = raw as Record<string, unknown>;\n\n if (!result.success) {\n return (\n <div className=\"my-2 overflow-hidden rounded-lg border border-red-300 bg-red-50 dark:border-red-900/50 dark:bg-red-950/20\">\n <div className=\"px-3 py-2 text-xs font-medium text-red-700 dark:text-red-400\">\n Python execution failed\n </div>\n <pre className=\"border-t border-red-200 px-3 py-2 text-xs whitespace-pre-wrap text-red-600 dark:border-red-900/50 dark:text-red-300\">\n {String(result.error ?? \"Unknown error\")}\n </pre>\n {!!result.output && (\n <pre className=\"border-t border-red-200 px-3 py-2 text-xs whitespace-pre-wrap text-red-500 dark:border-red-900/50 dark:text-red-400\">\n {String(result.output)}\n </pre>\n )}\n </div>\n );\n }\n\n const output = result.output ? String(result.output) : null;\n const table = result.table as { columns: string[]; rows: unknown[][] } | undefined;\n const charts = Array.isArray(result.charts) ? (result.charts as PythonChart[]) : undefined;\n const rechartsCharts = Array.isArray(result.rechartsCharts) ? (result.rechartsCharts as RechartsChartConfig[]) : undefined;\n\n const hasTable = table && Array.isArray(table.columns) && Array.isArray(table.rows)\n && table.columns.length > 0 && table.rows.length > 0;\n const hasCharts = charts && charts.length > 0;\n const hasRechartsCharts = rechartsCharts && rechartsCharts.length > 0;\n\n // Filter charts to only safe image MIME types\n const safeCharts = hasCharts\n ? charts.filter((c) => c.base64 && ALLOWED_IMAGE_MIME.has(c.mimeType))\n : [];\n\n return (\n <div className=\"my-2 overflow-hidden rounded-lg border border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-xs transition-colors hover:bg-zinc-100/60 dark:hover:bg-zinc-800/60\"\n >\n <span className=\"rounded bg-emerald-100 px-1.5 py-0.5 font-medium text-emerald-700 dark:bg-emerald-600/20 dark:text-emerald-400\">\n Python\n </span>\n <span className=\"flex-1 truncate text-zinc-500 dark:text-zinc-400\">\n {String(args.explanation ?? \"Python result\")}\n </span>\n <span className=\"text-zinc-400 dark:text-zinc-600\">{open ? \"\\u25BE\" : \"\\u25B8\"}</span>\n </button>\n\n {open && (\n <div className=\"space-y-2 border-t border-zinc-100 px-3 py-2 dark:border-zinc-800\">\n {output && (\n <pre className=\"rounded-md bg-zinc-100 px-3 py-2 text-xs whitespace-pre-wrap text-zinc-700 dark:bg-zinc-800 dark:text-zinc-300\">\n {output}\n </pre>\n )}\n\n {hasTable && <DataTable columns={table.columns} rows={table.rows} />}\n\n {hasRechartsCharts &&\n rechartsCharts.map((chart, i) => (\n <RechartsChartSection key={i} chart={chart} dark={dark} />\n ))}\n\n {safeCharts.length > 0 &&\n safeCharts.map((chart, i) => (\n <ChartImage key={i} chart={chart} index={i} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart image with error handling */\n/* ------------------------------------------------------------------ */\n\nfunction ChartImage({ chart, index }: { chart: PythonChart; index: number }) {\n const [failed, setFailed] = useState(false);\n\n if (failed) {\n return (\n <div className=\"rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Chart {index + 1} failed to render.\n </div>\n );\n }\n\n return (\n // eslint-disable-next-line @next/next/no-img-element -- @useatlas/react is framework-agnostic\n <img\n src={`data:${chart.mimeType};base64,${chart.base64}`}\n alt={`Python chart ${index + 1}`}\n className=\"max-w-full rounded-lg border border-zinc-200 dark:border-zinc-700\"\n onError={() => setFailed(true)}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Recharts section — bypasses auto-detection with synthetic result */\n/* ------------------------------------------------------------------ */\n\nfunction RechartsChartSection({ chart, dark }: { chart: RechartsChartConfig; dark: boolean }) {\n if (!chart.categoryKey || !Array.isArray(chart.valueKeys) || !Array.isArray(chart.data)) {\n return (\n <div className=\"rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Chart data is incomplete or malformed.\n </div>\n );\n }\n\n const headers = [chart.categoryKey, ...chart.valueKeys];\n const rows: string[][] = chart.data.map((row) =>\n headers.map((key) => (row[key] == null ? \"\" : String(row[key]))),\n );\n\n // Build a synthetic detection result so ResultChart uses the backend's\n // chart config directly, bypassing auto-detection that might reject it.\n const detectionResult: ChartDetectionResult = {\n chartable: true,\n columns: headers.map((h, i) => ({\n header: h,\n type: i === 0 ? \"categorical\" as const : \"numeric\" as const,\n index: i,\n uniqueCount: i === 0 ? chart.data.length : 0,\n })),\n recommendations: [{\n type: chart.type,\n categoryColumn: { header: chart.categoryKey, type: \"categorical\" as const, index: 0, uniqueCount: chart.data.length },\n valueColumns: chart.valueKeys.map((k, i) => ({\n header: k,\n type: \"numeric\" as const,\n index: i + 1,\n uniqueCount: 0,\n })) as [{ header: string; type: \"numeric\"; index: number; uniqueCount: number }, ...{ header: string; type: \"numeric\"; index: number; uniqueCount: number }[]],\n reason: \"Python-generated chart\",\n }],\n data: chart.data.map((row) => {\n const out: Record<string, string | number> = {};\n for (const key of headers) {\n const val = row[key];\n out[key] = typeof val === \"number\" ? val : String(val ?? \"\");\n }\n return out;\n }),\n };\n\n return (\n <Suspense fallback={<div className=\"h-64 animate-pulse rounded-lg bg-zinc-100 dark:bg-zinc-800\" />}>\n <ResultChart headers={headers} rows={rows} dark={dark} detectionResult={detectionResult} />\n </Suspense>\n );\n}\n","\"use client\";\n\nimport { Component, memo, type ReactNode, type ErrorInfo } from \"react\";\nimport { getToolName } from \"ai\";\nimport { getToolArgs, getToolResult, isToolComplete } from \"../../lib/helpers\";\nimport { isActionToolResult } from \"../../lib/action-types\";\nimport { ExploreCard } from \"./explore-card\";\nimport { SQLResultCard } from \"./sql-result-card\";\nimport { ActionApprovalCard } from \"../actions/action-approval-card\";\nimport { PythonResultCard } from \"./python-result-card\";\nimport type { ToolRenderers } from \"../../lib/tool-renderer-types\";\n\nexport interface ToolPartProps {\n part: unknown;\n toolRenderers?: ToolRenderers;\n}\n\n/** Error boundary that catches rendering failures in custom tool renderers. */\nclass ToolRendererErrorBoundary extends Component<\n { toolName: string; children: ReactNode },\n { hasError: boolean; error?: Error }\n> {\n constructor(props: { toolName: string; children: ReactNode }) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\n `Custom renderer for tool \"${this.props.toolName}\" failed:`,\n error,\n info.componentStack,\n );\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"my-2 rounded-lg border border-red-300 bg-red-50 px-3 py-2 text-xs text-red-700 dark:border-red-900/50 dark:bg-red-950/20 dark:text-red-400\">\n Custom renderer for &ldquo;{this.props.toolName}&rdquo; failed: {this.state.error?.message ?? \"unknown error\"}\n </div>\n );\n }\n return this.props.children;\n }\n}\n\nexport const ToolPart = memo(function ToolPart({ part, toolRenderers }: ToolPartProps) {\n let name: string;\n try {\n name = getToolName(part as Parameters<typeof getToolName>[0]);\n } catch (err) {\n console.warn(\"Failed to determine tool name:\", err);\n return (\n <div className=\"my-2 rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Tool result (unknown type)\n </div>\n );\n }\n\n // Custom renderers take precedence over built-in defaults.\n // Note: this also overrides the ActionApprovalCard for action tools —\n // if you register a renderer for a tool that uses the action approval flow,\n // you are responsible for handling the approval UI yourself.\n const CustomRenderer = toolRenderers?.[name];\n if (CustomRenderer) {\n const args = getToolArgs(part);\n const result = getToolResult(part);\n const isLoading = !isToolComplete(part);\n return (\n <ToolRendererErrorBoundary toolName={name}>\n <CustomRenderer toolName={name} args={args} result={result} isLoading={isLoading} />\n </ToolRendererErrorBoundary>\n );\n }\n\n switch (name) {\n case \"explore\":\n return <ExploreCard part={part} />;\n case \"executeSQL\":\n return <SQLResultCard part={part} />;\n case \"executePython\":\n return <PythonResultCard part={part} />;\n default: {\n const result = getToolResult(part);\n if (isActionToolResult(result)) {\n return <ActionApprovalCard part={part} />;\n }\n return (\n <div className=\"my-2 rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2 text-xs text-zinc-500 dark:border-zinc-700 dark:bg-zinc-900\">\n Tool: {name}\n </div>\n );\n }\n }\n}, (prev, next) => {\n // Once a tool part is complete, its output won't change — skip re-renders.\n // This prevents the Recharts render tree from contributing to React's update depth limit.\n // Also check toolRenderers identity so swapping renderers at runtime triggers a re-render.\n if (isToolComplete(prev.part) && isToolComplete(next.part) && prev.toolRenderers === next.toolRenderers) return true;\n return false;\n});\n","\"use client\";\n\nimport { memo, useContext, useState, useEffect, type ReactNode } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { DarkModeContext } from \"../../hooks/use-dark-mode\";\n\n/* ------------------------------------------------------------------ */\n/* Lazy-loaded syntax highlighter (~300KB) */\n/* ------------------------------------------------------------------ */\n\ntype SyntaxHighlighterModule = typeof import(\"react-syntax-highlighter\");\ntype StyleModule = typeof import(\"react-syntax-highlighter/dist/esm/styles/prism\");\n\nlet _highlighterCache: { Prism: SyntaxHighlighterModule[\"Prism\"]; oneDark: StyleModule[\"oneDark\"]; oneLight: StyleModule[\"oneLight\"] } | null = null;\nlet _loadFailed = false;\n\nfunction LazyCodeBlock({ language, dark, children }: { language: string; dark: boolean; children: string }) {\n const [mod, setMod] = useState(_highlighterCache);\n\n useEffect(() => {\n if (_highlighterCache || _loadFailed) return;\n Promise.all([\n import(\"react-syntax-highlighter\"),\n import(\"react-syntax-highlighter/dist/esm/styles/prism\"),\n ]).then(([sh, styles]) => {\n _highlighterCache = { Prism: sh.Prism, oneDark: styles.oneDark, oneLight: styles.oneLight };\n setMod(_highlighterCache);\n }).catch((err) => {\n console.warn(\"Syntax highlighter failed to load — code blocks will use plain text:\", err);\n _loadFailed = true;\n });\n }, []);\n\n if (!mod) {\n return (\n <pre className=\"my-2 overflow-x-auto rounded-lg bg-zinc-100 p-3 text-xs dark:bg-zinc-800\">\n <code>{children}</code>\n </pre>\n );\n }\n\n return (\n <mod.Prism\n language={language}\n style={dark ? mod.oneDark : mod.oneLight}\n customStyle={CODE_BLOCK_STYLE}\n >\n {children}\n </mod.Prism>\n );\n}\n\nconst CODE_BLOCK_STYLE = {\n margin: \"0.5rem 0\",\n borderRadius: \"0.5rem\",\n fontSize: \"0.75rem\",\n} as const;\n\n/* ------------------------------------------------------------------ */\n/* Static markdown renderers — hoisted outside component */\n/* ------------------------------------------------------------------ */\n\nconst mdComponents = {\n p: ({ children }: { children?: ReactNode }) => (\n <p className=\"mb-3 leading-relaxed last:mb-0\">{children}</p>\n ),\n h1: ({ children }: { children?: ReactNode }) => (\n <h1 className=\"mb-2 mt-4 text-lg font-bold first:mt-0\">{children}</h1>\n ),\n h2: ({ children }: { children?: ReactNode }) => (\n <h2 className=\"mb-2 mt-3 text-base font-semibold first:mt-0\">{children}</h2>\n ),\n h3: ({ children }: { children?: ReactNode }) => (\n <h3 className=\"mb-1 mt-2 font-semibold first:mt-0\">{children}</h3>\n ),\n ul: ({ children }: { children?: ReactNode }) => (\n <ul className=\"mb-3 list-disc space-y-1 pl-4\">{children}</ul>\n ),\n ol: ({ children }: { children?: ReactNode }) => (\n <ol className=\"mb-3 list-decimal space-y-1 pl-4\">{children}</ol>\n ),\n strong: ({ children }: { children?: ReactNode }) => (\n <strong className=\"font-semibold text-zinc-900 dark:text-zinc-50\">{children}</strong>\n ),\n blockquote: ({ children }: { children?: ReactNode }) => (\n <blockquote className=\"my-2 border-l-2 border-zinc-300 pl-3 text-zinc-500 dark:border-zinc-600 dark:text-zinc-400\">\n {children}\n </blockquote>\n ),\n table: ({ children }: { children?: ReactNode }) => (\n <div className=\"my-3 overflow-x-auto rounded-lg border border-zinc-200 dark:border-zinc-700\">\n <table className=\"min-w-full text-sm\">{children}</table>\n </div>\n ),\n thead: ({ children }: { children?: ReactNode }) => (\n <thead className=\"border-b border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-800/50\">\n {children}\n </thead>\n ),\n tbody: ({ children }: { children?: ReactNode }) => (\n <tbody className=\"divide-y divide-zinc-100 dark:divide-zinc-800\">{children}</tbody>\n ),\n tr: ({ children }: { children?: ReactNode }) => <tr>{children}</tr>,\n th: ({ children }: { children?: ReactNode }) => (\n <th className=\"px-3 py-2 text-left text-xs font-medium text-zinc-600 dark:text-zinc-300\">\n {children}\n </th>\n ),\n td: ({ children }: { children?: ReactNode }) => (\n <td className=\"px-3 py-2 text-zinc-700 dark:text-zinc-300\">{children}</td>\n ),\n pre: ({ children }: { children?: ReactNode }) => <>{children}</>,\n};\n\nexport const Markdown = memo(function Markdown({ content }: { content: string }) {\n const dark = useContext(DarkModeContext);\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n ...mdComponents,\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n if (match) {\n return (\n <LazyCodeBlock language={match[1]} dark={dark}>\n {String(children).replace(/\\n$/, \"\")}\n </LazyCodeBlock>\n );\n }\n return (\n <code\n className=\"rounded bg-zinc-200/50 px-1.5 py-0.5 text-xs text-zinc-800 dark:bg-zinc-700/50 dark:text-zinc-200\"\n {...props}\n >\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n );\n});\n","export const STARTER_PROMPTS = [\n \"What are the top 10 companies by revenue?\",\n \"Show me the distribution of account types\",\n \"What is the headcount breakdown by department?\",\n \"What is total MRR by plan type?\",\n];\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\n\nexport function FollowUpChips({\n suggestions,\n onSelect,\n}: {\n suggestions: string[];\n onSelect: (text: string) => void;\n}) {\n if (suggestions.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap gap-2 pt-1\">\n {suggestions.map((s, i) => (\n <Button\n key={`${i}-${s}`}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-auto rounded-full px-3 py-1.5 text-xs font-normal text-zinc-600 dark:text-zinc-400\"\n onClick={() => onSelect(s)}\n >\n {s}\n </Button>\n ))}\n </div>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Toggle as TogglePrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-2\",\n sm: \"h-8 min-w-8 px-1.5\",\n lg: \"h-10 min-w-10 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { type VariantProps } from \"class-variance-authority\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { toggleVariants } from \"./toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, spacing }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n \"w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10\",\n \"data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l\",\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90\",\n outline:\n \"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n ghost: \"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 [a&]:hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\";\n\nexport function DeleteConfirmation({\n onConfirm,\n onCancel,\n}: {\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 text-xs\">\n <span className=\"text-zinc-500 dark:text-zinc-400\">Delete?</span>\n <button\n onClick={onCancel}\n className=\"rounded px-2 py-0.5 text-zinc-500 transition-colors hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200\"\n >\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"rounded bg-red-600 px-2 py-0.5 text-white transition-colors hover:bg-red-500\"\n >\n Delete\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Star, Trash2 } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport type { Conversation } from \"../../lib/types\";\nimport { DeleteConfirmation } from \"./delete-confirmation\";\n\nfunction relativeTime(dateStr: string): string {\n const then = new Date(dateStr).getTime();\n if (isNaN(then)) return \"\";\n const now = Date.now();\n const diff = now - then;\n\n const minutes = Math.floor(diff / 60_000);\n if (minutes < 1) return \"just now\";\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n return new Date(dateStr).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n}\n\nexport function ConversationItem({\n conversation,\n isActive,\n onSelect,\n onDelete,\n onStar,\n}: {\n conversation: Conversation;\n isActive: boolean;\n onSelect: () => void;\n onDelete: () => Promise<boolean>;\n onStar: (starred: boolean) => Promise<boolean>;\n}) {\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [starPending, setStarPending] = useState(false);\n\n if (confirmDelete) {\n return (\n <div className=\"rounded-lg border border-red-200 bg-red-50/50 dark:border-red-900/30 dark:bg-red-950/10\">\n <DeleteConfirmation\n onCancel={() => setConfirmDelete(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n const success = await onDelete();\n if (success) {\n setConfirmDelete(false);\n }\n } catch (err) {\n console.warn(\"Failed to delete conversation:\", err);\n } finally {\n setDeleting(false);\n }\n }}\n />\n </div>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect();\n }\n }}\n className={`group flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left text-sm transition-colors ${\n isActive\n ? \"bg-blue-50 text-blue-700 dark:bg-blue-600/10 dark:text-blue-400\"\n : \"text-zinc-700 hover:bg-zinc-100 dark:text-zinc-300 dark:hover:bg-zinc-800\"\n }`}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {conversation.title || \"New conversation\"}\n </p>\n <p className=\"text-xs text-zinc-400 dark:text-zinc-500\">\n {relativeTime(conversation.updatedAt)}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={async (e) => {\n e.stopPropagation();\n if (starPending) return;\n setStarPending(true);\n try {\n await onStar(!conversation.starred);\n } catch (err) {\n console.warn(\"Failed to update star:\", err);\n } finally {\n setStarPending(false);\n }\n }}\n disabled={starPending}\n className={`size-8 transition-all ${\n conversation.starred\n ? \"text-amber-400 opacity-100 hover:text-amber-500 dark:text-amber-400 dark:hover:text-amber-300\"\n : \"text-zinc-400 opacity-0 hover:text-amber-400 group-hover:opacity-100 dark:hover:text-amber-400\"\n } ${starPending ? \"opacity-50\" : \"\"}`}\n aria-label={conversation.starred ? \"Unstar conversation\" : \"Star conversation\"}\n >\n <Star className=\"h-3.5 w-3.5\" fill={conversation.starred ? \"currentColor\" : \"none\"} />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDelete(true);\n }}\n disabled={deleting}\n className=\"size-8 shrink-0 text-zinc-400 opacity-0 transition-all hover:bg-red-50 hover:text-red-500 group-hover:opacity-100 dark:hover:bg-red-950/20 dark:hover:text-red-400\"\n aria-label=\"Delete conversation\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { Conversation } from \"../../lib/types\";\nimport { ConversationItem } from \"./conversation-item\";\n\nexport function ConversationList({\n conversations,\n selectedId,\n onSelect,\n onDelete,\n onStar,\n showSections = true,\n emptyMessage,\n}: {\n conversations: Conversation[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onDelete: (id: string) => Promise<boolean>;\n onStar: (id: string, starred: boolean) => Promise<boolean>;\n showSections?: boolean;\n emptyMessage?: string;\n}) {\n if (conversations.length === 0) {\n return (\n <div className=\"px-3 py-6 text-center text-xs text-zinc-400 dark:text-zinc-500\">\n {emptyMessage ?? \"No conversations yet\"}\n </div>\n );\n }\n\n function renderItems(items: Conversation[]) {\n return items.map((c) => (\n <ConversationItem\n key={c.id}\n conversation={c}\n isActive={c.id === selectedId}\n onSelect={() => onSelect(c.id)}\n onDelete={() => onDelete(c.id)}\n onStar={(s) => onStar(c.id, s)}\n />\n ));\n }\n\n if (!showSections) {\n return <div className=\"space-y-1\">{renderItems(conversations)}</div>;\n }\n\n const starred = conversations.filter((c) => c.starred);\n const unstarred = conversations.filter((c) => !c.starred);\n\n return (\n <div className=\"space-y-1\">\n {starred.length > 0 && (\n <>\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wider text-zinc-400 dark:text-zinc-500\">\n Starred\n </div>\n {renderItems(starred)}\n {unstarred.length > 0 && (\n <div className=\"px-3 pb-1 pt-3 text-[10px] font-semibold uppercase tracking-wider text-zinc-400 dark:text-zinc-500\">\n Recent\n </div>\n )}\n </>\n )}\n {renderItems(unstarred)}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport { Badge } from \"../ui/badge\";\nimport type { Conversation } from \"../../lib/types\";\nimport { ConversationList } from \"./conversation-list\";\n\ntype SidebarFilter = \"all\" | \"saved\";\n\nexport function ConversationSidebar({\n conversations,\n selectedId,\n loading,\n onSelect,\n onDelete,\n onStar,\n onNewChat,\n mobileOpen,\n onMobileClose,\n}: {\n conversations: Conversation[];\n selectedId: string | null;\n loading: boolean;\n onSelect: (id: string) => void;\n onDelete: (id: string) => Promise<boolean>;\n onStar: (id: string, starred: boolean) => Promise<boolean>;\n onNewChat: () => void;\n mobileOpen: boolean;\n onMobileClose: () => void;\n}) {\n const [filter, setFilter] = useState<SidebarFilter>(\"all\");\n const starredConversations = conversations.filter((c) => c.starred);\n const filteredConversations = filter === \"saved\" ? starredConversations : conversations;\n\n const sidebar = (\n <div className=\"flex h-full flex-col border-r border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-950\">\n <div className=\"flex items-center justify-between border-b border-zinc-200 px-3 py-3 dark:border-zinc-800\">\n <span className=\"text-sm font-medium text-zinc-700 dark:text-zinc-300\">History</span>\n <button\n onClick={onNewChat}\n className=\"rounded-lg border border-zinc-200 px-3 py-1.5 text-xs font-medium text-zinc-600 transition-colors hover:border-zinc-400 hover:text-zinc-900 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n + New\n </button>\n </div>\n\n <div className=\"border-b border-zinc-200 px-3 py-2 dark:border-zinc-800\">\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n value={filter}\n onValueChange={(val) => { if (val) setFilter(val as SidebarFilter); }}\n className=\"gap-1\"\n >\n <ToggleGroupItem value=\"all\" className=\"px-2.5 text-xs\">\n All\n </ToggleGroupItem>\n <ToggleGroupItem value=\"saved\" className=\"gap-1.5 px-2.5 text-xs\">\n <Star className=\"h-3 w-3\" fill={filter === \"saved\" ? \"currentColor\" : \"none\"} />\n Saved\n {starredConversations.length > 0 && (\n <Badge variant=\"secondary\" className=\"h-4 px-1.5 text-[10px] font-semibold\">\n {starredConversations.length}\n </Badge>\n )}\n </ToggleGroupItem>\n </ToggleGroup>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n {loading && conversations.length === 0 ? (\n <div className=\"flex items-center justify-center py-8\">\n <span className=\"inline-block h-4 w-4 animate-spin rounded-full border-2 border-zinc-300 border-t-zinc-600 dark:border-zinc-600 dark:border-t-zinc-300\" />\n </div>\n ) : (\n <ConversationList\n conversations={filteredConversations}\n selectedId={selectedId}\n onSelect={onSelect}\n onDelete={onDelete}\n onStar={onStar}\n showSections={filter === \"all\"}\n emptyMessage={filter === \"saved\" ? \"Star conversations to save them here\" : undefined}\n />\n )}\n </div>\n </div>\n );\n\n return (\n <>\n {/* Desktop sidebar */}\n <div className=\"hidden w-[280px] shrink-0 md:block\">\n {sidebar}\n </div>\n\n {/* Mobile overlay */}\n {mobileOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40 bg-black/30 md:hidden\"\n onClick={onMobileClose}\n />\n <div className=\"fixed inset-y-0 left-0 z-50 w-[280px] md:hidden\">\n {sidebar}\n </div>\n </>\n )}\n </>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-16 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30\",\n \"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"../ui/alert-dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { useAtlasConfig } from \"../../context\";\n\nexport function ChangePasswordDialog({\n open,\n onComplete,\n}: {\n open: boolean;\n onComplete: () => void;\n}) {\n const { apiUrl, isCrossOrigin } = useAtlasConfig();\n const credentials: RequestCredentials = isCrossOrigin ? \"include\" : \"same-origin\";\n\n const [currentPassword, setCurrentPassword] = useState(\"atlas-dev\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(false);\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n setError(\"\");\n\n if (newPassword.length < 8) {\n setError(\"Password must be at least 8 characters.\");\n return;\n }\n if (newPassword !== confirmPassword) {\n setError(\"Passwords do not match.\");\n return;\n }\n if (newPassword === currentPassword) {\n setError(\"New password must be different from current password.\");\n return;\n }\n\n setLoading(true);\n try {\n const res = await fetch(`${apiUrl}/api/v1/admin/me/password`, {\n method: \"POST\",\n credentials,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ currentPassword, newPassword }),\n });\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n setError(data.message ?? `Failed (HTTP ${res.status})`);\n return;\n }\n\n onComplete();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to change password\");\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <AlertDialog open={open}>\n <AlertDialogContent className=\"sm:max-w-md\" onEscapeKeyDown={(e) => e.preventDefault()}>\n <form onSubmit={handleSubmit}>\n <AlertDialogHeader>\n <AlertDialogTitle>Change your password</AlertDialogTitle>\n <AlertDialogDescription>\n You&apos;re using the default dev password. Please set a new password to continue.\n </AlertDialogDescription>\n </AlertDialogHeader>\n\n <div className=\"space-y-3 py-4\">\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">Current password</label>\n <Input\n type=\"password\"\n value={currentPassword}\n onChange={(e) => setCurrentPassword(e.target.value)}\n required\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">New password</label>\n <Input\n type=\"password\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n required\n minLength={8}\n placeholder=\"At least 8 characters\"\n />\n </div>\n <div className=\"space-y-1\">\n <label className=\"text-xs font-medium text-muted-foreground\">Confirm new password</label>\n <Input\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n required\n minLength={8}\n />\n </div>\n {error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">{error}</p>\n )}\n </div>\n\n <AlertDialogFooter>\n <Button type=\"submit\" disabled={loading}>\n {loading ? \"Changing...\" : \"Change password\"}\n </Button>\n </AlertDialogFooter>\n </form>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n viewportRef,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewportRef?: React.Ref<HTMLDivElement>\n}) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","\"use client\";\n\nimport { useEffect, useState, useRef } from \"react\";\nimport { useAtlasConfig } from \"../../context\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n} from \"../ui/sheet\";\nimport { Input } from \"../ui/input\";\nimport { Badge } from \"../ui/badge\";\nimport { ScrollArea } from \"../ui/scroll-area\";\nimport { Separator } from \"../ui/separator\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\";\nimport { Button } from \"../ui/button\";\nimport { Card, CardContent } from \"../ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\";\nimport {\n Search,\n ArrowLeft,\n ArrowRight,\n TableProperties,\n Eye,\n Columns3,\n Link2,\n Sparkles,\n} from \"lucide-react\";\nimport type {\n SemanticEntitySummary,\n SemanticEntityDetail,\n Dimension,\n Join,\n Measure,\n QueryPattern,\n} from \"../../lib/types\";\nimport { normalizeList } from \"../../lib/helpers\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ntype TypeFilter = \"all\" | \"table\" | \"view\";\n\n/** Parse a server error response, extracting the message field if present. */\nasync function parseErrorResponse(r: Response): Promise<string> {\n try {\n const body = await r.json();\n if (typeof body?.message === \"string\") return body.message;\n } catch (err) {\n console.warn(\"Could not parse error response body as JSON:\", err);\n }\n return `HTTP ${r.status}`;\n}\n\n// ---------------------------------------------------------------------------\n// Entity list\n// ---------------------------------------------------------------------------\n\nfunction EntityList({\n entities,\n search,\n onSearchChange,\n typeFilter,\n onTypeFilterChange,\n onSelect,\n}: {\n entities: SemanticEntitySummary[];\n search: string;\n onSearchChange: (v: string) => void;\n typeFilter: TypeFilter;\n onTypeFilterChange: (v: TypeFilter) => void;\n onSelect: (name: string) => void;\n}) {\n const filtered = entities.filter((e) => {\n const matchesSearch =\n !search ||\n e.table.toLowerCase().includes(search.toLowerCase()) ||\n e.description.toLowerCase().includes(search.toLowerCase());\n const matchesType =\n typeFilter === \"all\" ||\n (typeFilter === \"view\" ? e.type === \"view\" : e.type !== \"view\");\n return matchesSearch && matchesType;\n });\n\n const tableCount = entities.filter((e) => e.type !== \"view\").length;\n const viewCount = entities.filter((e) => e.type === \"view\").length;\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"space-y-3 px-4 pb-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-zinc-400\" />\n <Input\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search tables...\"\n className=\"h-8 pl-8 text-sm\"\n />\n </div>\n {viewCount > 0 && (\n <ToggleGroup\n type=\"single\"\n size=\"sm\"\n value={typeFilter}\n onValueChange={(v) => { if (v) onTypeFilterChange(v as TypeFilter); }}\n className=\"justify-start\"\n >\n <ToggleGroupItem value=\"all\" className=\"h-6 px-2 text-xs\">\n All ({entities.length})\n </ToggleGroupItem>\n <ToggleGroupItem value=\"table\" className=\"h-6 px-2 text-xs\">\n Tables ({tableCount})\n </ToggleGroupItem>\n <ToggleGroupItem value=\"view\" className=\"h-6 px-2 text-xs\">\n Views ({viewCount})\n </ToggleGroupItem>\n </ToggleGroup>\n )}\n </div>\n\n <Separator />\n\n <div className=\"flex-1 overflow-y-auto overflow-x-hidden p-2\">\n {filtered.length === 0 ? (\n <p className=\"px-2 py-8 text-center text-xs text-zinc-400 dark:text-zinc-500\">\n {search ? \"No matching entities\" : \"No entities found\"}\n </p>\n ) : (\n filtered.map((entity) => (\n <button\n key={entity.table}\n onClick={() => onSelect(entity.table)}\n className=\"flex w-full min-w-0 items-start gap-2 overflow-hidden rounded-md px-2 py-2 text-left transition-colors hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n {entity.type === \"view\" ? (\n <Eye className=\"mt-0.5 size-3.5 shrink-0 text-zinc-400\" />\n ) : (\n <TableProperties className=\"mt-0.5 size-3.5 shrink-0 text-zinc-400\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"truncate text-sm font-medium text-zinc-800 dark:text-zinc-200\">\n {entity.table}\n </span>\n {entity.type === \"view\" && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] px-1 py-0\">\n view\n </Badge>\n )}\n </div>\n {entity.description && (\n <p className=\"mt-0.5 truncate text-xs text-zinc-500 dark:text-zinc-400\">\n {entity.description}\n </p>\n )}\n <div className=\"mt-1 flex gap-2 text-[10px] text-zinc-400 dark:text-zinc-500\">\n <span>{entity.columnCount} cols</span>\n {entity.joinCount > 0 && <span>{entity.joinCount} joins</span>}\n </div>\n </div>\n <ArrowRight className=\"mt-1 size-3 shrink-0 text-zinc-300 dark:text-zinc-600\" />\n </button>\n ))\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Entity detail\n// ---------------------------------------------------------------------------\n\nfunction EntityDetailView({\n entity,\n onBack,\n onNavigateEntity,\n onInsertQuery,\n}: {\n entity: SemanticEntityDetail;\n onBack: () => void;\n onNavigateEntity: (name: string) => void;\n onInsertQuery: (description: string) => void;\n}) {\n const dimensions = normalizeList(entity.dimensions, \"name\") as Dimension[];\n const joins = normalizeList(entity.joins, \"to\") as Join[];\n const measures = normalizeList(entity.measures, \"name\") as Measure[];\n const patterns = normalizeList(entity.query_patterns, \"name\") as QueryPattern[];\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center gap-2 px-4 pb-3\">\n <Button variant=\"ghost\" size=\"icon\" className=\"size-7\" onClick={onBack}>\n <ArrowLeft className=\"size-3.5\" />\n </Button>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <h3 className=\"truncate text-sm font-semibold\">{entity.table}</h3>\n {entity.type === \"view\" && (\n <Badge variant=\"outline\" className=\"text-[10px]\">view</Badge>\n )}\n </div>\n </div>\n </div>\n\n <Separator />\n\n <ScrollArea className=\"flex-1\">\n <div className=\"space-y-5 p-4\">\n {entity.description && (\n <p className=\"text-xs text-zinc-500 dark:text-zinc-400\">{entity.description}</p>\n )}\n\n {/* Columns */}\n <section>\n <h4 className=\"mb-2 flex items-center gap-1.5 text-xs font-semibold text-zinc-700 dark:text-zinc-300\">\n <Columns3 className=\"size-3\" />\n Columns ({dimensions.length})\n </h4>\n <div className=\"rounded-md border\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"h-7 w-[30%] text-[10px]\">Name</TableHead>\n <TableHead className=\"h-7 w-[15%] text-[10px]\">Type</TableHead>\n <TableHead className=\"h-7 w-[35%] text-[10px] hidden sm:table-cell\">Description</TableHead>\n <TableHead className=\"h-7 w-[20%] text-[10px] hidden sm:table-cell\">Samples</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {dimensions.map((dim) => (\n <TableRow key={dim.name}>\n <TableCell className=\"py-1.5 font-mono text-[11px]\">\n <span className=\"flex items-center gap-1\">\n <span className=\"truncate\">{dim.name}</span>\n {dim.primary_key && (\n <Badge className=\"shrink-0 bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400 text-[9px] px-1 py-0\">\n PK\n </Badge>\n )}\n {dim.foreign_key && (\n <Badge className=\"shrink-0 bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400 text-[9px] px-1 py-0\">\n FK\n </Badge>\n )}\n </span>\n </TableCell>\n <TableCell className=\"py-1.5\">\n <Badge variant=\"secondary\" className=\"font-mono text-[9px]\">\n {dim.type}\n </Badge>\n </TableCell>\n <TableCell className=\"hidden py-1.5 text-[11px] text-zinc-500 sm:table-cell\">\n <span className=\"line-clamp-2\">{dim.description || \"—\"}</span>\n </TableCell>\n <TableCell className=\"hidden py-1.5 text-[11px] text-zinc-400 sm:table-cell\">\n <span className=\"line-clamp-1\">\n {dim.sample_values?.length\n ? dim.sample_values.slice(0, 3).join(\", \")\n : \"—\"}\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </section>\n\n {/* Joins */}\n {joins.length > 0 && (\n <section>\n <h4 className=\"mb-2 flex items-center gap-1.5 text-xs font-semibold text-zinc-700 dark:text-zinc-300\">\n <Link2 className=\"size-3\" />\n Relationships ({joins.length})\n </h4>\n <div className=\"space-y-1.5\">\n {joins.map((join, i) => (\n <Card key={i} className=\"shadow-none\">\n <CardContent className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"shrink-0 text-[9px]\">\n {join.relationship || \"many_to_one\"}\n </Badge>\n <button\n onClick={() => onNavigateEntity(join.to)}\n className=\"text-xs font-medium text-blue-600 hover:underline dark:text-blue-400\"\n >\n {join.to}\n </button>\n </div>\n {join.description && (\n <p className=\"mt-1 text-[11px] text-zinc-500\">{join.description}</p>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n </section>\n )}\n\n {/* Measures */}\n {measures.length > 0 && (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold text-zinc-700 dark:text-zinc-300\">\n Measures ({measures.length})\n </h4>\n <div className=\"space-y-1\">\n {measures.map((m) => (\n <div key={m.name} className=\"flex items-center gap-2 rounded px-2 py-1 text-xs\">\n <span className=\"font-medium text-zinc-700 dark:text-zinc-300\">{m.name}</span>\n <code className=\"rounded bg-zinc-100 px-1.5 py-0.5 text-[10px] text-zinc-500 dark:bg-zinc-800\">\n {m.sql}\n </code>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Query patterns */}\n {patterns.length > 0 && (\n <section>\n <h4 className=\"mb-2 flex items-center gap-1.5 text-xs font-semibold text-zinc-700 dark:text-zinc-300\">\n <Sparkles className=\"size-3\" />\n Query Patterns\n </h4>\n <div className=\"space-y-1.5\">\n {patterns.map((p, i) => (\n <button\n key={`${p.name}-${i}`}\n onClick={() => onInsertQuery(p.description)}\n className=\"w-full rounded-md border border-zinc-200 bg-zinc-50 px-3 py-2 text-left transition-colors hover:border-zinc-400 hover:bg-zinc-100 dark:border-zinc-700 dark:bg-zinc-900 dark:hover:border-zinc-500 dark:hover:bg-zinc-800\"\n >\n <p className=\"text-xs font-medium text-zinc-700 dark:text-zinc-300\">{p.name}</p>\n <p className=\"mt-0.5 text-[11px] text-zinc-500 dark:text-zinc-400\">{p.description}</p>\n </button>\n ))}\n </div>\n </section>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main schema explorer panel\n// ---------------------------------------------------------------------------\n\nexport function SchemaExplorer({\n open,\n onOpenChange,\n onInsertQuery,\n getHeaders,\n getCredentials,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onInsertQuery: (text: string) => void;\n getHeaders: () => Record<string, string>;\n getCredentials: () => RequestCredentials;\n}) {\n const { apiUrl } = useAtlasConfig();\n const [entities, setEntities] = useState<SemanticEntitySummary[]>([]);\n const [selectedEntity, setSelectedEntity] = useState<SemanticEntityDetail | null>(null);\n const [selectedName, setSelectedName] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [detailError, setDetailError] = useState<string | null>(null);\n const [search, setSearch] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<TypeFilter>(\"all\");\n const abortRef = useRef<AbortController | null>(null);\n\n // Fetch entity list when the sheet opens (or when API config changes)\n useEffect(() => {\n if (!open) return;\n\n // Reset to list view on every open — prevents stale detail view on reopen\n setSelectedName(null);\n setSelectedEntity(null);\n setDetailError(null);\n abortRef.current?.abort();\n\n setLoading(true);\n setError(null);\n\n const controller = new AbortController();\n fetch(`${apiUrl}/api/v1/semantic/entities`, {\n headers: getHeaders(),\n credentials: getCredentials(),\n signal: controller.signal,\n })\n .then(async (r) => {\n if (!r.ok) throw new Error(await parseErrorResponse(r));\n return r.json();\n })\n .then((data) => {\n const list = Array.isArray(data?.entities) ? data.entities : [];\n setEntities(list);\n })\n .catch((err) => {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n console.warn(\"Schema explorer: failed to fetch entities:\", err);\n setError(err instanceof Error ? err.message : \"Failed to load schema\");\n })\n .finally(() => setLoading(false));\n\n return () => controller.abort();\n }, [open, apiUrl, getHeaders, getCredentials]);\n\n function handleSelectEntity(name: string) {\n // Cancel any in-flight detail request\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setSelectedName(name);\n setSelectedEntity(null);\n setDetailError(null);\n\n fetch(`${apiUrl}/api/v1/semantic/entities/${encodeURIComponent(name)}`, {\n headers: getHeaders(),\n credentials: getCredentials(),\n signal: controller.signal,\n })\n .then(async (r) => {\n if (!r.ok) throw new Error(await parseErrorResponse(r));\n return r.json();\n })\n .then((data) => {\n setSelectedEntity(data?.entity ?? data);\n })\n .catch((err) => {\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n console.warn(\"Schema explorer: failed to load entity:\", err);\n setDetailError(err instanceof Error ? err.message : \"Failed to load entity\");\n });\n }\n\n function handleBack() {\n abortRef.current?.abort();\n setSelectedName(null);\n setSelectedEntity(null);\n setDetailError(null);\n }\n\n function handleInsertQuery(description: string) {\n onInsertQuery(description);\n onOpenChange(false);\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"flex w-full flex-col p-0 sm:max-w-xl\">\n <SheetHeader className=\"px-4 pt-4\">\n <SheetTitle className=\"flex items-center gap-2 text-base\">\n <TableProperties className=\"size-4\" />\n Schema Explorer\n </SheetTitle>\n </SheetHeader>\n\n <Separator className=\"mt-3\" />\n\n <div className=\"flex-1 overflow-hidden pt-3\">\n {loading ? (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-xs text-zinc-400\">Loading schema...</p>\n </div>\n ) : error ? (\n <div className=\"flex h-full items-center justify-center px-4\">\n <p className=\"text-center text-xs text-red-500\">{error}</p>\n </div>\n ) : selectedName ? (\n detailError ? (\n <div className=\"flex h-full flex-col items-center justify-center gap-2 px-4\">\n <p className=\"text-center text-xs text-red-500\">{detailError}</p>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleBack} className=\"text-xs\">\n <ArrowLeft className=\"mr-1 size-3\" /> Back to list\n </Button>\n </div>\n ) : selectedEntity ? (\n <EntityDetailView\n entity={selectedEntity}\n onBack={handleBack}\n onNavigateEntity={handleSelectEntity}\n onInsertQuery={handleInsertQuery}\n />\n ) : (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-xs text-zinc-400\">Loading {selectedName}...</p>\n </div>\n )\n ) : (\n <EntityList\n entities={entities}\n search={search}\n onSearchChange={setSearch}\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n onSelect={handleSelectEntity}\n />\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\";\n\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, isToolUIPart } from \"ai\";\nimport { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport { AUTH_MODES, type AuthMode } from \"../lib/types\";\nimport type { ToolRenderers } from \"../lib/tool-renderer-types\";\nimport { AtlasUIProvider, useAtlasConfig, ActionAuthProvider, type AtlasAuthClient } from \"../context\";\nimport { DarkModeContext, useDarkMode, useThemeMode, setTheme, applyBrandColor, OKLCH_RE, type ThemeMode } from \"../hooks/use-dark-mode\";\nimport { useConversations } from \"../hooks/use-conversations\";\nimport { ErrorBanner } from \"./chat/error-banner\";\nimport { ApiKeyBar } from \"./chat/api-key-bar\";\nimport { ManagedAuthCard } from \"./chat/managed-auth-card\";\nimport { TypingIndicator } from \"./chat/typing-indicator\";\nimport { ToolPart } from \"./chat/tool-part\";\nimport { Markdown } from \"./chat/markdown\";\nimport { STARTER_PROMPTS } from \"./chat/starter-prompts\";\nimport { FollowUpChips } from \"./chat/follow-up-chips\";\nimport { ConversationSidebar } from \"./conversations/conversation-sidebar\";\nimport { ChangePasswordDialog } from \"./admin/change-password-dialog\";\nimport { Sun, Moon, Monitor, Star, TableProperties } from \"lucide-react\";\nimport { SchemaExplorer } from \"./schema-explorer/schema-explorer\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Button } from \"./ui/button\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { parseSuggestions } from \"../lib/helpers\";\n\nconst API_KEY_STORAGE_KEY = \"atlas-api-key\";\n\nexport interface AtlasChatProps {\n /** Atlas API server URL (e.g. \"https://api.example.com\" or \"\" for same-origin). */\n apiUrl: string;\n /** API key for simple-key auth mode. When provided, sent as Bearer token. */\n apiKey?: string;\n /** Theme preference. Defaults to \"system\". */\n theme?: ThemeMode;\n /** Enable conversation history sidebar. Defaults to false. */\n sidebar?: boolean;\n /** Enable schema explorer button. Defaults to false. */\n schemaExplorer?: boolean;\n /** Custom auth client for managed auth mode. */\n authClient?: AtlasAuthClient;\n /** Custom renderers for tool results. Keys are tool names (e.g. \"executeSQL\", \"explore\", \"executePython\"). */\n toolRenderers?: ToolRenderers;\n}\n\n/** No-op auth client for non-managed auth modes. */\nconst noopAuthClient: AtlasAuthClient = {\n signIn: { email: async () => ({ error: { message: \"Not supported\" } }) },\n signUp: { email: async () => ({ error: { message: \"Not supported\" } }) },\n signOut: async () => {},\n useSession: () => ({ data: null, isPending: false }),\n};\n\n/* Static SVG icons — hoisted to avoid recreation on every render */\nconst MenuIcon = (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-5 w-5\">\n <path fillRule=\"evenodd\" d=\"M2 4.75A.75.75 0 0 1 2.75 4h14.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 4.75ZM2 10a.75.75 0 0 1 .75-.75h14.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 10Zm0 5.25a.75.75 0 0 1 .75-.75h14.5a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1-.75-.75Z\" clipRule=\"evenodd\" />\n </svg>\n);\n\nconst AtlasLogo = (\n <svg data-atlas-logo viewBox=\"0 0 256 256\" fill=\"none\" className=\"h-7 w-7 shrink-0 text-primary\" aria-hidden=\"true\">\n <path d=\"M128 24 L232 208 L24 208 Z\" stroke=\"currentColor\" strokeWidth=\"14\" fill=\"none\" strokeLinejoin=\"round\"/>\n <circle cx=\"128\" cy=\"28\" r=\"16\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst THEME_OPTIONS = [\n { value: \"light\", label: \"Light\", icon: Sun },\n { value: \"dark\", label: \"Dark\", icon: Moon },\n { value: \"system\", label: \"System\", icon: Monitor },\n] as const satisfies readonly { value: ThemeMode; label: string; icon: typeof Sun }[];\n\nfunction ThemeToggle() {\n const mode = useThemeMode();\n const CurrentIcon = mode === \"dark\" ? Moon : mode === \"light\" ? Sun : Monitor;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-11 sm:size-8 text-zinc-500 dark:text-zinc-400\">\n <CurrentIcon className=\"size-4\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {THEME_OPTIONS.map(({ value, label, icon: Icon }) => (\n <DropdownMenuItem\n key={value}\n onClick={() => setTheme(value)}\n className={mode === value ? \"bg-accent\" : \"\"}\n >\n <Icon className=\"mr-2 size-4\" />\n {label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction SaveButton({\n conversationId,\n conversations,\n onStar,\n}: {\n conversationId: string;\n conversations: { id: string; starred: boolean }[];\n onStar: (id: string, starred: boolean) => Promise<boolean>;\n}) {\n const isStarred = conversations.find((c) => c.id === conversationId)?.starred ?? false;\n const [pending, setPending] = useState(false);\n\n async function handleToggle() {\n setPending(true);\n try {\n await onStar(conversationId, !isStarred);\n } catch (err) {\n console.warn(\"Failed to update star:\", err);\n } finally {\n setPending(false);\n }\n }\n\n return (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={handleToggle}\n disabled={pending}\n className={\n isStarred\n ? \"text-amber-500 hover:text-amber-600 dark:text-amber-400 dark:hover:text-amber-300\"\n : \"text-zinc-400 hover:text-amber-500 dark:text-zinc-500 dark:hover:text-amber-400\"\n }\n aria-label={isStarred ? \"Unsave conversation\" : \"Save conversation\"}\n >\n <Star className=\"h-3.5 w-3.5\" fill={isStarred ? \"currentColor\" : \"none\"} />\n <span>{isStarred ? \"Saved\" : \"Save\"}</span>\n </Button>\n );\n}\n\n/**\n * Standalone Atlas chat component.\n *\n * Wraps itself in AtlasUIProvider so consumers only need to pass props.\n * For advanced usage (e.g. custom auth client), pass `authClient`.\n */\nexport function AtlasChat(props: AtlasChatProps) {\n const {\n apiUrl,\n apiKey: propApiKey,\n theme: propTheme = \"system\",\n sidebar = false,\n schemaExplorer: schemaExplorerEnabled = false,\n authClient = noopAuthClient,\n toolRenderers,\n } = props;\n\n // Apply theme from props on mount and when it changes\n useEffect(() => {\n setTheme(propTheme);\n }, [propTheme]);\n\n return (\n <AtlasUIProvider config={{ apiUrl, authClient }}>\n <AtlasChatInner\n propApiKey={propApiKey}\n sidebar={sidebar}\n schemaExplorerEnabled={schemaExplorerEnabled}\n toolRenderers={toolRenderers}\n />\n </AtlasUIProvider>\n );\n}\n\nfunction AtlasChatInner({\n propApiKey,\n sidebar,\n schemaExplorerEnabled,\n toolRenderers,\n}: {\n propApiKey?: string;\n sidebar: boolean;\n schemaExplorerEnabled: boolean;\n toolRenderers?: ToolRenderers;\n}) {\n const { apiUrl, isCrossOrigin, authClient } = useAtlasConfig();\n const dark = useDarkMode();\n const [input, setInput] = useState(\"\");\n const [authMode, setAuthMode] = useState<AuthMode | null>(null);\n const [healthWarning, setHealthWarning] = useState(\"\");\n const [healthFailed, setHealthFailed] = useState(false);\n const [apiKey, setApiKey] = useState(propApiKey ?? \"\");\n const [conversationId, setConversationId] = useState<string | null>(null);\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const [loadingConversation, setLoadingConversation] = useState(false);\n const [passwordChangeRequired, setPasswordChangeRequired] = useState(false);\n const [schemaExplorerOpen, setSchemaExplorerOpen] = useState(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Sync prop API key changes\n useEffect(() => {\n if (propApiKey !== undefined) setApiKey(propApiKey);\n }, [propApiKey]);\n\n const managedSession = authClient.useSession();\n const authResolved = authMode !== null;\n const isManaged = authMode === \"managed\";\n const isSignedIn = isManaged && !!managedSession.data?.user;\n\n const getHeaders = useCallback(() => {\n const headers: Record<string, string> = {};\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n return headers;\n }, [apiKey]);\n\n const getCredentials = useCallback((): RequestCredentials => {\n return isCrossOrigin ? \"include\" : \"same-origin\";\n }, [isCrossOrigin]);\n\n const convos = useConversations({\n apiUrl,\n enabled: sidebar,\n getHeaders,\n getCredentials,\n });\n\n const refreshConvosRef = useRef(convos.refresh);\n refreshConvosRef.current = convos.refresh;\n\n const conversationIdRef = useRef(conversationId);\n conversationIdRef.current = conversationId;\n\n // Load API key from sessionStorage on mount + fetch auth mode\n useEffect(() => {\n if (!propApiKey) {\n try {\n const stored = sessionStorage.getItem(API_KEY_STORAGE_KEY);\n if (stored) setApiKey(stored);\n } catch (err) {\n console.warn(\"Cannot read API key from sessionStorage:\", err);\n }\n }\n\n async function fetchHealth(attempt: number): Promise<void> {\n try {\n const res = await fetch(`${apiUrl}/api/health`, {\n credentials: isCrossOrigin ? \"include\" : \"same-origin\",\n });\n if (!res.ok) {\n console.warn(`Health check returned ${res.status}`);\n if (attempt < 2) {\n await new Promise((r) => setTimeout(r, 2000));\n return fetchHealth(attempt + 1);\n }\n setHealthWarning(\"Health check failed — check server logs. Try refreshing the page.\");\n setHealthFailed(true);\n setAuthMode(\"none\");\n return;\n }\n const data = await res.json();\n const mode = data?.checks?.auth?.mode;\n if (typeof mode === \"string\" && AUTH_MODES.includes(mode as AuthMode)) {\n setAuthMode(mode as AuthMode);\n } else {\n console.warn(\"Health check succeeded but returned no valid auth mode:\", data);\n setHealthWarning(\"Could not determine authentication mode from the server.\");\n setAuthMode(\"none\");\n }\n if (typeof data?.brandColor === \"string\" && OKLCH_RE.test(data.brandColor)) {\n applyBrandColor(data.brandColor);\n }\n } catch (err) {\n console.warn(\"Health endpoint unavailable:\", err);\n if (attempt < 2) {\n await new Promise((r) => setTimeout(r, 2000));\n return fetchHealth(attempt + 1);\n }\n setHealthWarning(\"Unable to reach the API server. Try refreshing the page.\");\n setHealthFailed(true);\n setAuthMode(\"none\");\n }\n }\n fetchHealth(1);\n }, [apiUrl, isCrossOrigin]);\n\n // Fetch conversation list after auth is resolved\n useEffect(() => {\n if (sidebar) convos.fetchList();\n }, [authMode, sidebar, convos.fetchList]);\n\n // Check if managed auth user needs to change their default password\n useEffect(() => {\n if (!isManaged || !managedSession.data?.user) return;\n\n async function checkPasswordStatus() {\n try {\n const res = await fetch(`${apiUrl}/api/v1/admin/me/password-status`, {\n credentials: isCrossOrigin ? \"include\" : \"same-origin\",\n });\n if (!res.ok) {\n console.warn(`Password status check returned HTTP ${res.status}`);\n return;\n }\n const data = await res.json();\n if (data.passwordChangeRequired) setPasswordChangeRequired(true);\n } catch (err) {\n console.warn(\"Failed to check password status:\", err);\n }\n }\n checkPasswordStatus();\n }, [isManaged, managedSession.data?.user, apiUrl, isCrossOrigin]);\n\n const handleSaveApiKey = useCallback((key: string) => {\n setApiKey(key);\n try {\n sessionStorage.setItem(API_KEY_STORAGE_KEY, key);\n } catch (err) {\n console.warn(\"Could not persist API key to sessionStorage:\", err);\n }\n }, []);\n\n const transport = useMemo(() => {\n const headers: Record<string, string> = {};\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n return new DefaultChatTransport({\n api: `${apiUrl}/api/chat`,\n headers,\n credentials: isCrossOrigin ? \"include\" : undefined,\n body: () => (conversationIdRef.current ? { conversationId: conversationIdRef.current } : {}),\n fetch: (async (input, init) => {\n const response = await globalThis.fetch(input, init);\n const convId = response.headers.get(\"x-conversation-id\");\n if (convId && convId !== conversationIdRef.current) {\n setConversationId(convId);\n setTimeout(() => {\n refreshConvosRef.current().catch((err) => {\n console.warn(\"Sidebar refresh failed:\", err);\n });\n }, 500);\n }\n return response;\n }) as typeof fetch,\n });\n }, [apiKey, apiUrl, isCrossOrigin]);\n\n const { messages, setMessages, sendMessage, status, error } = useChat({ transport });\n\n const isLoading = status === \"streaming\" || status === \"submitted\";\n\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const isNearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 100;\n if (isNearBottom) el.scrollTop = el.scrollHeight;\n }, [messages, status]);\n\n function handleSend(text: string) {\n if (!text.trim()) return;\n const saved = text;\n setInput(\"\");\n sendMessage({ text: saved }).catch((err) => {\n console.error(\"Failed to send message:\", err);\n setInput(saved);\n setHealthWarning(\"Failed to send message. Please try again.\");\n setTimeout(() => setHealthWarning(\"\"), 5000);\n });\n }\n\n async function handleSelectConversation(id: string) {\n if (loadingConversation) return;\n setLoadingConversation(true);\n try {\n const uiMessages = await convos.loadConversation(id);\n if (uiMessages) {\n setMessages(uiMessages);\n setConversationId(id);\n convos.setSelectedId(id);\n setMobileMenuOpen(false);\n } else {\n setHealthWarning(\"Could not load conversation. It may have been deleted.\");\n setTimeout(() => setHealthWarning(\"\"), 5000);\n }\n } catch (err) {\n console.warn(\"Failed to load conversation:\", err);\n setHealthWarning(\"Failed to load conversation. Please try again.\");\n setTimeout(() => setHealthWarning(\"\"), 5000);\n } finally {\n setLoadingConversation(false);\n }\n }\n\n function handleNewChat() {\n setMessages([]);\n setConversationId(null);\n convos.setSelectedId(null);\n setInput(\"\");\n setMobileMenuOpen(false);\n }\n\n if (!authResolved || (isManaged && managedSession.isPending)) {\n return (\n <DarkModeContext.Provider value={dark}>\n <div className=\"atlas-root flex h-dvh items-center justify-center bg-white dark:bg-zinc-950\" />\n </DarkModeContext.Provider>\n );\n }\n\n const showSidebar = sidebar && convos.available;\n\n return (\n <DarkModeContext.Provider value={dark}>\n <div className=\"atlas-root flex h-dvh\">\n {showSidebar && (\n <ConversationSidebar\n conversations={convos.conversations}\n selectedId={convos.selectedId}\n loading={convos.loading}\n onSelect={handleSelectConversation}\n onDelete={(id) => convos.deleteConversation(id)}\n onStar={(id, starred) => convos.starConversation(id, starred)}\n onNewChat={handleNewChat}\n mobileOpen={mobileMenuOpen}\n onMobileClose={() => setMobileMenuOpen(false)}\n />\n )}\n\n <main className=\"flex flex-1 flex-col overflow-hidden\">\n <div className=\"mx-auto flex w-full max-w-4xl flex-1 flex-col overflow-hidden p-4\">\n <header className=\"mb-4 flex-none border-b border-zinc-100 pb-3 dark:border-zinc-800\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {showSidebar && (\n <button\n onClick={() => setMobileMenuOpen(true)}\n className=\"flex size-11 items-center justify-center rounded text-zinc-400 hover:text-zinc-700 md:hidden dark:hover:text-zinc-200\"\n aria-label=\"Open conversation history\"\n >\n {MenuIcon}\n </button>\n )}\n <div className=\"flex items-center gap-2.5\">\n {AtlasLogo}\n <div>\n <h1 className=\"text-xl font-semibold tracking-tight\">Atlas</h1>\n <p className=\"text-sm text-zinc-500\">Ask your data anything</p>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {schemaExplorerEnabled && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-11 sm:size-8 text-zinc-500 dark:text-zinc-400\"\n onClick={() => setSchemaExplorerOpen(true)}\n aria-label=\"Open schema explorer\"\n >\n <TableProperties className=\"size-4\" />\n </Button>\n )}\n <ThemeToggle />\n {isSignedIn && (\n <>\n <span className=\"hidden text-xs text-zinc-500 sm:inline dark:text-zinc-400\">\n {managedSession.data?.user?.email}\n </span>\n <button\n onClick={() => {\n authClient.signOut().catch((err: unknown) => {\n console.error(\"Sign out failed:\", err);\n setHealthWarning(\"Sign out failed. Please try again.\");\n setTimeout(() => setHealthWarning(\"\"), 5000);\n });\n }}\n className=\"rounded border border-zinc-200 px-3 py-2 text-xs text-zinc-500 transition-colors hover:border-zinc-400 hover:text-zinc-800 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-500 dark:hover:text-zinc-200\"\n >\n Sign out\n </button>\n </>\n )}\n </div>\n </div>\n </header>\n\n {healthWarning && (\n <p className=\"mb-2 text-xs text-zinc-400 dark:text-zinc-500\">{healthWarning}</p>\n )}\n\n {isManaged && !isSignedIn ? (\n <ManagedAuthCard />\n ) : (\n <ActionAuthProvider getHeaders={getHeaders} getCredentials={getCredentials}>\n {authMode === \"simple-key\" && !propApiKey && (\n <div className=\"mb-3 flex-none\">\n <ApiKeyBar apiKey={apiKey} onSave={handleSaveApiKey} />\n </div>\n )}\n\n <ScrollArea viewportRef={scrollRef} className=\"min-h-0 flex-1\">\n <div data-atlas-messages className=\"space-y-4 pb-4 pr-3\">\n {messages.length === 0 && !error && (\n <div className=\"flex h-full flex-col items-center justify-center gap-6\">\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-zinc-500 dark:text-zinc-400\">\n What would you like to know?\n </p>\n <p className=\"mt-1 text-sm text-zinc-400 dark:text-zinc-600\">\n Ask a question about your data to get started\n </p>\n </div>\n <div className=\"grid w-full max-w-lg grid-cols-1 gap-2 sm:grid-cols-2\">\n {STARTER_PROMPTS.map((prompt) => (\n <button\n key={prompt}\n onClick={() => handleSend(prompt)}\n className=\"rounded-lg border border-zinc-200 bg-zinc-50 px-3 py-2.5 text-left text-sm text-zinc-500 transition-colors hover:border-zinc-400 hover:bg-zinc-100 hover:text-zinc-800 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-400 dark:hover:border-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"\n >\n {prompt}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {messages.map((m, msgIndex) => {\n if (m.role === \"user\") {\n return (\n <div key={m.id} className=\"flex justify-end\">\n <div className=\"max-w-[85%] rounded-xl bg-blue-600 px-4 py-3 text-sm text-white\">\n {m.parts?.map((part, i) =>\n part.type === \"text\" ? (\n <p key={i} className=\"whitespace-pre-wrap\">\n {part.text}\n </p>\n ) : null,\n )}\n </div>\n </div>\n );\n }\n\n const isLastAssistant =\n m.role === \"assistant\" &&\n msgIndex === messages.length - 1;\n\n const lastTextWithSuggestions = m.parts\n ?.filter((p): p is typeof p & { type: \"text\"; text: string } => p.type === \"text\" && !!p.text.trim())\n .findLast((p) => parseSuggestions(p.text).suggestions.length > 0);\n const suggestions = lastTextWithSuggestions\n ? parseSuggestions(lastTextWithSuggestions.text).suggestions\n : [];\n\n return (\n <div key={m.id} className=\"space-y-2\">\n {m.parts?.map((part, i) => {\n if (part.type === \"text\" && part.text.trim()) {\n const displayText = parseSuggestions(part.text).text;\n if (!displayText.trim()) return null;\n return (\n <div key={i} className=\"max-w-[90%]\">\n <div className=\"rounded-xl bg-zinc-100 px-4 py-3 text-sm text-zinc-800 dark:bg-zinc-800 dark:text-zinc-200\">\n <Markdown content={displayText} />\n </div>\n </div>\n );\n }\n if (isToolUIPart(part)) {\n return (\n <div key={i} className=\"max-w-[95%]\">\n <ToolPart part={part} toolRenderers={toolRenderers} />\n </div>\n );\n }\n return null;\n })}\n {isLastAssistant && !isLoading && (\n <>\n <FollowUpChips\n suggestions={suggestions}\n onSelect={handleSend}\n />\n {conversationId && sidebar && convos.available && (\n <SaveButton\n conversationId={conversationId}\n conversations={convos.conversations}\n onStar={convos.starConversation}\n />\n )}\n </>\n )}\n </div>\n );\n })}\n\n {isLoading && messages.length > 0 && <TypingIndicator />}\n </div>\n </ScrollArea>\n\n {error && <ErrorBanner error={error} authMode={authMode} />}\n\n <form\n data-atlas-form\n onSubmit={(e) => {\n e.preventDefault();\n handleSend(input);\n }}\n className=\"flex flex-none gap-2 border-t border-zinc-100 pt-4 dark:border-zinc-800\"\n >\n <input\n data-atlas-input\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Ask a question about your data...\"\n className=\"min-w-0 flex-1 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-base text-zinc-900 placeholder-zinc-400 outline-none focus:border-blue-500 sm:text-sm dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100 dark:placeholder-zinc-600\"\n disabled={isLoading || healthFailed}\n />\n <button\n type=\"submit\"\n disabled={isLoading || healthFailed || !input.trim()}\n className=\"shrink-0 rounded-lg bg-blue-600 px-5 py-3 text-sm font-medium text-white transition-colors hover:bg-blue-500 disabled:opacity-40\"\n >\n Ask\n </button>\n </form>\n </ActionAuthProvider>\n )}\n </div>\n </main>\n </div>\n {schemaExplorerEnabled && (\n <SchemaExplorer\n open={schemaExplorerOpen}\n onOpenChange={setSchemaExplorerOpen}\n onInsertQuery={(text) => setInput(text)}\n getHeaders={getHeaders}\n getCredentials={getCredentials}\n />\n )}\n <ChangePasswordDialog\n open={passwordChangeRequired}\n onComplete={() => setPasswordChangeRequired(false)}\n />\n </DarkModeContext.Provider>\n );\n}\n"]}