@cosmicstack/mercury-agent 1.1.13 → 1.2.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.
- package/README.md +9 -6
- package/dist/index.js +27245 -21727
- package/dist/index.js.map +1 -1
- package/dist/web/ui/assets/Chat-CajL8sV3.js +27 -0
- package/dist/web/ui/assets/{Dashboard-1rlAqQ-Y.js → Dashboard-ClnaDoDG.js} +1 -2
- package/dist/web/ui/assets/{Goals-CgSUAXLH.js → Goals-Rm3s3OGd.js} +1 -2
- package/dist/web/ui/assets/{Graph-DnlOWkay.js → Graph-hYGmN5vp.js} +1 -2
- package/dist/web/ui/assets/{Kanban-DRlNiNRF.js → Kanban-BK_Oi6am.js} +1 -2
- package/dist/web/ui/assets/{Login-BP5524pC.js → Login-Bl8tq7KA.js} +1 -2
- package/dist/web/ui/assets/MarkdownRenderer-DKGKZih7.js +21 -0
- package/dist/web/ui/assets/{Memory-BOQEY0H8.js → Memory-kKRHTUyC.js} +1 -2
- package/dist/web/ui/assets/{Permissions-jbFH-toa.js → Permissions-CDRBOdMO.js} +1 -2
- package/dist/web/ui/assets/{PersonDetail-Ca8B9io8.js → PersonDetail-DLbZBUS0.js} +1 -2
- package/dist/web/ui/assets/{Persons-epdmUeBM.js → Persons-C-GjzdmT.js} +1 -2
- package/dist/web/ui/assets/{Providers-Bm8sZNZo.js → Providers-L32issLd.js} +1 -2
- package/dist/web/ui/assets/{Schedules-BZKhm9R7.js → Schedules-BvGLrPPD.js} +1 -2
- package/dist/web/ui/assets/{Settings-Hii-5oku.js → Settings-BP9_1JW3.js} +1 -2
- package/dist/web/ui/assets/{Skills-BHJp2CgD.js → Skills-CvXlgjZK.js} +1 -2
- package/dist/web/ui/assets/{Tasks-D36pqkro.js → Tasks-XcAVd2Ff.js} +1 -2
- package/dist/web/ui/assets/{Usage-CmjaYrsT.js → Usage--2hxK31f.js} +1 -2
- package/dist/web/ui/assets/{Workspace-BYLf-wTJ.js → Workspace-BPChIyBc.js} +11 -12
- package/dist/web/ui/assets/{activity-MOTqH8zM.js → activity-CDTOZzUZ.js} +1 -2
- package/dist/web/ui/assets/{alert-dialog-MbYSbZx5.js → alert-dialog-B3JUwsIN.js} +1 -2
- package/dist/web/ui/assets/{arrow-left-CtqQsBC6.js → arrow-left-CkDXNwR2.js} +1 -2
- package/dist/web/ui/assets/{avatar-BIYaY7pR.js → avatar-NU204zr9.js} +1 -2
- package/dist/web/ui/assets/{badge-CUJiWF1y.js → badge-DpVeNL8j.js} +1 -2
- package/dist/web/ui/assets/{button-CNasMlFE.js → button-V3Fu7_kO.js} +1 -2
- package/dist/web/ui/assets/{card-BdsEOP7t.js → card-CjAvp22k.js} +1 -2
- package/dist/web/ui/assets/{chevron-down-CB9J_vvZ.js → chevron-down-C66c9kfo.js} +1 -2
- package/dist/web/ui/assets/{circle-check-DvGSe1uZ.js → circle-check-Cch4Kwja.js} +1 -2
- package/dist/web/ui/assets/{circle-x-CyaGJ_BM.js → circle-x-DK0DQPGB.js} +1 -2
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js +0 -1
- package/dist/web/ui/assets/{dialog-Bd1rELXb.js → dialog-FHqlAspv.js} +1 -2
- package/dist/web/ui/assets/{download-C8RvlFqO.js → download-D73EX-Ki.js} +1 -2
- package/dist/web/ui/assets/{eye-BJ0NucMz.js → eye-CxEb5_L8.js} +1 -2
- package/dist/web/ui/assets/{file-text-BWWBuD_N.js → file-text-CDTjVG9h.js} +1 -2
- package/dist/web/ui/assets/{folder-open-BwjemFy7.js → folder-open-CF5wm-xS.js} +1 -2
- package/dist/web/ui/assets/{git-branch-D9JVASpC.js → git-branch-CYWJZoQx.js} +1 -2
- package/dist/web/ui/assets/{index-C3YiF4qv.js → index-B1xAjISP.js} +4 -5
- package/dist/web/ui/assets/{index-CaqLZNof.js → index-CufYpqmV.js} +1 -2
- package/dist/web/ui/assets/{input-CH3dmo9r.js → input-CF6e2HL4.js} +1 -2
- package/dist/web/ui/assets/{loader-circle-DbYKk0_Q.js → loader-circle-CJko6bz6.js} +1 -2
- package/dist/web/ui/assets/{pencil-gNDEMhav.js → pencil-DGvW-dl_.js} +1 -2
- package/dist/web/ui/assets/{plus-7rbHkByr.js → plus-DhHrgqcD.js} +1 -2
- package/dist/web/ui/assets/{power-BS7gCDWs.js → power-BFKfrVvI.js} +1 -2
- package/dist/web/ui/assets/{progress-ZzhsBV2v.js → progress-CsRtYJ3t.js} +1 -2
- package/dist/web/ui/assets/{search-BZsbhO0B.js → search-BwE8vRR_.js} +1 -2
- package/dist/web/ui/assets/{select-vRSgBrHz.js → select-Xy3UJnp-.js} +1 -2
- package/dist/web/ui/assets/{send-BkyTIUtJ.js → send-DHy23R-c.js} +1 -2
- package/dist/web/ui/assets/{sparkles-DcP24GEL.js → sparkles-wNQvP7So.js} +1 -2
- package/dist/web/ui/assets/{switch-LRN9wWy2.js → switch-CGgMESDf.js} +1 -2
- package/dist/web/ui/assets/{terminal-CWG62zdD.js → terminal-BvZc6N0C.js} +1 -2
- package/dist/web/ui/assets/{textarea-CXh3tmJ1.js → textarea-BTxEQ_C2.js} +1 -2
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js +0 -1
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js +0 -1
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js +0 -1
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js +0 -1
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js +0 -1
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js +0 -1
- package/dist/web/ui/assets/{zap-BEfqVtvZ.js → zap-CK8xUBKc.js} +1 -2
- package/dist/web/ui/index.html +1 -1
- package/dist/web/ui/workbox-0bb07689.js +1 -0
- package/package.json +3 -1
- package/dist/web/ui/assets/Chat-DXSn2dY8.js +0 -28
- package/dist/web/ui/assets/Chat-DXSn2dY8.js.map +0 -1
- package/dist/web/ui/assets/Dashboard-1rlAqQ-Y.js.map +0 -1
- package/dist/web/ui/assets/Goals-CgSUAXLH.js.map +0 -1
- package/dist/web/ui/assets/Graph-DnlOWkay.js.map +0 -1
- package/dist/web/ui/assets/Kanban-DRlNiNRF.js.map +0 -1
- package/dist/web/ui/assets/Login-BP5524pC.js.map +0 -1
- package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js +0 -22
- package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js.map +0 -1
- package/dist/web/ui/assets/Memory-BOQEY0H8.js.map +0 -1
- package/dist/web/ui/assets/Permissions-jbFH-toa.js.map +0 -1
- package/dist/web/ui/assets/PersonDetail-Ca8B9io8.js.map +0 -1
- package/dist/web/ui/assets/Persons-epdmUeBM.js.map +0 -1
- package/dist/web/ui/assets/Providers-Bm8sZNZo.js.map +0 -1
- package/dist/web/ui/assets/Schedules-BZKhm9R7.js.map +0 -1
- package/dist/web/ui/assets/Settings-Hii-5oku.js.map +0 -1
- package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +0 -1
- package/dist/web/ui/assets/Tasks-D36pqkro.js.map +0 -1
- package/dist/web/ui/assets/Usage-CmjaYrsT.js.map +0 -1
- package/dist/web/ui/assets/Workspace-BYLf-wTJ.js.map +0 -1
- package/dist/web/ui/assets/activity-MOTqH8zM.js.map +0 -1
- package/dist/web/ui/assets/alert-dialog-MbYSbZx5.js.map +0 -1
- package/dist/web/ui/assets/arrow-left-CtqQsBC6.js.map +0 -1
- package/dist/web/ui/assets/avatar-BIYaY7pR.js.map +0 -1
- package/dist/web/ui/assets/badge-CUJiWF1y.js.map +0 -1
- package/dist/web/ui/assets/button-CNasMlFE.js.map +0 -1
- package/dist/web/ui/assets/card-BdsEOP7t.js.map +0 -1
- package/dist/web/ui/assets/chevron-down-CB9J_vvZ.js.map +0 -1
- package/dist/web/ui/assets/circle-check-DvGSe1uZ.js.map +0 -1
- package/dist/web/ui/assets/circle-x-CyaGJ_BM.js.map +0 -1
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js.map +0 -1
- package/dist/web/ui/assets/dialog-Bd1rELXb.js.map +0 -1
- package/dist/web/ui/assets/download-C8RvlFqO.js.map +0 -1
- package/dist/web/ui/assets/eye-BJ0NucMz.js.map +0 -1
- package/dist/web/ui/assets/file-text-BWWBuD_N.js.map +0 -1
- package/dist/web/ui/assets/folder-open-BwjemFy7.js.map +0 -1
- package/dist/web/ui/assets/git-branch-D9JVASpC.js.map +0 -1
- package/dist/web/ui/assets/index-C3YiF4qv.js.map +0 -1
- package/dist/web/ui/assets/index-CaqLZNof.js.map +0 -1
- package/dist/web/ui/assets/input-CH3dmo9r.js.map +0 -1
- package/dist/web/ui/assets/loader-circle-DbYKk0_Q.js.map +0 -1
- package/dist/web/ui/assets/pencil-gNDEMhav.js.map +0 -1
- package/dist/web/ui/assets/plus-7rbHkByr.js.map +0 -1
- package/dist/web/ui/assets/power-BS7gCDWs.js.map +0 -1
- package/dist/web/ui/assets/progress-ZzhsBV2v.js.map +0 -1
- package/dist/web/ui/assets/search-BZsbhO0B.js.map +0 -1
- package/dist/web/ui/assets/select-vRSgBrHz.js.map +0 -1
- package/dist/web/ui/assets/send-BkyTIUtJ.js.map +0 -1
- package/dist/web/ui/assets/sparkles-DcP24GEL.js.map +0 -1
- package/dist/web/ui/assets/switch-LRN9wWy2.js.map +0 -1
- package/dist/web/ui/assets/terminal-CWG62zdD.js.map +0 -1
- package/dist/web/ui/assets/textarea-CXh3tmJ1.js.map +0 -1
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js.map +0 -1
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js.map +0 -1
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js.map +0 -1
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js.map +0 -1
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js.map +0 -1
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js.map +0 -1
- package/dist/web/ui/assets/zap-BEfqVtvZ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Schedules-BZKhm9R7.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar.js","../../node_modules/lucide-react/dist/esm/icons/timer.js","../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../src/pages/Schedules.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n];\nconst Calendar = createLucideIcon(\"calendar\", __iconNode);\n\nexport { __iconNode, Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"line\", { x1: \"10\", x2: \"14\", y1: \"2\", y2: \"2\", key: \"14vaq8\" }],\n [\"line\", { x1: \"12\", x2: \"15\", y1: \"14\", y2: \"11\", key: \"17fdiu\" }],\n [\"circle\", { cx: \"12\", cy: \"14\", r: \"8\", key: \"1e1u0o\" }]\n];\nconst Timer = createLucideIcon(\"timer\", __iconNode);\n\nexport { __iconNode, Timer as default };\n//# sourceMappingURL=timer.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","import { useEffect, useState, useCallback } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Clock,\n Pencil,\n Trash2,\n Calendar,\n Timer,\n Sparkles,\n AlertTriangle,\n} from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"@/components/ui/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogAction,\n AlertDialogCancel,\n} from \"@/components/ui/alert-dialog\";\nimport { cn, formatDate, truncate } from \"@/lib/utils\";\nimport api, { type Schedule } from \"@/lib/api\";\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.07, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div className={cn(\"animate-pulse rounded-lg bg-muted\", className)} />\n );\n}\n\nfunction humanizeCron(cron: string): string {\n const parts = cron.trim().split(/\\s+/);\n if (parts.length < 5) return cron;\n const [min, hour, dom, , dow] = parts;\n\n if (cron === \"* * * * *\") return \"Every minute\";\n if (min === \"0\" && hour === \"*\") return \"Every hour\";\n if (min === \"*/5\" && hour === \"*\") return \"Every 5 minutes\";\n if (min === \"*/10\" && hour === \"*\") return \"Every 10 minutes\";\n if (min === \"*/15\" && hour === \"*\") return \"Every 15 minutes\";\n if (min === \"*/30\" && hour === \"*\") return \"Every 30 minutes\";\n if (dom === \"*\" && dow === \"*\" && hour !== \"*\" && min !== \"*\")\n return `Daily at ${hour.padStart(2, \"0\")}:${min.padStart(2, \"0\")}`;\n if (dow === \"1-5\" && hour !== \"*\")\n return `Weekdays at ${hour.padStart(2, \"0\")}:${min.padStart(2, \"0\")}`;\n return cron;\n}\n\nfunction humanizeDelay(seconds: number): string {\n if (seconds < 60) return `${seconds}s delay`;\n if (seconds < 3600) return `${Math.round(seconds / 60)}m delay`;\n return `${(seconds / 3600).toFixed(1)}h delay`;\n}\n\ninterface EditForm {\n description: string;\n cron: string;\n delaySeconds: string;\n prompt: string;\n skillName: string;\n}\n\nexport function SchedulesPage() {\n const [schedules, setSchedules] = useState<Schedule[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n const [feedback, setFeedback] = useState<{ type: \"success\" | \"error\"; message: string } | null>(null);\n\n // Edit dialog state\n const [editOpen, setEditOpen] = useState(false);\n const [editId, setEditId] = useState<string | null>(null);\n const [editForm, setEditForm] = useState<EditForm>({\n description: \"\",\n cron: \"\",\n delaySeconds: \"\",\n prompt: \"\",\n skillName: \"\",\n });\n const [saving, setSaving] = useState(false);\n\n // Delete dialog state\n const [deleteId, setDeleteId] = useState<string | null>(null);\n const [deleting, setDeleting] = useState(false);\n\n const load = useCallback(() => {\n setLoading(true);\n api.schedules\n .list()\n .then((res) => {\n setSchedules(res.schedules);\n setError(\"\");\n })\n .catch((err: Error) => setError(err.message))\n .finally(() => setLoading(false));\n }, []);\n\n useEffect(() => {\n load();\n }, [load]);\n\n // Auto-dismiss feedback\n useEffect(() => {\n if (!feedback) return;\n const t = setTimeout(() => setFeedback(null), 3000);\n return () => clearTimeout(t);\n }, [feedback]);\n\n function openEdit(schedule: Schedule) {\n setEditId(schedule.id);\n setEditForm({\n description: schedule.description,\n cron: schedule.cron ?? \"\",\n delaySeconds: schedule.delaySeconds?.toString() ?? \"\",\n prompt: schedule.prompt ?? \"\",\n skillName: schedule.skillName ?? \"\",\n });\n setEditOpen(true);\n }\n\n async function handleSave() {\n if (!editId) return;\n setSaving(true);\n try {\n const payload: Partial<Schedule> = {\n description: editForm.description,\n };\n if (editForm.cron.trim()) payload.cron = editForm.cron.trim();\n if (editForm.delaySeconds.trim())\n payload.delaySeconds = Number(editForm.delaySeconds);\n if (editForm.prompt.trim()) payload.prompt = editForm.prompt.trim();\n if (editForm.skillName.trim())\n payload.skillName = editForm.skillName.trim();\n\n const res = await api.schedules.update(editId, payload);\n if (res.success) {\n setSchedules((prev) =>\n prev.map((s) => (s.id === editId ? { ...s, ...res.schedule } : s))\n );\n setFeedback({ type: \"success\", message: \"Schedule updated\" });\n setEditOpen(false);\n }\n } catch (err) {\n setFeedback({\n type: \"error\",\n message: err instanceof Error ? err.message : \"Update failed\",\n });\n } finally {\n setSaving(false);\n }\n }\n\n async function handleDelete() {\n if (!deleteId) return;\n setDeleting(true);\n try {\n const res = await api.schedules.delete(deleteId);\n if (res.success) {\n setSchedules((prev) => prev.filter((s) => s.id !== deleteId));\n setFeedback({ type: \"success\", message: \"Schedule deleted\" });\n }\n } catch (err) {\n setFeedback({\n type: \"error\",\n message: err instanceof Error ? err.message : \"Delete failed\",\n });\n } finally {\n setDeleting(false);\n setDeleteId(null);\n }\n }\n\n if (error && !schedules.length) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-8 w-40\" />\n <Skeleton className=\"h-4 w-56\" />\n </div>\n <div className=\"flex flex-col gap-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-[140px]\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <h1 className=\"text-2xl font-bold tracking-tight\">Schedules</h1>\n <p className=\"text-sm text-muted-foreground\">\n Automated recurring tasks\n </p>\n </motion.div>\n\n {/* Feedback toast */}\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n className={cn(\n \"rounded-lg border px-4 py-2.5 text-sm font-medium\",\n feedback.type === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-500\"\n : \"border-destructive/30 bg-destructive/10 text-destructive\"\n )}\n >\n {feedback.message}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Empty state */}\n {schedules.length === 0 ? (\n <motion.div\n initial={{ opacity: 0, scale: 0.96 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.3 }}\n >\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-16 text-center\">\n <Clock className=\"mb-4 h-10 w-10 text-muted-foreground/50\" />\n <p className=\"text-lg font-medium text-muted-foreground\">\n No scheduled tasks\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground/70\">\n Schedules will appear here once configured via the API or CLI.\n </p>\n </CardContent>\n </Card>\n </motion.div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {schedules.map((schedule, idx) => (\n <motion.div\n key={schedule.id}\n custom={idx}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <Card>\n <CardHeader className=\"flex flex-row items-start justify-between gap-4 pb-3\">\n <div className=\"min-w-0 flex-1 space-y-1\">\n <CardTitle className=\"text-base\">\n {schedule.description}\n </CardTitle>\n <div className=\"flex flex-wrap items-center gap-2\">\n {schedule.cron && (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {humanizeCron(schedule.cron)}\n </Badge>\n )}\n {schedule.delaySeconds != null && (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Timer className=\"h-3 w-3\" />\n {humanizeDelay(schedule.delaySeconds)}\n </Badge>\n )}\n {schedule.skillName && (\n <Badge variant=\"default\" className=\"gap-1\">\n <Sparkles className=\"h-3 w-3\" />\n {schedule.skillName}\n </Badge>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => openEdit(schedule)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setDeleteId(schedule.id)}\n >\n <Trash2 className=\"h-4 w-4 text-destructive\" />\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col gap-2 text-sm\">\n {schedule.prompt && (\n <p className=\"text-muted-foreground\">\n <span className=\"font-medium text-foreground\">Prompt: </span>\n {truncate(schedule.prompt, 100)}\n </p>\n )}\n <div className=\"flex flex-wrap gap-x-6 gap-y-1 text-xs text-muted-foreground\">\n {schedule.lastRun && (\n <span>\n Last run:{\" \"}\n <span className=\"font-medium tabular-nums text-foreground\">\n {formatDate(schedule.lastRun)}\n </span>\n </span>\n )}\n {schedule.nextRun && (\n <span>\n Next run:{\" \"}\n <span className=\"font-medium tabular-nums text-foreground\">\n {formatDate(schedule.nextRun)}\n </span>\n </span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n ))}\n </div>\n )}\n\n {/* Edit Dialog */}\n <Dialog open={editOpen} onOpenChange={setEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit Schedule</DialogTitle>\n <DialogDescription>\n Update the schedule configuration.\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">Description</label>\n <Input\n value={editForm.description}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, description: e.target.value }))\n }\n placeholder=\"Schedule description\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">Cron Expression</label>\n <Input\n value={editForm.cron}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, cron: e.target.value }))\n }\n placeholder=\"*/30 * * * *\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">Delay (seconds)</label>\n <Input\n type=\"number\"\n value={editForm.delaySeconds}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, delaySeconds: e.target.value }))\n }\n placeholder=\"3600\"\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">Prompt</label>\n <Input\n value={editForm.prompt}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, prompt: e.target.value }))\n }\n placeholder=\"Optional prompt text\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">Skill Name</label>\n <Input\n value={editForm.skillName}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, skillName: e.target.value }))\n }\n placeholder=\"Optional skill name\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={saving || !editForm.description.trim()}>\n {saving ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation */}\n <AlertDialog open={!!deleteId} onOpenChange={(open) => !open && setDeleteId(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-destructive\" />\n Delete Schedule\n </AlertDialogTitle>\n <AlertDialogDescription>\n This action cannot be undone. The scheduled task will be permanently removed.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={deleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDelete}\n disabled={deleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {deleting ? \"Deleting...\" : \"Delete\"}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"names":["__iconNode","Calendar","createLucideIcon","Timer","TriangleAlert","fadeUp","i","Skeleton","className","cn","humanizeCron","cron","parts","min","hour","dom","dow","humanizeDelay","seconds","SchedulesPage","schedules","setSchedules","useState","loading","setLoading","error","setError","feedback","setFeedback","editOpen","setEditOpen","editId","setEditId","editForm","setEditForm","saving","setSaving","deleteId","setDeleteId","deleting","setDeleting","load","useCallback","api","res","err","useEffect","t","openEdit","schedule","_a","handleSave","payload","prev","s","handleDelete","jsx","jsxs","_","motion","AnimatePresence","Card","CardContent","Clock","idx","CardHeader","CardTitle","Badge","Sparkles","Button","Pencil","Trash2","truncate","formatDate","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","f","DialogFooter","AlertDialog","open","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertTriangle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Settings-Hii-5oku.js","sources":["../../node_modules/lucide-react/dist/esm/icons/lock.js","../../node_modules/lucide-react/dist/esm/icons/user.js","../../src/pages/Settings.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n];\nconst User = createLucideIcon(\"user\", __iconNode);\n\nexport { __iconNode, User as default };\n//# sourceMappingURL=user.js.map\n","import { useCallback, useEffect, useState } from \"react\";\nimport {\n Settings,\n Loader2,\n CheckCircle2,\n XCircle,\n Sun,\n Moon,\n Monitor,\n User,\n Lock,\n Sparkles,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport api, { type AppConfig } from \"@/lib/api\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardHeader, CardContent } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { useThemeStore } from \"@/stores/theme\";\n\n/* ── Feedback toast inline ── */\ninterface Feedback {\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction FeedbackBanner({ feedback }: { feedback: Feedback | null }) {\n return (\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 text-sm\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400\"\n : \"bg-destructive/10 text-destructive\"\n )}\n >\n {feedback.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n ) : (\n <XCircle className=\"h-4 w-4 shrink-0\" />\n )}\n {feedback.message}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\n/* ── Skeleton ── */\nfunction SectionSkeleton() {\n return (\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader>\n <div className=\"h-5 w-32 animate-pulse rounded bg-muted\" />\n <div className=\"h-3.5 w-56 animate-pulse rounded bg-muted mt-1\" />\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n <div className=\"h-9 w-full animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\n/* ── Hook: auto-dismiss feedback ── */\nfunction useFeedback(): [Feedback | null, (f: Feedback) => void] {\n const [fb, setFb] = useState<Feedback | null>(null);\n const show = useCallback((f: Feedback) => {\n setFb(f);\n setTimeout(() => setFb(null), 4000);\n }, []);\n return [fb, show];\n}\n\n/* ── Fade wrapper ── */\nconst fadeIn = {\n initial: { opacity: 0, y: 16 },\n animate: { opacity: 1, y: 0 },\n transition: { duration: 0.35 },\n};\n\nexport function SettingsPage() {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /* Identity state */\n const [identity, setIdentity] = useState(\"\");\n const [defaultProvider, setDefaultProvider] = useState(\"\");\n const [tokenBudget, setTokenBudget] = useState(0);\n const [identitySaving, setIdentitySaving] = useState(false);\n const [identityFb, showIdentityFb] = useFeedback();\n\n /* Account state */\n const [unCurrent, setUnCurrent] = useState(\"\");\n const [newUsername, setNewUsername] = useState(\"\");\n const [unSaving, setUnSaving] = useState(false);\n const [unFb, showUnFb] = useFeedback();\n\n const [pwCurrent, setPwCurrent] = useState(\"\");\n const [newPassword, setNewPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [pwSaving, setPwSaving] = useState(false);\n const [pwFb, showPwFb] = useFeedback();\n\n /* Theme */\n const { theme, setTheme } = useThemeStore();\n\n const fetchConfig = useCallback(async () => {\n try {\n const cfg: AppConfig = await api.config.get();\n setIdentity(cfg.identity);\n setDefaultProvider(cfg.defaultProvider);\n setTokenBudget(cfg.tokenBudget);\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load settings\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n /* Handlers */\n const saveIdentity = async () => {\n setIdentitySaving(true);\n try {\n await api.config.update({ identity, defaultProvider, tokenBudget });\n showIdentityFb({ type: \"success\", message: \"Settings saved\" });\n } catch (e) {\n showIdentityFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Save failed\",\n });\n } finally {\n setIdentitySaving(false);\n }\n };\n\n const changeUsername = async () => {\n if (!unCurrent || !newUsername) {\n showUnFb({ type: \"error\", message: \"Both fields are required\" });\n return;\n }\n setUnSaving(true);\n try {\n await api.auth.changeUsername(unCurrent, newUsername);\n showUnFb({ type: \"success\", message: \"Username updated\" });\n setUnCurrent(\"\");\n setNewUsername(\"\");\n } catch (e) {\n showUnFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setUnSaving(false);\n }\n };\n\n const changePassword = async () => {\n if (!pwCurrent || !newPassword) {\n showPwFb({ type: \"error\", message: \"All fields are required\" });\n return;\n }\n if (newPassword !== confirmPassword) {\n showPwFb({ type: \"error\", message: \"Passwords do not match\" });\n return;\n }\n setPwSaving(true);\n try {\n await api.auth.changePassword(pwCurrent, newPassword);\n showPwFb({ type: \"success\", message: \"Password updated\" });\n setPwCurrent(\"\");\n setNewPassword(\"\");\n setConfirmPassword(\"\");\n } catch (e) {\n showPwFb({\n type: \"error\",\n message: e instanceof Error ? e.message : \"Update failed\",\n });\n } finally {\n setPwSaving(false);\n }\n };\n\n const themeOptions: { value: \"dark\" | \"light\" | \"system\"; label: string; icon: typeof Sun }[] = [\n { value: \"light\", label: \"Light\", icon: Sun },\n { value: \"dark\", label: \"Dark\", icon: Moon },\n { value: \"system\", label: \"System\", icon: Monitor },\n ];\n\n if (loading) {\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-10 w-10 animate-pulse rounded-xl bg-muted\" />\n <div>\n <div className=\"h-6 w-24 animate-pulse rounded bg-muted\" />\n <div className=\"h-4 w-48 animate-pulse rounded bg-muted mt-1\" />\n </div>\n </div>\n <SectionSkeleton />\n <SectionSkeleton />\n <SectionSkeleton />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20 ring-1 ring-[#00d4ff]/30\">\n <Settings className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Settings</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage agent identity, credentials, and preferences\n </p>\n </div>\n </div>\n\n {error && (\n <Card className=\"border-destructive/50 bg-destructive/5\">\n <CardContent className=\"flex items-center gap-3 py-4\">\n <XCircle className=\"h-5 w-5 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto\" onClick={fetchConfig}>\n Retry\n </Button>\n </CardContent>\n </Card>\n )}\n\n {/* ── Defaults Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"h-4 w-4 text-[#a78bfa]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Defaults</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Default provider and daily token budget\n </p>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Default Provider\n </label>\n <Input\n placeholder=\"openai\"\n value={defaultProvider}\n onChange={(e) => setDefaultProvider(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Daily Token Budget\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"100000\"\n value={tokenBudget || \"\"}\n onChange={(e) => setTokenBudget(Number(e.target.value))}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n\n <FeedbackBanner feedback={identityFb} />\n\n <div className=\"pt-1\">\n <Button\n size=\"sm\"\n onClick={saveIdentity}\n disabled={identitySaving}\n className=\"bg-gradient-to-r from-[#00d4ff] to-[#a78bfa] text-white hover:opacity-90 transition-opacity\"\n >\n {identitySaving && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n Save\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Account Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.1 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Account</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Update your login credentials\n </p>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Change Username */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <User className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Username\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Enter current password\"\n value={unCurrent}\n onChange={(e) => setUnCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Username\n </label>\n <Input\n placeholder=\"Enter new username\"\n value={newUsername}\n onChange={(e) => setNewUsername(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={unFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changeUsername}\n disabled={unSaving}\n >\n {unSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Username\n </Button>\n </div>\n\n <Separator className=\"bg-border/30\" />\n\n {/* Change Password */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Lock className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Change Password\n </span>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Current Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Current\"\n value={pwCurrent}\n onChange={(e) => setPwCurrent(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n New Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"New\"\n value={newPassword}\n onChange={(e) => setNewPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Confirm Password\n </label>\n <Input\n type=\"password\"\n placeholder=\"Confirm\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n className=\"bg-background/50\"\n />\n </div>\n </div>\n <FeedbackBanner feedback={pwFb} />\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={changePassword}\n disabled={pwSaving}\n >\n {pwSaving && <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />}\n Update Password\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n <Separator className=\"bg-border/40\" />\n\n {/* ── Appearance Section ── */}\n <motion.div {...fadeIn} transition={{ ...fadeIn.transition, delay: 0.2 }}>\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center gap-2\">\n <Sun className=\"h-4 w-4 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-medium text-foreground\">Appearance</h2>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Choose your preferred theme\n </p>\n </CardHeader>\n <CardContent>\n <div className=\"flex gap-2\">\n {themeOptions.map(({ value, label, icon: Icon }) => (\n <button\n key={value}\n onClick={() => setTheme(value)}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-all\",\n theme === value\n ? \"border-[#00d4ff]/50 bg-[#00d4ff]/10 text-[#00d4ff] ring-1 ring-[#00d4ff]/20\"\n : \"border-border/50 bg-background/50 text-muted-foreground hover:text-foreground hover:border-border\"\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Lock","createLucideIcon","User","FeedbackBanner","feedback","jsx","AnimatePresence","motion","jsxs","cn","CheckCircle2","XCircle","SectionSkeleton","Card","CardHeader","CardContent","i","useFeedback","fb","setFb","useState","show","useCallback","f","fadeIn","SettingsPage","loading","setLoading","error","setError","identity","setIdentity","defaultProvider","setDefaultProvider","tokenBudget","setTokenBudget","identitySaving","setIdentitySaving","identityFb","showIdentityFb","unCurrent","setUnCurrent","newUsername","setNewUsername","unSaving","setUnSaving","unFb","showUnFb","pwCurrent","setPwCurrent","newPassword","setNewPassword","confirmPassword","setConfirmPassword","pwSaving","setPwSaving","pwFb","showPwFb","theme","setTheme","useThemeStore","fetchConfig","cfg","api","e","useEffect","saveIdentity","changeUsername","changePassword","themeOptions","Sun","Moon","Monitor","Settings","Button","Sparkles","Input","Loader2","Separator","value","label","Icon"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Skills-BHJp2CgD.js","sources":["../../node_modules/lucide-react/dist/esm/icons/external-link.js","../../node_modules/lucide-react/dist/esm/icons/package.js","../../node_modules/lucide-react/dist/esm/icons/store.js","../../src/pages/Skills.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z\",\n key: \"1a0edw\"\n }\n ],\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }],\n [\"polyline\", { points: \"3.29 7 12 12 20.71 7\", key: \"ousv84\" }],\n [\"path\", { d: \"m7.5 4.27 9 5.15\", key: \"1c824w\" }]\n];\nconst Package = createLucideIcon(\"package\", __iconNode);\n\nexport { __iconNode, Package as default };\n//# sourceMappingURL=package.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7\", key: \"ztvudi\" }],\n [\"path\", { d: \"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\", key: \"1b2hhj\" }],\n [\"path\", { d: \"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4\", key: \"2ebpfo\" }],\n [\"path\", { d: \"M2 7h20\", key: \"1fcdvo\" }],\n [\n \"path\",\n {\n d: \"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7\",\n key: \"6c3vgh\"\n }\n ]\n];\nconst Store = createLucideIcon(\"store\", __iconNode);\n\nexport { __iconNode, Store as default };\n//# sourceMappingURL=store.js.map\n","import { useEffect, useState, useCallback } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Sparkles,\n Download,\n Loader2,\n Trash2,\n Power,\n PowerOff,\n Package,\n FolderOpen,\n CheckCircle2,\n XCircle,\n ExternalLink,\n Store,\n} from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@/components/ui/alert-dialog\";\nimport { cn } from \"@/lib/utils\";\nimport api, { type Skill } from \"@/lib/api\";\n\n/* ── Animations ─────────────────────────────────────────────── */\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.06, duration: 0.35, ease: \"easeOut\" as const },\n }),\n exit: { opacity: 0, y: -8, transition: { duration: 0.2 } },\n};\n\nconst stagger = {\n visible: { transition: { staggerChildren: 0.06 } },\n};\n\n/* ── Toast-style Feedback ───────────────────────────────────── */\n\ninterface Toast {\n id: number;\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction ToastBar({ toasts }: { toasts: Toast[] }) {\n return (\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-2\">\n <AnimatePresence>\n {toasts.map((t) => (\n <motion.div\n key={t.id}\n initial={{ opacity: 0, x: 40 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 40 }}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm\",\n t.type === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-400\"\n : \"border-destructive/30 bg-destructive/10 text-destructive\"\n )}\n >\n {t.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4\" />\n ) : (\n <XCircle className=\"h-4 w-4\" />\n )}\n {t.message}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Skeleton ───────────────────────────────────────────────── */\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div className={cn(\"animate-pulse rounded-lg bg-muted\", className)} />\n );\n}\n\nfunction SkillCardSkeleton() {\n return (\n <Card>\n <CardContent className=\"p-5 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-5 w-32\" />\n <Skeleton className=\"h-5 w-16 rounded-md\" />\n </div>\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-3 w-48\" />\n <div className=\"flex gap-2 pt-1\">\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-8 w-20\" />\n </div>\n </CardContent>\n </Card>\n );\n}\n\n/* ── Main Page ──────────────────────────────────────────────── */\n\nexport function SkillsPage() {\n const [skills, setSkills] = useState<Skill[]>([]);\n const [loading, setLoading] = useState(true);\n const [installUrl, setInstallUrl] = useState(\"\");\n const [installing, setInstalling] = useState(false);\n const [registryId, setRegistryId] = useState(\"\");\n const [installingRegistry, setInstallingRegistry] = useState(false);\n const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({});\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const toast = useCallback((type: \"success\" | \"error\", message: string) => {\n const id = Date.now();\n setToasts((prev) => [...prev, { id, type, message }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3500);\n }, []);\n\n const fetchSkills = useCallback(async () => {\n try {\n const res = await api.skills.list();\n setSkills(res.skills);\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to load skills\");\n } finally {\n setLoading(false);\n }\n }, [toast]);\n\n useEffect(() => {\n fetchSkills();\n }, [fetchSkills]);\n\n const handleInstall = async () => {\n if (!installUrl.trim()) return;\n setInstalling(true);\n try {\n const res = await api.skills.install(installUrl.trim());\n toast(\"success\", `Installed \"${res.name}\" successfully`);\n setInstallUrl(\"\");\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Installation failed\");\n } finally {\n setInstalling(false);\n }\n };\n\n const handleRegistryInstall = async () => {\n const id = registryId.trim();\n if (!id) return;\n setInstallingRegistry(true);\n try {\n const res = await api.skills.installFromRegistry(id);\n const verb =\n res.status === \"already-installed\"\n ? \"Already installed\"\n : res.status === \"updated\"\n ? \"Updated\"\n : res.status === \"reinstalled\"\n ? \"Reinstalled\"\n : \"Installed\";\n toast(\"success\", `${verb} \"${res.id}\" (v${res.version})`);\n setRegistryId(\"\");\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Registry install failed\");\n } finally {\n setInstallingRegistry(false);\n }\n };\n\n const handleToggle = async (skill: Skill) => {\n setActionLoading((prev) => ({ ...prev, [skill.name]: true }));\n try {\n if (skill.active) {\n await api.skills.deactivate(skill.name);\n toast(\"success\", `Deactivated \"${skill.name}\"`);\n } else {\n await api.skills.activate(skill.name);\n toast(\"success\", `Activated \"${skill.name}\"`);\n }\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Toggle failed\");\n } finally {\n setActionLoading((prev) => ({ ...prev, [skill.name]: false }));\n }\n };\n\n const handleDelete = async (name: string) => {\n setActionLoading((prev) => ({ ...prev, [name]: true }));\n try {\n await api.skills.delete(name);\n toast(\"success\", `Deleted \"${name}\"`);\n await fetchSkills();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Delete failed\");\n } finally {\n setActionLoading((prev) => ({ ...prev, [name]: false }));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10\">\n <Sparkles className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Skills</h1>\n <p className=\"text-sm text-muted-foreground\">\n Extend Mercury with installable capabilities\n </p>\n </div>\n </div>\n </motion.div>\n\n {/* Install Section */}\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.1, duration: 0.3 }}\n >\n <Card>\n <CardContent className=\"p-5 space-y-5\">\n {/* Registry install */}\n <div>\n <div className=\"flex items-center justify-between gap-3 mb-3\">\n <div className=\"flex items-center gap-2\">\n <Store className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Install from registry\n </span>\n </div>\n <a\n href=\"https://skills.mercuryagent.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-[#00d4ff] transition-colors\"\n >\n Browse skills.mercuryagent.sh\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </div>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleRegistryInstall();\n }}\n className=\"flex gap-3\"\n >\n <Input\n placeholder=\"category/skill-slug e.g. finance-legal/contract-review\"\n value={registryId}\n onChange={(e) => setRegistryId(e.target.value)}\n disabled={installingRegistry}\n className=\"flex-1 font-mono text-sm\"\n />\n <Button\n type=\"submit\"\n disabled={installingRegistry || !registryId.trim()}\n >\n {installingRegistry ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Installing\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n </form>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Review any skill on the registry before installing — they execute\n with your agent's privileges.\n </p>\n </div>\n\n <div className=\"h-px bg-border\" />\n\n {/* URL install */}\n <div>\n <div className=\"flex items-center gap-2 mb-3\">\n <Download className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">\n Install from URL\n </span>\n </div>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleInstall();\n }}\n className=\"flex gap-3\"\n >\n <Input\n placeholder=\"https://github.com/user/skill-package\"\n value={installUrl}\n onChange={(e) => setInstallUrl(e.target.value)}\n disabled={installing}\n className=\"flex-1\"\n />\n <Button\n type=\"submit\"\n variant=\"outline\"\n disabled={installing || !installUrl.trim()}\n >\n {installing ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Installing\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n </form>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Skills List */}\n {loading ? (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <SkillCardSkeleton key={i} />\n ))}\n </div>\n ) : skills.length === 0 ? (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.2 }}\n >\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-muted mb-4\">\n <Package className=\"h-7 w-7 text-muted-foreground\" />\n </div>\n <h3 className=\"text-base font-medium text-foreground mb-1\">\n No skills installed\n </h3>\n <p className=\"text-sm text-muted-foreground max-w-sm\">\n Install skills from a URL above to extend Mercury's capabilities\n with new tools, workflows, and integrations.\n </p>\n </CardContent>\n </Card>\n </motion.div>\n ) : (\n <motion.div\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\"\n variants={stagger}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <AnimatePresence mode=\"popLayout\">\n {skills.map((skill, i) => (\n <motion.div\n key={skill.name}\n custom={i}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n layout\n >\n <Card className=\"h-full\">\n <CardContent className=\"p-5 flex flex-col gap-3 h-full\">\n {/* Name + Status */}\n <div className=\"flex items-start justify-between gap-3\">\n <h3 className=\"text-sm font-semibold text-foreground leading-tight\">\n {skill.name}\n </h3>\n <Badge variant={skill.active ? \"success\" : \"secondary\"}>\n {skill.active ? \"Active\" : \"Inactive\"}\n </Badge>\n </div>\n\n {/* Description */}\n {skill.description && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {skill.description}\n </p>\n )}\n\n {/* Path */}\n <div className=\"flex items-center gap-1.5 mt-auto\">\n <FolderOpen className=\"h-3 w-3 text-muted-foreground/60 shrink-0\" />\n <span className=\"text-xs text-muted-foreground/60 truncate font-mono\">\n {skill.path}\n </span>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 pt-1 border-t border-border\">\n <Button\n size=\"sm\"\n variant={skill.active ? \"outline\" : \"default\"}\n disabled={!!actionLoading[skill.name]}\n onClick={() => handleToggle(skill)}\n className=\"flex-1\"\n >\n {actionLoading[skill.name] ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : skill.active ? (\n <>\n <PowerOff className=\"h-3.5 w-3.5\" />\n Deactivate\n </>\n ) : (\n <>\n <Power className=\"h-3.5 w-3.5\" />\n Activate\n </>\n )}\n </Button>\n\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={!!actionLoading[skill.name]}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Skill</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete “{skill.name}”?\n This will remove the skill and all its data permanently.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => handleDelete(skill.name)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n ))}\n </AnimatePresence>\n </motion.div>\n )}\n\n <ToastBar toasts={toasts} />\n </div>\n );\n}\n"],"names":["__iconNode","ExternalLink","createLucideIcon","Package","Store","fadeUp","i","stagger","ToastBar","toasts","jsx","AnimatePresence","t","jsxs","motion","cn","CheckCircle2","XCircle","Skeleton","className","SkillCardSkeleton","Card","CardContent","SkillsPage","skills","setSkills","useState","loading","setLoading","installUrl","setInstallUrl","installing","setInstalling","registryId","setRegistryId","installingRegistry","setInstallingRegistry","actionLoading","setActionLoading","setToasts","toast","useCallback","type","message","id","prev","fetchSkills","res","api","err","useEffect","handleInstall","handleRegistryInstall","verb","handleToggle","skill","handleDelete","name","Sparkles","e","Input","Button","Fragment","Loader2","Download","_","Badge","FolderOpen","PowerOff","Power","AlertDialog","AlertDialogTrigger","Trash2","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Tasks-D36pqkro.js","sources":["../../node_modules/lucide-react/dist/esm/icons/square-check-big.js","../../src/pages/Tasks.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 10.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.5\", key: \"1uzm8b\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst SquareCheckBig = createLucideIcon(\"square-check-big\", __iconNode);\n\nexport { __iconNode, SquareCheckBig as default };\n//# sourceMappingURL=square-check-big.js.map\n","import { CheckSquare } from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\n\nexport function TasksPage() {\n return (\n <div className=\"space-y-4 p-6\">\n <div className=\"flex items-center gap-2\">\n <CheckSquare className=\"h-6 w-6 text-muted-foreground\" />\n <h1 className=\"text-2xl font-semibold text-foreground\">Tasks</h1>\n </div>\n <Card>\n <CardContent className=\"py-8 text-center text-muted-foreground\">\n Task management coming soon.\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"names":["__iconNode","SquareCheckBig","createLucideIcon","TasksPage","jsxs","jsx","CheckSquare","Card","CardContent"],"mappings":"gPAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,iEAAkE,IAAK,QAAQ,CAAE,EAC/F,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,EACMC,EAAiBC,EAAiB,mBAAoBF,CAAU,ECV/D,SAASG,GAAY,CAC1B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,+BAAA,CAAgC,EACvDD,EAAAA,IAAC,KAAA,CAAG,UAAU,yCAAyC,SAAA,OAAA,CAAK,CAAA,EAC9D,QACCE,EAAA,CACC,SAAAF,MAACG,GAAY,UAAU,yCAAyC,wCAEhE,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Usage-CmjaYrsT.js","sources":["../../node_modules/lucide-react/dist/esm/icons/globe.js","../../node_modules/lucide-react/dist/esm/icons/trending-down.js","../../src/pages/Usage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 17h6v-6\", key: \"t6n2it\" }],\n [\"path\", { d: \"m22 17-8.5-8.5-5 5L2 7\", key: \"x473p\" }]\n];\nconst TrendingDown = createLucideIcon(\"trending-down\", __iconNode);\n\nexport { __iconNode, TrendingDown as default };\n//# sourceMappingURL=trending-down.js.map\n","import { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport {\n BarChart3,\n Zap,\n TrendingDown,\n Activity,\n Globe,\n Terminal,\n MessageSquare,\n} from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn, formatDate, formatTokens } from \"@/lib/utils\";\nimport api, { type UsageData } from \"@/lib/api\";\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.07, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div\n className={cn(\"animate-pulse rounded-lg bg-muted\", className)}\n />\n );\n}\n\nconst PROVIDER_COLORS: Record<string, string> = {\n openai: \"#10b981\",\n anthropic: \"#f59e0b\",\n google: \"#3b82f6\",\n groq: \"#ef4444\",\n ollama: \"#8b5cf6\",\n openrouter: \"#ec4899\",\n};\n\nconst CHANNEL_ICONS: Record<string, React.ElementType> = {\n web: Globe,\n telegram: MessageSquare,\n cli: Terminal,\n};\n\nfunction getProviderColor(provider: string): string {\n return PROVIDER_COLORS[provider.toLowerCase()] ?? \"#6b7280\";\n}\n\nfunction getChannelIcon(channel: string): React.ElementType {\n return CHANNEL_ICONS[channel.toLowerCase()] ?? Activity;\n}\n\nexport function UsagePage() {\n const [data, setData] = useState<UsageData | null>(null);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n api.usage\n .get()\n .then(setData)\n .catch((err: Error) => setError(err.message));\n }, []);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-8\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-8 w-32\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-[130px]\" />\n ))}\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Skeleton className=\"h-[240px]\" />\n <Skeleton className=\"h-[240px]\" />\n </div>\n <Skeleton className=\"h-[320px]\" />\n </div>\n );\n }\n\n const budgetPct = data.dailyBudget\n ? Math.min(Math.round((data.dailyUsed / data.dailyBudget) * 100), 100)\n : 0;\n\n const providerEntries = Object.entries(data.byProvider);\n const providerTotal = providerEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n const channelEntries = Object.entries(data.byChannel);\n const channelTotal = channelEntries.reduce((s, [, v]) => s + v, 0) || 1;\n\n return (\n <div className=\"space-y-6 p-6 lg:p-8\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n >\n <h1 className=\"text-2xl font-bold tracking-tight\">Usage</h1>\n <p className=\"text-sm text-muted-foreground\">\n Token consumption and budget tracking\n </p>\n </motion.div>\n\n {/* Hero Stat Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {/* Daily Used / Budget */}\n <motion.div custom={0} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card className=\"mercury-glow-sm\">\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Daily Used / Budget\n </CardTitle>\n <Zap className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.dailyUsed)}\n <span className=\"ml-1 text-sm font-normal text-muted-foreground\">\n / {formatTokens(data.dailyBudget)}\n </span>\n </p>\n <Progress value={budgetPct} className=\"mt-3\" />\n <p className=\"mt-1.5 text-xs text-muted-foreground tabular-nums\">\n {budgetPct}% consumed\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Remaining */}\n <motion.div custom={1} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Remaining\n </CardTitle>\n <TrendingDown className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {formatTokens(data.remaining)}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n tokens left today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n\n {/* Total Requests */}\n <motion.div custom={2} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">\n Total Requests\n </CardTitle>\n <Activity className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-2xl font-bold tabular-nums\">\n {data.requestLog.length.toLocaleString()}\n </p>\n <p className=\"mt-1.5 text-xs text-muted-foreground\">\n requests today\n </p>\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Breakdown Section */}\n <div className=\"grid gap-4 md:grid-cols-2\">\n {/* By Provider */}\n <motion.div custom={3} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BarChart3 className=\"h-4 w-4\" />\n Usage by Provider\n </CardTitle>\n </CardHeader>\n <CardContent>\n {providerEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No provider usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {providerEntries\n .sort(([, a], [, b]) => b - a)\n .map(([provider, tokens]) => {\n const pct = Math.round((tokens / providerTotal) * 100);\n const color = getProviderColor(provider);\n return (\n <div key={provider} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"secondary\" className=\"capitalize\">\n {provider}\n </Badge>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.3 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n\n {/* By Channel */}\n <motion.div custom={4} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Globe className=\"h-4 w-4\" />\n Usage by Channel\n </CardTitle>\n </CardHeader>\n <CardContent>\n {channelEntries.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No channel usage recorded yet.\n </p>\n ) : (\n <div className=\"flex flex-col gap-4\">\n {channelEntries\n .sort(([, a], [, b]) => b - a)\n .map(([channel, tokens], idx) => {\n const pct = Math.round((tokens / channelTotal) * 100);\n const ChannelIcon = getChannelIcon(channel);\n const colors = [\"#00d4ff\", \"#8b5cf6\", \"#f59e0b\", \"#10b981\"];\n const color = colors[idx % colors.length];\n return (\n <div key={channel} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <Badge variant=\"secondary\" className=\"capitalize\">\n {channel}\n </Badge>\n </div>\n <span className=\"text-sm font-medium tabular-nums text-muted-foreground\">\n {formatTokens(tokens)}{\" \"}\n <span className=\"text-xs\">({pct}%)</span>\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <motion.div\n className=\"h-full rounded-full\"\n style={{ backgroundColor: color }}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.35 }}\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n\n {/* Request Log */}\n <motion.div custom={5} variants={fadeUp} initial=\"hidden\" animate=\"visible\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Request Log\n </CardTitle>\n </CardHeader>\n <CardContent>\n {data.requestLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No requests recorded yet.\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border text-left\">\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Time\n </th>\n <th className=\"pb-3 pr-4 font-medium text-muted-foreground\">\n Provider\n </th>\n <th className=\"pb-3 text-right font-medium text-muted-foreground\">\n Tokens\n </th>\n </tr>\n </thead>\n <tbody>\n {data.requestLog\n .slice()\n .reverse()\n .slice(0, 50)\n .map((entry, idx) => (\n <motion.tr\n key={`${entry.timestamp}-${idx}`}\n className=\"border-b border-border/50 last:border-0\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.4 + idx * 0.02, duration: 0.2 }}\n >\n <td className=\"py-2.5 pr-4 tabular-nums text-muted-foreground\">\n {formatDate(entry.timestamp)}\n </td>\n <td className=\"py-2.5 pr-4\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {entry.provider}\n </Badge>\n </td>\n <td className=\"py-2.5 text-right font-medium tabular-nums\">\n {formatTokens(entry.totalTokens)}\n </td>\n </motion.tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n </motion.div>\n </div>\n );\n}\n"],"names":["__iconNode","Globe","createLucideIcon","TrendingDown","fadeUp","i","Skeleton","className","jsx","cn","PROVIDER_COLORS","CHANNEL_ICONS","MessageSquare","Terminal","getProviderColor","provider","getChannelIcon","channel","Activity","UsagePage","data","setData","useState","error","setError","useEffect","api","err","jsxs","_","budgetPct","providerEntries","providerTotal","v","channelEntries","channelTotal","motion","Card","CardHeader","CardTitle","Zap","CardContent","formatTokens","Progress","BarChart3","a","b","tokens","pct","color","Badge","idx","ChannelIcon","colors","entry","formatDate"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace-BYLf-wTJ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../node_modules/lucide-react/dist/esm/icons/folder-input.js","../../node_modules/lucide-react/dist/esm/icons/folder-tree.js","../../node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../node_modules/lucide-react/dist/esm/icons/minimize-2.js","../../node_modules/lucide-react/dist/esm/icons/minus.js","../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../node_modules/lucide-react/dist/esm/icons/upload.js","../../src/pages/Workspace.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n];\nconst FileCode = createLucideIcon(\"file-code\", __iconNode);\n\nexport { __iconNode, FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n];\nconst FolderInput = createLucideIcon(\"folder-input\", __iconNode);\n\nexport { __iconNode, FolderInput as default };\n//# sourceMappingURL=folder-input.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"hod4my\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"w4yl2u\"\n }\n ],\n [\"path\", { d: \"M3 5a2 2 0 0 0 2 2h3\", key: \"f2jnh7\" }],\n [\"path\", { d: \"M3 3v13a2 2 0 0 0 2 2h3\", key: \"k8epm1\" }]\n];\nconst FolderTree = createLucideIcon(\"folder-tree\", __iconNode);\n\nexport { __iconNode, FolderTree as default };\n//# sourceMappingURL=folder-tree.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"line\", { x1: \"3\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1dyftd\" }],\n [\"line\", { x1: \"15\", x2: \"21\", y1: \"12\", y2: \"12\", key: \"oup4p8\" }]\n];\nconst GitCommitHorizontal = createLucideIcon(\"git-commit-horizontal\", __iconNode);\n\nexport { __iconNode, GitCommitHorizontal as default };\n//# sourceMappingURL=git-commit-horizontal.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"m21 3-7 7\", key: \"1l2asr\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M9 21H3v-6\", key: \"wtvkvv\" }]\n];\nconst Maximize2 = createLucideIcon(\"maximize-2\", __iconNode);\n\nexport { __iconNode, Maximize2 as default };\n//# sourceMappingURL=maximize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m14 10 7-7\", key: \"oa77jy\" }],\n [\"path\", { d: \"M20 10h-6V4\", key: \"mjg0md\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M4 14h6v6\", key: \"rmj7iw\" }]\n];\nconst Minimize2 = createLucideIcon(\"minimize-2\", __iconNode);\n\nexport { __iconNode, Minimize2 as default };\n//# sourceMappingURL=minimize-2.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]];\nconst Minus = createLucideIcon(\"minus\", __iconNode);\n\nexport { __iconNode, Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.511.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n ChevronRight,\n ChevronDown,\n File,\n Folder,\n FolderOpen,\n X,\n GitBranch,\n GitCommit as GitCommitIcon,\n GitPullRequest,\n Plus,\n Minus,\n Check,\n Upload,\n Download,\n RefreshCw,\n Terminal as TerminalIcon,\n MessageSquare,\n Send,\n Loader2,\n Circle,\n FileCode,\n FileText,\n FolderTree,\n ArrowUp,\n ArrowDown,\n Search,\n MoreHorizontal,\n Copy,\n Eye,\n Zap,\n Play,\n Sparkles,\n FolderInput,\n Maximize2,\n Minimize2,\n} from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport { Badge } from \"@/components/ui/badge\";\nimport api from \"@/lib/api\";\nimport type {\n WorkspaceTree,\n WorkspaceFile,\n WorkspaceInfo,\n GitStatus,\n GitFile,\n GitBranch as GitBranchType,\n GitCommit,\n TerminalResult,\n} from \"@/lib/api\";\nimport { useChatStore } from \"@/stores/chat\";\nimport { useSSE } from \"@/hooks/useSSE\";\nimport { MarkdownRenderer } from \"@/components/chat/MarkdownRenderer\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\n\n// ═══════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════\n\ninterface OpenTab {\n path: string;\n name: string;\n content: string;\n language: string;\n dirty: boolean;\n originalContent: string;\n}\n\ninterface TerminalEntry {\n id: string;\n command: string;\n output: string;\n exitCode: number;\n timestamp: number;\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Utilities\n// ═══════════════════════════════════════════════════════════════\n\nfunction extToLanguage(ext: string): string {\n const map: Record<string, string> = {\n \".ts\": \"typescript\", \".tsx\": \"tsx\", \".js\": \"javascript\", \".jsx\": \"jsx\",\n \".py\": \"python\", \".rs\": \"rust\", \".go\": \"go\", \".java\": \"java\",\n \".json\": \"json\", \".yaml\": \"yaml\", \".yml\": \"yaml\", \".toml\": \"toml\",\n \".md\": \"markdown\", \".txt\": \"text\", \".css\": \"css\", \".html\": \"html\",\n \".sh\": \"bash\", \".bash\": \"bash\", \".zsh\": \"bash\", \".sql\": \"sql\",\n \".xml\": \"xml\", \".svg\": \"xml\", \".dockerfile\": \"docker\",\n \".env\": \"text\", \".gitignore\": \"text\", \".c\": \"c\", \".cpp\": \"cpp\",\n \".h\": \"c\", \".hpp\": \"cpp\", \".rb\": \"ruby\", \".php\": \"php\",\n \".swift\": \"swift\", \".kt\": \"kotlin\", \".scala\": \"scala\",\n \".lua\": \"lua\", \".r\": \"r\", \".dart\": \"dart\", \".graphql\": \"graphql\",\n \".scss\": \"scss\", \".less\": \"less\", \".vue\": \"markup\",\n \".prisma\": \"text\", \".proto\": \"protobuf\",\n };\n return map[ext.toLowerCase()] || \"text\";\n}\n\nfunction fileIcon(name: string, isDir: boolean, isOpen?: boolean) {\n if (isDir) {\n return isOpen\n ? <FolderOpen className=\"h-4 w-4 text-mercury-400\" />\n : <Folder className=\"h-4 w-4 text-mercury-400/70\" />;\n }\n const ext = name.includes(\".\") ? \".\" + name.split(\".\").pop()! : \"\";\n const codeExts = [\".ts\", \".tsx\", \".js\", \".jsx\", \".py\", \".rs\", \".go\", \".java\", \".sh\"];\n if (codeExts.includes(ext)) return <FileCode className=\"h-4 w-4 text-blue-400\" />;\n return <FileText className=\"h-4 w-4 text-muted-foreground\" />;\n}\n\nfunction statusColor(status: string): string {\n switch (status) {\n case \"modified\": return \"text-amber-400\";\n case \"added\": return \"text-emerald-400\";\n case \"deleted\": return \"text-red-400\";\n case \"untracked\": return \"text-gray-400\";\n case \"renamed\": return \"text-purple-400\";\n default: return \"text-muted-foreground\";\n }\n}\n\nfunction statusIcon(status: string) {\n switch (status) {\n case \"modified\": return <span className=\"text-amber-400 text-xs font-bold\">M</span>;\n case \"added\": return <span className=\"text-emerald-400 text-xs font-bold\">A</span>;\n case \"deleted\": return <span className=\"text-red-400 text-xs font-bold\">D</span>;\n case \"untracked\": return <span className=\"text-gray-400 text-xs font-bold\">U</span>;\n case \"renamed\": return <span className=\"text-purple-400 text-xs font-bold\">R</span>;\n default: return <span className=\"text-muted-foreground text-xs\">?</span>;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════\n// File Explorer Panel (Left)\n// ═══════════════════════════════════════════════════════════════\n\nfunction FileExplorer({\n onOpenFile,\n openFiles,\n}: {\n onOpenFile: (path: string) => void;\n openFiles: string[];\n}) {\n const [tree, setTree] = useState<WorkspaceTree | null>(null);\n const [expandedDirs, setExpandedDirs] = useState<Set<string>>(new Set([\".\"]));\n const [dirContents, setDirContents] = useState<Map<string, WorkspaceTree>>(new Map());\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n loadDir();\n }, []);\n\n async function loadDir(path?: string) {\n try {\n const data = await api.workspace.tree(path);\n if (!path || path === \".\") {\n setTree(data);\n setLoading(false);\n } else {\n setDirContents((prev) => new Map(prev).set(path, data));\n }\n } catch {\n setLoading(false);\n }\n }\n\n function toggleDir(path: string) {\n const next = new Set(expandedDirs);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n if (!dirContents.has(path)) {\n loadDir(path);\n }\n }\n setExpandedDirs(next);\n }\n\n function renderItems(items: WorkspaceTree[\"items\"], parentPath: string) {\n return items.map((item) => {\n const fullPath = parentPath === \".\" ? item.name : `${parentPath}/${item.name}`;\n const isExpanded = expandedDirs.has(fullPath);\n const isOpen = openFiles.includes(fullPath);\n\n if (item.isDirectory) {\n const subTree = dirContents.get(fullPath);\n return (\n <div key={fullPath}>\n <button\n onClick={() => toggleDir(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n \"hover:bg-muted/60\"\n )}\n >\n {isExpanded\n ? <ChevronDown className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n : <ChevronRight className=\"h-3 w-3 shrink-0 text-muted-foreground\" />\n }\n {fileIcon(item.name, true, isExpanded)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n {isExpanded && subTree && (\n <div className=\"ml-3 border-l border-border/30 pl-1\">\n {renderItems(subTree.items, fullPath)}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <button\n key={fullPath}\n onClick={() => onOpenFile(fullPath)}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors\",\n isOpen\n ? \"bg-primary/10 text-primary\"\n : \"hover:bg-muted/60 text-foreground/80\"\n )}\n >\n <span className=\"w-3\" />\n {fileIcon(item.name, false)}\n <span className=\"truncate\">{item.name}</span>\n </button>\n );\n });\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <FolderTree className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Explorer\n </span>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={() => loadDir()}>\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n </div>\n <ScrollArea className=\"flex-1 px-1 py-1\">\n {tree && renderItems(tree.items, \".\")}\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Editor Tabs Panel (Center)\n// ═══════════════════════════════════════════════════════════════\n\nfunction EditorPanel({\n tabs,\n activeTab,\n onSelectTab,\n onCloseTab,\n onSave,\n onContentChange,\n}: {\n tabs: OpenTab[];\n activeTab: string | null;\n onSelectTab: (path: string) => void;\n onCloseTab: (path: string) => void;\n onSave: (path: string) => void;\n onContentChange: (path: string, content: string) => void;\n}) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const current = tabs.find((t) => t.path === activeTab);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if ((e.metaKey || e.ctrlKey) && e.key === \"s\") {\n e.preventDefault();\n if (activeTab) onSave(activeTab);\n }\n }\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [activeTab, onSave]);\n\n if (tabs.length === 0) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-4 text-center\">\n <div className=\"rounded-2xl bg-primary/10 p-6\">\n <FileCode className=\"h-12 w-12 text-primary/60\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">No files open</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Select a file from the explorer to start editing\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-0 overflow-x-auto border-b border-border bg-muted/20\">\n {tabs.map((tab) => (\n <button\n key={tab.path}\n onClick={() => onSelectTab(tab.path)}\n className={cn(\n \"group flex items-center gap-2 border-r border-border/30 px-3 py-1.5 text-[13px] transition-colors\",\n tab.path === activeTab\n ? \"bg-background text-foreground border-b-2 border-b-primary\"\n : \"text-muted-foreground hover:bg-muted/40 hover:text-foreground\"\n )}\n >\n {fileIcon(tab.name, false)}\n <span className=\"max-w-[120px] truncate\">{tab.name}</span>\n {tab.dirty && (\n <Circle className=\"h-2 w-2 fill-primary text-primary\" />\n )}\n <button\n onClick={(e) => { e.stopPropagation(); onCloseTab(tab.path); }}\n className=\"ml-1 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-muted\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </button>\n ))}\n </div>\n\n {/* Editor area */}\n {current && (\n <div className=\"relative flex flex-col flex-1 min-h-0\">\n {/* Info bar */}\n <div className=\"flex items-center justify-between border-b border-border/30 bg-muted/10 px-3 py-1\">\n <span className=\"text-xs text-muted-foreground font-mono\">{current.path}</span>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0\">\n {current.language}\n </Badge>\n {current.dirty && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-5 gap-1 px-2 text-[10px]\" onClick={() => onSave(current.path)}>\n <span className=\"text-primary\">Save</span>\n <span className=\"text-muted-foreground\">Cmd+S</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Code content — syntax highlighted with editable overlay */}\n <div className=\"flex-1 min-h-0 overflow-auto bg-[#282c34]\" ref={scrollRef} onClick={() => textareaRef.current?.focus()}>\n <div className=\"relative\" style={{ minWidth: \"fit-content\" }}>\n {/* Syntax highlighted layer (visual) */}\n <SyntaxHighlighter\n language={current.language}\n style={oneDark}\n showLineNumbers\n lineNumberStyle={{\n minWidth: \"3em\",\n paddingRight: \"1em\",\n color: \"rgba(255,255,255,0.25)\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n userSelect: \"none\",\n }}\n customStyle={{\n margin: 0,\n padding: \"0.5rem 0\",\n background: \"transparent\",\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n }}\n codeTagProps={{\n style: {\n fontSize: \"13px\",\n lineHeight: \"20px\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n },\n }}\n wrapLongLines={false}\n >\n {current.content || \" \"}\n </SyntaxHighlighter>\n {/* Transparent textarea overlay for editing */}\n <textarea\n ref={textareaRef}\n value={current.content}\n onChange={(e) => onContentChange(current.path, e.target.value)}\n spellCheck={false}\n className={cn(\n \"absolute top-0 left-0 w-full h-full resize-none bg-transparent text-transparent caret-white\",\n \"font-mono text-[13px] leading-[20px]\",\n \"focus:outline-none\",\n \"whitespace-pre\",\n \"pointer-events-none focus:pointer-events-auto\"\n )}\n style={{\n tabSize: 2,\n padding: \"0.5rem 0 0.5rem 4.5em\",\n fontFamily: \"var(--font-mono, 'Geist Mono', ui-monospace, monospace)\",\n overflow: \"hidden\",\n }}\n onFocus={() => {\n // Enable pointer events while editing\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"auto\";\n }\n }}\n onBlur={() => {\n // Disable pointer events when not editing so scroll passes through\n if (textareaRef.current) {\n textareaRef.current.style.pointerEvents = \"none\";\n }\n }}\n onWheel={(e) => {\n // Forward wheel events to parent scroll container while focused\n if (scrollRef.current) {\n scrollRef.current.scrollTop += e.deltaY;\n scrollRef.current.scrollLeft += e.deltaX;\n }\n }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Git Panel (Right)\n// ═══════════════════════════════════════════════════════════════\n\nfunction GitPanel() {\n const [gitStatus, setGitStatus] = useState<GitStatus | null>(null);\n const [branches, setBranches] = useState<GitBranchType[]>([]);\n const [commits, setCommits] = useState<GitCommit[]>([]);\n const [commitMsg, setCommitMsg] = useState(\"\");\n const [showBranches, setShowBranches] = useState(false);\n const [showLog, setShowLog] = useState(false);\n const [loading, setLoading] = useState(true);\n const [refreshing, setRefreshing] = useState(false);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n const [feedback, setFeedback] = useState<{ type: \"success\" | \"error\"; msg: string } | null>(null);\n\n const refresh = useCallback(async (showToast: boolean = false) => {\n setRefreshing(true);\n try {\n const [statusData, branchData, logData] = await Promise.all([\n api.git.status(),\n api.git.branches(),\n api.git.log(15),\n ]);\n setGitStatus(statusData);\n setBranches(branchData.branches);\n setCommits(logData.commits);\n if (showToast) {\n setFeedback({ type: \"success\", msg: \"Refreshed\" });\n setTimeout(() => setFeedback(null), 1500);\n }\n } catch (err: any) {\n setFeedback({ type: \"error\", msg: err.message });\n } finally {\n setLoading(false);\n setRefreshing(false);\n }\n }, []);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n function showFeedbackMsg(type: \"success\" | \"error\", msg: string) {\n setFeedback({ type, msg });\n setTimeout(() => setFeedback(null), 3000);\n }\n\n async function handleStage(files: string[]) {\n setActionLoading(\"stage\");\n try {\n await api.git.stage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleUnstage(files: string[]) {\n setActionLoading(\"unstage\");\n try {\n await api.git.unstage(files);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCommit() {\n if (!commitMsg.trim()) return;\n setActionLoading(\"commit\");\n try {\n const result = await api.git.commit(commitMsg.trim());\n setCommitMsg(\"\");\n showFeedbackMsg(\"success\", \"Committed successfully\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePush() {\n setActionLoading(\"push\");\n try {\n const result = await api.git.push();\n showFeedbackMsg(\"success\", result.message || \"Pushed\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handlePull() {\n setActionLoading(\"pull\");\n try {\n const result = await api.git.pull();\n showFeedbackMsg(\"success\", result.message || \"Pulled\");\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleCheckout(branch: string) {\n setActionLoading(\"checkout\");\n try {\n await api.git.checkout(branch);\n showFeedbackMsg(\"success\", `Switched to ${branch}`);\n setShowBranches(false);\n await refresh();\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n async function handleGenerateMessage() {\n setActionLoading(\"generate\");\n try {\n // Auto-stage all unstaged files first\n const unstaged = gitStatus?.files.filter((f) => !f.staged) || [];\n if (unstaged.length > 0) {\n await api.git.stage([\".\"]);\n await refresh();\n }\n const result = await api.git.generateCommitMessage();\n const msg = typeof result === \"string\" ? result : result?.message || \"\";\n if (msg) {\n setCommitMsg(msg);\n showFeedbackMsg(\"success\", \"Message generated\");\n } else {\n showFeedbackMsg(\"error\", \"No message returned\");\n }\n } catch (err: any) {\n showFeedbackMsg(\"error\", err.message);\n } finally {\n setActionLoading(null);\n }\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-5 w-5 animate-spin text-primary\" />\n </div>\n );\n }\n\n const stagedFiles = gitStatus?.files.filter((f) => f.staged) || [];\n const unstagedFiles = gitStatus?.files.filter((f) => !f.staged) || [];\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <GitBranch className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Source Control\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePull} disabled={!!actionLoading}>\n <Download className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={handlePush} disabled={!!actionLoading}>\n <Upload className=\"h-3 w-3\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={() => refresh(true)}\n disabled={!!actionLoading || refreshing}\n title=\"Refresh\"\n aria-label=\"Refresh\"\n >\n <RefreshCw className={cn(\"h-3 w-3\", refreshing && \"animate-spin\")} />\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"flex-1\">\n <div className=\"p-2 space-y-3\">\n {/* Feedback */}\n <AnimatePresence>\n {feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className={cn(\n \"rounded-md px-3 py-1.5 text-xs\",\n feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\"\n : \"bg-red-500/10 text-red-400 border border-red-500/20\"\n )}\n >\n {feedback.msg}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Branch info */}\n <div className=\"space-y-1\">\n <button\n onClick={() => setShowBranches(!showBranches)}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted/60\"\n >\n <GitBranch className=\"h-3.5 w-3.5 text-primary\" />\n <span className=\"font-medium\">{gitStatus?.branch || \"—\"}</span>\n {gitStatus && gitStatus.ahead > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowUp className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.ahead}\n </Badge>\n )}\n {gitStatus && gitStatus.behind > 0 && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n <ArrowDown className=\"h-2.5 w-2.5 mr-0.5\" />{gitStatus.behind}\n </Badge>\n )}\n <ChevronRight className={cn(\"ml-auto h-3 w-3 transition-transform\", showBranches && \"rotate-90\")} />\n </button>\n\n {/* Branch picker */}\n <AnimatePresence>\n {showBranches && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"ml-2 space-y-0.5 border-l border-border/30 pl-2 py-1\">\n {branches.filter((b) => !b.name.startsWith(\"remotes/\")).map((b) => (\n <button\n key={b.name}\n onClick={() => !b.isCurrent && handleCheckout(b.name)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1 text-xs transition-colors\",\n b.isCurrent\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\"\n )}\n disabled={b.isCurrent || !!actionLoading}\n >\n {b.isCurrent && <Check className=\"h-3 w-3\" />}\n <span className=\"truncate\">{b.name}</span>\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n\n {/* Commit input */}\n <div className=\"space-y-1.5\">\n <div className=\"relative\">\n <textarea\n value={commitMsg}\n onChange={(e) => setCommitMsg(e.target.value)}\n placeholder=\"Commit message...\"\n rows={2}\n className={cn(\n \"w-full resize-none rounded-lg border border-border bg-muted/30 px-3 py-2 pr-9 text-sm text-foreground\",\n \"placeholder:text-muted-foreground/60 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n )}\n />\n {/* Generate button inside textarea */}\n <button\n onClick={handleGenerateMessage}\n disabled={!!actionLoading}\n title=\"AI generate commit message\"\n className={cn(\n \"absolute right-2 top-2 rounded-md p-1.5 transition-colors border border-border/50\",\n \"text-primary/70 hover:text-primary hover:bg-primary/10 bg-background/80\",\n actionLoading === \"generate\" && \"animate-pulse\"\n )}\n >\n {actionLoading === \"generate\"\n ? <Loader2 className=\"h-4 w-4 animate-spin text-primary\" />\n : <Sparkles className=\"h-4 w-4\" />\n }\n </button>\n </div>\n <Button\n size=\"sm\"\n className=\"w-full h-7 gap-1.5 text-xs\"\n disabled={!commitMsg.trim() || stagedFiles.length === 0 || !!actionLoading}\n onClick={handleCommit}\n >\n {actionLoading === \"commit\"\n ? <Loader2 className=\"h-3 w-3 animate-spin\" />\n : <Check className=\"h-3 w-3\" />\n }\n Commit ({stagedFiles.length} staged)\n </Button>\n </div>\n\n {/* Staged Changes */}\n {stagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Staged ({stagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleUnstage(stagedFiles.map((f) => f.path))}>\n <Minus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {stagedFiles.map((f) => (\n <div\n key={`staged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleUnstage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Minus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Unstaged Changes */}\n {unstagedFiles.length > 0 && (\n <div>\n <div className=\"flex items-center justify-between px-1 mb-1\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Changes ({unstagedFiles.length})\n </span>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-5 w-5\" onClick={() => handleStage(unstagedFiles.map((f) => f.path))}>\n <Plus className=\"h-3 w-3\" />\n </Button>\n </div>\n <div className=\"space-y-0.5\">\n {unstagedFiles.map((f) => (\n <div\n key={`unstaged-${f.path}`}\n className=\"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group\"\n >\n {statusIcon(f.status)}\n <span className=\"flex-1 truncate font-mono\">{f.path}</span>\n <button\n onClick={() => handleStage([f.path])}\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Plus className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {stagedFiles.length === 0 && unstagedFiles.length === 0 && (\n <div className=\"py-4 text-center text-xs text-muted-foreground\">\n No changes detected\n </div>\n )}\n\n {/* Recent Commits */}\n <div>\n <button\n onClick={() => setShowLog(!showLog)}\n className=\"flex w-full items-center gap-1.5 px-1 mb-1\"\n >\n <ChevronRight className={cn(\"h-3 w-3 text-muted-foreground transition-transform\", showLog && \"rotate-90\")} />\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n Recent Commits\n </span>\n </button>\n <AnimatePresence>\n {showLog && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div className=\"space-y-0.5\">\n {commits.map((commit) => (\n <div\n key={commit.hash}\n className=\"rounded-md px-2 py-1.5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"flex items-start gap-2\">\n <GitCommitIcon className=\"h-3 w-3 mt-0.5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs text-foreground line-clamp-2 leading-snug\">\n {commit.message}\n </p>\n <p className=\"mt-0.5 text-[10px] text-muted-foreground\">\n <span className=\"font-mono\">{commit.short}</span>\n <span className=\"mx-1\">·</span>\n {commit.date}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </div>\n </ScrollArea>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Bottom Panel — Terminal + Chat Input\n// ═══════════════════════════════════════════════════════════════\n\nfunction BottomPanel({\n projectInfo,\n codeMode,\n isMaximized,\n onToggleMaximize,\n}: {\n projectInfo: WorkspaceInfo | null;\n codeMode: { state: string; active: boolean } | null;\n isMaximized: boolean;\n onToggleMaximize: () => void;\n}) {\n const [activeBottomTab, setActiveBottomTab] = useState<\"terminal\" | \"chat\">(\"terminal\");\n const [terminalHistory, setTerminalHistory] = useState<TerminalEntry[]>([]);\n const [terminalInput, setTerminalInput] = useState(\"\");\n const [terminalLoading, setTerminalLoading] = useState(false);\n const [cmdHistory, setCmdHistory] = useState<string[]>([]);\n const [cmdHistoryIdx, setCmdHistoryIdx] = useState(-1);\n const terminalRef = useRef<HTMLDivElement>(null);\n const termInputRef = useRef<HTMLInputElement>(null);\n\n // Chat state\n const [chatInput, setChatInput] = useState(\"\");\n const { connected } = useSSE();\n const streamingText = useChatStore((s) => s.streamingText);\n const isStreaming = useChatStore((s) => s.isStreaming);\n const waiting = useChatStore((s) => s.waiting);\n const messages = useChatStore((s) => s.messages);\n const addMessage = useChatStore((s) => s.addMessage);\n const setWaiting = useChatStore((s) => s.setWaiting);\n const clearStreaming = useChatStore((s) => s.clearStreaming);\n const activeThreadId = useChatStore((s) => s.activeThreadId);\n const setActiveThread = useChatStore((s) => s.setActiveThread);\n const bumpThreadVersion = useChatStore((s) => s.bumpThreadVersion);\n\n const isBusy = isStreaming || waiting;\n\n // Scroll terminal to bottom\n useEffect(() => {\n if (terminalRef.current) {\n terminalRef.current.scrollTop = terminalRef.current.scrollHeight;\n }\n }, [terminalHistory]);\n\n async function handleTerminalExec() {\n const cmd = terminalInput.trim();\n if (!cmd || terminalLoading) return;\n setTerminalInput(\"\");\n setCmdHistory((prev) => [...prev, cmd]);\n setCmdHistoryIdx(-1);\n setTerminalLoading(true);\n\n try {\n const result = await api.terminal.exec(cmd);\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: result.output || result.error || \"\",\n exitCode: result.exitCode,\n timestamp: Date.now(),\n },\n ]);\n } catch (err: any) {\n setTerminalHistory((prev) => [\n ...prev,\n {\n id: `${Date.now()}`,\n command: cmd,\n output: err.message,\n exitCode: 1,\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setTerminalLoading(false);\n termInputRef.current?.focus();\n }\n }\n\n function handleTerminalKeyDown(e: React.KeyboardEvent) {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleTerminalExec();\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (cmdHistory.length > 0) {\n const newIdx = cmdHistoryIdx < 0 ? cmdHistory.length - 1 : Math.max(0, cmdHistoryIdx - 1);\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (cmdHistoryIdx >= 0) {\n const newIdx = cmdHistoryIdx + 1;\n if (newIdx >= cmdHistory.length) {\n setCmdHistoryIdx(-1);\n setTerminalInput(\"\");\n } else {\n setCmdHistoryIdx(newIdx);\n setTerminalInput(cmdHistory[newIdx]);\n }\n }\n }\n }\n\n async function handleChatSend() {\n const content = chatInput.trim();\n if (!content || isBusy) return;\n setChatInput(\"\");\n\n let threadId = activeThreadId;\n if (!threadId) {\n threadId = `web:${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n setActiveThread(threadId);\n }\n\n addMessage({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n timestamp: new Date().toISOString(),\n });\n setWaiting(true);\n\n api.chat.threads.addMessage(threadId, \"user\", content)\n .then(() => bumpThreadVersion())\n .catch(() => {});\n\n try {\n await api.chat.send(content, threadId);\n } catch {\n setWaiting(false);\n clearStreaming();\n }\n }\n\n // Get last few messages for the chat feed\n const recentMessages = messages.slice(-6);\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Status bar */}\n <div className=\"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1 text-[11px]\">\n {/* Mode indicator */}\n <div className=\"flex items-center gap-1.5\">\n {codeMode?.active ? (\n <Badge\n variant=\"outline\"\n className={cn(\n \"text-[10px] px-1.5 py-0 gap-1\",\n codeMode.state === \"execute\"\n ? \"border-emerald-500/40 text-emerald-400\"\n : \"border-amber-500/40 text-amber-400\"\n )}\n >\n <Zap className=\"h-2.5 w-2.5\" />\n {codeMode.state === \"execute\" ? \"Execute\" : \"Plan\"}\n </Badge>\n ) : (\n <Badge variant=\"outline\" className=\"text-[10px] px-1.5 py-0 text-muted-foreground\">\n Chat\n </Badge>\n )}\n </div>\n\n <span className=\"h-3 w-px bg-border\" />\n\n {/* Project info */}\n {projectInfo && (\n <>\n <span className=\"text-muted-foreground font-mono truncate max-w-[200px]\">\n {projectInfo.projectName}\n </span>\n <span className=\"h-3 w-px bg-border\" />\n <span className=\"text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo.cwd}>\n {projectInfo.cwd}\n </span>\n {projectInfo.isGit && (\n <>\n <span className=\"h-3 w-px bg-border\" />\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <GitBranch className=\"h-3 w-3\" />\n <span className=\"font-mono\">{projectInfo.branch}</span>\n </div>\n </>\n )}\n </>\n )}\n\n <span className=\"flex-1\" />\n\n {/* Connection indicator */}\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <div className={cn(\"h-1.5 w-1.5 rounded-full\", connected ? \"bg-emerald-500\" : \"bg-red-500\")} />\n <span>{connected ? \"Connected\" : \"Disconnected\"}</span>\n </div>\n </div>\n\n {/* Tab headers */}\n <div className=\"flex items-center justify-between border-b border-border bg-muted/10\">\n <div className=\"flex items-center\">\n <button\n onClick={() => setActiveBottomTab(\"terminal\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"terminal\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <TerminalIcon className=\"h-3.5 w-3.5\" />\n Terminal\n </button>\n <button\n onClick={() => setActiveBottomTab(\"chat\")}\n className={cn(\n \"flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2\",\n activeBottomTab === \"chat\"\n ? \"border-b-primary text-foreground\"\n : \"border-b-transparent text-muted-foreground hover:text-foreground\"\n )}\n >\n <MessageSquare className=\"h-3.5 w-3.5\" />\n Chat\n {isBusy && <Loader2 className=\"h-3 w-3 animate-spin text-primary\" />}\n </button>\n </div>\n <button\n onClick={onToggleMaximize}\n className=\"mr-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n title={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n aria-label={isMaximized ? \"Restore panel\" : \"Maximize panel\"}\n >\n {isMaximized ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {activeBottomTab === \"terminal\" ? (\n <div className=\"flex h-full flex-col bg-[#0d1117]\">\n <div ref={terminalRef} className=\"flex-1 overflow-auto p-2 font-mono text-[13px]\">\n {terminalHistory.map((entry) => (\n <div key={entry.id} className=\"mb-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-emerald-400\">$</span>\n <span className=\"text-gray-200\">{entry.command}</span>\n </div>\n {entry.output && (\n <pre className={cn(\n \"whitespace-pre-wrap text-[12px] leading-relaxed mt-0.5 pl-4\",\n entry.exitCode === 0 ? \"text-gray-400\" : \"text-red-400\"\n )}>\n {entry.output}\n </pre>\n )}\n </div>\n ))}\n {terminalLoading && (\n <div className=\"flex items-center gap-2 text-gray-500\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n <span className=\"text-xs\">Running...</span>\n </div>\n )}\n </div>\n\n {/* Terminal input */}\n <div className=\"flex items-center gap-2 border-t border-gray-800 bg-[#0d1117] px-3 py-2\">\n <span className=\"text-emerald-400 font-mono text-sm\">$</span>\n <input\n ref={termInputRef}\n value={terminalInput}\n onChange={(e) => setTerminalInput(e.target.value)}\n onKeyDown={handleTerminalKeyDown}\n placeholder=\"Type a command...\"\n className=\"flex-1 bg-transparent font-mono text-[13px] text-gray-200 placeholder:text-gray-600 focus:outline-none\"\n autoFocus\n />\n </div>\n </div>\n ) : (\n <div className=\"flex h-full flex-col\">\n {/* Chat messages feed */}\n <ScrollArea className=\"flex-1 px-3 py-2\">\n <div className=\"space-y-2\">\n {recentMessages.map((msg) => (\n <div\n key={msg.id}\n className={cn(\n \"rounded-lg px-3 py-2 text-sm\",\n msg.role === \"user\"\n ? \"bg-primary/10 text-foreground ml-8\"\n : msg.role === \"system\"\n ? \"bg-red-500/10 text-red-400\"\n : \"bg-muted text-foreground mr-8\"\n )}\n >\n {msg.role === \"assistant\" ? (\n <MarkdownRenderer content={msg.content} />\n ) : (\n <p className=\"whitespace-pre-wrap text-[13px]\">{msg.content}</p>\n )}\n </div>\n ))}\n {isStreaming && streamingText && (\n <div className=\"rounded-lg bg-muted px-3 py-2 mr-8\">\n <MarkdownRenderer content={streamingText} />\n <span className=\"inline-block h-3.5 w-[2px] animate-pulse bg-primary ml-0.5\" />\n </div>\n )}\n {waiting && !isStreaming && (\n <div className=\"flex items-center gap-2 rounded-lg bg-muted px-3 py-2 text-sm text-muted-foreground mr-8\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-primary\" />\n Thinking...\n </div>\n )}\n </div>\n </ScrollArea>\n\n {/* Chat input */}\n <div className=\"flex items-center gap-2 border-t border-border px-3 py-2\">\n <input\n value={chatInput}\n onChange={(e) => setChatInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleChatSend();\n }\n }}\n placeholder=\"Ask Mercury...\"\n disabled={isBusy}\n className={cn(\n \"flex-1 bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\",\n isBusy && \"opacity-50\"\n )}\n />\n <Button\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n disabled={isBusy || !chatInput.trim()}\n onClick={handleChatSend}\n >\n <Send className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ═══════════════════════════════════════════════════════════════\n// Main Workspace Page\n// ═══════════════════════════════════════════════════════════════\n\nexport function WorkspacePage() {\n const [tabs, setTabs] = useState<OpenTab[]>([]);\n const [activeTab, setActiveTab] = useState<string | null>(null);\n const [projectInfo, setProjectInfo] = useState<WorkspaceInfo | null>(null);\n const [codeMode, setCodeMode] = useState<{ state: string; active: boolean } | null>(null);\n const [leftWidth, setLeftWidth] = useState(240);\n const [rightWidth, setRightWidth] = useState(280);\n const [bottomHeight, setBottomHeight] = useState(260);\n const [bottomMaximized, setBottomMaximized] = useState(false);\n const [showLeft, setShowLeft] = useState(true);\n const [showRight, setShowRight] = useState(true);\n const [showFolderPicker, setShowFolderPicker] = useState(false);\n const [folderInput, setFolderInput] = useState(\"\");\n const [folderError, setFolderError] = useState(\"\");\n const [folderLoading, setFolderLoading] = useState(false);\n const [workspaceKey, setWorkspaceKey] = useState(0);\n\n // Load project info and code mode\n useEffect(() => {\n api.workspace.info().then(setProjectInfo).catch(() => {});\n api.code.status().then((s) => setCodeMode({ state: s.state, active: s.active })).catch(() => {});\n }, []);\n\n async function handleChangeWorkspace() {\n const path = folderInput.trim();\n if (!path) return;\n setFolderLoading(true);\n setFolderError(\"\");\n try {\n await api.workspace.setRoot(path);\n const info = await api.workspace.info();\n setProjectInfo(info);\n setShowFolderPicker(false);\n setFolderInput(\"\");\n // Reset all panels and close all tabs\n setTabs([]);\n setActiveTab(null);\n setWorkspaceKey((k) => k + 1);\n } catch (err: any) {\n setFolderError(err.message || \"Invalid path\");\n } finally {\n setFolderLoading(false);\n }\n }\n\n // Open a file in a tab\n async function openFile(path: string) {\n // Check if already open\n const existing = tabs.find((t) => t.path === path);\n if (existing) {\n setActiveTab(path);\n return;\n }\n\n try {\n const file = await api.workspace.file(path);\n const ext = file.ext || (path.includes(\".\") ? \".\" + path.split(\".\").pop()! : \"\");\n const newTab: OpenTab = {\n path,\n name: file.name,\n content: file.content,\n language: extToLanguage(ext),\n dirty: false,\n originalContent: file.content,\n };\n setTabs((prev) => [...prev, newTab]);\n setActiveTab(path);\n } catch {\n // Could not open file\n }\n }\n\n function closeTab(path: string) {\n setTabs((prev) => prev.filter((t) => t.path !== path));\n if (activeTab === path) {\n const remaining = tabs.filter((t) => t.path !== path);\n setActiveTab(remaining.length > 0 ? remaining[remaining.length - 1].path : null);\n }\n }\n\n async function saveTab(path: string) {\n const tab = tabs.find((t) => t.path === path);\n if (!tab || !tab.dirty) return;\n\n try {\n await api.workspace.saveFile(path, tab.content);\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, dirty: false, originalContent: t.content }\n : t\n )\n );\n } catch {\n // Save failed\n }\n }\n\n function updateTabContent(path: string, content: string) {\n setTabs((prev) =>\n prev.map((t) =>\n t.path === path\n ? { ...t, content, dirty: content !== t.originalContent }\n : t\n )\n );\n }\n\n // Resizer handlers\n function useResizer(\n direction: \"horizontal\" | \"vertical\",\n setValue: React.Dispatch<React.SetStateAction<number>>,\n min: number,\n max: number,\n invert: boolean = false\n ) {\n const dragging = useRef(false);\n\n const onMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n const startPos = direction === \"horizontal\" ? e.clientX : e.clientY;\n let currentValue: number;\n setValue((v) => { currentValue = v; return v; });\n\n function onMouseMove(e2: MouseEvent) {\n if (!dragging.current) return;\n const rawDelta = direction === \"horizontal\"\n ? e2.clientX - startPos\n : startPos - e2.clientY; // inverted for bottom panel\n const delta = invert ? -rawDelta : rawDelta;\n setValue(Math.min(max, Math.max(min, currentValue! + delta)));\n }\n\n function onMouseUp() {\n dragging.current = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n }\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n }, [direction, setValue, min, max, invert]);\n\n return { onMouseDown };\n }\n\n const leftResizer = useResizer(\"horizontal\", setLeftWidth, 160, 400);\n // Right panel's resizer sits on its LEFT edge, so mouse delta is inverted\n const rightResizer = useResizer(\"horizontal\", setRightWidth, 200, 450, true);\n const bottomResizer = useResizer(\"vertical\", setBottomHeight, 120, 500);\n\n return (\n <div className=\"flex h-full w-full flex-col overflow-hidden bg-background\">\n {/* Workspace header bar */}\n <div className=\"flex items-center gap-3 border-b border-border bg-muted/20 px-4 py-1.5\">\n <div className=\"flex items-center gap-2 text-sm\">\n <FolderInput className=\"h-4 w-4 text-mercury-400\" />\n <span className=\"font-medium text-foreground\">\n {projectInfo?.projectName || \"Workspace\"}\n </span>\n <span className=\"text-xs text-muted-foreground font-mono truncate max-w-[300px]\" title={projectInfo?.cwd}>\n {projectInfo?.cwd || \"—\"}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 gap-1 px-2 text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => { setShowFolderPicker(!showFolderPicker); setFolderInput(projectInfo?.cwd || \"\"); setFolderError(\"\"); }}\n >\n Change Folder\n </Button>\n <span className=\"flex-1\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowLeft(!showLeft)}\n >\n {showLeft ? \"Hide Explorer\" : \"Show Explorer\"}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setShowRight(!showRight)}\n >\n {showRight ? \"Hide Git\" : \"Show Git\"}\n </Button>\n </div>\n\n {/* Folder picker dropdown */}\n <AnimatePresence>\n {showFolderPicker && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden border-b border-border\"\n >\n <div className=\"flex items-center gap-2 bg-muted/10 px-4 py-2\">\n <input\n value={folderInput}\n onChange={(e) => { setFolderInput(e.target.value); setFolderError(\"\"); }}\n onKeyDown={(e) => { if (e.key === \"Enter\") handleChangeWorkspace(); if (e.key === \"Escape\") setShowFolderPicker(false); }}\n placeholder=\"/path/to/project\"\n className=\"flex-1 rounded-md border border-border bg-background px-3 py-1.5 text-sm font-mono text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-primary/40\"\n autoFocus\n />\n <Button\n size=\"sm\"\n className=\"h-7 gap-1 text-xs\"\n onClick={handleChangeWorkspace}\n disabled={folderLoading || !folderInput.trim()}\n >\n {folderLoading ? <Loader2 className=\"h-3 w-3 animate-spin\" /> : <Check className=\"h-3 w-3\" />}\n Open\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n onClick={() => setShowFolderPicker(false)}\n >\n Cancel\n </Button>\n </div>\n {folderError && (\n <p className=\"px-4 pb-2 text-xs text-red-400\">{folderError}</p>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Main content area (horizontal split) */}\n {!bottomMaximized && (\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Left Panel — File Explorer */}\n {showLeft && (\n <>\n <div style={{ width: leftWidth }} className=\"shrink-0 overflow-hidden border-r border-border\">\n <FileExplorer key={workspaceKey} onOpenFile={openFile} openFiles={tabs.map((t) => t.path)} />\n </div>\n {/* Left resizer */}\n <div\n {...leftResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n </>\n )}\n\n {/* Center Panel — Editor Tabs */}\n <div className=\"flex-1 min-w-0 overflow-hidden\">\n <EditorPanel\n tabs={tabs}\n activeTab={activeTab}\n onSelectTab={setActiveTab}\n onCloseTab={closeTab}\n onSave={saveTab}\n onContentChange={updateTabContent}\n />\n </div>\n\n {/* Right resizer */}\n {showRight && (\n <div\n {...rightResizer}\n className=\"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors\"\n />\n )}\n\n {/* Right Panel — Git */}\n {showRight && (\n <div style={{ width: rightWidth }} className=\"shrink-0 overflow-hidden border-l border-border\">\n <GitPanel key={workspaceKey} />\n </div>\n )}\n </div>\n )}\n\n {/* Bottom resizer (hidden when maximized) */}\n {!bottomMaximized && (\n <div\n {...bottomResizer}\n className=\"h-1 shrink-0 cursor-row-resize hover:bg-primary/30 active:bg-primary/50 transition-colors border-t border-border\"\n />\n )}\n\n {/* Bottom Panel — Terminal + Chat */}\n <div\n style={bottomMaximized ? undefined : { height: bottomHeight }}\n className={cn(\n \"overflow-hidden\",\n bottomMaximized ? \"flex-1 min-h-0\" : \"shrink-0\"\n )}\n >\n <BottomPanel\n projectInfo={projectInfo}\n codeMode={codeMode}\n isMaximized={bottomMaximized}\n onToggleMaximize={() => setBottomMaximized((v) => !v)}\n />\n </div>\n </div>\n );\n}\n"],"names":["__iconNode","Circle","createLucideIcon","FileCode","FolderInput","FolderTree","GitCommitHorizontal","Maximize2","Minimize2","Minus","RefreshCw","Upload","extToLanguage","ext","fileIcon","name","isDir","isOpen","FolderOpen","jsx","Folder","FileText","statusIcon","status","FileExplorer","onOpenFile","openFiles","tree","setTree","useState","expandedDirs","setExpandedDirs","dirContents","setDirContents","loading","setLoading","useEffect","loadDir","path","data","api","prev","toggleDir","next","renderItems","items","parentPath","item","fullPath","isExpanded","subTree","jsxs","cn","ChevronDown","ChevronRight","Loader2","Button","ScrollArea","EditorPanel","tabs","activeTab","onSelectTab","onCloseTab","onSave","onContentChange","textareaRef","useRef","scrollRef","current","t","handleKey","e","tab","X","Badge","_a","SyntaxHighlighter","oneDark","GitPanel","gitStatus","setGitStatus","branches","setBranches","commits","setCommits","commitMsg","setCommitMsg","showBranches","setShowBranches","showLog","setShowLog","refreshing","setRefreshing","actionLoading","setActionLoading","feedback","setFeedback","refresh","useCallback","showToast","statusData","branchData","logData","err","showFeedbackMsg","type","msg","handleStage","files","handleUnstage","handleCommit","result","handlePush","handlePull","handleCheckout","branch","handleGenerateMessage","f","stagedFiles","unstagedFiles","GitBranch","Download","AnimatePresence","motion","ArrowUp","ArrowDown","b","Check","Sparkles","Plus","commit","GitCommitIcon","BottomPanel","projectInfo","codeMode","isMaximized","onToggleMaximize","activeBottomTab","setActiveBottomTab","terminalHistory","setTerminalHistory","terminalInput","setTerminalInput","terminalLoading","setTerminalLoading","cmdHistory","setCmdHistory","cmdHistoryIdx","setCmdHistoryIdx","terminalRef","termInputRef","chatInput","setChatInput","connected","useSSE","streamingText","useChatStore","isStreaming","waiting","messages","addMessage","setWaiting","clearStreaming","activeThreadId","setActiveThread","bumpThreadVersion","isBusy","handleTerminalExec","cmd","handleTerminalKeyDown","newIdx","handleChatSend","content","threadId","recentMessages","Zap","Fragment","TerminalIcon","MessageSquare","entry","MarkdownRenderer","Send","WorkspacePage","setTabs","setActiveTab","setProjectInfo","setCodeMode","leftWidth","setLeftWidth","rightWidth","setRightWidth","bottomHeight","setBottomHeight","bottomMaximized","setBottomMaximized","showLeft","setShowLeft","showRight","setShowRight","showFolderPicker","setShowFolderPicker","folderInput","setFolderInput","folderError","setFolderError","folderLoading","setFolderLoading","workspaceKey","setWorkspaceKey","s","handleChangeWorkspace","info","k","openFile","file","newTab","closeTab","remaining","saveTab","updateTabContent","useResizer","direction","setValue","min","max","invert","dragging","startPos","currentValue","v","onMouseMove","e2","rawDelta","delta","onMouseUp","leftResizer","rightResizer","bottomResizer"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|