@cosmicstack/mercury-agent 1.1.7 → 1.1.9
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 +36 -2
- package/dist/index.js +10142 -4331
- package/dist/index.js.map +1 -1
- package/dist/web/static/vendor/geist/Geist-Italic[wght].woff2 +0 -0
- package/dist/web/static/vendor/geist/Geist-Variable.woff2 +0 -0
- package/dist/web/static/vendor/geist/GeistMono-Italic[wght].woff2 +0 -0
- package/dist/web/static/vendor/geist/GeistMono-Variable.woff2 +0 -0
- package/dist/web/static/vendor/graphology.min.js +2 -0
- package/dist/web/static/vendor/icons.svg +108 -0
- package/dist/web/static/vendor/sql-wasm.wasm +0 -0
- package/dist/web/ui/assets/Chat-DCFkzIwn.js +28 -0
- package/dist/web/ui/assets/Chat-DCFkzIwn.js.map +1 -0
- package/dist/web/ui/assets/Dashboard-B81ollv8.js +2 -0
- package/dist/web/ui/assets/Dashboard-B81ollv8.js.map +1 -0
- package/dist/web/ui/assets/Goals-D0cR8yIP.js +12 -0
- package/dist/web/ui/assets/Goals-D0cR8yIP.js.map +1 -0
- package/dist/web/ui/assets/Graph-C3eHp3_J.js +7 -0
- package/dist/web/ui/assets/Graph-C3eHp3_J.js.map +1 -0
- package/dist/web/ui/assets/Kanban-DrkTRyni.js +45 -0
- package/dist/web/ui/assets/Kanban-DrkTRyni.js.map +1 -0
- package/dist/web/ui/assets/Login-GRQ-LjgN.js +2 -0
- package/dist/web/ui/assets/Login-GRQ-LjgN.js.map +1 -0
- package/dist/web/ui/assets/MarkdownRenderer-Dvh1jwyj.js +22 -0
- package/dist/web/ui/assets/MarkdownRenderer-Dvh1jwyj.js.map +1 -0
- package/dist/web/ui/assets/Memory-dAZsKmWz.js +12 -0
- package/dist/web/ui/assets/Memory-dAZsKmWz.js.map +1 -0
- package/dist/web/ui/assets/Permissions-DCiyUUfI.js +17 -0
- package/dist/web/ui/assets/Permissions-DCiyUUfI.js.map +1 -0
- package/dist/web/ui/assets/PersonDetail-iZgApJog.js +2 -0
- package/dist/web/ui/assets/PersonDetail-iZgApJog.js.map +1 -0
- package/dist/web/ui/assets/Persons-Bs_HhYjC.js +2 -0
- package/dist/web/ui/assets/Persons-Bs_HhYjC.js.map +1 -0
- package/dist/web/ui/assets/Providers-CL6wMWni.js +7 -0
- package/dist/web/ui/assets/Providers-CL6wMWni.js.map +1 -0
- package/dist/web/ui/assets/Schedules-BQwE1hP5.js +17 -0
- package/dist/web/ui/assets/Schedules-BQwE1hP5.js.map +1 -0
- package/dist/web/ui/assets/Settings-26SF-okR.js +12 -0
- package/dist/web/ui/assets/Settings-26SF-okR.js.map +1 -0
- package/dist/web/ui/assets/Skills-DANyYK_d.js +7 -0
- package/dist/web/ui/assets/Skills-DANyYK_d.js.map +1 -0
- package/dist/web/ui/assets/Tasks-DbwRozzx.js +7 -0
- package/dist/web/ui/assets/Tasks-DbwRozzx.js.map +1 -0
- package/dist/web/ui/assets/Usage-i_q6Ri4s.js +12 -0
- package/dist/web/ui/assets/Usage-i_q6Ri4s.js.map +1 -0
- package/dist/web/ui/assets/Workspace-ZR5syf-9.js +52 -0
- package/dist/web/ui/assets/Workspace-ZR5syf-9.js.map +1 -0
- package/dist/web/ui/assets/activity-CIP1IzSg.js +7 -0
- package/dist/web/ui/assets/activity-CIP1IzSg.js.map +1 -0
- package/dist/web/ui/assets/alert-dialog-CW-j2nG4.js +7 -0
- package/dist/web/ui/assets/alert-dialog-CW-j2nG4.js.map +1 -0
- package/dist/web/ui/assets/arrow-left-D2YO-iMS.js +7 -0
- package/dist/web/ui/assets/arrow-left-D2YO-iMS.js.map +1 -0
- package/dist/web/ui/assets/avatar-BLsf3GhK.js +7 -0
- package/dist/web/ui/assets/avatar-BLsf3GhK.js.map +1 -0
- package/dist/web/ui/assets/badge-DfDJNUtd.js +2 -0
- package/dist/web/ui/assets/badge-DfDJNUtd.js.map +1 -0
- package/dist/web/ui/assets/button-TaFPR-zy.js +2 -0
- package/dist/web/ui/assets/button-TaFPR-zy.js.map +1 -0
- package/dist/web/ui/assets/card-DAYo4Zl5.js +2 -0
- package/dist/web/ui/assets/card-DAYo4Zl5.js.map +1 -0
- package/dist/web/ui/assets/chevron-down-CQi0yuay.js +12 -0
- package/dist/web/ui/assets/chevron-down-CQi0yuay.js.map +1 -0
- package/dist/web/ui/assets/circle-check-DweDcOkA.js +7 -0
- package/dist/web/ui/assets/circle-check-DweDcOkA.js.map +1 -0
- package/dist/web/ui/assets/circle-x-BmL20etA.js +7 -0
- package/dist/web/ui/assets/circle-x-BmL20etA.js.map +1 -0
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js +2 -0
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js.map +1 -0
- package/dist/web/ui/assets/dialog-DovgkMhT.js +2 -0
- package/dist/web/ui/assets/dialog-DovgkMhT.js.map +1 -0
- package/dist/web/ui/assets/download-_QBatDio.js +7 -0
- package/dist/web/ui/assets/download-_QBatDio.js.map +1 -0
- package/dist/web/ui/assets/eye-Wpgtfmgw.js +7 -0
- package/dist/web/ui/assets/eye-Wpgtfmgw.js.map +1 -0
- package/dist/web/ui/assets/file-text-2EGFNyc1.js +7 -0
- package/dist/web/ui/assets/file-text-2EGFNyc1.js.map +1 -0
- package/dist/web/ui/assets/folder-open-C-OiZn9P.js +7 -0
- package/dist/web/ui/assets/folder-open-C-OiZn9P.js.map +1 -0
- package/dist/web/ui/assets/git-branch-BT9gCKgG.js +7 -0
- package/dist/web/ui/assets/git-branch-BT9gCKgG.js.map +1 -0
- package/dist/web/ui/assets/index-BhxU0YlT.js +163 -0
- package/dist/web/ui/assets/index-BhxU0YlT.js.map +1 -0
- package/dist/web/ui/assets/index-CUT6Fr2C.js +2 -0
- package/dist/web/ui/assets/index-CUT6Fr2C.js.map +1 -0
- package/dist/web/ui/assets/index-DOw1nKre.css +1 -0
- package/dist/web/ui/assets/input-L1uz5xAQ.js +2 -0
- package/dist/web/ui/assets/input-L1uz5xAQ.js.map +1 -0
- package/dist/web/ui/assets/loader-circle-BTFgt3hG.js +7 -0
- package/dist/web/ui/assets/loader-circle-BTFgt3hG.js.map +1 -0
- package/dist/web/ui/assets/pencil-uxK07iYy.js +7 -0
- package/dist/web/ui/assets/pencil-uxK07iYy.js.map +1 -0
- package/dist/web/ui/assets/plus-DcWFYr4m.js +7 -0
- package/dist/web/ui/assets/plus-DcWFYr4m.js.map +1 -0
- package/dist/web/ui/assets/power-DVIqVIMj.js +12 -0
- package/dist/web/ui/assets/power-DVIqVIMj.js.map +1 -0
- package/dist/web/ui/assets/progress-DMwOdxli.js +2 -0
- package/dist/web/ui/assets/progress-DMwOdxli.js.map +1 -0
- package/dist/web/ui/assets/search-D1OOxb1X.js +7 -0
- package/dist/web/ui/assets/search-D1OOxb1X.js.map +1 -0
- package/dist/web/ui/assets/select-Dnx_bUgy.js +2 -0
- package/dist/web/ui/assets/select-Dnx_bUgy.js.map +1 -0
- package/dist/web/ui/assets/send-D4uxqmyH.js +7 -0
- package/dist/web/ui/assets/send-D4uxqmyH.js.map +1 -0
- package/dist/web/ui/assets/sparkles-DLSJA4xU.js +7 -0
- package/dist/web/ui/assets/sparkles-DLSJA4xU.js.map +1 -0
- package/dist/web/ui/assets/switch-CvDDbCUA.js +2 -0
- package/dist/web/ui/assets/switch-CvDDbCUA.js.map +1 -0
- package/dist/web/ui/assets/terminal-DI3J3W_z.js +7 -0
- package/dist/web/ui/assets/terminal-DI3J3W_z.js.map +1 -0
- package/dist/web/ui/assets/textarea-CXLsr8tf.js +2 -0
- package/dist/web/ui/assets/textarea-CXLsr8tf.js.map +1 -0
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js +6 -0
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js.map +1 -0
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js +30 -0
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js.map +1 -0
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js +18 -0
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js.map +1 -0
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js +65 -0
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js.map +1 -0
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js +44 -0
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js.map +1 -0
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js +17 -0
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js.map +1 -0
- package/dist/web/ui/assets/zap-C-0oH5gt.js +7 -0
- package/dist/web/ui/assets/zap-C-0oH5gt.js.map +1 -0
- package/dist/web/ui/favicon.svg +10 -0
- package/dist/web/ui/icons/icon-192.svg +10 -0
- package/dist/web/ui/icons/icon-512-maskable.svg +10 -0
- package/dist/web/ui/icons/icon-512.svg +10 -0
- package/dist/web/ui/index.html +24 -0
- package/dist/web/ui/logo-dark.png +0 -0
- package/dist/web/ui/logo-full-dark.png +0 -0
- package/dist/web/ui/logo-full-light.png +0 -0
- package/dist/web/ui/logo-light.png +0 -0
- package/dist/web/ui/manifest.webmanifest +1 -0
- package/dist/web/ui/registerSW.js +1 -0
- package/dist/web/ui/sw.js +11 -0
- package/dist/web/ui/sw.js.map +1 -0
- package/dist/web/ui/workbox-0bb07689.js +3 -0
- package/dist/web/ui/workbox-0bb07689.js.map +1 -0
- package/package.json +11 -6
- package/src/web/static/vendor/geist/Geist-Italic[wght].woff2 +0 -0
- package/src/web/static/vendor/geist/Geist-Variable.woff2 +0 -0
- package/src/web/static/vendor/geist/GeistMono-Italic[wght].woff2 +0 -0
- package/src/web/static/vendor/geist/GeistMono-Variable.woff2 +0 -0
- package/src/web/static/vendor/graphology.min.js +2 -0
- package/src/web/static/vendor/icons.svg +108 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Usage-i_q6Ri4s.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]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import{j as e,A as te,m as se}from"./vendor-motion-Dwx3-JO5.js";import{r as a}from"./vendor-react-C7pctHW3.js";import{e as P,a as f,c as N,S as le,X as Ne,g as re,M as ve}from"./index-BhxU0YlT.js";import{B as T}from"./button-TaFPR-zy.js";import{B as Q}from"./badge-DfDJNUtd.js";import{o as we,A as ke,b as Ce,a as Se,u as $,M as ue,F as Me}from"./MarkdownRenderer-Dvh1jwyj.js";import{L as K}from"./loader-circle-BTFgt3hG.js";import{a as ne,C as ze}from"./chevron-down-CQi0yuay.js";import{h as De}from"./vendor-syntax-xZUI6Op9.js";import{G as oe}from"./git-branch-BT9gCKgG.js";import{D as Te}from"./download-_QBatDio.js";import{S as Ee}from"./sparkles-DLSJA4xU.js";import{P as pe}from"./plus-DcWFYr4m.js";import{Z as Fe}from"./zap-C-0oH5gt.js";import{T as Re}from"./terminal-DI3J3W_z.js";import{S as Le}from"./send-D4uxqmyH.js";import{F as He}from"./folder-open-C-OiZn9P.js";import{F as _e}from"./file-text-2EGFNyc1.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";import"./vendor-markdown-DwTbvico.js";/**
|
|
2
|
+
* @license lucide-react v0.511.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const $e=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Pe=P("circle",$e);/**
|
|
7
|
+
* @license lucide-react v0.511.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Ae=[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]],ye=P("file-code",Ae);/**
|
|
12
|
+
* @license lucide-react v0.511.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const Be=[["path",{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",key:"fm4g5t"}],["path",{d:"M2 13h10",key:"pgb2dq"}],["path",{d:"m9 16 3-3-3-3",key:"6m91ic"}]],We=P("folder-input",Be);/**
|
|
17
|
+
* @license lucide-react v0.511.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const Ge=[["path",{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",key:"hod4my"}],["path",{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",key:"w4yl2u"}],["path",{d:"M3 5a2 2 0 0 0 2 2h3",key:"f2jnh7"}],["path",{d:"M3 3v13a2 2 0 0 0 2 2h3",key:"k8epm1"}]],Ie=P("folder-tree",Ge);/**
|
|
22
|
+
* @license lucide-react v0.511.0 - ISC
|
|
23
|
+
*
|
|
24
|
+
* This source code is licensed under the ISC license.
|
|
25
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
+
*/const qe=[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]],Ke=P("git-commit-horizontal",qe);/**
|
|
27
|
+
* @license lucide-react v0.511.0 - ISC
|
|
28
|
+
*
|
|
29
|
+
* This source code is licensed under the ISC license.
|
|
30
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
31
|
+
*/const Ue=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]],Oe=P("maximize-2",Ue);/**
|
|
32
|
+
* @license lucide-react v0.511.0 - ISC
|
|
33
|
+
*
|
|
34
|
+
* This source code is licensed under the ISC license.
|
|
35
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
36
|
+
*/const Ve=[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]],Xe=P("minimize-2",Ve);/**
|
|
37
|
+
* @license lucide-react v0.511.0 - ISC
|
|
38
|
+
*
|
|
39
|
+
* This source code is licensed under the ISC license.
|
|
40
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
41
|
+
*/const Ze=[["path",{d:"M5 12h14",key:"1ays0h"}]],fe=P("minus",Ze);/**
|
|
42
|
+
* @license lucide-react v0.511.0 - ISC
|
|
43
|
+
*
|
|
44
|
+
* This source code is licensed under the ISC license.
|
|
45
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
46
|
+
*/const Ye=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],je=P("refresh-cw",Ye);/**
|
|
47
|
+
* @license lucide-react v0.511.0 - ISC
|
|
48
|
+
*
|
|
49
|
+
* This source code is licensed under the ISC license.
|
|
50
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
51
|
+
*/const Je=[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]],Qe=P("upload",Je);function et(r){return{".ts":"typescript",".tsx":"tsx",".js":"javascript",".jsx":"jsx",".py":"python",".rs":"rust",".go":"go",".java":"java",".json":"json",".yaml":"yaml",".yml":"yaml",".toml":"toml",".md":"markdown",".txt":"text",".css":"css",".html":"html",".sh":"bash",".bash":"bash",".zsh":"bash",".sql":"sql",".xml":"xml",".svg":"xml",".dockerfile":"docker",".env":"text",".gitignore":"text",".c":"c",".cpp":"cpp",".h":"c",".hpp":"cpp",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin",".scala":"scala",".lua":"lua",".r":"r",".dart":"dart",".graphql":"graphql",".scss":"scss",".less":"less",".vue":"markup",".prisma":"text",".proto":"protobuf"}[r.toLowerCase()]||"text"}function ie(r,c,C){if(c)return C?e.jsx(He,{className:"h-4 w-4 text-mercury-400"}):e.jsx(Me,{className:"h-4 w-4 text-mercury-400/70"});const S=r.includes(".")?"."+r.split(".").pop():"";return[".ts",".tsx",".js",".jsx",".py",".rs",".go",".java",".sh"].includes(S)?e.jsx(ye,{className:"h-4 w-4 text-blue-400"}):e.jsx(_e,{className:"h-4 w-4 text-muted-foreground"})}function ge(r){switch(r){case"modified":return e.jsx("span",{className:"text-amber-400 text-xs font-bold",children:"M"});case"added":return e.jsx("span",{className:"text-emerald-400 text-xs font-bold",children:"A"});case"deleted":return e.jsx("span",{className:"text-red-400 text-xs font-bold",children:"D"});case"untracked":return e.jsx("span",{className:"text-gray-400 text-xs font-bold",children:"U"});case"renamed":return e.jsx("span",{className:"text-purple-400 text-xs font-bold",children:"R"});default:return e.jsx("span",{className:"text-muted-foreground text-xs",children:"?"})}}function tt({onOpenFile:r,openFiles:c}){const[C,S]=a.useState(null),[i,R]=a.useState(new Set(["."])),[y,M]=a.useState(new Map),[g,o]=a.useState(!0);a.useEffect(()=>{j()},[]);async function j(v){try{const d=await f.workspace.tree(v);!v||v==="."?(S(d),o(!1)):M(b=>new Map(b).set(v,d))}catch{o(!1)}}function W(v){const d=new Set(i);d.has(v)?d.delete(v):(d.add(v),y.has(v)||j(v)),R(d)}function F(v,d){return v.map(b=>{const l=d==="."?b.name:`${d}/${b.name}`,m=i.has(l),z=c.includes(l);if(b.isDirectory){const E=y.get(l);return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>W(l),className:N("flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors","hover:bg-muted/60"),children:[m?e.jsx(ze,{className:"h-3 w-3 shrink-0 text-muted-foreground"}):e.jsx(re,{className:"h-3 w-3 shrink-0 text-muted-foreground"}),ie(b.name,!0,m),e.jsx("span",{className:"truncate",children:b.name})]}),m&&E&&e.jsx("div",{className:"ml-3 border-l border-border/30 pl-1",children:F(E.items,l)})]},l)}return e.jsxs("button",{onClick:()=>r(l),className:N("flex w-full items-center gap-1.5 rounded-md px-2 py-1 text-left text-[13px] transition-colors",z?"bg-primary/10 text-primary":"hover:bg-muted/60 text-foreground/80"),children:[e.jsx("span",{className:"w-3"}),ie(b.name,!1),e.jsx("span",{className:"truncate",children:b.name})]},l)})}return g?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(K,{className:"h-5 w-5 animate-spin text-primary"})}):e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Ie,{className:"h-4 w-4 text-mercury-400"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Explorer"})]}),e.jsx(T,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>j(),children:e.jsx(je,{className:"h-3 w-3"})})]}),e.jsx(le,{className:"flex-1 px-1 py-1",children:C&&F(C.items,".")})]})}function st({tabs:r,activeTab:c,onSelectTab:C,onCloseTab:S,onSave:i,onContentChange:R}){const y=a.useRef(null),M=a.useRef(null),g=r.find(o=>o.path===c);return a.useEffect(()=>{function o(j){(j.metaKey||j.ctrlKey)&&j.key==="s"&&(j.preventDefault(),c&&i(c))}return window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)},[c,i]),r.length===0?e.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-4 text-center",children:[e.jsx("div",{className:"rounded-2xl bg-primary/10 p-6",children:e.jsx(ye,{className:"h-12 w-12 text-primary/60"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-base font-semibold text-foreground",children:"No files open"}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"Select a file from the explorer to start editing"})]})]}):e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsx("div",{className:"flex items-center gap-0 overflow-x-auto border-b border-border bg-muted/20",children:r.map(o=>e.jsxs("button",{onClick:()=>C(o.path),className:N("group flex items-center gap-2 border-r border-border/30 px-3 py-1.5 text-[13px] transition-colors",o.path===c?"bg-background text-foreground border-b-2 border-b-primary":"text-muted-foreground hover:bg-muted/40 hover:text-foreground"),children:[ie(o.name,!1),e.jsx("span",{className:"max-w-[120px] truncate",children:o.name}),o.dirty&&e.jsx(Pe,{className:"h-2 w-2 fill-primary text-primary"}),e.jsx("button",{onClick:j=>{j.stopPropagation(),S(o.path)},className:"ml-1 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-muted",children:e.jsx(Ne,{className:"h-3 w-3"})})]},o.path))}),g&&e.jsxs("div",{className:"relative flex flex-col flex-1 min-h-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/30 bg-muted/10 px-3 py-1",children:[e.jsx("span",{className:"text-xs text-muted-foreground font-mono",children:g.path}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Q,{variant:"outline",className:"text-[10px] px-1.5 py-0",children:g.language}),g.dirty&&e.jsxs(T,{size:"sm",variant:"ghost",className:"h-5 gap-1 px-2 text-[10px]",onClick:()=>i(g.path),children:[e.jsx("span",{className:"text-primary",children:"Save"}),e.jsx("span",{className:"text-muted-foreground",children:"Cmd+S"})]})]})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-auto bg-[#282c34]",ref:M,onClick:()=>{var o;return(o=y.current)==null?void 0:o.focus()},children:e.jsxs("div",{className:"relative",style:{minWidth:"fit-content"},children:[e.jsx(De,{language:g.language,style:we,showLineNumbers:!0,lineNumberStyle:{minWidth:"3em",paddingRight:"1em",color:"rgba(255,255,255,0.25)",fontSize:"13px",lineHeight:"20px",userSelect:"none"},customStyle:{margin:0,padding:"0.5rem 0",background:"transparent",fontSize:"13px",lineHeight:"20px",fontFamily:"var(--font-mono, 'Geist Mono', ui-monospace, monospace)"},codeTagProps:{style:{fontSize:"13px",lineHeight:"20px",fontFamily:"var(--font-mono, 'Geist Mono', ui-monospace, monospace)"}},wrapLongLines:!1,children:g.content||" "}),e.jsx("textarea",{ref:y,value:g.content,onChange:o=>R(g.path,o.target.value),spellCheck:!1,className:N("absolute top-0 left-0 w-full h-full resize-none bg-transparent text-transparent caret-white","font-mono text-[13px] leading-[20px]","focus:outline-none","whitespace-pre","pointer-events-none focus:pointer-events-auto"),style:{tabSize:2,padding:"0.5rem 0 0.5rem 4.5em",fontFamily:"var(--font-mono, 'Geist Mono', ui-monospace, monospace)",overflow:"hidden"},onFocus:()=>{y.current&&(y.current.style.pointerEvents="auto")},onBlur:()=>{y.current&&(y.current.style.pointerEvents="none")},onWheel:o=>{M.current&&(M.current.scrollTop+=o.deltaY,M.current.scrollLeft+=o.deltaX)}})]})})]})]})}function at(){const[r,c]=a.useState(null),[C,S]=a.useState([]),[i,R]=a.useState([]),[y,M]=a.useState(""),[g,o]=a.useState(!1),[j,W]=a.useState(!1),[F,v]=a.useState(!0),[d,b]=a.useState(!1),[l,m]=a.useState(null),[z,E]=a.useState(null),k=a.useCallback(async(t=!1)=>{b(!0);try{const[h,I,q]=await Promise.all([f.git.status(),f.git.branches(),f.git.log(15)]);c(h),S(I.branches),R(q.commits),t&&(E({type:"success",msg:"Refreshed"}),setTimeout(()=>E(null),1500))}catch(h){E({type:"error",msg:h.message})}finally{v(!1),b(!1)}},[]);a.useEffect(()=>{k()},[k]);function x(t,h){E({type:t,msg:h}),setTimeout(()=>E(null),3e3)}async function H(t){m("stage");try{await f.git.stage(t),await k()}catch(h){x("error",h.message)}finally{m(null)}}async function A(t){m("unstage");try{await f.git.unstage(t),await k()}catch(h){x("error",h.message)}finally{m(null)}}async function O(){if(y.trim()){m("commit");try{const t=await f.git.commit(y.trim());M(""),x("success","Committed successfully"),await k()}catch(t){x("error",t.message)}finally{m(null)}}}async function G(){m("push");try{const t=await f.git.push();x("success",t.message||"Pushed"),await k()}catch(t){x("error",t.message)}finally{m(null)}}async function U(){m("pull");try{const t=await f.git.pull();x("success",t.message||"Pulled"),await k()}catch(t){x("error",t.message)}finally{m(null)}}async function V(t){m("checkout");try{await f.git.checkout(t),x("success",`Switched to ${t}`),o(!1),await k()}catch(h){x("error",h.message)}finally{m(null)}}async function X(){m("generate");try{((r==null?void 0:r.files.filter(q=>!q.staged))||[]).length>0&&(await f.git.stage(["."]),await k());const h=await f.git.generateCommitMessage(),I=typeof h=="string"?h:(h==null?void 0:h.message)||"";I?(M(I),x("success","Message generated")):x("error","No message returned")}catch(t){x("error",t.message)}finally{m(null)}}if(F)return e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(K,{className:"h-5 w-5 animate-spin text-primary"})});const L=(r==null?void 0:r.files.filter(t=>t.staged))||[],_=(r==null?void 0:r.files.filter(t=>!t.staged))||[];return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(oe,{className:"h-4 w-4 text-mercury-400"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"Source Control"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(T,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:U,disabled:!!l,children:e.jsx(Te,{className:"h-3 w-3"})}),e.jsx(T,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:G,disabled:!!l,children:e.jsx(Qe,{className:"h-3 w-3"})}),e.jsx(T,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>k(!0),disabled:!!l||d,title:"Refresh","aria-label":"Refresh",children:e.jsx(je,{className:N("h-3 w-3",d&&"animate-spin")})})]})]}),e.jsx(le,{className:"flex-1",children:e.jsxs("div",{className:"p-2 space-y-3",children:[e.jsx(te,{children:z&&e.jsx(se.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:N("rounded-md px-3 py-1.5 text-xs",z.type==="success"?"bg-emerald-500/10 text-emerald-400 border border-emerald-500/20":"bg-red-500/10 text-red-400 border border-red-500/20"),children:z.msg})}),e.jsxs("div",{className:"space-y-1",children:[e.jsxs("button",{onClick:()=>o(!g),className:"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted/60",children:[e.jsx(oe,{className:"h-3.5 w-3.5 text-primary"}),e.jsx("span",{className:"font-medium",children:(r==null?void 0:r.branch)||"—"}),r&&r.ahead>0&&e.jsxs(Q,{variant:"outline",className:"text-[10px] px-1 py-0",children:[e.jsx(ke,{className:"h-2.5 w-2.5 mr-0.5"}),r.ahead]}),r&&r.behind>0&&e.jsxs(Q,{variant:"outline",className:"text-[10px] px-1 py-0",children:[e.jsx(Ce,{className:"h-2.5 w-2.5 mr-0.5"}),r.behind]}),e.jsx(re,{className:N("ml-auto h-3 w-3 transition-transform",g&&"rotate-90")})]}),e.jsx(te,{children:g&&e.jsx(se.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:"overflow-hidden",children:e.jsx("div",{className:"ml-2 space-y-0.5 border-l border-border/30 pl-2 py-1",children:C.filter(t=>!t.name.startsWith("remotes/")).map(t=>e.jsxs("button",{onClick:()=>!t.isCurrent&&V(t.name),className:N("flex w-full items-center gap-2 rounded-md px-2 py-1 text-xs transition-colors",t.isCurrent?"bg-primary/10 text-primary":"text-muted-foreground hover:bg-muted/60 hover:text-foreground"),disabled:t.isCurrent||!!l,children:[t.isCurrent&&e.jsx(ne,{className:"h-3 w-3"}),e.jsx("span",{className:"truncate",children:t.name})]},t.name))})})})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"relative",children:[e.jsx("textarea",{value:y,onChange:t=>M(t.target.value),placeholder:"Commit message...",rows:2,className:N("w-full resize-none rounded-lg border border-border bg-muted/30 px-3 py-2 pr-9 text-sm text-foreground","placeholder:text-muted-foreground/60 focus:outline-none focus:ring-1 focus:ring-primary/40")}),e.jsx("button",{onClick:X,disabled:!!l,title:"AI generate commit message",className:N("absolute right-2 top-2 rounded-md p-1.5 transition-colors border border-border/50","text-primary/70 hover:text-primary hover:bg-primary/10 bg-background/80",l==="generate"&&"animate-pulse"),children:l==="generate"?e.jsx(K,{className:"h-4 w-4 animate-spin text-primary"}):e.jsx(Ee,{className:"h-4 w-4"})})]}),e.jsxs(T,{size:"sm",className:"w-full h-7 gap-1.5 text-xs",disabled:!y.trim()||L.length===0||!!l,onClick:O,children:[l==="commit"?e.jsx(K,{className:"h-3 w-3 animate-spin"}):e.jsx(ne,{className:"h-3 w-3"}),"Commit (",L.length," staged)"]})]}),L.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between px-1 mb-1",children:[e.jsxs("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:["Staged (",L.length,")"]}),e.jsx(T,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>A(L.map(t=>t.path)),children:e.jsx(fe,{className:"h-3 w-3"})})]}),e.jsx("div",{className:"space-y-0.5",children:L.map(t=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group",children:[ge(t.status),e.jsx("span",{className:"flex-1 truncate font-mono",children:t.path}),e.jsx("button",{onClick:()=>A([t.path]),className:"opacity-0 group-hover:opacity-100 transition-opacity",children:e.jsx(fe,{className:"h-3 w-3 text-muted-foreground hover:text-foreground"})})]},`staged-${t.path}`))})]}),_.length>0&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between px-1 mb-1",children:[e.jsxs("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:["Changes (",_.length,")"]}),e.jsx(T,{variant:"ghost",size:"icon",className:"h-5 w-5",onClick:()=>H(_.map(t=>t.path)),children:e.jsx(pe,{className:"h-3 w-3"})})]}),e.jsx("div",{className:"space-y-0.5",children:_.map(t=>e.jsxs("div",{className:"flex items-center gap-2 rounded-md px-2 py-1 text-xs hover:bg-muted/40 group",children:[ge(t.status),e.jsx("span",{className:"flex-1 truncate font-mono",children:t.path}),e.jsx("button",{onClick:()=>H([t.path]),className:"opacity-0 group-hover:opacity-100 transition-opacity",children:e.jsx(pe,{className:"h-3 w-3 text-muted-foreground hover:text-foreground"})})]},`unstaged-${t.path}`))})]}),L.length===0&&_.length===0&&e.jsx("div",{className:"py-4 text-center text-xs text-muted-foreground",children:"No changes detected"}),e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>W(!j),className:"flex w-full items-center gap-1.5 px-1 mb-1",children:[e.jsx(re,{className:N("h-3 w-3 text-muted-foreground transition-transform",j&&"rotate-90")}),e.jsx("span",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:"Recent Commits"})]}),e.jsx(te,{children:j&&e.jsx(se.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:"overflow-hidden",children:e.jsx("div",{className:"space-y-0.5",children:i.map(t=>e.jsx("div",{className:"rounded-md px-2 py-1.5 hover:bg-muted/40 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(Ke,{className:"h-3 w-3 mt-0.5 shrink-0 text-muted-foreground"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-xs text-foreground line-clamp-2 leading-snug",children:t.message}),e.jsxs("p",{className:"mt-0.5 text-[10px] text-muted-foreground",children:[e.jsx("span",{className:"font-mono",children:t.short}),e.jsx("span",{className:"mx-1",children:"·"}),t.date]})]})]})},t.hash))})})})]})]})})]})}function rt({projectInfo:r,codeMode:c,isMaximized:C,onToggleMaximize:S}){const[i,R]=a.useState("terminal"),[y,M]=a.useState([]),[g,o]=a.useState(""),[j,W]=a.useState(!1),[F,v]=a.useState([]),[d,b]=a.useState(-1),l=a.useRef(null),m=a.useRef(null),[z,E]=a.useState(""),{connected:k}=Se(),x=$(s=>s.streamingText),H=$(s=>s.isStreaming),A=$(s=>s.waiting),O=$(s=>s.messages),G=$(s=>s.addMessage),U=$(s=>s.setWaiting),V=$(s=>s.clearStreaming),X=$(s=>s.activeThreadId),L=$(s=>s.setActiveThread),_=$(s=>s.bumpThreadVersion),t=H||A;a.useEffect(()=>{l.current&&(l.current.scrollTop=l.current.scrollHeight)},[y]);async function h(){var w;const s=g.trim();if(!(!s||j)){o(""),v(B=>[...B,s]),b(-1),W(!0);try{const B=await f.terminal.exec(s);M(n=>[...n,{id:`${Date.now()}`,command:s,output:B.output||B.error||"",exitCode:B.exitCode,timestamp:Date.now()}])}catch(B){M(n=>[...n,{id:`${Date.now()}`,command:s,output:B.message,exitCode:1,timestamp:Date.now()}])}finally{W(!1),(w=m.current)==null||w.focus()}}}function I(s){if(s.key==="Enter")s.preventDefault(),h();else if(s.key==="ArrowUp"){if(s.preventDefault(),F.length>0){const w=d<0?F.length-1:Math.max(0,d-1);b(w),o(F[w])}}else if(s.key==="ArrowDown"&&(s.preventDefault(),d>=0)){const w=d+1;w>=F.length?(b(-1),o("")):(b(w),o(F[w]))}}async function q(){const s=z.trim();if(!s||t)return;E("");let w=X;w||(w=`web:${Date.now()}_${Math.random().toString(36).slice(2,8)}`,L(w)),G({id:crypto.randomUUID(),role:"user",content:s,timestamp:new Date().toISOString()}),U(!0),f.chat.threads.addMessage(w,"user",s).then(()=>_()).catch(()=>{});try{await f.chat.send(s,w)}catch{U(!1),V()}}const Z=O.slice(-6);return e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1 text-[11px]",children:[e.jsx("div",{className:"flex items-center gap-1.5",children:c!=null&&c.active?e.jsxs(Q,{variant:"outline",className:N("text-[10px] px-1.5 py-0 gap-1",c.state==="execute"?"border-emerald-500/40 text-emerald-400":"border-amber-500/40 text-amber-400"),children:[e.jsx(Fe,{className:"h-2.5 w-2.5"}),c.state==="execute"?"Execute":"Plan"]}):e.jsx(Q,{variant:"outline",className:"text-[10px] px-1.5 py-0 text-muted-foreground",children:"Chat"})}),e.jsx("span",{className:"h-3 w-px bg-border"}),r&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-muted-foreground font-mono truncate max-w-[200px]",children:r.projectName}),e.jsx("span",{className:"h-3 w-px bg-border"}),e.jsx("span",{className:"text-muted-foreground font-mono truncate max-w-[300px]",title:r.cwd,children:r.cwd}),r.isGit&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"h-3 w-px bg-border"}),e.jsxs("div",{className:"flex items-center gap-1 text-muted-foreground",children:[e.jsx(oe,{className:"h-3 w-3"}),e.jsx("span",{className:"font-mono",children:r.branch})]})]})]}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"flex items-center gap-1 text-muted-foreground",children:[e.jsx("div",{className:N("h-1.5 w-1.5 rounded-full",k?"bg-emerald-500":"bg-red-500")}),e.jsx("span",{children:k?"Connected":"Disconnected"})]})]}),e.jsxs("div",{className:"flex items-center justify-between border-b border-border bg-muted/10",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsxs("button",{onClick:()=>R("terminal"),className:N("flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2",i==="terminal"?"border-b-primary text-foreground":"border-b-transparent text-muted-foreground hover:text-foreground"),children:[e.jsx(Re,{className:"h-3.5 w-3.5"}),"Terminal"]}),e.jsxs("button",{onClick:()=>R("chat"),className:N("flex items-center gap-1.5 px-4 py-1.5 text-xs font-medium transition-colors border-b-2",i==="chat"?"border-b-primary text-foreground":"border-b-transparent text-muted-foreground hover:text-foreground"),children:[e.jsx(ve,{className:"h-3.5 w-3.5"}),"Chat",t&&e.jsx(K,{className:"h-3 w-3 animate-spin text-primary"})]})]}),e.jsx("button",{onClick:S,className:"mr-2 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground",title:C?"Restore panel":"Maximize panel","aria-label":C?"Restore panel":"Maximize panel",children:C?e.jsx(Xe,{className:"h-3.5 w-3.5"}):e.jsx(Oe,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:i==="terminal"?e.jsxs("div",{className:"flex h-full flex-col bg-[#0d1117]",children:[e.jsxs("div",{ref:l,className:"flex-1 overflow-auto p-2 font-mono text-[13px]",children:[y.map(s=>e.jsxs("div",{className:"mb-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-emerald-400",children:"$"}),e.jsx("span",{className:"text-gray-200",children:s.command})]}),s.output&&e.jsx("pre",{className:N("whitespace-pre-wrap text-[12px] leading-relaxed mt-0.5 pl-4",s.exitCode===0?"text-gray-400":"text-red-400"),children:s.output})]},s.id)),j&&e.jsxs("div",{className:"flex items-center gap-2 text-gray-500",children:[e.jsx(K,{className:"h-3 w-3 animate-spin"}),e.jsx("span",{className:"text-xs",children:"Running..."})]})]}),e.jsxs("div",{className:"flex items-center gap-2 border-t border-gray-800 bg-[#0d1117] px-3 py-2",children:[e.jsx("span",{className:"text-emerald-400 font-mono text-sm",children:"$"}),e.jsx("input",{ref:m,value:g,onChange:s=>o(s.target.value),onKeyDown:I,placeholder:"Type a command...",className:"flex-1 bg-transparent font-mono text-[13px] text-gray-200 placeholder:text-gray-600 focus:outline-none",autoFocus:!0})]})]}):e.jsxs("div",{className:"flex h-full flex-col",children:[e.jsx(le,{className:"flex-1 px-3 py-2",children:e.jsxs("div",{className:"space-y-2",children:[Z.map(s=>e.jsx("div",{className:N("rounded-lg px-3 py-2 text-sm",s.role==="user"?"bg-primary/10 text-foreground ml-8":s.role==="system"?"bg-red-500/10 text-red-400":"bg-muted text-foreground mr-8"),children:s.role==="assistant"?e.jsx(ue,{content:s.content}):e.jsx("p",{className:"whitespace-pre-wrap text-[13px]",children:s.content})},s.id)),H&&x&&e.jsxs("div",{className:"rounded-lg bg-muted px-3 py-2 mr-8",children:[e.jsx(ue,{content:x}),e.jsx("span",{className:"inline-block h-3.5 w-[2px] animate-pulse bg-primary ml-0.5"})]}),A&&!H&&e.jsxs("div",{className:"flex items-center gap-2 rounded-lg bg-muted px-3 py-2 text-sm text-muted-foreground mr-8",children:[e.jsx(K,{className:"h-3.5 w-3.5 animate-spin text-primary"}),"Thinking..."]})]})}),e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-3 py-2",children:[e.jsx("input",{value:z,onChange:s=>E(s.target.value),onKeyDown:s=>{s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),q())},placeholder:"Ask Mercury...",disabled:t,className:N("flex-1 bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none",t&&"opacity-50")}),e.jsx(T,{size:"icon",className:"h-7 w-7 shrink-0",disabled:t||!z.trim(),onClick:q,children:e.jsx(Le,{className:"h-3.5 w-3.5"})})]})]})})]})}function Mt(){const[r,c]=a.useState([]),[C,S]=a.useState(null),[i,R]=a.useState(null),[y,M]=a.useState(null),[g,o]=a.useState(240),[j,W]=a.useState(280),[F,v]=a.useState(260),[d,b]=a.useState(!1),[l,m]=a.useState(!0),[z,E]=a.useState(!0),[k,x]=a.useState(!1),[H,A]=a.useState(""),[O,G]=a.useState(""),[U,V]=a.useState(!1),[X,L]=a.useState(0);a.useEffect(()=>{f.workspace.info().then(R).catch(()=>{}),f.code.status().then(n=>M({state:n.state,active:n.active})).catch(()=>{})},[]);async function _(){const n=H.trim();if(n){V(!0),G("");try{await f.workspace.setRoot(n);const u=await f.workspace.info();R(u),x(!1),A(""),c([]),S(null),L(p=>p+1)}catch(u){G(u.message||"Invalid path")}finally{V(!1)}}}async function t(n){if(r.find(p=>p.path===n)){S(n);return}try{const p=await f.workspace.file(n),D=p.ext||(n.includes(".")?"."+n.split(".").pop():""),ee={path:n,name:p.name,content:p.content,language:et(D),dirty:!1,originalContent:p.content};c(Y=>[...Y,ee]),S(n)}catch{}}function h(n){if(c(u=>u.filter(p=>p.path!==n)),C===n){const u=r.filter(p=>p.path!==n);S(u.length>0?u[u.length-1].path:null)}}async function I(n){const u=r.find(p=>p.path===n);if(!(!u||!u.dirty))try{await f.workspace.saveFile(n,u.content),c(p=>p.map(D=>D.path===n?{...D,dirty:!1,originalContent:D.content}:D))}catch{}}function q(n,u){c(p=>p.map(D=>D.path===n?{...D,content:u,dirty:u!==D.originalContent}:D))}function Z(n,u,p,D,ee=!1){const Y=a.useRef(!1);return{onMouseDown:a.useCallback(ae=>{ae.preventDefault(),Y.current=!0;const ce=n==="horizontal"?ae.clientX:ae.clientY;let de;u(J=>(de=J,J));function me(J){if(!Y.current)return;const he=n==="horizontal"?J.clientX-ce:ce-J.clientY,be=ee?-he:he;u(Math.min(D,Math.max(p,de+be)))}function xe(){Y.current=!1,document.removeEventListener("mousemove",me),document.removeEventListener("mouseup",xe)}document.addEventListener("mousemove",me),document.addEventListener("mouseup",xe)},[n,u,p,D,ee])}}const s=Z("horizontal",o,160,400),w=Z("horizontal",W,200,450,!0),B=Z("vertical",v,120,500);return e.jsxs("div",{className:"flex h-full w-full flex-col overflow-hidden bg-background",children:[e.jsxs("div",{className:"flex items-center gap-3 border-b border-border bg-muted/20 px-4 py-1.5",children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[e.jsx(We,{className:"h-4 w-4 text-mercury-400"}),e.jsx("span",{className:"font-medium text-foreground",children:(i==null?void 0:i.projectName)||"Workspace"}),e.jsx("span",{className:"text-xs text-muted-foreground font-mono truncate max-w-[300px]",title:i==null?void 0:i.cwd,children:(i==null?void 0:i.cwd)||"—"})]}),e.jsx(T,{variant:"ghost",size:"sm",className:"h-6 gap-1 px-2 text-xs text-muted-foreground hover:text-foreground",onClick:()=>{x(!k),A((i==null?void 0:i.cwd)||""),G("")},children:"Change Folder"}),e.jsx("span",{className:"flex-1"}),e.jsx(T,{variant:"ghost",size:"sm",className:"h-6 px-2 text-xs",onClick:()=>m(!l),children:l?"Hide Explorer":"Show Explorer"}),e.jsx(T,{variant:"ghost",size:"sm",className:"h-6 px-2 text-xs",onClick:()=>E(!z),children:z?"Hide Git":"Show Git"})]}),e.jsx(te,{children:k&&e.jsxs(se.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:"overflow-hidden border-b border-border",children:[e.jsxs("div",{className:"flex items-center gap-2 bg-muted/10 px-4 py-2",children:[e.jsx("input",{value:H,onChange:n=>{A(n.target.value),G("")},onKeyDown:n=>{n.key==="Enter"&&_(),n.key==="Escape"&&x(!1)},placeholder:"/path/to/project",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",autoFocus:!0}),e.jsxs(T,{size:"sm",className:"h-7 gap-1 text-xs",onClick:_,disabled:U||!H.trim(),children:[U?e.jsx(K,{className:"h-3 w-3 animate-spin"}):e.jsx(ne,{className:"h-3 w-3"}),"Open"]}),e.jsx(T,{size:"sm",variant:"ghost",className:"h-7 text-xs",onClick:()=>x(!1),children:"Cancel"})]}),O&&e.jsx("p",{className:"px-4 pb-2 text-xs text-red-400",children:O})]})}),!d&&e.jsxs("div",{className:"flex flex-1 min-h-0 overflow-hidden",children:[l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{width:g},className:"shrink-0 overflow-hidden border-r border-border",children:e.jsx(tt,{onOpenFile:t,openFiles:r.map(n=>n.path)},X)}),e.jsx("div",{...s,className:"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors"})]}),e.jsx("div",{className:"flex-1 min-w-0 overflow-hidden",children:e.jsx(st,{tabs:r,activeTab:C,onSelectTab:S,onCloseTab:h,onSave:I,onContentChange:q})}),z&&e.jsx("div",{...w,className:"w-1 shrink-0 cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors"}),z&&e.jsx("div",{style:{width:j},className:"shrink-0 overflow-hidden border-l border-border",children:e.jsx(at,{},X)})]}),!d&&e.jsx("div",{...B,className:"h-1 shrink-0 cursor-row-resize hover:bg-primary/30 active:bg-primary/50 transition-colors border-t border-border"}),e.jsx("div",{style:d?void 0:{height:F},className:N("overflow-hidden",d?"flex-1 min-h-0":"shrink-0"),children:e.jsx(rt,{projectInfo:i,codeMode:y,isMaximized:d,onToggleMaximize:()=>b(n=>!n)})})]})}export{Mt as WorkspacePage};
|
|
52
|
+
//# sourceMappingURL=Workspace-ZR5syf-9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Workspace-ZR5syf-9.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]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{e as t}from"./index-BhxU0YlT.js";/**
|
|
2
|
+
* @license lucide-react v0.511.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const a=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],e=t("activity",a);export{e as A};
|
|
7
|
+
//# sourceMappingURL=activity-CIP1IzSg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-CIP1IzSg.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js"],"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 [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n];\nconst Activity = createLucideIcon(\"activity\", __iconNode);\n\nexport { __iconNode, Activity as default };\n//# sourceMappingURL=activity.js.map\n"],"names":["__iconNode","Activity","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CACE,OACA,CACE,EAAG,6HACH,IAAK,QACX,CACA,CACA,EACMC,EAAWC,EAAiB,WAAYF,CAAU","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{e as x,c as o}from"./index-BhxU0YlT.js";import{j as s}from"./vendor-motion-Dwx3-JO5.js";import{r as l}from"./vendor-react-C7pctHW3.js";import{W as g,X as y,Y as N,Z as r,_ as d,$ as i,a0 as n,a1 as c,a2 as m}from"./vendor-radix-3UdfCgs_.js";import{b as p}from"./button-TaFPR-zy.js";/**
|
|
2
|
+
* @license lucide-react v0.511.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const u=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],M=x("trash-2",u),V=g,_=y,A=N,f=l.forwardRef(({className:a,...e},t)=>s.jsx(m,{className:o("fixed inset-0 z-50 bg-black/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e,ref:t}));f.displayName=m.displayName;const D=l.forwardRef(({className:a,...e},t)=>s.jsxs(A,{children:[s.jsx(f,{}),s.jsx(r,{ref:t,className:o("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...e})]}));D.displayName=r.displayName;const j=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col space-y-2 text-center sm:text-left",a),...e});j.displayName="AlertDialogHeader";const b=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});b.displayName="AlertDialogFooter";const w=l.forwardRef(({className:a,...e},t)=>s.jsx(d,{ref:t,className:o("text-lg font-semibold",a),...e}));w.displayName=d.displayName;const h=l.forwardRef(({className:a,...e},t)=>s.jsx(i,{ref:t,className:o("text-sm text-muted-foreground",a),...e}));h.displayName=i.displayName;const k=l.forwardRef(({className:a,...e},t)=>s.jsx(c,{ref:t,className:o(p(),a),...e}));k.displayName=c.displayName;const v=l.forwardRef(({className:a,...e},t)=>s.jsx(n,{ref:t,className:o(p({variant:"outline"}),"mt-2 sm:mt-0",a),...e}));v.displayName=n.displayName;export{V as A,M as T,D as a,j as b,w as c,h as d,b as e,v as f,k as g,_ as h};
|
|
7
|
+
//# sourceMappingURL=alert-dialog-CW-j2nG4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-dialog-CW-j2nG4.js","sources":["../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../../src/components/ui/alert-dialog.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: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { cn } from \"@/lib/utils\";\nimport { buttonVariants } from \"@/components/ui/button\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n"],"names":["__iconNode","Trash2","createLucideIcon","AlertDialog","AlertDialogPrimitive.Root","AlertDialogTrigger","AlertDialogPrimitive.Trigger","AlertDialogPortal","AlertDialogPrimitive.Portal","AlertDialogOverlay","React.forwardRef","className","props","ref","jsx","AlertDialogPrimitive.Overlay","cn","AlertDialogContent","jsxs","AlertDialogPrimitive.Content","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","AlertDialogPrimitive.Title","AlertDialogDescription","AlertDialogPrimitive.Description","AlertDialogAction","AlertDialogPrimitive.Action","buttonVariants","AlertDialogCancel","AlertDialogPrimitive.Cancel"],"mappings":"iSAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,QAAQ,CAAE,EACtE,CAAC,OAAQ,CAAE,EAAG,qCAAsC,IAAK,QAAQ,CAAE,EACnE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,OAAO,CAAE,CACnE,EACMC,EAASC,EAAiB,UAAWF,CAAU,ECX/CG,EAAcC,EACdC,EAAqBC,EACrBC,EAAoBC,EAEpBC,EAAqBC,EAAAA,WAGzB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACC,EAAA,CACC,UAAWC,EACT,0KACAL,CAAA,EAED,GAAGC,EACJ,IAAAC,CAAA,CACF,CACD,EACDJ,EAAmB,YAAcM,EAA6B,YAE9D,MAAME,EAAqBP,EAAAA,WAGzB,CAAC,CAAE,UAAAC,EAAW,GAAGC,GAASC,IAC1BK,EAAAA,KAACX,EAAA,CACC,SAAA,CAAAO,EAAAA,IAACL,EAAA,EAAmB,EACpBK,EAAAA,IAACK,EAAA,CACC,IAAAN,EACA,UAAWG,EACT,4gBACAL,CAAA,EAED,GAAGC,CAAA,CAAA,CACN,EACF,CACD,EACDK,EAAmB,YAAcE,EAA6B,YAE9D,MAAMC,EAAoB,CAAC,CACzB,UAAAT,EACA,GAAGC,CACL,IACEE,EAAAA,IAAC,MAAA,CACC,UAAWE,EACT,mDACAL,CAAA,EAED,GAAGC,CAAA,CACN,EAEFQ,EAAkB,YAAc,oBAEhC,MAAMC,EAAoB,CAAC,CACzB,UAAAV,EACA,GAAGC,CACL,IACEE,EAAAA,IAAC,MAAA,CACC,UAAWE,EACT,gEACAL,CAAA,EAED,GAAGC,CAAA,CACN,EAEFS,EAAkB,YAAc,oBAEhC,MAAMC,EAAmBZ,EAAAA,WAGvB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACS,EAAA,CACC,IAAAV,EACA,UAAWG,EAAG,wBAAyBL,CAAS,EAC/C,GAAGC,CAAA,CACN,CACD,EACDU,EAAiB,YAAcC,EAA2B,YAE1D,MAAMC,EAAyBd,EAAAA,WAG7B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACW,EAAA,CACC,IAAAZ,EACA,UAAWG,EAAG,gCAAiCL,CAAS,EACvD,GAAGC,CAAA,CACN,CACD,EACDY,EAAuB,YACrBC,EAAiC,YAEnC,MAAMC,EAAoBhB,EAAAA,WAGxB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACa,EAAA,CACC,IAAAd,EACA,UAAWG,EAAGY,EAAA,EAAkBjB,CAAS,EACxC,GAAGC,CAAA,CACN,CACD,EACDc,EAAkB,YAAcC,EAA4B,YAE5D,MAAME,EAAoBnB,EAAAA,WAGxB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACgB,EAAA,CACC,IAAAjB,EACA,UAAWG,EACTY,EAAe,CAAE,QAAS,UAAW,EACrC,eACAjB,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDiB,EAAkB,YAAcC,EAA4B","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{e}from"./index-BhxU0YlT.js";/**
|
|
2
|
+
* @license lucide-react v0.511.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const o=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],r=e("arrow-left",o);export{r as A};
|
|
7
|
+
//# sourceMappingURL=arrow-left-D2YO-iMS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrow-left-D2YO-iMS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-left.js"],"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: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n];\nconst ArrowLeft = createLucideIcon(\"arrow-left\", __iconNode);\n\nexport { __iconNode, ArrowLeft as default };\n//# sourceMappingURL=arrow-left.js.map\n"],"names":["__iconNode","ArrowLeft","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,EAC/C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,EACMC,EAAYC,EAAiB,aAAcF,CAAU","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{e as m,c as s}from"./index-BhxU0YlT.js";import{j as l}from"./vendor-motion-Dwx3-JO5.js";import{r as c}from"./vendor-react-C7pctHW3.js";import{F as o,G as t,H as i}from"./vendor-radix-3UdfCgs_.js";/**
|
|
2
|
+
* @license lucide-react v0.511.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const f=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}],["path",{d:"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662",key:"154egf"}]],h=m("circle-user",f),d=c.forwardRef(({className:a,...e},r)=>l.jsx(o,{ref:r,className:s("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",a),...e}));d.displayName=o.displayName;const n=c.forwardRef(({className:a,...e},r)=>l.jsx(i,{ref:r,className:s("aspect-square h-full w-full",a),...e}));n.displayName=i.displayName;const p=c.forwardRef(({className:a,...e},r)=>l.jsx(t,{ref:r,className:s("flex h-full w-full items-center justify-center rounded-full bg-muted",a),...e}));p.displayName=t.displayName;export{d as A,h as C,p as a};
|
|
7
|
+
//# sourceMappingURL=avatar-BLsf3GhK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-BLsf3GhK.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-user.js","../../src/components/ui/avatar.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 [\"circle\", { cx: \"12\", cy: \"10\", r: \"3\", key: \"ilqhr7\" }],\n [\"path\", { d: \"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662\", key: \"154egf\" }]\n];\nconst CircleUser = createLucideIcon(\"circle-user\", __iconNode);\n\nexport { __iconNode, CircleUser as default };\n//# sourceMappingURL=circle-user.js.map\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport { cn } from \"@/lib/utils\";\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n"],"names":["__iconNode","CircleUser","createLucideIcon","Avatar","React.forwardRef","className","props","ref","jsx","AvatarPrimitive.Root","cn","AvatarImage","AvatarPrimitive.Image","AvatarFallback","AvatarPrimitive.Fallback"],"mappings":"2MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACxD,CAAC,OAAQ,CAAE,EAAG,mDAAoD,IAAK,QAAQ,CAAE,CACnF,EACMC,EAAaC,EAAiB,cAAeF,CAAU,ECVvDG,EAASC,EAAAA,WAGb,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACC,EAAA,CACC,IAAAF,EACA,UAAWG,EACT,gEACAL,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDH,EAAO,YAAcM,EAAqB,YAE1C,MAAME,EAAcP,EAAAA,WAGlB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACI,EAAA,CACC,IAAAL,EACA,UAAWG,EAAG,8BAA+BL,CAAS,EACrD,GAAGC,CAAA,CACN,CACD,EACDK,EAAY,YAAcC,EAAsB,YAEhD,MAAMC,EAAiBT,EAAAA,WAGrB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,IAACM,EAAA,CACC,IAAAP,EACA,UAAWG,EACT,uEACAL,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDO,EAAe,YAAcC,EAAyB","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as o}from"./vendor-motion-Dwx3-JO5.js";import{r as n}from"./vendor-react-C7pctHW3.js";import{c as s}from"./index-CUT6Fr2C.js";import{c as d}from"./index-BhxU0YlT.js";const i=s("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",outline:"text-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",success:"border-transparent bg-emerald-500/15 text-emerald-500 dark:bg-emerald-500/20 dark:text-emerald-400",warning:"border-transparent bg-amber-500/15 text-amber-600 dark:bg-amber-500/20 dark:text-amber-400"}},defaultVariants:{variant:"default"}}),m=n.forwardRef(({className:r,variant:e,...t},a)=>o.jsx("div",{ref:a,className:d(i({variant:e}),r),...t}));m.displayName="Badge";export{m as B};
|
|
2
|
+
//# sourceMappingURL=badge-DfDJNUtd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-DfDJNUtd.js","sources":["../../src/components/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n outline: \"text-foreground\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n success:\n \"border-transparent bg-emerald-500/15 text-emerald-500 dark:bg-emerald-500/20 dark:text-emerald-400\",\n warning:\n \"border-transparent bg-amber-500/15 text-amber-600 dark:bg-amber-500/20 dark:text-amber-400\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n );\n }\n);\nBadge.displayName = \"Badge\";\n\nexport { Badge, badgeVariants };\n"],"names":["badgeVariants","cva","Badge","React.forwardRef","className","variant","props","ref","jsx","cn"],"mappings":"+KAIA,MAAMA,EAAgBC,EACpB,uKACA,CACE,SAAU,CACR,QAAS,CACP,QACE,mFACF,UACE,kFACF,QAAS,kBACT,YACE,+FACF,QACE,qGACF,QACE,4FAAA,CACJ,EAEF,gBAAiB,CACf,QAAS,SAAA,CACX,CAEJ,EAMMC,EAAQC,EAAAA,WACZ,CAAC,CAAE,UAAAC,EAAW,QAAAC,EAAS,GAAGC,CAAA,EAASC,IAE/BC,EAAAA,IAAC,MAAA,CACC,IAAAD,EACA,UAAWE,EAAGT,EAAc,CAAE,QAAAK,CAAA,CAAS,EAAGD,CAAS,EAClD,GAAGE,CAAA,CAAA,CAIZ,EACAJ,EAAM,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as i}from"./vendor-motion-Dwx3-JO5.js";import{r as d}from"./vendor-react-C7pctHW3.js";import{a5 as c}from"./vendor-radix-3UdfCgs_.js";import{c as u}from"./index-CUT6Fr2C.js";import{c as m}from"./index-BhxU0YlT.js";const f=u("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",ghost:"hover:bg-accent hover:text-accent-foreground",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),p=d.forwardRef(({className:e,variant:r,size:t,asChild:o=!1,...n},s)=>{const a=o?c:"button";return i.jsx(a,{className:m(f({variant:r,size:t,className:e})),ref:s,...n})});p.displayName="Button";export{p as B,f as b};
|
|
2
|
+
//# sourceMappingURL=button-TaFPR-zy.js.map
|