@cosmicstack/mercury-agent 1.1.13 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/dist/index.js +27909 -22358
- package/dist/index.js.map +1 -1
- package/dist/web/ui/assets/Chat-CajL8sV3.js +27 -0
- package/dist/web/ui/assets/{Dashboard-1rlAqQ-Y.js → Dashboard-ClnaDoDG.js} +1 -2
- package/dist/web/ui/assets/{Goals-CgSUAXLH.js → Goals-Rm3s3OGd.js} +1 -2
- package/dist/web/ui/assets/{Graph-DnlOWkay.js → Graph-hYGmN5vp.js} +1 -2
- package/dist/web/ui/assets/{Kanban-DRlNiNRF.js → Kanban-BK_Oi6am.js} +1 -2
- package/dist/web/ui/assets/{Login-BP5524pC.js → Login-Bl8tq7KA.js} +1 -2
- package/dist/web/ui/assets/MarkdownRenderer-DKGKZih7.js +21 -0
- package/dist/web/ui/assets/{Memory-BOQEY0H8.js → Memory-kKRHTUyC.js} +1 -2
- package/dist/web/ui/assets/{Permissions-jbFH-toa.js → Permissions-CDRBOdMO.js} +1 -2
- package/dist/web/ui/assets/{PersonDetail-Ca8B9io8.js → PersonDetail-DLbZBUS0.js} +1 -2
- package/dist/web/ui/assets/{Persons-epdmUeBM.js → Persons-C-GjzdmT.js} +1 -2
- package/dist/web/ui/assets/{Providers-Bm8sZNZo.js → Providers-L32issLd.js} +1 -2
- package/dist/web/ui/assets/{Schedules-BZKhm9R7.js → Schedules-BvGLrPPD.js} +1 -2
- package/dist/web/ui/assets/{Settings-Hii-5oku.js → Settings-BP9_1JW3.js} +1 -2
- package/dist/web/ui/assets/{Skills-BHJp2CgD.js → Skills-CvXlgjZK.js} +1 -2
- package/dist/web/ui/assets/{Tasks-D36pqkro.js → Tasks-XcAVd2Ff.js} +1 -2
- package/dist/web/ui/assets/{Usage-CmjaYrsT.js → Usage--2hxK31f.js} +1 -2
- package/dist/web/ui/assets/{Workspace-BYLf-wTJ.js → Workspace-BPChIyBc.js} +11 -12
- package/dist/web/ui/assets/{activity-MOTqH8zM.js → activity-CDTOZzUZ.js} +1 -2
- package/dist/web/ui/assets/{alert-dialog-MbYSbZx5.js → alert-dialog-B3JUwsIN.js} +1 -2
- package/dist/web/ui/assets/{arrow-left-CtqQsBC6.js → arrow-left-CkDXNwR2.js} +1 -2
- package/dist/web/ui/assets/{avatar-BIYaY7pR.js → avatar-NU204zr9.js} +1 -2
- package/dist/web/ui/assets/{badge-CUJiWF1y.js → badge-DpVeNL8j.js} +1 -2
- package/dist/web/ui/assets/{button-CNasMlFE.js → button-V3Fu7_kO.js} +1 -2
- package/dist/web/ui/assets/{card-BdsEOP7t.js → card-CjAvp22k.js} +1 -2
- package/dist/web/ui/assets/{chevron-down-CB9J_vvZ.js → chevron-down-C66c9kfo.js} +1 -2
- package/dist/web/ui/assets/{circle-check-DvGSe1uZ.js → circle-check-Cch4Kwja.js} +1 -2
- package/dist/web/ui/assets/{circle-x-CyaGJ_BM.js → circle-x-DK0DQPGB.js} +1 -2
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js +0 -1
- package/dist/web/ui/assets/{dialog-Bd1rELXb.js → dialog-FHqlAspv.js} +1 -2
- package/dist/web/ui/assets/{download-C8RvlFqO.js → download-D73EX-Ki.js} +1 -2
- package/dist/web/ui/assets/{eye-BJ0NucMz.js → eye-CxEb5_L8.js} +1 -2
- package/dist/web/ui/assets/{file-text-BWWBuD_N.js → file-text-CDTjVG9h.js} +1 -2
- package/dist/web/ui/assets/{folder-open-BwjemFy7.js → folder-open-CF5wm-xS.js} +1 -2
- package/dist/web/ui/assets/{git-branch-D9JVASpC.js → git-branch-CYWJZoQx.js} +1 -2
- package/dist/web/ui/assets/{index-C3YiF4qv.js → index-B1xAjISP.js} +4 -5
- package/dist/web/ui/assets/{index-CaqLZNof.js → index-CufYpqmV.js} +1 -2
- package/dist/web/ui/assets/{input-CH3dmo9r.js → input-CF6e2HL4.js} +1 -2
- package/dist/web/ui/assets/{loader-circle-DbYKk0_Q.js → loader-circle-CJko6bz6.js} +1 -2
- package/dist/web/ui/assets/{pencil-gNDEMhav.js → pencil-DGvW-dl_.js} +1 -2
- package/dist/web/ui/assets/{plus-7rbHkByr.js → plus-DhHrgqcD.js} +1 -2
- package/dist/web/ui/assets/{power-BS7gCDWs.js → power-BFKfrVvI.js} +1 -2
- package/dist/web/ui/assets/{progress-ZzhsBV2v.js → progress-CsRtYJ3t.js} +1 -2
- package/dist/web/ui/assets/{search-BZsbhO0B.js → search-BwE8vRR_.js} +1 -2
- package/dist/web/ui/assets/{select-vRSgBrHz.js → select-Xy3UJnp-.js} +1 -2
- package/dist/web/ui/assets/{send-BkyTIUtJ.js → send-DHy23R-c.js} +1 -2
- package/dist/web/ui/assets/{sparkles-DcP24GEL.js → sparkles-wNQvP7So.js} +1 -2
- package/dist/web/ui/assets/{switch-LRN9wWy2.js → switch-CGgMESDf.js} +1 -2
- package/dist/web/ui/assets/{terminal-CWG62zdD.js → terminal-BvZc6N0C.js} +1 -2
- package/dist/web/ui/assets/{textarea-CXh3tmJ1.js → textarea-BTxEQ_C2.js} +1 -2
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js +0 -1
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js +0 -1
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js +0 -1
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js +0 -1
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js +0 -1
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js +0 -1
- package/dist/web/ui/assets/{zap-BEfqVtvZ.js → zap-CK8xUBKc.js} +1 -2
- package/dist/web/ui/index.html +1 -1
- package/dist/web/ui/workbox-0bb07689.js +1 -0
- package/package.json +3 -1
- package/dist/web/ui/assets/Chat-DXSn2dY8.js +0 -28
- package/dist/web/ui/assets/Chat-DXSn2dY8.js.map +0 -1
- package/dist/web/ui/assets/Dashboard-1rlAqQ-Y.js.map +0 -1
- package/dist/web/ui/assets/Goals-CgSUAXLH.js.map +0 -1
- package/dist/web/ui/assets/Graph-DnlOWkay.js.map +0 -1
- package/dist/web/ui/assets/Kanban-DRlNiNRF.js.map +0 -1
- package/dist/web/ui/assets/Login-BP5524pC.js.map +0 -1
- package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js +0 -22
- package/dist/web/ui/assets/MarkdownRenderer-B9KGVD0X.js.map +0 -1
- package/dist/web/ui/assets/Memory-BOQEY0H8.js.map +0 -1
- package/dist/web/ui/assets/Permissions-jbFH-toa.js.map +0 -1
- package/dist/web/ui/assets/PersonDetail-Ca8B9io8.js.map +0 -1
- package/dist/web/ui/assets/Persons-epdmUeBM.js.map +0 -1
- package/dist/web/ui/assets/Providers-Bm8sZNZo.js.map +0 -1
- package/dist/web/ui/assets/Schedules-BZKhm9R7.js.map +0 -1
- package/dist/web/ui/assets/Settings-Hii-5oku.js.map +0 -1
- package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +0 -1
- package/dist/web/ui/assets/Tasks-D36pqkro.js.map +0 -1
- package/dist/web/ui/assets/Usage-CmjaYrsT.js.map +0 -1
- package/dist/web/ui/assets/Workspace-BYLf-wTJ.js.map +0 -1
- package/dist/web/ui/assets/activity-MOTqH8zM.js.map +0 -1
- package/dist/web/ui/assets/alert-dialog-MbYSbZx5.js.map +0 -1
- package/dist/web/ui/assets/arrow-left-CtqQsBC6.js.map +0 -1
- package/dist/web/ui/assets/avatar-BIYaY7pR.js.map +0 -1
- package/dist/web/ui/assets/badge-CUJiWF1y.js.map +0 -1
- package/dist/web/ui/assets/button-CNasMlFE.js.map +0 -1
- package/dist/web/ui/assets/card-BdsEOP7t.js.map +0 -1
- package/dist/web/ui/assets/chevron-down-CB9J_vvZ.js.map +0 -1
- package/dist/web/ui/assets/circle-check-DvGSe1uZ.js.map +0 -1
- package/dist/web/ui/assets/circle-x-CyaGJ_BM.js.map +0 -1
- package/dist/web/ui/assets/collapsible-BU_K9n8f.js.map +0 -1
- package/dist/web/ui/assets/dialog-Bd1rELXb.js.map +0 -1
- package/dist/web/ui/assets/download-C8RvlFqO.js.map +0 -1
- package/dist/web/ui/assets/eye-BJ0NucMz.js.map +0 -1
- package/dist/web/ui/assets/file-text-BWWBuD_N.js.map +0 -1
- package/dist/web/ui/assets/folder-open-BwjemFy7.js.map +0 -1
- package/dist/web/ui/assets/git-branch-D9JVASpC.js.map +0 -1
- package/dist/web/ui/assets/index-C3YiF4qv.js.map +0 -1
- package/dist/web/ui/assets/index-CaqLZNof.js.map +0 -1
- package/dist/web/ui/assets/input-CH3dmo9r.js.map +0 -1
- package/dist/web/ui/assets/loader-circle-DbYKk0_Q.js.map +0 -1
- package/dist/web/ui/assets/pencil-gNDEMhav.js.map +0 -1
- package/dist/web/ui/assets/plus-7rbHkByr.js.map +0 -1
- package/dist/web/ui/assets/power-BS7gCDWs.js.map +0 -1
- package/dist/web/ui/assets/progress-ZzhsBV2v.js.map +0 -1
- package/dist/web/ui/assets/search-BZsbhO0B.js.map +0 -1
- package/dist/web/ui/assets/select-vRSgBrHz.js.map +0 -1
- package/dist/web/ui/assets/send-BkyTIUtJ.js.map +0 -1
- package/dist/web/ui/assets/sparkles-DcP24GEL.js.map +0 -1
- package/dist/web/ui/assets/switch-LRN9wWy2.js.map +0 -1
- package/dist/web/ui/assets/terminal-CWG62zdD.js.map +0 -1
- package/dist/web/ui/assets/textarea-CXh3tmJ1.js.map +0 -1
- package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js.map +0 -1
- package/dist/web/ui/assets/vendor-markdown-DwTbvico.js.map +0 -1
- package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js.map +0 -1
- package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js.map +0 -1
- package/dist/web/ui/assets/vendor-react-C7pctHW3.js.map +0 -1
- package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js.map +0 -1
- package/dist/web/ui/assets/zap-BEfqVtvZ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownRenderer-B9KGVD0X.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-down.js","../../node_modules/lucide-react/dist/esm/icons/arrow-up.js","../../node_modules/lucide-react/dist/esm/icons/copy.js","../../node_modules/lucide-react/dist/esm/icons/folder.js","../../src/stores/chat.ts","../../src/hooks/useSSE.ts","../../node_modules/react-syntax-highlighter/dist/esm/styles/prism/one-dark.js","../../src/components/chat/CodeBlock.tsx","../../src/components/chat/MarkdownRenderer.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: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n];\nconst ArrowDown = createLucideIcon(\"arrow-down\", __iconNode);\n\nexport { __iconNode, ArrowDown as default };\n//# sourceMappingURL=arrow-down.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: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.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 [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.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 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.js.map\n","import { create } from \"zustand\";\nimport type { ChatMessage, ChatThread, ChatSettings } from \"@/lib/api\";\n\nexport interface ChatState {\n // Messages\n messages: ChatMessage[];\n streamingText: string;\n isStreaming: boolean;\n waiting: boolean;\n\n // Threads\n threads: ChatThread[];\n activeThreadId: string | null;\n\n // Provider info\n provider: string;\n model: string;\n\n // Tool execution\n totalSteps: number;\n completedSteps: number;\n currentStepTool: string;\n\n // Settings\n settings: ChatSettings | null;\n\n // Actions\n addMessage: (msg: ChatMessage) => void;\n updateLastAssistantMessage: (content: string) => void;\n appendStreamingText: (text: string) => void;\n clearStreaming: () => void;\n setStreaming: (streaming: boolean) => void;\n setWaiting: (waiting: boolean) => void;\n setThreads: (threads: ChatThread[]) => void;\n setActiveThread: (id: string | null) => void;\n setProvider: (provider: string) => void;\n setModel: (model: string) => void;\n setSteps: (total: number, completed: number, tool: string) => void;\n resetSteps: () => void;\n setSettings: (settings: ChatSettings) => void;\n clearMessages: () => void;\n threadVersion: number;\n bumpThreadVersion: () => void;\n}\n\nconst STORAGE_KEY = \"mercury-chat-active-thread\";\n\nfunction getStoredThreadId(): string | null {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(STORAGE_KEY);\n}\n\nexport const useChatStore = create<ChatState>((set) => ({\n messages: [],\n streamingText: \"\",\n isStreaming: false,\n waiting: false,\n\n threads: [],\n activeThreadId: getStoredThreadId(),\n\n provider: \"\",\n model: \"\",\n\n totalSteps: 0,\n completedSteps: 0,\n currentStepTool: \"\",\n\n settings: null,\n\n addMessage: (msg) =>\n set((state) => ({ messages: [...state.messages, msg] })),\n\n updateLastAssistantMessage: (content) =>\n set((state) => {\n const msgs = [...state.messages];\n for (let i = msgs.length - 1; i >= 0; i--) {\n if (msgs[i].role === \"assistant\") {\n msgs[i] = { ...msgs[i], content };\n break;\n }\n }\n return { messages: msgs };\n }),\n\n appendStreamingText: (text) =>\n set((state) => ({\n streamingText: state.streamingText + text,\n isStreaming: true,\n })),\n\n clearStreaming: () => set({ streamingText: \"\", isStreaming: false }),\n\n setStreaming: (streaming) => set({ isStreaming: streaming }),\n\n setWaiting: (waiting) => set({ waiting }),\n\n setThreads: (threads) => set({ threads }),\n\n setActiveThread: (id) => {\n if (id) {\n localStorage.setItem(STORAGE_KEY, id);\n } else {\n localStorage.removeItem(STORAGE_KEY);\n }\n set({ activeThreadId: id });\n },\n\n setProvider: (provider) => set({ provider }),\n\n setModel: (model) => set({ model }),\n\n setSteps: (total, completed, tool) =>\n set({ totalSteps: total, completedSteps: completed, currentStepTool: tool }),\n\n resetSteps: () =>\n set({ totalSteps: 0, completedSteps: 0, currentStepTool: \"\" }),\n\n setSettings: (settings) => set({ settings }),\n\n clearMessages: () => set({ messages: [], streamingText: \"\", isStreaming: false }),\n\n threadVersion: 0,\n bumpThreadVersion: () => set((state) => ({ threadVersion: state.threadVersion + 1 })),\n}));\n","import { useEffect, useRef, useCallback, useState } from \"react\";\nimport { useChatStore } from \"@/stores/chat\";\nimport api from \"@/lib/api\";\n\ninterface SSEResult {\n connected: boolean;\n reconnecting: boolean;\n}\n\nexport function useSSE(): SSEResult {\n const [connected, setConnected] = useState(false);\n const [reconnecting, setReconnecting] = useState(false);\n const esRef = useRef<EventSource | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const store = useChatStore;\n\n const connect = useCallback(() => {\n if (esRef.current) {\n esRef.current.close();\n }\n\n const es = new EventSource(\"/api/chat/events\");\n esRef.current = es;\n\n es.onopen = () => {\n setConnected(true);\n setReconnecting(false);\n };\n\n es.onerror = () => {\n setConnected(false);\n es.close();\n esRef.current = null;\n\n setReconnecting(true);\n reconnectTimer.current = setTimeout(() => {\n connect();\n }, 3000);\n };\n\n es.addEventListener(\"connected\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().setProvider(data.provider ?? \"\");\n store.getState().setModel(data.model ?? \"\");\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"thinking\", () => {\n store.getState().setWaiting(true);\n });\n\n es.addEventListener(\"provider\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().setProvider(data.provider ?? \"\");\n store.getState().setModel(data.model ?? \"\");\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"step_start\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().setSteps(\n data.totalSteps ?? 0,\n data.stepNumber ?? 0,\n data.tool ?? \"\"\n );\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"step_done\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().setSteps(\n data.totalSteps ?? 0,\n data.stepNumber ?? 0,\n data.tool ?? \"\"\n );\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"text_delta\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().setWaiting(false);\n store.getState().appendStreamingText(data.text ?? \"\");\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"text_done\", (e) => {\n try {\n const raw = (e as MessageEvent).data;\n const data = JSON.parse(raw);\n const fullText = data.fullText ?? data.text ?? raw;\n store.getState().clearStreaming();\n store.getState().setWaiting(false);\n store.getState().resetSteps();\n store.getState().addMessage({\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: fullText,\n timestamp: new Date().toISOString(),\n });\n\n // Persist assistant message to thread\n const threadId = store.getState().activeThreadId;\n if (threadId) {\n api.chat.threads.addMessage(threadId, \"assistant\", fullText)\n .then(() => store.getState().bumpThreadVersion())\n .catch(() => {});\n }\n } catch {\n // Always reset busy state even if parsing fails\n store.getState().clearStreaming();\n store.getState().setWaiting(false);\n store.getState().resetSteps();\n }\n });\n\n es.addEventListener(\"permission_request\", (e) => {\n try {\n const data = JSON.parse((e as MessageEvent).data);\n store.getState().addMessage({\n id: data.id ?? crypto.randomUUID(),\n role: \"system\",\n content: JSON.stringify(data),\n timestamp: new Date().toISOString(),\n });\n } catch { /* ignore */ }\n });\n\n es.addEventListener(\"permission_continue\", () => {\n // Permission resolved, no special action needed\n });\n\n es.addEventListener(\"permission_mode\", () => {\n // Informational, no action needed\n });\n\n es.addEventListener(\"loop_warning\", () => {\n // Could surface a warning in the future\n });\n\n es.addEventListener(\"error\", (e) => {\n const msg = (e as MessageEvent).data ?? \"An error occurred\";\n store.getState().setWaiting(false);\n store.getState().clearStreaming();\n store.getState().resetSteps();\n store.getState().addMessage({\n id: crypto.randomUUID(),\n role: \"system\",\n content: msg,\n timestamp: new Date().toISOString(),\n });\n });\n }, [store]);\n\n useEffect(() => {\n connect();\n\n return () => {\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n }\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n };\n }, [connect]);\n\n return { connected, reconnecting };\n}\n","export default {\n \"code[class*=\\\"language-\\\"]\": {\n \"background\": \"hsl(220, 13%, 18%)\",\n \"color\": \"hsl(220, 14%, 71%)\",\n \"textShadow\": \"0 1px rgba(0, 0, 0, 0.3)\",\n \"fontFamily\": \"\\\"Fira Code\\\", \\\"Fira Mono\\\", Menlo, Consolas, \\\"DejaVu Sans Mono\\\", monospace\",\n \"direction\": \"ltr\",\n \"textAlign\": \"left\",\n \"whiteSpace\": \"pre\",\n \"wordSpacing\": \"normal\",\n \"wordBreak\": \"normal\",\n \"lineHeight\": \"1.5\",\n \"MozTabSize\": \"2\",\n \"OTabSize\": \"2\",\n \"tabSize\": \"2\",\n \"WebkitHyphens\": \"none\",\n \"MozHyphens\": \"none\",\n \"msHyphens\": \"none\",\n \"hyphens\": \"none\"\n },\n \"pre[class*=\\\"language-\\\"]\": {\n \"background\": \"hsl(220, 13%, 18%)\",\n \"color\": \"hsl(220, 14%, 71%)\",\n \"textShadow\": \"0 1px rgba(0, 0, 0, 0.3)\",\n \"fontFamily\": \"\\\"Fira Code\\\", \\\"Fira Mono\\\", Menlo, Consolas, \\\"DejaVu Sans Mono\\\", monospace\",\n \"direction\": \"ltr\",\n \"textAlign\": \"left\",\n \"whiteSpace\": \"pre\",\n \"wordSpacing\": \"normal\",\n \"wordBreak\": \"normal\",\n \"lineHeight\": \"1.5\",\n \"MozTabSize\": \"2\",\n \"OTabSize\": \"2\",\n \"tabSize\": \"2\",\n \"WebkitHyphens\": \"none\",\n \"MozHyphens\": \"none\",\n \"msHyphens\": \"none\",\n \"hyphens\": \"none\",\n \"padding\": \"1em\",\n \"margin\": \"0.5em 0\",\n \"overflow\": \"auto\",\n \"borderRadius\": \"0.3em\"\n },\n \"code[class*=\\\"language-\\\"]::-moz-selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \"code[class*=\\\"language-\\\"] *::-moz-selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \"pre[class*=\\\"language-\\\"] *::-moz-selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \"code[class*=\\\"language-\\\"]::selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \"code[class*=\\\"language-\\\"] *::selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \"pre[class*=\\\"language-\\\"] *::selection\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"inherit\",\n \"textShadow\": \"none\"\n },\n \":not(pre) > code[class*=\\\"language-\\\"]\": {\n \"padding\": \"0.2em 0.3em\",\n \"borderRadius\": \"0.3em\",\n \"whiteSpace\": \"normal\"\n },\n \"comment\": {\n \"color\": \"hsl(220, 10%, 40%)\",\n \"fontStyle\": \"italic\"\n },\n \"prolog\": {\n \"color\": \"hsl(220, 10%, 40%)\"\n },\n \"cdata\": {\n \"color\": \"hsl(220, 10%, 40%)\"\n },\n \"doctype\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"punctuation\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"entity\": {\n \"color\": \"hsl(220, 14%, 71%)\",\n \"cursor\": \"help\"\n },\n \"attr-name\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"class-name\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"boolean\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"constant\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"number\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"atrule\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \"keyword\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \"property\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"tag\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"symbol\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"deleted\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"important\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"selector\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"string\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"char\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"builtin\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"inserted\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"regex\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"attr-value\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"attr-value > .token.punctuation\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \"variable\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \"operator\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \"function\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \"url\": {\n \"color\": \"hsl(187, 47%, 55%)\"\n },\n \"attr-value > .token.punctuation.attr-equals\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"special-attr > .token.attr-value > .token.value.css\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-css .token.selector\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".language-css .token.property\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-css .token.function\": {\n \"color\": \"hsl(187, 47%, 55%)\"\n },\n \".language-css .token.url > .token.function\": {\n \"color\": \"hsl(187, 47%, 55%)\"\n },\n \".language-css .token.url > .token.string.url\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \".language-css .token.important\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".language-css .token.atrule .token.rule\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".language-javascript .token.operator\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation\": {\n \"color\": \"hsl(5, 48%, 51%)\"\n },\n \".language-json .token.operator\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-json .token.null.keyword\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \".language-markdown .token.url\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-markdown .token.url > .token.operator\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-markdown .token.url-reference.url > .token.string\": {\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".language-markdown .token.url > .token.content\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \".language-markdown .token.url > .token.url\": {\n \"color\": \"hsl(187, 47%, 55%)\"\n },\n \".language-markdown .token.url-reference.url\": {\n \"color\": \"hsl(187, 47%, 55%)\"\n },\n \".language-markdown .token.blockquote.punctuation\": {\n \"color\": \"hsl(220, 10%, 40%)\",\n \"fontStyle\": \"italic\"\n },\n \".language-markdown .token.hr.punctuation\": {\n \"color\": \"hsl(220, 10%, 40%)\",\n \"fontStyle\": \"italic\"\n },\n \".language-markdown .token.code-snippet\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \".language-markdown .token.bold .token.content\": {\n \"color\": \"hsl(29, 54%, 61%)\"\n },\n \".language-markdown .token.italic .token.content\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".language-markdown .token.strike .token.content\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".language-markdown .token.strike .token.punctuation\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".language-markdown .token.list.punctuation\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".language-markdown .token.title.important > .token.punctuation\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \"bold\": {\n \"fontWeight\": \"bold\"\n },\n \"italic\": {\n \"fontStyle\": \"italic\"\n },\n \"namespace\": {\n \"Opacity\": \"0.8\"\n },\n \"token.tab:not(:empty):before\": {\n \"color\": \"hsla(220, 14%, 71%, 0.15)\",\n \"textShadow\": \"none\"\n },\n \"token.cr:before\": {\n \"color\": \"hsla(220, 14%, 71%, 0.15)\",\n \"textShadow\": \"none\"\n },\n \"token.lf:before\": {\n \"color\": \"hsla(220, 14%, 71%, 0.15)\",\n \"textShadow\": \"none\"\n },\n \"token.space:before\": {\n \"color\": \"hsla(220, 14%, 71%, 0.15)\",\n \"textShadow\": \"none\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item\": {\n \"marginRight\": \"0.4em\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button\": {\n \"background\": \"hsl(220, 13%, 26%)\",\n \"color\": \"hsl(220, 9%, 55%)\",\n \"padding\": \"0.1em 0.4em\",\n \"borderRadius\": \"0.3em\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a\": {\n \"background\": \"hsl(220, 13%, 26%)\",\n \"color\": \"hsl(220, 9%, 55%)\",\n \"padding\": \"0.1em 0.4em\",\n \"borderRadius\": \"0.3em\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span\": {\n \"background\": \"hsl(220, 13%, 26%)\",\n \"color\": \"hsl(220, 9%, 55%)\",\n \"padding\": \"0.1em 0.4em\",\n \"borderRadius\": \"0.3em\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \"div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus\": {\n \"background\": \"hsl(220, 13%, 28%)\",\n \"color\": \"hsl(220, 14%, 71%)\"\n },\n \".line-highlight.line-highlight\": {\n \"background\": \"hsla(220, 100%, 80%, 0.04)\"\n },\n \".line-highlight.line-highlight:before\": {\n \"background\": \"hsl(220, 13%, 26%)\",\n \"color\": \"hsl(220, 14%, 71%)\",\n \"padding\": \"0.1em 0.6em\",\n \"borderRadius\": \"0.3em\",\n \"boxShadow\": \"0 2px 0 0 rgba(0, 0, 0, 0.2)\"\n },\n \".line-highlight.line-highlight[data-end]:after\": {\n \"background\": \"hsl(220, 13%, 26%)\",\n \"color\": \"hsl(220, 14%, 71%)\",\n \"padding\": \"0.1em 0.6em\",\n \"borderRadius\": \"0.3em\",\n \"boxShadow\": \"0 2px 0 0 rgba(0, 0, 0, 0.2)\"\n },\n \"pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before\": {\n \"backgroundColor\": \"hsla(220, 100%, 80%, 0.04)\"\n },\n \".line-numbers.line-numbers .line-numbers-rows\": {\n \"borderRightColor\": \"hsla(220, 14%, 71%, 0.15)\"\n },\n \".command-line .command-line-prompt\": {\n \"borderRightColor\": \"hsla(220, 14%, 71%, 0.15)\"\n },\n \".line-numbers .line-numbers-rows > span:before\": {\n \"color\": \"hsl(220, 14%, 45%)\"\n },\n \".command-line .command-line-prompt > span:before\": {\n \"color\": \"hsl(220, 14%, 45%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-1\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-5\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-9\": {\n \"color\": \"hsl(355, 65%, 65%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-2\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-6\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-10\": {\n \"color\": \"hsl(95, 38%, 62%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-3\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-7\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-11\": {\n \"color\": \"hsl(207, 82%, 66%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-4\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-8\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \".rainbow-braces .token.token.punctuation.brace-level-12\": {\n \"color\": \"hsl(286, 60%, 67%)\"\n },\n \"pre.diff-highlight > code .token.token.deleted:not(.prefix)\": {\n \"backgroundColor\": \"hsla(353, 100%, 66%, 0.15)\"\n },\n \"pre > code.diff-highlight .token.token.deleted:not(.prefix)\": {\n \"backgroundColor\": \"hsla(353, 100%, 66%, 0.15)\"\n },\n \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection\": {\n \"backgroundColor\": \"hsla(353, 95%, 66%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.inserted:not(.prefix)\": {\n \"backgroundColor\": \"hsla(137, 100%, 55%, 0.15)\"\n },\n \"pre > code.diff-highlight .token.token.inserted:not(.prefix)\": {\n \"backgroundColor\": \"hsla(137, 100%, 55%, 0.15)\"\n },\n \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \"pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection\": {\n \"backgroundColor\": \"hsla(135, 73%, 55%, 0.25)\"\n },\n \".prism-previewer.prism-previewer:before\": {\n \"borderColor\": \"hsl(224, 13%, 17%)\"\n },\n \".prism-previewer-gradient.prism-previewer-gradient div\": {\n \"borderColor\": \"hsl(224, 13%, 17%)\",\n \"borderRadius\": \"0.3em\"\n },\n \".prism-previewer-color.prism-previewer-color:before\": {\n \"borderRadius\": \"0.3em\"\n },\n \".prism-previewer-easing.prism-previewer-easing:before\": {\n \"borderRadius\": \"0.3em\"\n },\n \".prism-previewer.prism-previewer:after\": {\n \"borderTopColor\": \"hsl(224, 13%, 17%)\"\n },\n \".prism-previewer-flipped.prism-previewer-flipped.after\": {\n \"borderBottomColor\": \"hsl(224, 13%, 17%)\"\n },\n \".prism-previewer-angle.prism-previewer-angle:before\": {\n \"background\": \"hsl(219, 13%, 22%)\"\n },\n \".prism-previewer-time.prism-previewer-time:before\": {\n \"background\": \"hsl(219, 13%, 22%)\"\n },\n \".prism-previewer-easing.prism-previewer-easing\": {\n \"background\": \"hsl(219, 13%, 22%)\"\n },\n \".prism-previewer-angle.prism-previewer-angle circle\": {\n \"stroke\": \"hsl(220, 14%, 71%)\",\n \"strokeOpacity\": \"1\"\n },\n \".prism-previewer-time.prism-previewer-time circle\": {\n \"stroke\": \"hsl(220, 14%, 71%)\",\n \"strokeOpacity\": \"1\"\n },\n \".prism-previewer-easing.prism-previewer-easing circle\": {\n \"stroke\": \"hsl(220, 14%, 71%)\",\n \"fill\": \"transparent\"\n },\n \".prism-previewer-easing.prism-previewer-easing path\": {\n \"stroke\": \"hsl(220, 14%, 71%)\"\n },\n \".prism-previewer-easing.prism-previewer-easing line\": {\n \"stroke\": \"hsl(220, 14%, 71%)\"\n }\n};","import { useState, useCallback } from \"react\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport { Check, Copy } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\ninterface CodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport function CodeBlock({ code, language }: CodeBlockProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [code]);\n\n const displayLang = language || \"text\";\n\n return (\n <div className=\"group relative my-3 overflow-hidden rounded-lg border border-border bg-[#282c34]\">\n {/* Header bar */}\n <div className=\"flex items-center justify-between border-b border-white/10 px-4 py-1.5 text-xs\">\n <span className=\"font-mono text-muted-foreground\">{displayLang}</span>\n <button\n onClick={handleCopy}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-xs transition-colors\",\n \"text-muted-foreground hover:bg-white/10 hover:text-foreground\"\n )}\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5 text-emerald-400\" />\n <span className=\"text-emerald-400\">Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n\n {/* Code */}\n <SyntaxHighlighter\n language={language || \"text\"}\n style={oneDark}\n customStyle={{\n margin: 0,\n padding: \"1rem\",\n background: \"transparent\",\n fontSize: \"0.8125rem\",\n lineHeight: \"1.6\",\n }}\n showLineNumbers={false}\n wrapLongLines={false}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n );\n}\n","import ReactMarkdown, { type Components } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { CodeBlock } from \"./CodeBlock\";\nimport { cn } from \"@/lib/utils\";\n\ninterface MarkdownRendererProps {\n content: string;\n className?: string;\n}\n\nconst components: Components = {\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const codeString = String(children).replace(/\\n$/, \"\");\n\n // Fenced code blocks get rendered by CodeBlock\n if (match) {\n return <CodeBlock code={codeString} language={match[1]} />;\n }\n\n // Inline code\n return (\n <code\n className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[0.8125rem] text-foreground\"\n {...props}\n >\n {children}\n </code>\n );\n },\n\n pre({ children }) {\n // If pre wraps a CodeBlock, just pass through\n return <>{children}</>;\n },\n\n a({ href, children, ...props }) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-mercury-500 underline decoration-mercury-500/40 underline-offset-2 transition-colors hover:text-mercury-400 hover:decoration-mercury-400\"\n {...props}\n >\n {children}\n </a>\n );\n },\n\n h1({ children, ...props }) {\n return (\n <h1 className=\"mb-2 mt-4 text-lg font-semibold tracking-tight\" {...props}>\n {children}\n </h1>\n );\n },\n h2({ children, ...props }) {\n return (\n <h2 className=\"mb-2 mt-3 text-base font-semibold tracking-tight\" {...props}>\n {children}\n </h2>\n );\n },\n h3({ children, ...props }) {\n return (\n <h3 className=\"mb-1.5 mt-2.5 text-sm font-semibold\" {...props}>\n {children}\n </h3>\n );\n },\n\n p({ children, ...props }) {\n return (\n <p className=\"mb-2 leading-relaxed last:mb-0\" {...props}>\n {children}\n </p>\n );\n },\n\n ul({ children, ...props }) {\n return (\n <ul className=\"mb-2 ml-4 list-disc space-y-1 last:mb-0\" {...props}>\n {children}\n </ul>\n );\n },\n ol({ children, ...props }) {\n return (\n <ol className=\"mb-2 ml-4 list-decimal space-y-1 last:mb-0\" {...props}>\n {children}\n </ol>\n );\n },\n li({ children, ...props }) {\n return (\n <li className=\"leading-relaxed\" {...props}>\n {children}\n </li>\n );\n },\n\n blockquote({ children, ...props }) {\n return (\n <blockquote\n className=\"my-2 border-l-2 border-mercury-500/50 pl-3 italic text-muted-foreground\"\n {...props}\n >\n {children}\n </blockquote>\n );\n },\n\n table({ children, ...props }) {\n return (\n <div className=\"my-3 overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full text-sm\" {...props}>\n {children}\n </table>\n </div>\n );\n },\n thead({ children, ...props }) {\n return (\n <thead className=\"border-b border-border bg-muted/50\" {...props}>\n {children}\n </thead>\n );\n },\n tr({ children, ...props }) {\n return (\n <tr className=\"border-b border-border/50 transition-colors hover:bg-muted/30\" {...props}>\n {children}\n </tr>\n );\n },\n th({ children, ...props }) {\n return (\n <th className=\"px-3 py-2 text-left font-medium\" {...props}>\n {children}\n </th>\n );\n },\n td({ children, ...props }) {\n return (\n <td className=\"px-3 py-2\" {...props}>\n {children}\n </td>\n );\n },\n\n hr() {\n return <hr className=\"my-4 border-border\" />;\n },\n};\n\nexport function MarkdownRenderer({ content, className }: MarkdownRendererProps) {\n return (\n <div className={cn(\"text-sm\", className)}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n"],"names":["__iconNode","ArrowDown","createLucideIcon","ArrowUp","Copy","Folder","STORAGE_KEY","getStoredThreadId","useChatStore","create","set","msg","state","content","msgs","i","text","streaming","waiting","threads","id","provider","model","total","completed","tool","settings","useSSE","connected","setConnected","useState","reconnecting","setReconnecting","esRef","useRef","reconnectTimer","store","connect","useCallback","es","e","data","raw","fullText","threadId","api","useEffect","oneDark","CodeBlock","code","language","copied","setCopied","handleCopy","displayLang","jsxs","jsx","cn","Fragment","Check","SyntaxHighlighter","components","className","children","props","match","codeString","href","MarkdownRenderer","ReactMarkdown","remarkGfm"],"mappings":"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mBACb,EACE,QAAW,CACT,MAAS,mBACb,EACE,SAAY,CACV,MAAS,mBACb,EACE,OAAU,CACR,MAAS,mBACb,EACE,OAAU,CACR,MAAS,mBACb,EACE,QAAW,CACT,MAAS,oBACb,EACE,SAAY,CACV,MAAS,oBACb,EACE,IAAO,CACL,MAAS,oBACb,EACE,OAAU,CACR,MAAS,oBACb,EACE,QAAW,CACT,MAAS,oBACb,EACE,UAAa,CACX,MAAS,oBACb,EACE,SAAY,CACV,MAAS,mBACb,EACE,OAAU,CACR,MAAS,mBACb,EACE,KAAQ,CACN,MAAS,mBACb,EACE,QAAW,CACT,MAAS,mBACb,EACE,SAAY,CACV,MAAS,mBACb,EACE,MAAS,CACP,MAAS,mBACb,EACE,aAAc,CACZ,MAAS,mBACb,EACE,kCAAmC,CACjC,MAAS,mBACb,EACE,SAAY,CACV,MAAS,oBACb,EACE,SAAY,CACV,MAAS,oBACb,EACE,SAAY,CACV,MAAS,oBACb,EACE,IAAO,CACL,MAAS,oBACb,EACE,8CAA+C,CAC7C,MAAS,oBACb,EACE,sDAAuD,CACrD,MAAS,oBACb,EACE,gCAAiC,CAC/B,MAAS,oBACb,EACE,gCAAiC,CAC/B,MAAS,oBACb,EACE,gCAAiC,CAC/B,MAAS,oBACb,EACE,6CAA8C,CAC5C,MAAS,oBACb,EACE,+CAAgD,CAC9C,MAAS,mBACb,EACE,iCAAkC,CAChC,MAAS,oBACb,EACE,0CAA2C,CACzC,MAAS,oBACb,EACE,uCAAwC,CACtC,MAAS,oBACb,EACE,oHAAqH,CACnH,MAAS,kBACb,EACE,iCAAkC,CAChC,MAAS,oBACb,EACE,qCAAsC,CACpC,MAAS,mBACb,EACE,gCAAiC,CAC/B,MAAS,oBACb,EACE,kDAAmD,CACjD,MAAS,oBACb,EACE,8DAA+D,CAC7D,MAAS,oBACb,EACE,iDAAkD,CAChD,MAAS,oBACb,EACE,6CAA8C,CAC5C,MAAS,oBACb,EACE,8CAA+C,CAC7C,MAAS,oBACb,EACE,mDAAoD,CAClD,MAAS,qBACT,UAAa,QACjB,EACE,2CAA4C,CAC1C,MAAS,qBACT,UAAa,QACjB,EACE,yCAA0C,CACxC,MAAS,mBACb,EACE,gDAAiD,CAC/C,MAAS,mBACb,EACE,kDAAmD,CACjD,MAAS,oBACb,EACE,kDAAmD,CACjD,MAAS,oBACb,EACE,sDAAuD,CACrD,MAAS,oBACb,EACE,6CAA8C,CAC5C,MAAS,oBACb,EACE,iEAAkE,CAChE,MAAS,oBACb,EACE,KAAQ,CACN,WAAc,MAClB,EACE,OAAU,CACR,UAAa,QACjB,EACE,UAAa,CACX,QAAW,KACf,EACE,+BAAgC,CAC9B,MAAS,4BACT,WAAc,MAClB,EACE,kBAAmB,CACjB,MAAS,4BACT,WAAc,MAClB,EACE,kBAAmB,CACjB,MAAS,4BACT,WAAc,MAClB,EACE,qBAAsB,CACpB,MAAS,4BACT,WAAc,MAClB,EACE,sDAAuD,CACrD,YAAe,OACnB,EACE,+DAAgE,CAC9D,WAAc,qBACd,MAAS,oBACT,QAAW,cACX,aAAgB,OACpB,EACE,0DAA2D,CACzD,WAAc,qBACd,MAAS,oBACT,QAAW,cACX,aAAgB,OACpB,EACE,6DAA8D,CAC5D,WAAc,qBACd,MAAS,oBACT,QAAW,cACX,aAAgB,OACpB,EACE,qEAAsE,CACpE,WAAc,qBACd,MAAS,oBACb,EACE,qEAAsE,CACpE,WAAc,qBACd,MAAS,oBACb,EACE,gEAAiE,CAC/D,WAAc,qBACd,MAAS,oBACb,EACE,gEAAiE,CAC/D,WAAc,qBACd,MAAS,oBACb,EACE,mEAAoE,CAClE,WAAc,qBACd,MAAS,oBACb,EACE,mEAAoE,CAClE,WAAc,qBACd,MAAS,oBACb,EACE,iCAAkC,CAChC,WAAc,4BAClB,EACE,wCAAyC,CACvC,WAAc,qBACd,MAAS,qBACT,QAAW,cACX,aAAgB,QAChB,UAAa,8BACjB,EACE,iDAAkD,CAChD,WAAc,qBACd,MAAS,qBACT,QAAW,cACX,aAAgB,QAChB,UAAa,8BACjB,EACE,iGAAkG,CAChG,gBAAmB,4BACvB,EACE,gDAAiD,CAC/C,iBAAoB,2BACxB,EACE,qCAAsC,CACpC,iBAAoB,2BACxB,EACE,iDAAkD,CAChD,M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","x_google_ignoreList":[0,1,2,3,6]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Memory-BOQEY0H8.js","sources":["../../node_modules/lucide-react/dist/esm/icons/database-zap.js","../../node_modules/lucide-react/dist/esm/icons/pin.js","../../src/pages/brain/Memory.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 [\"ellipse\", { cx: \"12\", cy: \"5\", rx: \"9\", ry: \"3\", key: \"msslwz\" }],\n [\"path\", { d: \"M3 5V19A9 3 0 0 0 15 21.84\", key: \"14ibmq\" }],\n [\"path\", { d: \"M21 5V8\", key: \"1marbg\" }],\n [\"path\", { d: \"M21 12L18 17H22L19 22\", key: \"zafso\" }],\n [\"path\", { d: \"M3 12A9 3 0 0 0 14.59 14.87\", key: \"1y4wr8\" }]\n];\nconst DatabaseZap = createLucideIcon(\"database-zap\", __iconNode);\n\nexport { __iconNode, DatabaseZap as default };\n//# sourceMappingURL=database-zap.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 17v5\", key: \"bb1du9\" }],\n [\n \"path\",\n {\n d: \"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\",\n key: \"1nkz8b\"\n }\n ]\n];\nconst Pin = createLucideIcon(\"pin\", __iconNode);\n\nexport { __iconNode, Pin as default };\n//# sourceMappingURL=pin.js.map\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Brain,\n Search,\n Plus,\n Trash2,\n Pencil,\n ChevronDown,\n ChevronRight,\n Loader2,\n CheckCircle2,\n XCircle,\n DatabaseZap,\n Moon,\n Pin,\n Clock,\n} from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n} from \"@/components/ui/dialog\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@/components/ui/alert-dialog\";\nimport { cn, formatDate } from \"@/lib/utils\";\nimport api, { type Memory, type BrainStatus, type MemoryCreate } from \"@/lib/api\";\n\n/* ── Constants ─────────────────────────────────────────────── */\n\nconst MEMORY_TYPES = [\n \"identity\",\n \"preference\",\n \"goal\",\n \"project\",\n \"habit\",\n \"decision\",\n \"constraint\",\n \"relationship\",\n \"episode\",\n \"reflection\",\n] as const;\n\nconst TYPE_COLORS: Record<string, string> = {\n identity: \"bg-blue-500/15 text-blue-400\",\n preference: \"bg-purple-500/15 text-purple-400\",\n goal: \"bg-amber-500/15 text-amber-400\",\n project: \"bg-cyan-500/15 text-cyan-400\",\n habit: \"bg-emerald-500/15 text-emerald-400\",\n decision: \"bg-indigo-500/15 text-indigo-400\",\n constraint: \"bg-red-500/15 text-red-400\",\n relationship: \"bg-pink-500/15 text-pink-400\",\n episode: \"bg-orange-500/15 text-orange-400\",\n reflection: \"bg-teal-500/15 text-teal-400\",\n};\n\nconst PAGE_SIZE = 30;\n\n/* ── Animations ─────────────────────────────────────────────── */\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.03, duration: 0.25, ease: \"easeOut\" as const },\n }),\n exit: { opacity: 0, y: -8, transition: { duration: 0.15 } },\n};\n\nconst stagger = {\n visible: { transition: { staggerChildren: 0.03 } },\n};\n\n/* ── Toast ──────────────────────────────────────────────────── */\n\ninterface Toast {\n id: number;\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction ToastBar({ toasts }: { toasts: Toast[] }) {\n return (\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-2\">\n <AnimatePresence>\n {toasts.map((t) => (\n <motion.div\n key={t.id}\n initial={{ opacity: 0, x: 40 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 40 }}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm\",\n t.type === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-400\"\n : \"border-destructive/30 bg-destructive/10 text-destructive\"\n )}\n >\n {t.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4\" />\n ) : (\n <XCircle className=\"h-4 w-4\" />\n )}\n {t.message}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Skeleton ───────────────────────────────────────────────── */\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div className={cn(\"animate-pulse rounded-lg bg-muted\", className)} />\n );\n}\n\nfunction MemoryCardSkeleton() {\n return (\n <Card>\n <CardContent className=\"p-5 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-5 w-20 rounded-md\" />\n <Skeleton className=\"h-4 w-full\" />\n </div>\n <Skeleton className=\"h-3 w-3/4\" />\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-3 w-16\" />\n <Skeleton className=\"h-3 w-16\" />\n <Skeleton className=\"h-3 w-20\" />\n </div>\n </CardContent>\n </Card>\n );\n}\n\n/* ── Importance Bar ─────────────────────────────────────────── */\n\nfunction ImportanceBar({ value }: { value: number }) {\n const normalized = Math.round(value * 10);\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs text-muted-foreground/70 shrink-0\">Imp</span>\n <div className=\"flex gap-0.5\">\n {Array.from({ length: 10 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"h-1.5 w-1.5 rounded-full transition-colors\",\n i < normalized\n ? \"bg-[#00d4ff]\"\n : \"bg-muted-foreground/15\"\n )}\n />\n ))}\n </div>\n </div>\n );\n}\n\n/* ── Scope Badge ────────────────────────────────────────────── */\n\nfunction ScopeBadge({ scope }: { scope?: string }) {\n if (scope === \"durable\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-amber-400/80\" title=\"Durable memory\">\n <Pin className=\"h-3 w-3\" />\n </span>\n );\n }\n if (scope === \"subconscious\") {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-violet-400/80\" title=\"Subconscious memory\">\n <Moon className=\"h-3 w-3\" />\n </span>\n );\n }\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground/50\" title=\"Active memory\">\n <Clock className=\"h-3 w-3\" />\n </span>\n );\n}\n\n/* ── Memory Item ────────────────────────────────────────────── */\n\nfunction MemoryItem({\n memory,\n onDelete,\n onEdit,\n index,\n showLastSeen,\n}: {\n memory: Memory;\n onDelete: (id: string) => void;\n onEdit: (memory: Memory) => void;\n index: number;\n showLastSeen?: boolean;\n}) {\n const [expanded, setExpanded] = useState(false);\n\n const lastSeenDays = memory.lastSeenAt\n ? Math.round((Date.now() - new Date(memory.lastSeenAt).getTime()) / (1000 * 60 * 60 * 24))\n : null;\n\n return (\n <motion.div\n custom={index}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n layout\n >\n <Card className=\"group transition-colors hover:border-[#00d4ff]/20\">\n <CardContent className=\"p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n {/* Left content */}\n <div className=\"flex-1 min-w-0 space-y-2\">\n {/* Type badge + scope + summary */}\n <div className=\"flex items-start gap-2.5\">\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-md px-2 py-0.5 text-xs font-semibold capitalize\",\n TYPE_COLORS[memory.type] ?? \"bg-muted text-muted-foreground\"\n )}\n >\n {memory.type}\n </span>\n <ScopeBadge scope={memory.scope} />\n <p className=\"text-sm font-medium text-foreground leading-relaxed\">\n {memory.summary}\n </p>\n </div>\n\n {/* Detail */}\n {memory.detail && (\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full text-left\"\n >\n <p\n className={cn(\n \"text-sm text-muted-foreground leading-relaxed transition-all\",\n !expanded && \"line-clamp-2\"\n )}\n >\n {memory.detail}\n </p>\n {memory.detail.length > 120 && (\n <span className=\"text-xs text-[#00d4ff]/70 hover:text-[#00d4ff] mt-0.5 inline-block\">\n {expanded ? \"Show less\" : \"Show more\"}\n </span>\n )}\n </button>\n )}\n\n {/* Meta row */}\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1.5 pt-1\">\n {memory.importance != null && (\n <ImportanceBar value={memory.importance} />\n )}\n {memory.confidence != null && (\n <span className=\"text-xs text-muted-foreground/70\">\n {Math.round(memory.confidence * 100)}% conf\n </span>\n )}\n {memory.evidenceCount != null && memory.evidenceCount > 1 && (\n <span className=\"text-xs text-muted-foreground/50\">\n Seen {memory.evidenceCount}x\n </span>\n )}\n {showLastSeen && lastSeenDays != null && (\n <span className=\"text-xs text-violet-400/70\">\n Last seen: {lastSeenDays}d ago\n </span>\n )}\n <span className=\"text-xs text-muted-foreground/50\">\n {formatDate(memory.createdAt)}\n </span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity shrink-0\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-[#00d4ff]\"\n onClick={() => onEdit(memory)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete Memory</AlertDialogTitle>\n <AlertDialogDescription>\n Are you sure you want to delete this memory? This action\n cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => onDelete(memory.id)}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n );\n}\n\n/* ── Edit Memory Dialog ─────────────────────────────────────── */\n\nfunction EditMemoryDialog({\n memory,\n open,\n onOpenChange,\n onSave,\n saving,\n}: {\n memory: Memory | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (id: string, data: Partial<Memory>) => void;\n saving: boolean;\n}) {\n const [summary, setSummary] = useState(\"\");\n const [detail, setDetail] = useState(\"\");\n const [confidence, setConfidence] = useState(\"0.8\");\n const [importance, setImportance] = useState(\"0.7\");\n\n useEffect(() => {\n if (memory) {\n setSummary(memory.summary);\n setDetail(memory.detail || \"\");\n setConfidence(String(memory.confidence ?? 0.8));\n setImportance(String(memory.importance ?? 0.7));\n }\n }, [memory]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!memory || !summary.trim()) return;\n onSave(memory.id, {\n summary: summary.trim(),\n detail: detail.trim() || undefined,\n confidence: parseFloat(confidence),\n importance: parseFloat(importance),\n });\n };\n\n if (!memory) return null;\n\n const lastSeenDays = memory.lastSeenAt\n ? Math.round((Date.now() - new Date(memory.lastSeenAt).getTime()) / (1000 * 60 * 60 * 24))\n : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Edit Memory</DialogTitle>\n <DialogDescription>\n Update this memory entry.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {/* Type + Scope (read-only) */}\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"inline-flex items-center rounded-md px-2 py-0.5 text-xs font-semibold capitalize\",\n TYPE_COLORS[memory.type] ?? \"bg-muted text-muted-foreground\"\n )}\n >\n {memory.type}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {memory.scope}\n </Badge>\n {lastSeenDays != null && memory.scope === \"subconscious\" && (\n <span className=\"text-xs text-violet-400/70\">\n Last seen {lastSeenDays}d ago\n </span>\n )}\n </div>\n\n {/* Summary */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Summary <span className=\"text-destructive\">*</span>\n </label>\n <Input\n value={summary}\n onChange={(e) => setSummary(e.target.value)}\n required\n />\n </div>\n\n {/* Detail */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Detail\n </label>\n <Textarea\n value={detail}\n onChange={(e) => setDetail(e.target.value)}\n rows={3}\n />\n </div>\n\n {/* Confidence + Importance row */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Confidence (0-1)\n </label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={confidence}\n onChange={(e) => setConfidence(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Importance (0-1)\n </label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={importance}\n onChange={(e) => setImportance(e.target.value)}\n />\n </div>\n </div>\n\n {/* Timestamps */}\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground/60\">\n <span>Created: {formatDate(memory.createdAt)}</span>\n {memory.updatedAt && <span>Updated: {formatDate(memory.updatedAt)}</span>}\n </div>\n\n <DialogFooter>\n <Button type=\"submit\" disabled={saving || !summary.trim()}>\n {saving ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Save Changes\"\n )}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\n/* ── Add Memory Dialog ──────────────────────────────────────── */\n\nfunction AddMemoryDialog({\n open,\n onOpenChange,\n onSubmit,\n submitting,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSubmit: (data: MemoryCreate) => void;\n submitting: boolean;\n}) {\n const [type, setType] = useState<string>(\"preference\");\n const [summary, setSummary] = useState(\"\");\n const [detail, setDetail] = useState(\"\");\n const [confidence, setConfidence] = useState(\"0.8\");\n const [importance, setImportance] = useState(\"0.7\");\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!summary.trim()) return;\n onSubmit({\n type,\n summary: summary.trim(),\n detail: detail.trim() || undefined,\n confidence: parseFloat(confidence),\n importance: parseFloat(importance),\n durability: \"0.8\",\n });\n };\n\n const reset = () => {\n setType(\"preference\");\n setSummary(\"\");\n setDetail(\"\");\n setConfidence(\"0.8\");\n setImportance(\"0.7\");\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(v) => {\n if (!v) reset();\n onOpenChange(v);\n }}\n >\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Add Memory</DialogTitle>\n <DialogDescription>\n Create a new memory entry in the Second Brain.\n </DialogDescription>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {/* Type */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">Type</label>\n <Select value={type} onValueChange={setType}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {MEMORY_TYPES.map((t) => (\n <SelectItem key={t} value={t} className=\"capitalize\">\n {t}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Summary */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Summary <span className=\"text-destructive\">*</span>\n </label>\n <Input\n placeholder=\"What should Mercury remember?\"\n value={summary}\n onChange={(e) => setSummary(e.target.value)}\n required\n />\n </div>\n\n {/* Detail */}\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Detail\n </label>\n <Textarea\n placeholder=\"Additional context or details...\"\n value={detail}\n onChange={(e) => setDetail(e.target.value)}\n rows={3}\n />\n </div>\n\n {/* Confidence + Importance row */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Confidence (0-1)\n </label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={confidence}\n onChange={(e) => setConfidence(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n Importance (0-1)\n </label>\n <Input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={importance}\n onChange={(e) => setImportance(e.target.value)}\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button type=\"submit\" disabled={submitting || !summary.trim()}>\n {submitting ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Add Memory\"\n )}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\n/* ── Collapsible Section ────────────────────────────────────── */\n\nfunction MemorySection({\n title,\n icon,\n count,\n defaultOpen,\n children,\n actions,\n}: {\n title: string;\n icon: React.ReactNode;\n count: number;\n defaultOpen: boolean;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <div className=\"space-y-3\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-2 w-full text-left group\"\n >\n {open ? (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground transition-transform\" />\n ) : (\n <ChevronRight className=\"h-4 w-4 text-muted-foreground transition-transform\" />\n )}\n <span className=\"flex items-center gap-2\">\n {icon}\n <span className=\"text-sm font-semibold text-foreground\">{title}</span>\n </span>\n <Badge variant=\"secondary\" className=\"tabular-nums text-xs\">\n {count}\n </Badge>\n {actions && <div className=\"ml-auto\" onClick={(e) => e.stopPropagation()}>{actions}</div>}\n </button>\n <AnimatePresence>\n {open && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n className=\"overflow-hidden\"\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Main Page ──────────────────────────────────────────────── */\n\nexport function MemoryPage() {\n const [consciousMemories, setConsciousMemories] = useState<Memory[]>([]);\n const [subconsciousMemories, setSubconsciousMemories] = useState<Memory[]>([]);\n const [consciousTotal, setConsciousTotal] = useState(0);\n const [subconsciousTotal, setSubconsciousTotal] = useState(0);\n const [brainStatus, setBrainStatus] = useState<BrainStatus | null>(null);\n const [loading, setLoading] = useState(true);\n const [loadingMoreConscious, setLoadingMoreConscious] = useState(false);\n const [loadingMoreSubconscious, setLoadingMoreSubconscious] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [query, setQuery] = useState(\"\");\n const [activeTypes, setActiveTypes] = useState<Set<string>>(new Set());\n const [dialogOpen, setDialogOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [editMemory, setEditMemory] = useState<Memory | null>(null);\n const [editOpen, setEditOpen] = useState(false);\n const [saving, setSaving] = useState(false);\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n\n const toast = useCallback((type: \"success\" | \"error\", message: string) => {\n const id = Date.now();\n setToasts((prev) => [...prev, { id, type, message }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3500);\n }, []);\n\n /* Fetch brain status */\n const fetchStatus = useCallback(async () => {\n try {\n const s = await api.brain.status();\n setBrainStatus(s);\n } catch {\n // non-critical\n }\n }, []);\n\n /* Fetch memories for both sections */\n const fetchMemories = useCallback(\n async (section: \"conscious\" | \"subconscious\" | \"both\", offset = 0, append = false) => {\n try {\n if (!append) setLoading(true);\n setError(null);\n\n if (section === \"conscious\" || section === \"both\") {\n if (append) setLoadingMoreConscious(true);\n\n let result: { memories: Memory[]; total: number };\n if (query.trim()) {\n // Search conscious\n result = await api.brain.memory.list({\n limit: PAGE_SIZE,\n offset: section === \"conscious\" ? offset : 0,\n q: query.trim(),\n scope: \"conscious\",\n });\n } else {\n const typeParam = activeTypes.size === 1 ? Array.from(activeTypes)[0] : undefined;\n result = await api.brain.memory.list({\n limit: PAGE_SIZE,\n offset: section === \"conscious\" ? offset : 0,\n type: typeParam,\n scope: \"conscious\",\n });\n }\n\n let filtered = result.memories;\n if (activeTypes.size > 1 && !query.trim()) {\n filtered = filtered.filter((m) => activeTypes.has(m.type));\n }\n\n if (append && section === \"conscious\") {\n setConsciousMemories((prev) => [...prev, ...filtered]);\n } else {\n setConsciousMemories(filtered);\n }\n setConsciousTotal(result.total);\n setLoadingMoreConscious(false);\n }\n\n if (section === \"subconscious\" || section === \"both\") {\n if (append) setLoadingMoreSubconscious(true);\n\n let result: { memories: Memory[]; total: number };\n if (query.trim()) {\n // Search subconscious — use the main list endpoint with scope\n result = await api.brain.memory.list({\n limit: PAGE_SIZE,\n offset: section === \"subconscious\" ? offset : 0,\n q: query.trim(),\n scope: \"subconscious\",\n });\n } else {\n result = await api.brain.memory.list({\n limit: PAGE_SIZE,\n offset: section === \"subconscious\" ? offset : 0,\n scope: \"subconscious\",\n });\n }\n\n if (append && section === \"subconscious\") {\n setSubconsciousMemories((prev) => [...prev, ...result.memories]);\n } else {\n setSubconsciousMemories(result.memories);\n }\n setSubconsciousTotal(result.total);\n setLoadingMoreSubconscious(false);\n }\n } catch (err: unknown) {\n setError(\n err instanceof Error ? err.message : \"Failed to load memories\"\n );\n } finally {\n setLoading(false);\n }\n },\n [query, activeTypes]\n );\n\n /* Initial load */\n useEffect(() => {\n fetchStatus();\n }, [fetchStatus]);\n\n /* Debounced search + filter */\n useEffect(() => {\n clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n fetchMemories(\"both\", 0, false);\n }, 300);\n return () => clearTimeout(debounceRef.current);\n }, [fetchMemories]);\n\n /* Toggle type filter */\n const toggleType = (type: string) => {\n setActiveTypes((prev) => {\n const next = new Set(prev);\n if (next.has(type)) next.delete(type);\n else next.add(type);\n return next;\n });\n };\n\n /* Create memory */\n const handleCreate = async (data: MemoryCreate) => {\n setSubmitting(true);\n try {\n await api.brain.memory.create(data);\n toast(\"success\", \"Memory created\");\n setDialogOpen(false);\n fetchMemories(\"both\", 0, false);\n fetchStatus();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to create\");\n } finally {\n setSubmitting(false);\n }\n };\n\n /* Delete memory */\n const handleDelete = async (id: string) => {\n try {\n await api.brain.memory.delete(id);\n setConsciousMemories((prev) => prev.filter((m) => m.id !== id));\n setSubconsciousMemories((prev) => prev.filter((m) => m.id !== id));\n toast(\"success\", \"Memory deleted\");\n fetchStatus();\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to delete\");\n }\n };\n\n /* Edit memory */\n const handleEdit = (memory: Memory) => {\n setEditMemory(memory);\n setEditOpen(true);\n };\n\n const handleSave = async (id: string, data: Partial<Memory>) => {\n setSaving(true);\n try {\n await api.brain.memory.update(id, data);\n toast(\"success\", \"Memory updated\");\n setEditOpen(false);\n setEditMemory(null);\n // Update in-place\n const updater = (prev: Memory[]) =>\n prev.map((m) => (m.id === id ? { ...m, ...data } : m));\n setConsciousMemories(updater);\n setSubconsciousMemories(updater);\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to update\");\n } finally {\n setSaving(false);\n }\n };\n\n const hasMoreConscious = consciousMemories.length < consciousTotal;\n const hasMoreSubconscious = subconsciousMemories.length < subconsciousTotal;\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex items-start justify-between gap-4\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10\">\n <Brain className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2.5\">\n <h1 className=\"text-2xl font-semibold text-foreground\">Memory</h1>\n {brainStatus && (\n <div className=\"flex items-center gap-1.5\">\n <Badge variant=\"secondary\" className=\"tabular-nums\">\n {brainStatus.total} conscious\n </Badge>\n <Badge variant=\"secondary\" className=\"tabular-nums text-violet-400\">\n {brainStatus.subconsciousTotal ?? 0} subconscious\n </Badge>\n </div>\n )}\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Browse and manage Mercury's knowledge\n </p>\n </div>\n </div>\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"h-4 w-4\" />\n Add Memory\n </Button>\n </motion.div>\n\n {/* Search */}\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.05, duration: 0.3 }}\n className=\"relative\"\n >\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search across all memories...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"pl-9\"\n />\n </motion.div>\n\n {/* Type filter chips */}\n {brainStatus && (\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.1, duration: 0.3 }}\n className=\"flex flex-wrap gap-2\"\n >\n {MEMORY_TYPES.map((type) => {\n const count = brainStatus.byType?.[type] ?? 0;\n const active = activeTypes.has(type);\n return (\n <button\n key={type}\n onClick={() => toggleType(type)}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium capitalize transition-all\",\n active\n ? \"border-[#00d4ff]/40 bg-[#00d4ff]/10 text-[#00d4ff]\"\n : \"border-border bg-secondary/50 text-muted-foreground hover:border-border hover:bg-secondary\"\n )}\n >\n {type}\n {count > 0 && (\n <span\n className={cn(\n \"tabular-nums\",\n active ? \"text-[#00d4ff]/70\" : \"text-muted-foreground/50\"\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </motion.div>\n )}\n\n {/* Error state */}\n {error && (\n <Card className=\"border-destructive/30\">\n <CardContent className=\"flex items-center gap-3 p-4 text-sm text-destructive\">\n <XCircle className=\"h-4 w-4 shrink-0\" />\n {error}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"ml-auto\"\n onClick={() => fetchMemories(\"both\", 0, false)}\n >\n Retry\n </Button>\n </CardContent>\n </Card>\n )}\n\n {/* Loading skeleton */}\n {loading && (\n <div className=\"space-y-3\">\n {Array.from({ length: 5 }).map((_, i) => (\n <MemoryCardSkeleton key={i} />\n ))}\n </div>\n )}\n\n {/* Memory sections */}\n {!loading && !error && (\n <div className=\"space-y-6\">\n {/* Conscious Section */}\n <MemorySection\n title=\"Conscious\"\n icon={<Brain className=\"h-4 w-4 text-[#00d4ff]\" />}\n count={consciousTotal}\n defaultOpen={true}\n >\n {consciousMemories.length > 0 ? (\n <div className=\"space-y-3\">\n <motion.div\n className=\"space-y-3\"\n variants={stagger}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <AnimatePresence mode=\"popLayout\">\n {consciousMemories.map((memory, i) => (\n <MemoryItem\n key={memory.id}\n memory={memory}\n onDelete={handleDelete}\n onEdit={handleEdit}\n index={i}\n />\n ))}\n </AnimatePresence>\n </motion.div>\n {hasMoreConscious && (\n <div className=\"flex justify-center pt-2\">\n <Button\n variant=\"outline\"\n onClick={() => fetchMemories(\"conscious\", consciousMemories.length, true)}\n disabled={loadingMoreConscious}\n >\n {loadingMoreConscious ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <ChevronDown className=\"h-4 w-4\" />\n Load More ({consciousMemories.length} / {consciousTotal})\n </>\n )}\n </Button>\n </div>\n )}\n </div>\n ) : (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-10 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <DatabaseZap className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {query.trim()\n ? \"No conscious memories match your search.\"\n : \"No conscious memories yet. Start a conversation or add one manually.\"}\n </p>\n </CardContent>\n </Card>\n )}\n </MemorySection>\n\n {/* Subconscious Section */}\n <MemorySection\n title=\"Subconscious\"\n icon={<Moon className=\"h-4 w-4 text-violet-400\" />}\n count={subconsciousTotal}\n defaultOpen={false}\n >\n {subconsciousMemories.length > 0 ? (\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground/70 px-1\">\n Dormant memories not referenced in 30+ days. Automatically recalled when relevant.\n </p>\n <motion.div\n className=\"space-y-3\"\n variants={stagger}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <AnimatePresence mode=\"popLayout\">\n {subconsciousMemories.map((memory, i) => (\n <MemoryItem\n key={memory.id}\n memory={memory}\n onDelete={handleDelete}\n onEdit={handleEdit}\n index={i}\n showLastSeen\n />\n ))}\n </AnimatePresence>\n </motion.div>\n {hasMoreSubconscious && (\n <div className=\"flex justify-center pt-2\">\n <Button\n variant=\"outline\"\n onClick={() => fetchMemories(\"subconscious\", subconsciousMemories.length, true)}\n disabled={loadingMoreSubconscious}\n >\n {loadingMoreSubconscious ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Loading...\n </>\n ) : (\n <>\n <ChevronDown className=\"h-4 w-4\" />\n Load More ({subconsciousMemories.length} / {subconsciousTotal})\n </>\n )}\n </Button>\n </div>\n )}\n </div>\n ) : (\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-10 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3\">\n <Moon className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {query.trim()\n ? \"No subconscious memories match your search.\"\n : \"No subconscious memories yet. Memories move here after 30 days of not being referenced.\"}\n </p>\n </CardContent>\n </Card>\n )}\n </MemorySection>\n </div>\n )}\n\n {/* Dialogs */}\n <AddMemoryDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n onSubmit={handleCreate}\n submitting={submitting}\n />\n\n <EditMemoryDialog\n memory={editMemory}\n open={editOpen}\n onOpenChange={setEditOpen}\n onSave={handleSave}\n saving={saving}\n />\n\n <ToastBar toasts={toasts} />\n </div>\n );\n}\n"],"names":["__iconNode","DatabaseZap","createLucideIcon","Pin","MEMORY_TYPES","TYPE_COLORS","PAGE_SIZE","fadeUp","i","stagger","ToastBar","toasts","jsx","AnimatePresence","t","jsxs","motion","cn","CheckCircle2","XCircle","Skeleton","className","MemoryCardSkeleton","Card","CardContent","ImportanceBar","value","normalized","_","ScopeBadge","scope","Moon","Clock","MemoryItem","memory","onDelete","onEdit","index","showLastSeen","expanded","setExpanded","useState","lastSeenDays","formatDate","Button","Pencil","AlertDialog","AlertDialogTrigger","Trash2","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","EditMemoryDialog","open","onOpenChange","onSave","saving","summary","setSummary","detail","setDetail","confidence","setConfidence","importance","setImportance","useEffect","handleSubmit","e","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Badge","Input","Textarea","DialogFooter","Fragment","Loader2","AddMemoryDialog","onSubmit","submitting","type","setType","reset","v","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","MemorySection","title","icon","count","defaultOpen","children","actions","setOpen","ChevronDown","ChevronRight","MemoryPage","consciousMemories","setConsciousMemories","subconsciousMemories","setSubconsciousMemories","consciousTotal","setConsciousTotal","subconsciousTotal","setSubconsciousTotal","brainStatus","setBrainStatus","loading","setLoading","loadingMoreConscious","setLoadingMoreConscious","loadingMoreSubconscious","setLoadingMoreSubconscious","error","setError","query","setQuery","activeTypes","setActiveTypes","dialogOpen","setDialogOpen","setSubmitting","editMemory","setEditMemory","editOpen","setEditOpen","setSaving","setToasts","debounceRef","useRef","toast","useCallback","message","id","prev","fetchStatus","s","api","fetchMemories","section","offset","append","result","typeParam","filtered","m","err","toggleType","next","handleCreate","data","handleDelete","handleEdit","handleSave","updater","hasMoreConscious","hasMoreSubconscious","Brain","Plus","Search","_a","active"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Permissions-jbFH-toa.js","sources":["../../node_modules/lucide-react/dist/esm/icons/hard-drive.js","../../node_modules/lucide-react/dist/esm/icons/info.js","../../node_modules/lucide-react/dist/esm/icons/save.js","../../src/pages/Permissions.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 [\"line\", { x1: \"22\", x2: \"2\", y1: \"12\", y2: \"12\", key: \"1y58io\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"16\", y2: \"16\", key: \"sgf278\" }],\n [\"line\", { x1: \"10\", x2: \"10.01\", y1: \"16\", y2: \"16\", key: \"1l4acy\" }]\n];\nconst HardDrive = createLucideIcon(\"hard-drive\", __iconNode);\n\nexport { __iconNode, HardDrive as default };\n//# sourceMappingURL=hard-drive.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: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.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: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","import { useEffect, useState, useCallback, useMemo } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Shield,\n Save,\n Loader2,\n HardDrive,\n Terminal,\n GitBranch,\n CheckCircle2,\n XCircle,\n Info,\n} from \"lucide-react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n} from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { cn } from \"@/lib/utils\";\nimport api from \"@/lib/api\";\n\n/* ── Animations ─────────────────────────────────────────────── */\n\nconst fadeUp = {\n hidden: { opacity: 0, y: 12 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: { delay: i * 0.08, duration: 0.35, ease: \"easeOut\" as const },\n }),\n};\n\n/* ── Permission Metadata ────────────────────────────────────── */\n\ninterface PermMeta {\n icon: React.ElementType;\n label: string;\n description: string;\n permissions: Record<string, { label: string; description: string }>;\n}\n\nconst CAPABILITY_META: Record<string, PermMeta> = {\n filesystem: {\n icon: HardDrive,\n label: \"Filesystem\",\n description: \"Access to read, write, and manage files on the local system\",\n permissions: {\n read: {\n label: \"Read Files\",\n description: \"Read file contents and directory listings\",\n },\n write: {\n label: \"Write Files\",\n description: \"Create and modify files on disk\",\n },\n delete: {\n label: \"Delete Files\",\n description: \"Remove files and directories permanently\",\n },\n },\n },\n shell: {\n icon: Terminal,\n label: \"Shell\",\n description: \"Execute commands in the system shell\",\n permissions: {\n execute: {\n label: \"Execute Commands\",\n description: \"Run shell commands and scripts\",\n },\n },\n },\n git: {\n icon: GitBranch,\n label: \"Git\",\n description: \"Version control operations on repositories\",\n permissions: {\n commit: {\n label: \"Commit\",\n description: \"Create commits in repositories\",\n },\n push: {\n label: \"Push\",\n description: \"Push commits to remote repositories\",\n },\n pull: {\n label: \"Pull\",\n description: \"Pull changes from remote repositories\",\n },\n },\n },\n};\n\n/* ── Toast ──────────────────────────────────────────────────── */\n\ninterface Toast {\n id: number;\n type: \"success\" | \"error\";\n message: string;\n}\n\nfunction ToastBar({ toasts }: { toasts: Toast[] }) {\n return (\n <div className=\"fixed bottom-6 right-6 z-50 flex flex-col gap-2\">\n <AnimatePresence>\n {toasts.map((t) => (\n <motion.div\n key={t.id}\n initial={{ opacity: 0, x: 40 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: 40 }}\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm\",\n t.type === \"success\"\n ? \"border-emerald-500/30 bg-emerald-500/10 text-emerald-400\"\n : \"border-destructive/30 bg-destructive/10 text-destructive\"\n )}\n >\n {t.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4\" />\n ) : (\n <XCircle className=\"h-4 w-4\" />\n )}\n {t.message}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\n/* ── Skeleton ───────────────────────────────────────────────── */\n\nfunction Skeleton({ className }: { className?: string }) {\n return (\n <div className={cn(\"animate-pulse rounded-lg bg-muted\", className)} />\n );\n}\n\nfunction CapabilitySkeleton() {\n return (\n <Card>\n <CardHeader>\n <Skeleton className=\"h-5 w-28\" />\n <Skeleton className=\"h-4 w-64 mt-1\" />\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center justify-between\">\n <div className=\"space-y-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-48\" />\n </div>\n <Skeleton className=\"h-5 w-9 rounded-full\" />\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\n/* ── Types ──────────────────────────────────────────────────── */\n\ntype Capabilities = Record<string, Record<string, boolean>>;\n\n/* ── Main Page ──────────────────────────────────────────────── */\n\nexport function PermissionsPage() {\n const [capabilities, setCapabilities] = useState<Capabilities>({});\n const [originalCapabilities, setOriginalCapabilities] = useState<Capabilities>({});\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const toast = useCallback((type: \"success\" | \"error\", message: string) => {\n const id = Date.now();\n setToasts((prev) => [...prev, { id, type, message }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3500);\n }, []);\n\n const fetchPermissions = useCallback(async () => {\n try {\n const res = await api.permissions.get();\n const caps = res.manifest.capabilities as Capabilities;\n setCapabilities(structuredClone(caps));\n setOriginalCapabilities(structuredClone(caps));\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to load permissions\");\n } finally {\n setLoading(false);\n }\n }, [toast]);\n\n useEffect(() => {\n fetchPermissions();\n }, [fetchPermissions]);\n\n const hasChanges = useMemo(() => {\n return JSON.stringify(capabilities) !== JSON.stringify(originalCapabilities);\n }, [capabilities, originalCapabilities]);\n\n const handleToggle = (group: string, perm: string, checked: boolean) => {\n setCapabilities((prev) => ({\n ...prev,\n [group]: {\n ...prev[group],\n [perm]: checked,\n },\n }));\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const res = await api.permissions.update(capabilities);\n if (res.success) {\n const caps = res.manifest.capabilities as Capabilities;\n setCapabilities(structuredClone(caps));\n setOriginalCapabilities(structuredClone(caps));\n toast(\"success\", \"Permissions updated successfully\");\n }\n } catch (err: unknown) {\n toast(\"error\", err instanceof Error ? err.message : \"Failed to save permissions\");\n } finally {\n setSaving(false);\n }\n };\n\n // Merge API capabilities with known metadata, handling unknown groups gracefully\n const capabilityGroups = useMemo(() => {\n const groups: {\n key: string;\n icon: React.ElementType;\n label: string;\n description: string;\n permissions: { key: string; label: string; description: string; value: boolean }[];\n }[] = [];\n\n for (const [groupKey, groupValue] of Object.entries(capabilities)) {\n const meta = CAPABILITY_META[groupKey];\n const perms = typeof groupValue === \"object\" && groupValue !== null\n ? groupValue\n : {};\n\n const permEntries = Object.entries(perms).map(([permKey, permValue]) => {\n const permMeta = meta?.permissions[permKey];\n return {\n key: permKey,\n label: permMeta?.label ?? permKey.charAt(0).toUpperCase() + permKey.slice(1),\n description: permMeta?.description ?? `${permKey} permission`,\n value: Boolean(permValue),\n };\n });\n\n groups.push({\n key: groupKey,\n icon: meta?.icon ?? Info,\n label: meta?.label ?? groupKey.charAt(0).toUpperCase() + groupKey.slice(1),\n description: meta?.description ?? `Manage ${groupKey} permissions`,\n permissions: permEntries,\n });\n }\n\n return groups;\n }, [capabilities]);\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <motion.div\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"flex items-start justify-between\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10\">\n <Shield className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Permissions</h1>\n <p className=\"text-sm text-muted-foreground\">\n Control what Mercury can access\n </p>\n </div>\n </div>\n </motion.div>\n\n {/* Capability Groups */}\n {loading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <CapabilitySkeleton key={i} />\n ))}\n </div>\n ) : capabilityGroups.length === 0 ? (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.2 }}\n >\n <Card>\n <CardContent className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-muted mb-4\">\n <Shield className=\"h-7 w-7 text-muted-foreground\" />\n </div>\n <h3 className=\"text-base font-medium text-foreground mb-1\">\n No permissions configured\n </h3>\n <p className=\"text-sm text-muted-foreground max-w-sm\">\n The permission manifest is empty. Capabilities will appear here\n once configured.\n </p>\n </CardContent>\n </Card>\n </motion.div>\n ) : (\n <div className=\"space-y-4\">\n {capabilityGroups.map((group, i) => {\n const Icon = group.icon;\n return (\n <motion.div\n key={group.key}\n custom={i}\n variants={fadeUp}\n initial=\"hidden\"\n animate=\"visible\"\n >\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-muted\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{group.label}</CardTitle>\n <CardDescription>{group.description}</CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"divide-y divide-border\">\n {group.permissions.map((perm) => (\n <div\n key={perm.key}\n className=\"flex items-center justify-between py-3 first:pt-0 last:pb-0\"\n >\n <div className=\"space-y-0.5 pr-4\">\n <label\n htmlFor={`${group.key}-${perm.key}`}\n className=\"text-sm font-medium text-foreground cursor-pointer\"\n >\n {perm.label}\n </label>\n <p className=\"text-xs text-muted-foreground\">\n {perm.description}\n </p>\n </div>\n <Switch\n id={`${group.key}-${perm.key}`}\n checked={perm.value}\n onCheckedChange={(checked) =>\n handleToggle(group.key, perm.key, checked)\n }\n />\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </motion.div>\n );\n })}\n\n {/* Save Button */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.3 }}\n className=\"flex justify-end pt-2\"\n >\n <Button\n onClick={handleSave}\n disabled={saving || !hasChanges}\n size=\"lg\"\n className={cn(\n hasChanges && \"mercury-glow-sm\"\n )}\n >\n {saving ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n Saving\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Changes\n </>\n )}\n </Button>\n </motion.div>\n </div>\n )}\n\n <ToastBar toasts={toasts} />\n </div>\n );\n}\n"],"names":["__iconNode","HardDrive","createLucideIcon","Info","Save","fadeUp","i","CAPABILITY_META","Terminal","GitBranch","ToastBar","toasts","jsx","AnimatePresence","t","jsxs","motion","cn","CheckCircle2","XCircle","Skeleton","className","CapabilitySkeleton","Card","CardHeader","CardContent","_","PermissionsPage","capabilities","setCapabilities","useState","originalCapabilities","setOriginalCapabilities","loading","setLoading","saving","setSaving","setToasts","toast","useCallback","type","message","id","prev","fetchPermissions","caps","api","err","useEffect","hasChanges","useMemo","handleToggle","group","perm","checked","handleSave","res","capabilityGroups","groups","groupKey","groupValue","meta","permEntries","permKey","permValue","permMeta","Shield","Icon","CardTitle","CardDescription","Switch","Button","Fragment","Loader2"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PersonDetail-Ca8B9io8.js","sources":["../../src/pages/brain/PersonDetail.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport { Link, useParams } from \"react-router-dom\";\nimport { motion } from \"framer-motion\";\nimport { ArrowLeft, Brain, Clock, UserCircle } from \"lucide-react\";\nimport api, { type Person, type Memory } from \"@/lib/api\";\nimport { cn, formatDate } from \"@/lib/utils\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\n\n// ── Animation ──\n\nconst fadeIn = {\n hidden: { opacity: 0, y: 10 },\n show: { opacity: 1, y: 0, transition: { duration: 0.35, ease: \"easeOut\" as const } },\n};\n\nconst stagger = {\n hidden: {},\n show: { transition: { staggerChildren: 0.03 } },\n};\n\nconst listItem = {\n hidden: { opacity: 0, x: -8 },\n show: { opacity: 1, x: 0, transition: { duration: 0.25 } },\n};\n\n// ── Skeleton ──\n\nfunction DetailSkeleton() {\n return (\n <div className=\"space-y-6 p-6 animate-pulse\">\n <div className=\"h-4 w-32 rounded bg-muted\" />\n <div className=\"flex items-center gap-4\">\n <div className=\"h-16 w-16 rounded-full bg-muted\" />\n <div className=\"space-y-2\">\n <div className=\"h-6 w-40 rounded bg-muted\" />\n <div className=\"h-4 w-20 rounded bg-muted\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"h-4 w-full rounded bg-muted\" />\n <div className=\"h-4 w-3/4 rounded bg-muted\" />\n </div>\n <div className=\"flex gap-2\">\n <div className=\"h-5 w-16 rounded bg-muted\" />\n <div className=\"h-5 w-14 rounded bg-muted\" />\n <div className=\"h-5 w-18 rounded bg-muted\" />\n </div>\n <div className=\"h-5 w-28 rounded bg-muted mt-8\" />\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"rounded-lg border border-border p-4 space-y-2\">\n <div className=\"h-4 w-full rounded bg-muted\" />\n <div className=\"h-3 w-24 rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n}\n\n// ── Type badge color mapping ──\n\nfunction typeBadgeVariant(\n type: string\n): \"default\" | \"secondary\" | \"success\" | \"warning\" | \"outline\" {\n switch (type) {\n case \"fact\":\n return \"default\";\n case \"preference\":\n return \"success\";\n case \"observation\":\n return \"warning\";\n default:\n return \"secondary\";\n }\n}\n\n// ── Page ──\n\nexport function PersonDetailPage() {\n const { id } = useParams<{ id: string }>();\n const [person, setPerson] = useState<Person | null>(null);\n const [memories, setMemories] = useState<Memory[]>([]);\n const [memoryTotal, setMemoryTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!id) return;\n try {\n setError(null);\n setLoading(true);\n const [personRes, memoriesRes] = await Promise.all([\n api.brain.persons.get(id),\n api.brain.persons.memories(id, 50),\n ]);\n setPerson(personRes.person);\n setMemories(memoriesRes.memories);\n setMemoryTotal(memoriesRes.total);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load person\");\n } finally {\n setLoading(false);\n }\n }, [id]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n if (loading) return <DetailSkeleton />;\n\n if (error || !person) {\n return (\n <div className=\"space-y-6 p-6\">\n <Link\n to=\"/second-brain/persons\"\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Persons\n </Link>\n <Card>\n <CardContent className=\"flex flex-col items-center gap-3 py-12 text-center text-muted-foreground\">\n <UserCircle className=\"h-10 w-10\" />\n <div>\n <p className=\"font-medium text-foreground\">Person not found</p>\n <p className=\"text-sm\">\n {error || \"This person doesn't exist or has been removed.\"}\n </p>\n </div>\n <Link\n to=\"/second-brain/persons\"\n className=\"mt-2 text-sm text-[#00d4ff] hover:underline\"\n >\n Return to directory\n </Link>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-8 p-6\">\n {/* Back */}\n <motion.div variants={fadeIn} initial=\"hidden\" animate=\"show\">\n <Link\n to=\"/second-brain/persons\"\n className=\"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Persons\n </Link>\n </motion.div>\n\n {/* Person header */}\n <motion.div\n className=\"space-y-4\"\n variants={fadeIn}\n initial=\"hidden\"\n animate=\"show\"\n >\n <div className=\"flex items-center gap-4\">\n <Avatar className=\"h-16 w-16\">\n <AvatarFallback className=\"bg-[#00d4ff]/10 text-[#00d4ff] text-xl font-semibold\">\n {person.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div>\n <h1 className=\"text-2xl font-bold text-foreground\">\n {person.name}\n </h1>\n {person.relationship && (\n <Badge variant=\"secondary\" className=\"mt-1 capitalize\">\n {person.relationship}\n </Badge>\n )}\n </div>\n </div>\n\n {person.summary && (\n <p className=\"max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n {person.summary}\n </p>\n )}\n\n {person.traits && person.traits.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {person.traits.map((trait) => (\n <Badge key={trait} variant=\"outline\" className=\"text-xs\">\n {trait}\n </Badge>\n ))}\n </div>\n )}\n </motion.div>\n\n {/* Memories */}\n <motion.div\n className=\"space-y-4\"\n variants={fadeIn}\n initial=\"hidden\"\n animate=\"show\"\n transition={{ delay: 0.1 }}\n >\n <div className=\"flex items-center gap-2\">\n <Brain className=\"h-5 w-5 text-[#00d4ff]\" />\n <h2 className=\"text-lg font-semibold text-foreground\">\n Memories\n <span className=\"ml-1.5 text-sm font-normal text-muted-foreground\">\n ({memoryTotal})\n </span>\n </h2>\n </div>\n\n {memories.length === 0 ? (\n <Card>\n <CardContent className=\"py-8 text-center text-sm text-muted-foreground\">\n No memories associated with this person yet.\n </CardContent>\n </Card>\n ) : (\n <motion.div\n className=\"space-y-2\"\n variants={stagger}\n initial=\"hidden\"\n animate=\"show\"\n >\n {memories.map((memory) => (\n <motion.div key={memory.id} variants={listItem}>\n <Card\n className={cn(\n \"transition-colors hover:border-[#00d4ff]/20\"\n )}\n >\n <CardContent className=\"flex items-start gap-3 p-4\">\n <Badge\n variant={typeBadgeVariant(memory.type)}\n className=\"mt-0.5 shrink-0 text-[10px] capitalize\"\n >\n {memory.type}\n </Badge>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-foreground\">\n {memory.summary}\n </p>\n <span className=\"mt-1 flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatDate(memory.createdAt)}\n </span>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n ))}\n </motion.div>\n )}\n </motion.div>\n </div>\n );\n}\n"],"names":["fadeIn","stagger","listItem","DetailSkeleton","jsxs","jsx","_","i","typeBadgeVariant","type","PersonDetailPage","id","useParams","person","setPerson","useState","memories","setMemories","memoryTotal","setMemoryTotal","loading","setLoading","error","setError","fetchData","useCallback","personRes","memoriesRes","api","err","useEffect","Link","ArrowLeft","Card","CardContent","UserCircle","motion","Avatar","AvatarFallback","Badge","trait","Brain","memory","cn","Clock","formatDate"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Persons-epdmUeBM.js","sources":["../../src/pages/brain/Persons.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { motion } from \"framer-motion\";\nimport { Search, Users, UserCircle, Brain } from \"lucide-react\";\nimport api, { type Person } from \"@/lib/api\";\nimport { cn } from \"@/lib/utils\";\nimport { Input } from \"@/components/ui/input\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Avatar, AvatarFallback } from \"@/components/ui/avatar\";\n\n// ── Skeleton ──\n\nfunction PersonCardSkeleton() {\n return (\n <div className=\"rounded-xl border border-border bg-card p-5 animate-pulse\">\n <div className=\"flex items-center gap-3 mb-3\">\n <div className=\"h-11 w-11 rounded-full bg-muted\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-4 w-28 rounded bg-muted\" />\n <div className=\"h-3 w-16 rounded bg-muted\" />\n </div>\n </div>\n <div className=\"space-y-2 mb-3\">\n <div className=\"h-3 w-full rounded bg-muted\" />\n <div className=\"h-3 w-3/4 rounded bg-muted\" />\n </div>\n <div className=\"flex gap-1.5\">\n <div className=\"h-5 w-14 rounded bg-muted\" />\n <div className=\"h-5 w-12 rounded bg-muted\" />\n </div>\n </div>\n );\n}\n\n// ── Animation variants ──\n\nconst container = {\n hidden: {},\n show: {\n transition: { staggerChildren: 0.04 },\n },\n};\n\nconst item = {\n hidden: { opacity: 0, y: 12 },\n show: { opacity: 1, y: 0, transition: { duration: 0.3, ease: \"easeOut\" as const } },\n};\n\n// ── Page ──\n\nexport function PersonsPage() {\n const [persons, setPersons] = useState<Person[]>([]);\n const [total, setTotal] = useState(0);\n const [query, setQuery] = useState(\"\");\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const fetchPersons = useCallback(async (q: string) => {\n try {\n setError(null);\n setLoading(true);\n const res = await api.brain.persons.list({\n q: q || undefined,\n limit: 200,\n });\n setPersons(res.persons);\n setTotal(res.total);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to load persons\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchPersons(\"\");\n }, [fetchPersons]);\n\n const handleSearch = (value: string) => {\n setQuery(value);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => fetchPersons(value), 300);\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-2.5\">\n <Users className=\"h-6 w-6 text-[#00d4ff]\" />\n <h1 className=\"text-2xl font-semibold text-foreground\">\n Persons\n {!loading && (\n <span className=\"ml-2 text-base font-normal text-muted-foreground\">\n ({total})\n </span>\n )}\n </h1>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n People Mercury knows about\n </p>\n </div>\n\n {/* Search */}\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search by name...\"\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n {/* Error */}\n {error && (\n <Card>\n <CardContent className=\"py-8 text-center text-destructive\">\n {error}\n </CardContent>\n </Card>\n )}\n\n {/* Loading */}\n {loading && (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <PersonCardSkeleton key={i} />\n ))}\n </div>\n )}\n\n {/* Empty */}\n {!loading && !error && persons.length === 0 && (\n <Card>\n <CardContent className=\"flex flex-col items-center gap-3 py-12 text-center text-muted-foreground\">\n <UserCircle className=\"h-10 w-10\" />\n <div>\n <p className=\"font-medium text-foreground\">No persons found</p>\n <p className=\"text-sm\">\n {query\n ? \"Try a different search term.\"\n : \"Mercury hasn't recorded any people yet.\"}\n </p>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Grid */}\n {!loading && !error && persons.length > 0 && (\n <motion.div\n className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\"\n variants={container}\n initial=\"hidden\"\n animate=\"show\"\n >\n {persons.map((person) => (\n <motion.div key={person.id} variants={item}>\n <Link\n to={`/second-brain/persons/${person.id}`}\n className=\"block\"\n >\n <Card\n className={cn(\n \"cursor-pointer transition-all duration-200\",\n \"hover:-translate-y-0.5 hover:shadow-lg hover:border-[#00d4ff]/30\"\n )}\n >\n <CardContent className=\"p-5\">\n {/* Avatar + name */}\n <div className=\"flex items-center gap-3 mb-3\">\n <Avatar className=\"h-11 w-11\">\n <AvatarFallback className=\"bg-[#00d4ff]/10 text-[#00d4ff] font-semibold text-sm\">\n {person.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-base font-semibold text-foreground\">\n {person.name}\n </p>\n {person.relationship && (\n <Badge\n variant=\"secondary\"\n className=\"mt-0.5 text-[10px] capitalize\"\n >\n {person.relationship}\n </Badge>\n )}\n </div>\n </div>\n\n {/* Summary */}\n {person.summary && (\n <p className=\"mb-3 line-clamp-2 text-sm text-muted-foreground\">\n {person.summary}\n </p>\n )}\n\n {/* Footer: traits + memory count */}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {person.traits?.slice(0, 4).map((trait) => (\n <Badge\n key={trait}\n variant=\"outline\"\n className=\"text-[10px]\"\n >\n {trait}\n </Badge>\n ))}\n {person.memoryCount != null && person.memoryCount > 0 && (\n <span className=\"ml-auto flex items-center gap-1 text-xs text-muted-foreground\">\n <Brain className=\"h-3 w-3\" />\n {person.memoryCount} memories\n </span>\n )}\n </div>\n </CardContent>\n </Card>\n </Link>\n </motion.div>\n ))}\n </motion.div>\n )}\n </div>\n );\n}\n"],"names":["PersonCardSkeleton","jsxs","jsx","container","item","PersonsPage","persons","setPersons","useState","total","setTotal","query","setQuery","loading","setLoading","error","setError","debounceRef","useRef","fetchPersons","useCallback","q","res","api","err","useEffect","handleSearch","value","Users","Search","Input","e","Card","CardContent","_","i","UserCircle","motion","person","Link","cn","Avatar","AvatarFallback","Badge","_a","trait","Brain"],"mappings":"2eAaA,SAASA,GAAqB,CAC5B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4DACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAA,CAAkC,EACjDD,EAAAA,KAAC,MAAA,CAAI,UAAU,mBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,EAC3CA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAAA,CAC7C,CAAA,EACF,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAAA,CAA8B,EAC7CA,EAAAA,IAAC,MAAA,CAAI,UAAU,4BAAA,CAA6B,CAAA,EAC9C,EACAD,EAAAA,KAAC,MAAA,CAAI,UAAU,eACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,EAC3CA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAAA,CAC7C,CAAA,EACF,CAEJ,CAIA,MAAMC,EAAY,CAChB,OAAQ,CAAA,EACR,KAAM,CACJ,WAAY,CAAE,gBAAiB,GAAA,CAAK,CAExC,EAEMC,EAAO,CACX,OAAQ,CAAE,QAAS,EAAG,EAAG,EAAA,EACzB,KAAM,CAAE,QAAS,EAAG,EAAG,EAAG,WAAY,CAAE,SAAU,GAAK,KAAM,SAAA,CAAmB,CAClF,EAIO,SAASC,GAAc,CAC5B,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAmB,CAAA,CAAE,EAC7C,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAS,CAAC,EAC9B,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAS,EAAE,EAC/B,CAACK,EAASC,CAAU,EAAIN,EAAAA,SAAS,EAAI,EACrC,CAACO,EAAOC,CAAQ,EAAIR,EAAAA,SAAwB,IAAI,EAChDS,EAAcC,EAAAA,OAA6C,IAAI,EAE/DC,EAAeC,cAAY,MAAOC,GAAc,CACpD,GAAI,CACFL,EAAS,IAAI,EACbF,EAAW,EAAI,EACf,MAAMQ,EAAM,MAAMC,EAAI,MAAM,QAAQ,KAAK,CACvC,EAAGF,GAAK,OACR,MAAO,GAAA,CACR,EACDd,EAAWe,EAAI,OAAO,EACtBZ,EAASY,EAAI,KAAK,CACpB,OAASE,EAAK,CACZR,EAASQ,aAAe,MAAQA,EAAI,QAAU,wBAAwB,CACxE,QAAA,CACEV,EAAW,EAAK,CAClB,CACF,EAAG,CAAA,CAAE,EAELW,EAAAA,UAAU,IAAM,CACdN,EAAa,EAAE,CACjB,EAAG,CAACA,CAAY,CAAC,EAEjB,MAAMO,EAAgBC,GAAkB,CACtCf,EAASe,CAAK,EACVV,EAAY,SAAS,aAAaA,EAAY,OAAO,EACzDA,EAAY,QAAU,WAAW,IAAME,EAAaQ,CAAK,EAAG,GAAG,CACjE,EAEA,OACE1B,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC0B,EAAA,CAAM,UAAU,wBAAA,CAAyB,EAC1C3B,EAAAA,KAAC,KAAA,CAAG,UAAU,yCAAyC,SAAA,CAAA,UAEpD,CAACY,GACAZ,EAAAA,KAAC,OAAA,CAAK,UAAU,mDAAmD,SAAA,CAAA,IAC/DQ,EAAM,GAAA,CAAA,CACV,CAAA,CAAA,CAEJ,CAAA,EACF,EACAP,EAAAA,IAAC,IAAA,CAAE,UAAU,qCAAqC,SAAA,4BAAA,CAElD,CAAA,EACF,EAGAD,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACb,SAAA,CAAAC,EAAAA,IAAC2B,EAAA,CAAO,UAAU,wEAAA,CAAyE,EAC3F3B,EAAAA,IAAC4B,EAAA,CACC,YAAY,oBACZ,MAAOnB,EACP,SAAWoB,GAAML,EAAaK,EAAE,OAAO,KAAK,EAC5C,UAAU,MAAA,CAAA,CACZ,EACF,EAGChB,SACEiB,EAAA,CACC,SAAA9B,EAAAA,IAAC+B,GAAY,UAAU,oCACpB,WACH,CAAA,CACF,EAIDpB,SACE,MAAA,CAAI,UAAU,uDACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAACqB,EAAGC,UAChCnC,EAAA,CAAA,EAAwBmC,CAAG,CAC7B,EACH,EAID,CAACtB,GAAW,CAACE,GAAST,EAAQ,SAAW,GACxCJ,EAAAA,IAAC8B,EAAA,CACC,SAAA/B,EAAAA,KAACgC,EAAA,CAAY,UAAU,2EACrB,SAAA,CAAA/B,EAAAA,IAACkC,EAAA,CAAW,UAAU,WAAA,CAAY,SACjC,MAAA,CACC,SAAA,CAAAlC,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,mBAAgB,QAC1D,IAAA,CAAE,UAAU,UACV,SAAAS,EACG,+BACA,yCAAA,CACN,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EAID,CAACE,GAAW,CAACE,GAAST,EAAQ,OAAS,GACtCJ,EAAAA,IAACmC,EAAO,IAAP,CACC,UAAU,uDACV,SAAUlC,EACV,QAAQ,SACR,QAAQ,OAEP,SAAAG,EAAQ,IAAKgC,GAAA,oBACXD,EAAO,IAAP,CAA2B,SAAUjC,EACpC,SAAAF,EAAAA,IAACqC,EAAA,CACC,GAAI,yBAAyBD,EAAO,EAAE,GACtC,UAAU,QAEV,SAAApC,EAAAA,IAAC8B,EAAA,CACC,UAAWQ,EACT,6CACA,kEAAA,EAGF,SAAAvC,EAAAA,KAACgC,EAAA,CAAY,UAAU,MAErB,SAAA,CAAAhC,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAC,MAACuC,EAAA,CAAO,UAAU,YAChB,SAAAvC,EAAAA,IAACwC,GAAe,UAAU,uDACvB,SAAAJ,EAAO,KAAK,OAAO,CAAC,EAAE,YAAA,EACzB,EACF,EACArC,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,mDACV,SAAAoC,EAAO,KACV,EACCA,EAAO,cACNpC,EAAAA,IAACyC,EAAA,CACC,QAAQ,YACR,UAAU,gCAET,SAAAL,EAAO,YAAA,CAAA,CACV,CAAA,CAEJ,CAAA,EACF,EAGCA,EAAO,SACNpC,EAAAA,IAAC,KAAE,UAAU,kDACV,WAAO,QACV,EAIFD,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACZ,SAAA,EAAA2C,EAAAN,EAAO,SAAP,YAAAM,EAAe,MAAM,EAAG,GAAG,IAAKC,GAC/B3C,EAAAA,IAACyC,EAAA,CAEC,QAAQ,UACR,UAAU,cAET,SAAAE,CAAA,EAJIA,CAAA,GAORP,EAAO,aAAe,MAAQA,EAAO,YAAc,GAClDrC,EAAAA,KAAC,OAAA,CAAK,UAAU,gEACd,SAAA,CAAAC,EAAAA,IAAC4C,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1BR,EAAO,YAAY,WAAA,CAAA,CACtB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,EA7DeA,EAAO,EA8DxB,EACD,CAAA,CAAA,CACH,EAEJ,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Providers-Bm8sZNZo.js","sources":["../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../src/pages/Providers.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 [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n];\nconst EyeOff = createLucideIcon(\"eye-off\", __iconNode);\n\nexport { __iconNode, EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Cpu, Eye, EyeOff, Loader2, CheckCircle2, XCircle } from \"lucide-react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport api, { type ProviderInfo, type ProviderTestResult } from \"@/lib/api\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardHeader, CardContent } from \"@/components/ui/card\";\nimport { Input } from \"@/components/ui/input\";\nimport { Button } from \"@/components/ui/button\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Badge } from \"@/components/ui/badge\";\n\n/* ── Per-provider local form state ── */\ninterface ProviderForm {\n apiKey: string;\n baseUrl: string;\n model: string;\n enabled: boolean;\n showKey: boolean;\n saving: boolean;\n testing: boolean;\n feedback: { type: \"success\" | \"error\"; message: string } | null;\n testResult: ProviderTestResult | null;\n}\n\nconst emptyForm = (p: ProviderInfo): ProviderForm => ({\n apiKey: \"\",\n baseUrl: p.baseUrl,\n model: p.model,\n enabled: p.enabled,\n showKey: false,\n saving: false,\n testing: false,\n feedback: null,\n testResult: null,\n});\n\n/* ── Skeleton ── */\nfunction ProviderSkeleton() {\n return (\n <Card className=\"border-border/50 bg-card/60 backdrop-blur\">\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"h-9 w-9 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-5 w-28 animate-pulse rounded bg-muted\" />\n </div>\n <div className=\"h-5 w-9 animate-pulse rounded-full bg-muted\" />\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"h-3.5 w-16 animate-pulse rounded bg-muted\" />\n <div className=\"h-9 w-full animate-pulse rounded-md bg-muted\" />\n </div>\n ))}\n <div className=\"flex gap-2 pt-2\">\n <div className=\"h-9 w-20 animate-pulse rounded-md bg-muted\" />\n <div className=\"h-9 w-32 animate-pulse rounded-md bg-muted\" />\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport function ProvidersPage() {\n const [providers, setProviders] = useState<ProviderInfo[]>([]);\n const [forms, setForms] = useState<Record<string, ProviderForm>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const feedbackTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n\n const fetchProviders = useCallback(async () => {\n try {\n const data = await api.providers.list();\n setProviders(data);\n setForms((prev) => {\n const next: Record<string, ProviderForm> = {};\n for (const p of data) {\n next[p.name] = prev[p.name]\n ? { ...prev[p.name], enabled: p.enabled }\n : emptyForm(p);\n }\n return next;\n });\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Failed to load providers\");\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchProviders();\n return () => {\n Object.values(feedbackTimers.current).forEach(clearTimeout);\n };\n }, [fetchProviders]);\n\n /* helpers */\n const updateForm = (name: string, patch: Partial<ProviderForm>) => {\n setForms((prev) => ({ ...prev, [name]: { ...prev[name], ...patch } }));\n };\n\n const showFeedback = (\n name: string,\n type: \"success\" | \"error\",\n message: string\n ) => {\n if (feedbackTimers.current[name]) clearTimeout(feedbackTimers.current[name]);\n updateForm(name, { feedback: { type, message } });\n feedbackTimers.current[name] = setTimeout(() => {\n updateForm(name, { feedback: null });\n }, 4000);\n };\n\n const handleSave = async (name: string) => {\n const f = forms[name];\n if (!f) return;\n updateForm(name, { saving: true });\n try {\n await api.providers.update(name, {\n ...(f.apiKey ? { apiKey: f.apiKey } : {}),\n baseUrl: f.baseUrl,\n model: f.model,\n enabled: f.enabled,\n });\n showFeedback(name, \"success\", \"Configuration saved\");\n updateForm(name, { apiKey: \"\", saving: false });\n fetchProviders();\n } catch (e) {\n showFeedback(name, \"error\", e instanceof Error ? e.message : \"Save failed\");\n updateForm(name, { saving: false });\n }\n };\n\n const handleTest = async (name: string) => {\n updateForm(name, { testing: true, testResult: null });\n try {\n const result = await api.providers.test(name);\n updateForm(name, { testing: false, testResult: result });\n showFeedback(\n name,\n result.success ? \"success\" : \"error\",\n result.success ? \"Connection successful\" : \"Connection failed\"\n );\n } catch (e) {\n updateForm(name, { testing: false });\n showFeedback(name, \"error\", e instanceof Error ? e.message : \"Test failed\");\n }\n };\n\n const handleToggle = async (name: string, enabled: boolean) => {\n updateForm(name, { enabled });\n try {\n await api.providers.update(name, { enabled });\n fetchProviders();\n } catch (e) {\n showFeedback(name, \"error\", \"Failed to toggle provider\");\n updateForm(name, { enabled: !enabled });\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20 ring-1 ring-[#00d4ff]/30\">\n <Cpu className=\"h-5 w-5 text-[#00d4ff]\" />\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Providers</h1>\n <p className=\"text-sm text-muted-foreground\">\n Configure your AI model providers\n </p>\n </div>\n </div>\n </div>\n\n {/* Error state */}\n {error && !loading && (\n <Card className=\"border-destructive/50 bg-destructive/5\">\n <CardContent className=\"flex items-center gap-3 py-4\">\n <XCircle className=\"h-5 w-5 text-destructive\" />\n <p className=\"text-sm text-destructive\">{error}</p>\n <Button variant=\"outline\" size=\"sm\" className=\"ml-auto\" onClick={fetchProviders}>\n Retry\n </Button>\n </CardContent>\n </Card>\n )}\n\n {/* Loading */}\n {loading && (\n <div className=\"grid gap-6 md:grid-cols-1 lg:grid-cols-2\">\n {[1, 2, 3, 4].map((i) => (\n <ProviderSkeleton key={i} />\n ))}\n </div>\n )}\n\n {/* Provider Grid */}\n {!loading && providers.length > 0 && (\n <div className=\"grid gap-6 md:grid-cols-1 lg:grid-cols-2\">\n <AnimatePresence mode=\"popLayout\">\n {providers.map((provider, idx) => {\n const f = forms[provider.name];\n if (!f) return null;\n return (\n <motion.div\n key={provider.name}\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.3, delay: idx * 0.05 }}\n >\n <Card\n className={cn(\n \"border-border/50 bg-card/60 backdrop-blur transition-all duration-300\",\n f.enabled && \"ring-1 ring-[#00d4ff]/20\"\n )}\n >\n <CardHeader className=\"pb-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n \"flex h-9 w-9 items-center justify-center rounded-lg transition-colors\",\n f.enabled\n ? \"bg-gradient-to-br from-[#00d4ff]/20 to-[#a78bfa]/20\"\n : \"bg-muted\"\n )}\n >\n <Cpu\n className={cn(\n \"h-4.5 w-4.5 transition-colors\",\n f.enabled ? \"text-[#00d4ff]\" : \"text-muted-foreground\"\n )}\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base font-medium text-foreground\">\n {provider.name}\n </span>\n <Badge\n variant={f.enabled ? \"default\" : \"secondary\"}\n className={cn(\n \"text-[10px] px-1.5 py-0\",\n f.enabled &&\n \"bg-[#00d4ff]/15 text-[#00d4ff] border-[#00d4ff]/30 hover:bg-[#00d4ff]/20\"\n )}\n >\n {f.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n </div>\n </div>\n <Switch\n checked={f.enabled}\n onCheckedChange={(val) => handleToggle(provider.name, val)}\n />\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {/* API Key */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n API Key\n </label>\n <div className=\"relative\">\n <Input\n type={f.showKey ? \"text\" : \"password\"}\n placeholder={provider.maskedKey || \"Enter API key\"}\n value={f.apiKey}\n onChange={(e) =>\n updateForm(provider.name, { apiKey: e.target.value })\n }\n className=\"pr-9 bg-background/50\"\n />\n <button\n type=\"button\"\n onClick={() =>\n updateForm(provider.name, { showKey: !f.showKey })\n }\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\n >\n {f.showKey ? (\n <EyeOff className=\"h-4 w-4\" />\n ) : (\n <Eye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Base URL */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Base URL{\" \"}\n <span className=\"text-muted-foreground/60\">(optional)</span>\n </label>\n <Input\n placeholder=\"https://api.openai.com/v1\"\n value={f.baseUrl}\n onChange={(e) =>\n updateForm(provider.name, { baseUrl: e.target.value })\n }\n className=\"bg-background/50\"\n />\n </div>\n\n {/* Model */}\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground\">\n Model\n </label>\n <Input\n placeholder=\"gpt-4o\"\n value={f.model}\n onChange={(e) =>\n updateForm(provider.name, { model: e.target.value })\n }\n className=\"bg-background/50\"\n />\n </div>\n\n {/* Feedback */}\n <AnimatePresence>\n {f.feedback && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{ opacity: 0, height: 0 }}\n className=\"overflow-hidden\"\n >\n <div\n className={cn(\n \"flex items-center gap-2 rounded-md px-3 py-2 text-sm\",\n f.feedback.type === \"success\"\n ? \"bg-emerald-500/10 text-emerald-400\"\n : \"bg-destructive/10 text-destructive\"\n )}\n >\n {f.feedback.type === \"success\" ? (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n ) : (\n <XCircle className=\"h-4 w-4 shrink-0\" />\n )}\n {f.feedback.message}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Test result details */}\n <AnimatePresence>\n {f.testResult?.success && f.testResult.models && (\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=\"rounded-md border border-border/50 bg-background/30 p-3 space-y-2\">\n {f.testResult.recommendedModel && (\n <p className=\"text-xs text-muted-foreground\">\n Recommended:{\" \"}\n <span className=\"font-medium text-[#00d4ff]\">\n {f.testResult.recommendedModel}\n </span>\n </p>\n )}\n <div className=\"flex flex-wrap gap-1.5\">\n {f.testResult.models.slice(0, 12).map((m) => (\n <Badge\n key={m}\n variant=\"secondary\"\n className=\"text-[10px] cursor-pointer hover:bg-[#00d4ff]/15 hover:text-[#00d4ff] transition-colors\"\n onClick={() =>\n updateForm(provider.name, { model: m })\n }\n >\n {m}\n </Badge>\n ))}\n {f.testResult.models.length > 12 && (\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n +{f.testResult.models.length - 12} more\n </Badge>\n )}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-1\">\n <Button\n size=\"sm\"\n onClick={() => handleSave(provider.name)}\n disabled={f.saving}\n className=\"bg-gradient-to-r from-[#00d4ff] to-[#a78bfa] text-white hover:opacity-90 transition-opacity\"\n >\n {f.saving && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n Save\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleTest(provider.name)}\n disabled={f.testing}\n >\n {f.testing && (\n <Loader2 className=\"mr-1.5 h-3.5 w-3.5 animate-spin\" />\n )}\n Test Connection\n </Button>\n </div>\n </CardContent>\n </Card>\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n )}\n\n {/* Empty state */}\n {!loading && !error && providers.length === 0 && (\n <Card className=\"border-border/50 bg-card/60\">\n <CardContent className=\"py-12 text-center\">\n <Cpu className=\"mx-auto h-10 w-10 text-muted-foreground/40 mb-3\" />\n <p className=\"text-muted-foreground\">No providers configured yet.</p>\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"names":["__iconNode","EyeOff","createLucideIcon","emptyForm","p","ProviderSkeleton","jsxs","Card","jsx","CardHeader","CardContent","i","ProvidersPage","providers","setProviders","useState","forms","setForms","loading","setLoading","error","setError","feedbackTimers","useRef","fetchProviders","useCallback","data","api","prev","next","e","useEffect","updateForm","name","patch","showFeedback","type","message","handleSave","f","handleTest","result","handleToggle","enabled","Cpu","XCircle","Button","AnimatePresence","provider","idx","motion","cn","Badge","Switch","val","Input","Eye","CheckCircle2","_a","m","Loader2"],"mappings":"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","x_google_ignoreList":[0]}
|