@cosmicstack/mercury-agent 1.1.7 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +36 -2
  2. package/dist/index.js +10142 -4331
  3. package/dist/index.js.map +1 -1
  4. package/dist/web/static/vendor/geist/Geist-Italic[wght].woff2 +0 -0
  5. package/dist/web/static/vendor/geist/Geist-Variable.woff2 +0 -0
  6. package/dist/web/static/vendor/geist/GeistMono-Italic[wght].woff2 +0 -0
  7. package/dist/web/static/vendor/geist/GeistMono-Variable.woff2 +0 -0
  8. package/dist/web/static/vendor/graphology.min.js +2 -0
  9. package/dist/web/static/vendor/icons.svg +108 -0
  10. package/dist/web/static/vendor/sql-wasm.wasm +0 -0
  11. package/dist/web/ui/assets/Chat-DCFkzIwn.js +28 -0
  12. package/dist/web/ui/assets/Chat-DCFkzIwn.js.map +1 -0
  13. package/dist/web/ui/assets/Dashboard-B81ollv8.js +2 -0
  14. package/dist/web/ui/assets/Dashboard-B81ollv8.js.map +1 -0
  15. package/dist/web/ui/assets/Goals-D0cR8yIP.js +12 -0
  16. package/dist/web/ui/assets/Goals-D0cR8yIP.js.map +1 -0
  17. package/dist/web/ui/assets/Graph-C3eHp3_J.js +7 -0
  18. package/dist/web/ui/assets/Graph-C3eHp3_J.js.map +1 -0
  19. package/dist/web/ui/assets/Kanban-DrkTRyni.js +45 -0
  20. package/dist/web/ui/assets/Kanban-DrkTRyni.js.map +1 -0
  21. package/dist/web/ui/assets/Login-GRQ-LjgN.js +2 -0
  22. package/dist/web/ui/assets/Login-GRQ-LjgN.js.map +1 -0
  23. package/dist/web/ui/assets/MarkdownRenderer-Dvh1jwyj.js +22 -0
  24. package/dist/web/ui/assets/MarkdownRenderer-Dvh1jwyj.js.map +1 -0
  25. package/dist/web/ui/assets/Memory-dAZsKmWz.js +12 -0
  26. package/dist/web/ui/assets/Memory-dAZsKmWz.js.map +1 -0
  27. package/dist/web/ui/assets/Permissions-DCiyUUfI.js +17 -0
  28. package/dist/web/ui/assets/Permissions-DCiyUUfI.js.map +1 -0
  29. package/dist/web/ui/assets/PersonDetail-iZgApJog.js +2 -0
  30. package/dist/web/ui/assets/PersonDetail-iZgApJog.js.map +1 -0
  31. package/dist/web/ui/assets/Persons-Bs_HhYjC.js +2 -0
  32. package/dist/web/ui/assets/Persons-Bs_HhYjC.js.map +1 -0
  33. package/dist/web/ui/assets/Providers-CL6wMWni.js +7 -0
  34. package/dist/web/ui/assets/Providers-CL6wMWni.js.map +1 -0
  35. package/dist/web/ui/assets/Schedules-BQwE1hP5.js +17 -0
  36. package/dist/web/ui/assets/Schedules-BQwE1hP5.js.map +1 -0
  37. package/dist/web/ui/assets/Settings-26SF-okR.js +12 -0
  38. package/dist/web/ui/assets/Settings-26SF-okR.js.map +1 -0
  39. package/dist/web/ui/assets/Skills-DANyYK_d.js +7 -0
  40. package/dist/web/ui/assets/Skills-DANyYK_d.js.map +1 -0
  41. package/dist/web/ui/assets/Tasks-DbwRozzx.js +7 -0
  42. package/dist/web/ui/assets/Tasks-DbwRozzx.js.map +1 -0
  43. package/dist/web/ui/assets/Usage-i_q6Ri4s.js +12 -0
  44. package/dist/web/ui/assets/Usage-i_q6Ri4s.js.map +1 -0
  45. package/dist/web/ui/assets/Workspace-ZR5syf-9.js +52 -0
  46. package/dist/web/ui/assets/Workspace-ZR5syf-9.js.map +1 -0
  47. package/dist/web/ui/assets/activity-CIP1IzSg.js +7 -0
  48. package/dist/web/ui/assets/activity-CIP1IzSg.js.map +1 -0
  49. package/dist/web/ui/assets/alert-dialog-CW-j2nG4.js +7 -0
  50. package/dist/web/ui/assets/alert-dialog-CW-j2nG4.js.map +1 -0
  51. package/dist/web/ui/assets/arrow-left-D2YO-iMS.js +7 -0
  52. package/dist/web/ui/assets/arrow-left-D2YO-iMS.js.map +1 -0
  53. package/dist/web/ui/assets/avatar-BLsf3GhK.js +7 -0
  54. package/dist/web/ui/assets/avatar-BLsf3GhK.js.map +1 -0
  55. package/dist/web/ui/assets/badge-DfDJNUtd.js +2 -0
  56. package/dist/web/ui/assets/badge-DfDJNUtd.js.map +1 -0
  57. package/dist/web/ui/assets/button-TaFPR-zy.js +2 -0
  58. package/dist/web/ui/assets/button-TaFPR-zy.js.map +1 -0
  59. package/dist/web/ui/assets/card-DAYo4Zl5.js +2 -0
  60. package/dist/web/ui/assets/card-DAYo4Zl5.js.map +1 -0
  61. package/dist/web/ui/assets/chevron-down-CQi0yuay.js +12 -0
  62. package/dist/web/ui/assets/chevron-down-CQi0yuay.js.map +1 -0
  63. package/dist/web/ui/assets/circle-check-DweDcOkA.js +7 -0
  64. package/dist/web/ui/assets/circle-check-DweDcOkA.js.map +1 -0
  65. package/dist/web/ui/assets/circle-x-BmL20etA.js +7 -0
  66. package/dist/web/ui/assets/circle-x-BmL20etA.js.map +1 -0
  67. package/dist/web/ui/assets/collapsible-BU_K9n8f.js +2 -0
  68. package/dist/web/ui/assets/collapsible-BU_K9n8f.js.map +1 -0
  69. package/dist/web/ui/assets/dialog-DovgkMhT.js +2 -0
  70. package/dist/web/ui/assets/dialog-DovgkMhT.js.map +1 -0
  71. package/dist/web/ui/assets/download-_QBatDio.js +7 -0
  72. package/dist/web/ui/assets/download-_QBatDio.js.map +1 -0
  73. package/dist/web/ui/assets/eye-Wpgtfmgw.js +7 -0
  74. package/dist/web/ui/assets/eye-Wpgtfmgw.js.map +1 -0
  75. package/dist/web/ui/assets/file-text-2EGFNyc1.js +7 -0
  76. package/dist/web/ui/assets/file-text-2EGFNyc1.js.map +1 -0
  77. package/dist/web/ui/assets/folder-open-C-OiZn9P.js +7 -0
  78. package/dist/web/ui/assets/folder-open-C-OiZn9P.js.map +1 -0
  79. package/dist/web/ui/assets/git-branch-BT9gCKgG.js +7 -0
  80. package/dist/web/ui/assets/git-branch-BT9gCKgG.js.map +1 -0
  81. package/dist/web/ui/assets/index-BhxU0YlT.js +163 -0
  82. package/dist/web/ui/assets/index-BhxU0YlT.js.map +1 -0
  83. package/dist/web/ui/assets/index-CUT6Fr2C.js +2 -0
  84. package/dist/web/ui/assets/index-CUT6Fr2C.js.map +1 -0
  85. package/dist/web/ui/assets/index-DOw1nKre.css +1 -0
  86. package/dist/web/ui/assets/input-L1uz5xAQ.js +2 -0
  87. package/dist/web/ui/assets/input-L1uz5xAQ.js.map +1 -0
  88. package/dist/web/ui/assets/loader-circle-BTFgt3hG.js +7 -0
  89. package/dist/web/ui/assets/loader-circle-BTFgt3hG.js.map +1 -0
  90. package/dist/web/ui/assets/pencil-uxK07iYy.js +7 -0
  91. package/dist/web/ui/assets/pencil-uxK07iYy.js.map +1 -0
  92. package/dist/web/ui/assets/plus-DcWFYr4m.js +7 -0
  93. package/dist/web/ui/assets/plus-DcWFYr4m.js.map +1 -0
  94. package/dist/web/ui/assets/power-DVIqVIMj.js +12 -0
  95. package/dist/web/ui/assets/power-DVIqVIMj.js.map +1 -0
  96. package/dist/web/ui/assets/progress-DMwOdxli.js +2 -0
  97. package/dist/web/ui/assets/progress-DMwOdxli.js.map +1 -0
  98. package/dist/web/ui/assets/search-D1OOxb1X.js +7 -0
  99. package/dist/web/ui/assets/search-D1OOxb1X.js.map +1 -0
  100. package/dist/web/ui/assets/select-Dnx_bUgy.js +2 -0
  101. package/dist/web/ui/assets/select-Dnx_bUgy.js.map +1 -0
  102. package/dist/web/ui/assets/send-D4uxqmyH.js +7 -0
  103. package/dist/web/ui/assets/send-D4uxqmyH.js.map +1 -0
  104. package/dist/web/ui/assets/sparkles-DLSJA4xU.js +7 -0
  105. package/dist/web/ui/assets/sparkles-DLSJA4xU.js.map +1 -0
  106. package/dist/web/ui/assets/switch-CvDDbCUA.js +2 -0
  107. package/dist/web/ui/assets/switch-CvDDbCUA.js.map +1 -0
  108. package/dist/web/ui/assets/terminal-DI3J3W_z.js +7 -0
  109. package/dist/web/ui/assets/terminal-DI3J3W_z.js.map +1 -0
  110. package/dist/web/ui/assets/textarea-CXLsr8tf.js +2 -0
  111. package/dist/web/ui/assets/textarea-CXLsr8tf.js.map +1 -0
  112. package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js +6 -0
  113. package/dist/web/ui/assets/vendor-dnd-DRBSMxXo.js.map +1 -0
  114. package/dist/web/ui/assets/vendor-markdown-DwTbvico.js +30 -0
  115. package/dist/web/ui/assets/vendor-markdown-DwTbvico.js.map +1 -0
  116. package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js +18 -0
  117. package/dist/web/ui/assets/vendor-motion-Dwx3-JO5.js.map +1 -0
  118. package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js +65 -0
  119. package/dist/web/ui/assets/vendor-radix-3UdfCgs_.js.map +1 -0
  120. package/dist/web/ui/assets/vendor-react-C7pctHW3.js +44 -0
  121. package/dist/web/ui/assets/vendor-react-C7pctHW3.js.map +1 -0
  122. package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js +17 -0
  123. package/dist/web/ui/assets/vendor-syntax-xZUI6Op9.js.map +1 -0
  124. package/dist/web/ui/assets/zap-C-0oH5gt.js +7 -0
  125. package/dist/web/ui/assets/zap-C-0oH5gt.js.map +1 -0
  126. package/dist/web/ui/favicon.svg +10 -0
  127. package/dist/web/ui/icons/icon-192.svg +10 -0
  128. package/dist/web/ui/icons/icon-512-maskable.svg +10 -0
  129. package/dist/web/ui/icons/icon-512.svg +10 -0
  130. package/dist/web/ui/index.html +24 -0
  131. package/dist/web/ui/logo-dark.png +0 -0
  132. package/dist/web/ui/logo-full-dark.png +0 -0
  133. package/dist/web/ui/logo-full-light.png +0 -0
  134. package/dist/web/ui/logo-light.png +0 -0
  135. package/dist/web/ui/manifest.webmanifest +1 -0
  136. package/dist/web/ui/registerSW.js +1 -0
  137. package/dist/web/ui/sw.js +11 -0
  138. package/dist/web/ui/sw.js.map +1 -0
  139. package/dist/web/ui/workbox-0bb07689.js +3 -0
  140. package/dist/web/ui/workbox-0bb07689.js.map +1 -0
  141. package/package.json +11 -6
  142. package/src/web/static/vendor/geist/Geist-Italic[wght].woff2 +0 -0
  143. package/src/web/static/vendor/geist/Geist-Variable.woff2 +0 -0
  144. package/src/web/static/vendor/geist/GeistMono-Italic[wght].woff2 +0 -0
  145. package/src/web/static/vendor/geist/GeistMono-Variable.woff2 +0 -0
  146. package/src/web/static/vendor/graphology.min.js +2 -0
  147. package/src/web/static/vendor/icons.svg +108 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownRenderer-Dvh1jwyj.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]}
@@ -0,0 +1,12 @@
1
+ import{j as e,m as S,A as _}from"./vendor-motion-Dwx3-JO5.js";import{r as a}from"./vendor-react-C7pctHW3.js";import{C as O,c as B}from"./card-DAYo4Zl5.js";import{B as w}from"./button-TaFPR-zy.js";import{I as k}from"./input-L1uz5xAQ.js";import{B as R}from"./badge-DfDJNUtd.js";import{T as ie}from"./textarea-CXLsr8tf.js";import{D as re,a as le,b as ce,c as oe,d as de,e as me}from"./dialog-DovgkMhT.js";import{S as ke,a as Te,b as Ee,c as Le,d as ze}from"./select-Dnx_bUgy.js";import{A as Fe,h as Oe,T as Be,a as Ie,b as Pe,c as _e,d as Re,e as qe,f as Ve,g as He}from"./alert-dialog-CW-j2nG4.js";import{e as ue,a as v,B as se,c as C,j as Y,g as Ue,h as Z,C as Ye}from"./index-BhxU0YlT.js";import{P as Ze}from"./plus-DcWFYr4m.js";import{S as Ge}from"./search-D1OOxb1X.js";import{C as xe}from"./circle-x-BmL20etA.js";import{L as q}from"./loader-circle-BTFgt3hG.js";import{C as G}from"./chevron-down-CQi0yuay.js";import{P as Qe}from"./pencil-uxK07iYy.js";import{C as We}from"./circle-check-DweDcOkA.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";import"./vendor-syntax-xZUI6Op9.js";/**
2
+ * @license lucide-react v0.511.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const Xe=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 15 21.84",key:"14ibmq"}],["path",{d:"M21 5V8",key:"1marbg"}],["path",{d:"M21 12L18 17H22L19 22",key:"zafso"}],["path",{d:"M3 12A9 3 0 0 0 14.59 14.87",key:"1y4wr8"}]],$e=ue("database-zap",Xe);/**
7
+ * @license lucide-react v0.511.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const Je=[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{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",key:"1nkz8b"}]],Ke=ue("pin",Je),he=["identity","preference","goal","project","habit","decision","constraint","relationship","episode","reflection"],pe={identity:"bg-blue-500/15 text-blue-400",preference:"bg-purple-500/15 text-purple-400",goal:"bg-amber-500/15 text-amber-400",project:"bg-cyan-500/15 text-cyan-400",habit:"bg-emerald-500/15 text-emerald-400",decision:"bg-indigo-500/15 text-indigo-400",constraint:"bg-red-500/15 text-red-400",relationship:"bg-pink-500/15 text-pink-400",episode:"bg-orange-500/15 text-orange-400",reflection:"bg-teal-500/15 text-teal-400"},P=30,es={hidden:{opacity:0,y:12},visible:s=>({opacity:1,y:0,transition:{delay:s*.03,duration:.25,ease:"easeOut"}}),exit:{opacity:0,y:-8,transition:{duration:.15}}},te={visible:{transition:{staggerChildren:.03}}};function ss({toasts:s}){return e.jsx("div",{className:"fixed bottom-6 right-6 z-50 flex flex-col gap-2",children:e.jsx(_,{children:s.map(c=>e.jsxs(S.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:40},className:C("flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm",c.type==="success"?"border-emerald-500/30 bg-emerald-500/10 text-emerald-400":"border-destructive/30 bg-destructive/10 text-destructive"),children:[c.type==="success"?e.jsx(We,{className:"h-4 w-4"}):e.jsx(xe,{className:"h-4 w-4"}),c.message]},c.id))})})}function z({className:s}){return e.jsx("div",{className:C("animate-pulse rounded-lg bg-muted",s)})}function ts(){return e.jsx(O,{children:e.jsxs(B,{className:"p-5 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(z,{className:"h-5 w-20 rounded-md"}),e.jsx(z,{className:"h-4 w-full"})]}),e.jsx(z,{className:"h-3 w-3/4"}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(z,{className:"h-3 w-16"}),e.jsx(z,{className:"h-3 w-16"}),e.jsx(z,{className:"h-3 w-20"})]})]})})}function as({value:s}){const c=Math.round(s*10);return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"text-xs text-muted-foreground/70 shrink-0",children:"Imp"}),e.jsx("div",{className:"flex gap-0.5",children:Array.from({length:10}).map((u,d)=>e.jsx("div",{className:C("h-1.5 w-1.5 rounded-full transition-colors",d<c?"bg-[#00d4ff]":"bg-muted-foreground/15")},d))})]})}function ns({scope:s}){return s==="durable"?e.jsx("span",{className:"inline-flex items-center gap-1 text-xs text-amber-400/80",title:"Durable memory",children:e.jsx(Ke,{className:"h-3 w-3"})}):s==="subconscious"?e.jsx("span",{className:"inline-flex items-center gap-1 text-xs text-violet-400/80",title:"Subconscious memory",children:e.jsx(Y,{className:"h-3 w-3"})}):e.jsx("span",{className:"inline-flex items-center gap-1 text-xs text-muted-foreground/50",title:"Active memory",children:e.jsx(Ye,{className:"h-3 w-3"})})}function ae({memory:s,onDelete:c,onEdit:u,index:d,showLastSeen:h}){const[m,o]=a.useState(!1),f=s.lastSeenAt?Math.round((Date.now()-new Date(s.lastSeenAt).getTime())/(1e3*60*60*24)):null;return e.jsx(S.div,{custom:d,variants:es,initial:"hidden",animate:"visible",exit:"exit",layout:!0,children:e.jsx(O,{className:"group transition-colors hover:border-[#00d4ff]/20",children:e.jsx(B,{className:"p-5",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsx("span",{className:C("inline-flex shrink-0 items-center rounded-md px-2 py-0.5 text-xs font-semibold capitalize",pe[s.type]??"bg-muted text-muted-foreground"),children:s.type}),e.jsx(ns,{scope:s.scope}),e.jsx("p",{className:"text-sm font-medium text-foreground leading-relaxed",children:s.summary})]}),s.detail&&e.jsxs("button",{onClick:()=>o(!m),className:"w-full text-left",children:[e.jsx("p",{className:C("text-sm text-muted-foreground leading-relaxed transition-all",!m&&"line-clamp-2"),children:s.detail}),s.detail.length>120&&e.jsx("span",{className:"text-xs text-[#00d4ff]/70 hover:text-[#00d4ff] mt-0.5 inline-block",children:m?"Show less":"Show more"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1.5 pt-1",children:[s.importance!=null&&e.jsx(as,{value:s.importance}),s.confidence!=null&&e.jsxs("span",{className:"text-xs text-muted-foreground/70",children:[Math.round(s.confidence*100),"% conf"]}),s.evidenceCount!=null&&s.evidenceCount>1&&e.jsxs("span",{className:"text-xs text-muted-foreground/50",children:["Seen ",s.evidenceCount,"x"]}),h&&f!=null&&e.jsxs("span",{className:"text-xs text-violet-400/70",children:["Last seen: ",f,"d ago"]}),e.jsx("span",{className:"text-xs text-muted-foreground/50",children:Z(s.createdAt)})]})]}),e.jsxs("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity shrink-0",children:[e.jsx(w,{size:"sm",variant:"ghost",className:"text-muted-foreground hover:text-[#00d4ff]",onClick:()=>u(s),children:e.jsx(Qe,{className:"h-3.5 w-3.5"})}),e.jsxs(Fe,{children:[e.jsx(Oe,{asChild:!0,children:e.jsx(w,{size:"sm",variant:"ghost",className:"text-muted-foreground hover:text-destructive",children:e.jsx(Be,{className:"h-3.5 w-3.5"})})}),e.jsxs(Ie,{children:[e.jsxs(Pe,{children:[e.jsx(_e,{children:"Delete Memory"}),e.jsx(Re,{children:"Are you sure you want to delete this memory? This action cannot be undone."})]}),e.jsxs(qe,{children:[e.jsx(Ve,{children:"Cancel"}),e.jsx(He,{onClick:()=>c(s.id),className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"Delete"})]})]})]})]})]})})})})}function is({memory:s,open:c,onOpenChange:u,onSave:d,saving:h}){const[m,o]=a.useState(""),[f,p]=a.useState(""),[M,b]=a.useState("0.8"),[y,N]=a.useState("0.7");a.useEffect(()=>{s&&(o(s.summary),p(s.detail||""),b(String(s.confidence??.8)),N(String(s.importance??.7)))},[s]);const D=x=>{x.preventDefault(),!(!s||!m.trim())&&d(s.id,{summary:m.trim(),detail:f.trim()||void 0,confidence:parseFloat(M),importance:parseFloat(y)})};if(!s)return null;const A=s.lastSeenAt?Math.round((Date.now()-new Date(s.lastSeenAt).getTime())/(1e3*60*60*24)):null;return e.jsx(re,{open:c,onOpenChange:u,children:e.jsxs(le,{className:"sm:max-w-md",children:[e.jsxs(ce,{children:[e.jsx(oe,{children:"Edit Memory"}),e.jsx(de,{children:"Update this memory entry."})]}),e.jsxs("form",{onSubmit:D,className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:C("inline-flex items-center rounded-md px-2 py-0.5 text-xs font-semibold capitalize",pe[s.type]??"bg-muted text-muted-foreground"),children:s.type}),e.jsx(R,{variant:"secondary",className:"text-xs capitalize",children:s.scope}),A!=null&&s.scope==="subconscious"&&e.jsxs("span",{className:"text-xs text-violet-400/70",children:["Last seen ",A,"d ago"]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("label",{className:"text-sm font-medium text-foreground",children:["Summary ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(k,{value:m,onChange:x=>o(x.target.value),required:!0})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Detail"}),e.jsx(ie,{value:f,onChange:x=>p(x.target.value),rows:3})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Confidence (0-1)"}),e.jsx(k,{type:"number",min:"0",max:"1",step:"0.05",value:M,onChange:x=>b(x.target.value)})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Importance (0-1)"}),e.jsx(k,{type:"number",min:"0",max:"1",step:"0.05",value:y,onChange:x=>N(x.target.value)})]})]}),e.jsxs("div",{className:"flex items-center gap-4 text-xs text-muted-foreground/60",children:[e.jsxs("span",{children:["Created: ",Z(s.createdAt)]}),s.updatedAt&&e.jsxs("span",{children:["Updated: ",Z(s.updatedAt)]})]}),e.jsx(me,{children:e.jsx(w,{type:"submit",disabled:h||!m.trim(),children:h?e.jsxs(e.Fragment,{children:[e.jsx(q,{className:"h-4 w-4 animate-spin"}),"Saving..."]}):"Save Changes"})})]})]})})}function rs({open:s,onOpenChange:c,onSubmit:u,submitting:d}){const[h,m]=a.useState("preference"),[o,f]=a.useState(""),[p,M]=a.useState(""),[b,y]=a.useState("0.8"),[N,D]=a.useState("0.7"),A=l=>{l.preventDefault(),o.trim()&&u({type:h,summary:o.trim(),detail:p.trim()||void 0,confidence:parseFloat(b),importance:parseFloat(N),durability:"0.8"})},x=()=>{m("preference"),f(""),M(""),y("0.8"),D("0.7")};return e.jsx(re,{open:s,onOpenChange:l=>{l||x(),c(l)},children:e.jsxs(le,{className:"sm:max-w-md",children:[e.jsxs(ce,{children:[e.jsx(oe,{children:"Add Memory"}),e.jsx(de,{children:"Create a new memory entry in the Second Brain."})]}),e.jsxs("form",{onSubmit:A,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Type"}),e.jsxs(ke,{value:h,onValueChange:m,children:[e.jsx(Te,{children:e.jsx(Ee,{})}),e.jsx(Le,{children:he.map(l=>e.jsx(ze,{value:l,className:"capitalize",children:l},l))})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("label",{className:"text-sm font-medium text-foreground",children:["Summary ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(k,{placeholder:"What should Mercury remember?",value:o,onChange:l=>f(l.target.value),required:!0})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Detail"}),e.jsx(ie,{placeholder:"Additional context or details...",value:p,onChange:l=>M(l.target.value),rows:3})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Confidence (0-1)"}),e.jsx(k,{type:"number",min:"0",max:"1",step:"0.05",value:b,onChange:l=>y(l.target.value)})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"text-sm font-medium text-foreground",children:"Importance (0-1)"}),e.jsx(k,{type:"number",min:"0",max:"1",step:"0.05",value:N,onChange:l=>D(l.target.value)})]})]}),e.jsx(me,{children:e.jsx(w,{type:"submit",disabled:d||!o.trim(),children:d?e.jsxs(e.Fragment,{children:[e.jsx(q,{className:"h-4 w-4 animate-spin"}),"Saving..."]}):"Add Memory"})})]})]})})}function ne({title:s,icon:c,count:u,defaultOpen:d,children:h,actions:m}){const[o,f]=a.useState(d);return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("button",{onClick:()=>f(!o),className:"flex items-center gap-2 w-full text-left group",children:[o?e.jsx(G,{className:"h-4 w-4 text-muted-foreground transition-transform"}):e.jsx(Ue,{className:"h-4 w-4 text-muted-foreground transition-transform"}),e.jsxs("span",{className:"flex items-center gap-2",children:[c,e.jsx("span",{className:"text-sm font-semibold text-foreground",children:s})]}),e.jsx(R,{variant:"secondary",className:"tabular-nums text-xs",children:u}),m&&e.jsx("div",{className:"ml-auto",onClick:p=>p.stopPropagation(),children:m})]}),e.jsx(_,{children:o&&e.jsx(S.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},transition:{duration:.2},className:"overflow-hidden",children:h})})]})}function As(){const[s,c]=a.useState([]),[u,d]=a.useState([]),[h,m]=a.useState(0),[o,f]=a.useState(0),[p,M]=a.useState(null),[b,y]=a.useState(!0),[N,D]=a.useState(!1),[A,x]=a.useState(!1),[l,Q]=a.useState(null),[j,fe]=a.useState(""),[T,ge]=a.useState(new Set),[je,V]=a.useState(!1),[be,W]=a.useState(!1),[ye,X]=a.useState(null),[Ne,H]=a.useState(!1),[ve,$]=a.useState(!1),[Se,J]=a.useState([]),U=a.useRef(),E=a.useCallback((t,n)=>{const i=Date.now();J(r=>[...r,{id:i,type:t,message:n}]),setTimeout(()=>{J(r=>r.filter(g=>g.id!==i))},3500)},[]),I=a.useCallback(async()=>{try{const t=await v.brain.status();M(t)}catch{}},[]),L=a.useCallback(async(t,n=0,i=!1)=>{try{if(i||y(!0),Q(null),t==="conscious"||t==="both"){i&&D(!0);let r;if(j.trim())r=await v.brain.memory.list({limit:P,offset:t==="conscious"?n:0,q:j.trim(),scope:"conscious"});else{const F=T.size===1?Array.from(T)[0]:void 0;r=await v.brain.memory.list({limit:P,offset:t==="conscious"?n:0,type:F,scope:"conscious"})}let g=r.memories;T.size>1&&!j.trim()&&(g=g.filter(F=>T.has(F.type))),c(i&&t==="conscious"?F=>[...F,...g]:g),m(r.total),D(!1)}if(t==="subconscious"||t==="both"){i&&x(!0);let r;j.trim()?r=await v.brain.memory.list({limit:P,offset:t==="subconscious"?n:0,q:j.trim(),scope:"subconscious"}):r=await v.brain.memory.list({limit:P,offset:t==="subconscious"?n:0,scope:"subconscious"}),d(i&&t==="subconscious"?g=>[...g,...r.memories]:r.memories),f(r.total),x(!1)}}catch(r){Q(r instanceof Error?r.message:"Failed to load memories")}finally{y(!1)}},[j,T]);a.useEffect(()=>{I()},[I]),a.useEffect(()=>(clearTimeout(U.current),U.current=setTimeout(()=>{L("both",0,!1)},300),()=>clearTimeout(U.current)),[L]);const we=t=>{ge(n=>{const i=new Set(n);return i.has(t)?i.delete(t):i.add(t),i})},Ce=async t=>{W(!0);try{await v.brain.memory.create(t),E("success","Memory created"),V(!1),L("both",0,!1),I()}catch(n){E("error",n instanceof Error?n.message:"Failed to create")}finally{W(!1)}},K=async t=>{try{await v.brain.memory.delete(t),c(n=>n.filter(i=>i.id!==t)),d(n=>n.filter(i=>i.id!==t)),E("success","Memory deleted"),I()}catch(n){E("error",n instanceof Error?n.message:"Failed to delete")}},ee=t=>{X(t),H(!0)},Me=async(t,n)=>{$(!0);try{await v.brain.memory.update(t,n),E("success","Memory updated"),H(!1),X(null);const i=r=>r.map(g=>g.id===t?{...g,...n}:g);c(i),d(i)}catch(i){E("error",i instanceof Error?i.message:"Failed to update")}finally{$(!1)}},De=s.length<h,Ae=u.length<o;return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs(S.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},transition:{duration:.3},className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10",children:e.jsx(se,{className:"h-5 w-5 text-[#00d4ff]"})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Memory"}),p&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs(R,{variant:"secondary",className:"tabular-nums",children:[p.total," conscious"]}),e.jsxs(R,{variant:"secondary",className:"tabular-nums text-violet-400",children:[p.subconsciousTotal??0," subconscious"]})]})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Browse and manage Mercury's knowledge"})]})]}),e.jsxs(w,{onClick:()=>V(!0),children:[e.jsx(Ze,{className:"h-4 w-4"}),"Add Memory"]})]}),e.jsxs(S.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{delay:.05,duration:.3},className:"relative",children:[e.jsx(Ge,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(k,{placeholder:"Search across all memories...",value:j,onChange:t=>fe(t.target.value),className:"pl-9"})]}),p&&e.jsx(S.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{delay:.1,duration:.3},className:"flex flex-wrap gap-2",children:he.map(t=>{var r;const n=((r=p.byType)==null?void 0:r[t])??0,i=T.has(t);return e.jsxs("button",{onClick:()=>we(t),className:C("inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-medium capitalize transition-all",i?"border-[#00d4ff]/40 bg-[#00d4ff]/10 text-[#00d4ff]":"border-border bg-secondary/50 text-muted-foreground hover:border-border hover:bg-secondary"),children:[t,n>0&&e.jsx("span",{className:C("tabular-nums",i?"text-[#00d4ff]/70":"text-muted-foreground/50"),children:n})]},t)})}),l&&e.jsx(O,{className:"border-destructive/30",children:e.jsxs(B,{className:"flex items-center gap-3 p-4 text-sm text-destructive",children:[e.jsx(xe,{className:"h-4 w-4 shrink-0"}),l,e.jsx(w,{size:"sm",variant:"outline",className:"ml-auto",onClick:()=>L("both",0,!1),children:"Retry"})]})}),b&&e.jsx("div",{className:"space-y-3",children:Array.from({length:5}).map((t,n)=>e.jsx(ts,{},n))}),!b&&!l&&e.jsxs("div",{className:"space-y-6",children:[e.jsx(ne,{title:"Conscious",icon:e.jsx(se,{className:"h-4 w-4 text-[#00d4ff]"}),count:h,defaultOpen:!0,children:s.length>0?e.jsxs("div",{className:"space-y-3",children:[e.jsx(S.div,{className:"space-y-3",variants:te,initial:"hidden",animate:"visible",children:e.jsx(_,{mode:"popLayout",children:s.map((t,n)=>e.jsx(ae,{memory:t,onDelete:K,onEdit:ee,index:n},t.id))})}),De&&e.jsx("div",{className:"flex justify-center pt-2",children:e.jsx(w,{variant:"outline",onClick:()=>L("conscious",s.length,!0),disabled:N,children:N?e.jsxs(e.Fragment,{children:[e.jsx(q,{className:"h-4 w-4 animate-spin"}),"Loading..."]}):e.jsxs(e.Fragment,{children:[e.jsx(G,{className:"h-4 w-4"}),"Load More (",s.length," / ",h,")"]})})})]}):e.jsx(O,{children:e.jsxs(B,{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3",children:e.jsx($e,{className:"h-6 w-6 text-muted-foreground"})}),e.jsx("p",{className:"text-sm text-muted-foreground",children:j.trim()?"No conscious memories match your search.":"No conscious memories yet. Start a conversation or add one manually."})]})})}),e.jsx(ne,{title:"Subconscious",icon:e.jsx(Y,{className:"h-4 w-4 text-violet-400"}),count:o,defaultOpen:!1,children:u.length>0?e.jsxs("div",{className:"space-y-3",children:[e.jsx("p",{className:"text-xs text-muted-foreground/70 px-1",children:"Dormant memories not referenced in 30+ days. Automatically recalled when relevant."}),e.jsx(S.div,{className:"space-y-3",variants:te,initial:"hidden",animate:"visible",children:e.jsx(_,{mode:"popLayout",children:u.map((t,n)=>e.jsx(ae,{memory:t,onDelete:K,onEdit:ee,index:n,showLastSeen:!0},t.id))})}),Ae&&e.jsx("div",{className:"flex justify-center pt-2",children:e.jsx(w,{variant:"outline",onClick:()=>L("subconscious",u.length,!0),disabled:A,children:A?e.jsxs(e.Fragment,{children:[e.jsx(q,{className:"h-4 w-4 animate-spin"}),"Loading..."]}):e.jsxs(e.Fragment,{children:[e.jsx(G,{className:"h-4 w-4"}),"Load More (",u.length," / ",o,")"]})})})]}):e.jsx(O,{children:e.jsxs(B,{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx("div",{className:"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-3",children:e.jsx(Y,{className:"h-6 w-6 text-muted-foreground"})}),e.jsx("p",{className:"text-sm text-muted-foreground",children:j.trim()?"No subconscious memories match your search.":"No subconscious memories yet. Memories move here after 30 days of not being referenced."})]})})})]}),e.jsx(rs,{open:je,onOpenChange:V,onSubmit:Ce,submitting:be}),e.jsx(is,{memory:ye,open:Ne,onOpenChange:H,onSave:Me,saving:ve}),e.jsx(ss,{toasts:Se})]})}export{As as MemoryPage};
12
+ //# sourceMappingURL=Memory-dAZsKmWz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Memory-dAZsKmWz.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&apos;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]}
@@ -0,0 +1,17 @@
1
+ import{j as e,m,A as O}from"./vendor-motion-Dwx3-JO5.js";import{r as c}from"./vendor-react-C7pctHW3.js";import{C as h,c as u,a as P,b as H,d as I}from"./card-DAYo4Zl5.js";import{B as L}from"./button-TaFPR-zy.js";import{S as R}from"./switch-CvDDbCUA.js";import{e as f,a as S,l as A,c as y}from"./index-BhxU0YlT.js";import{G as z}from"./git-branch-BT9gCKgG.js";import{T as D}from"./terminal-DI3J3W_z.js";import{L as G}from"./loader-circle-BTFgt3hG.js";import{C as V}from"./circle-check-DweDcOkA.js";import{C as U}from"./circle-x-BmL20etA.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";import"./vendor-syntax-xZUI6Op9.js";/**
2
+ * @license lucide-react v0.511.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const J=[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{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",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]],W=f("hard-drive",J);/**
7
+ * @license lucide-react v0.511.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const X=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Y=f("info",X);/**
12
+ * @license lucide-react v0.511.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const q=[["path",{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",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],Q=f("save",q),Z={hidden:{opacity:0,y:12},visible:a=>({opacity:1,y:0,transition:{delay:a*.08,duration:.35,ease:"easeOut"}})},K={filesystem:{icon:W,label:"Filesystem",description:"Access to read, write, and manage files on the local system",permissions:{read:{label:"Read Files",description:"Read file contents and directory listings"},write:{label:"Write Files",description:"Create and modify files on disk"},delete:{label:"Delete Files",description:"Remove files and directories permanently"}}},shell:{icon:D,label:"Shell",description:"Execute commands in the system shell",permissions:{execute:{label:"Execute Commands",description:"Run shell commands and scripts"}}},git:{icon:z,label:"Git",description:"Version control operations on repositories",permissions:{commit:{label:"Commit",description:"Create commits in repositories"},push:{label:"Push",description:"Push commits to remote repositories"},pull:{label:"Pull",description:"Pull changes from remote repositories"}}}};function ee({toasts:a}){return e.jsx("div",{className:"fixed bottom-6 right-6 z-50 flex flex-col gap-2",children:e.jsx(O,{children:a.map(n=>e.jsxs(m.div,{initial:{opacity:0,x:40},animate:{opacity:1,x:0},exit:{opacity:0,x:40},className:y("flex items-center gap-2 rounded-lg border px-4 py-3 text-sm shadow-lg backdrop-blur-sm",n.type==="success"?"border-emerald-500/30 bg-emerald-500/10 text-emerald-400":"border-destructive/30 bg-destructive/10 text-destructive"),children:[n.type==="success"?e.jsx(V,{className:"h-4 w-4"}):e.jsx(U,{className:"h-4 w-4"}),n.message]},n.id))})})}function d({className:a}){return e.jsx("div",{className:y("animate-pulse rounded-lg bg-muted",a)})}function se(){return e.jsxs(h,{children:[e.jsxs(P,{children:[e.jsx(d,{className:"h-5 w-28"}),e.jsx(d,{className:"h-4 w-64 mt-1"})]}),e.jsx(u,{className:"space-y-4",children:Array.from({length:3}).map((a,n)=>e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(d,{className:"h-4 w-24"}),e.jsx(d,{className:"h-3 w-48"})]}),e.jsx(d,{className:"h-5 w-9 rounded-full"})]},n))})]})}function fe(){const[a,n]=c.useState({}),[j,b]=c.useState({}),[T,E]=c.useState(!0),[g,v]=c.useState(!1),[F,N]=c.useState([]),p=c.useCallback((s,t)=>{const r=Date.now();N(i=>[...i,{id:r,type:s,message:t}]),setTimeout(()=>{N(i=>i.filter(x=>x.id!==r))},3500)},[]),C=c.useCallback(async()=>{try{const t=(await S.permissions.get()).manifest.capabilities;n(structuredClone(t)),b(structuredClone(t))}catch(s){p("error",s instanceof Error?s.message:"Failed to load permissions")}finally{E(!1)}},[p]);c.useEffect(()=>{C()},[C]);const k=c.useMemo(()=>JSON.stringify(a)!==JSON.stringify(j),[a,j]),_=(s,t,r)=>{n(i=>({...i,[s]:{...i[s],[t]:r}}))},M=async()=>{v(!0);try{const s=await S.permissions.update(a);if(s.success){const t=s.manifest.capabilities;n(structuredClone(t)),b(structuredClone(t)),p("success","Permissions updated successfully")}}catch(s){p("error",s instanceof Error?s.message:"Failed to save permissions")}finally{v(!1)}},w=c.useMemo(()=>{const s=[];for(const[t,r]of Object.entries(a)){const i=K[t],$=Object.entries(typeof r=="object"&&r!==null?r:{}).map(([o,B])=>{const l=i==null?void 0:i.permissions[o];return{key:o,label:(l==null?void 0:l.label)??o.charAt(0).toUpperCase()+o.slice(1),description:(l==null?void 0:l.description)??`${o} permission`,value:!!B}});s.push({key:t,icon:(i==null?void 0:i.icon)??Y,label:(i==null?void 0:i.label)??t.charAt(0).toUpperCase()+t.slice(1),description:(i==null?void 0:i.description)??`Manage ${t} permissions`,permissions:$})}return s},[a]);return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx(m.div,{initial:{opacity:0,y:-8},animate:{opacity:1,y:0},transition:{duration:.3},className:"flex items-start justify-between",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-[#00d4ff]/10",children:e.jsx(A,{className:"h-5 w-5 text-[#00d4ff]"})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-semibold text-foreground",children:"Permissions"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Control what Mercury can access"})]})]})}),T?e.jsx("div",{className:"space-y-4",children:Array.from({length:3}).map((s,t)=>e.jsx(se,{},t))}):w.length===0?e.jsx(m.div,{initial:{opacity:0},animate:{opacity:1},transition:{delay:.2},children:e.jsx(h,{children:e.jsxs(u,{className:"flex flex-col items-center justify-center py-16 text-center",children:[e.jsx("div",{className:"flex h-14 w-14 items-center justify-center rounded-full bg-muted mb-4",children:e.jsx(A,{className:"h-7 w-7 text-muted-foreground"})}),e.jsx("h3",{className:"text-base font-medium text-foreground mb-1",children:"No permissions configured"}),e.jsx("p",{className:"text-sm text-muted-foreground max-w-sm",children:"The permission manifest is empty. Capabilities will appear here once configured."})]})})}):e.jsxs("div",{className:"space-y-4",children:[w.map((s,t)=>{const r=s.icon;return e.jsx(m.div,{custom:t,variants:Z,initial:"hidden",animate:"visible",children:e.jsxs(h,{children:[e.jsx(P,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-8 w-8 items-center justify-center rounded-md bg-muted",children:e.jsx(r,{className:"h-4 w-4 text-muted-foreground"})}),e.jsxs("div",{children:[e.jsx(H,{className:"text-base",children:s.label}),e.jsx(I,{children:s.description})]})]})}),e.jsx(u,{children:e.jsx("div",{className:"divide-y divide-border",children:s.permissions.map(i=>e.jsxs("div",{className:"flex items-center justify-between py-3 first:pt-0 last:pb-0",children:[e.jsxs("div",{className:"space-y-0.5 pr-4",children:[e.jsx("label",{htmlFor:`${s.key}-${i.key}`,className:"text-sm font-medium text-foreground cursor-pointer",children:i.label}),e.jsx("p",{className:"text-xs text-muted-foreground",children:i.description})]}),e.jsx(R,{id:`${s.key}-${i.key}`,checked:i.value,onCheckedChange:x=>_(s.key,i.key,x)})]},i.key))})})]})},s.key)}),e.jsx(m.div,{initial:{opacity:0},animate:{opacity:1},transition:{delay:.3},className:"flex justify-end pt-2",children:e.jsx(L,{onClick:M,disabled:g||!k,size:"lg",className:y(k&&"mercury-glow-sm"),children:g?e.jsxs(e.Fragment,{children:[e.jsx(G,{className:"h-4 w-4 animate-spin"}),"Saving"]}):e.jsxs(e.Fragment,{children:[e.jsx(Q,{className:"h-4 w-4"}),"Save Changes"]})})})]}),e.jsx(ee,{toasts:F})]})}export{fe as PermissionsPage};
17
+ //# sourceMappingURL=Permissions-DCiyUUfI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Permissions-DCiyUUfI.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]}
@@ -0,0 +1,2 @@
1
+ import{j as e,m as n}from"./vendor-motion-Dwx3-JO5.js";import{j as C,r,L as i}from"./vendor-react-C7pctHW3.js";import{a as j,B as k,C as A,h as P,c as B}from"./index-BhxU0YlT.js";import{C as d,c as o}from"./card-DAYo4Zl5.js";import{B as l}from"./badge-DfDJNUtd.js";import{C as S,A as E,a as D}from"./avatar-BLsf3GhK.js";import{A as g}from"./arrow-left-D2YO-iMS.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";const c={hidden:{opacity:0,y:10},show:{opacity:1,y:0,transition:{duration:.35,ease:"easeOut"}}},L={hidden:{},show:{transition:{staggerChildren:.03}}},R={hidden:{opacity:0,x:-8},show:{opacity:1,x:0,transition:{duration:.25}}};function M(){return e.jsxs("div",{className:"space-y-6 p-6 animate-pulse",children:[e.jsx("div",{className:"h-4 w-32 rounded bg-muted"}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"h-16 w-16 rounded-full bg-muted"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-6 w-40 rounded bg-muted"}),e.jsx("div",{className:"h-4 w-20 rounded bg-muted"})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-4 w-full rounded bg-muted"}),e.jsx("div",{className:"h-4 w-3/4 rounded bg-muted"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"h-5 w-16 rounded bg-muted"}),e.jsx("div",{className:"h-5 w-14 rounded bg-muted"}),e.jsx("div",{className:"h-5 w-18 rounded bg-muted"})]}),e.jsx("div",{className:"h-5 w-28 rounded bg-muted mt-8"}),Array.from({length:4}).map((t,a)=>e.jsxs("div",{className:"rounded-lg border border-border p-4 space-y-2",children:[e.jsx("div",{className:"h-4 w-full rounded bg-muted"}),e.jsx("div",{className:"h-3 w-24 rounded bg-muted"})]},a))]})}function T(t){switch(t){case"fact":return"default";case"preference":return"success";case"observation":return"warning";default:return"secondary"}}function J(){const{id:t}=C(),[a,N]=r.useState(null),[m,v]=r.useState([]),[w,y]=r.useState(0),[b,x]=r.useState(!0),[h,u]=r.useState(null),p=r.useCallback(async()=>{if(t)try{u(null),x(!0);const[s,f]=await Promise.all([j.brain.persons.get(t),j.brain.persons.memories(t,50)]);N(s.person),v(f.memories),y(f.total)}catch(s){u(s instanceof Error?s.message:"Failed to load person")}finally{x(!1)}},[t]);return r.useEffect(()=>{p()},[p]),b?e.jsx(M,{}):h||!a?e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs(i,{to:"/second-brain/persons",className:"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors",children:[e.jsx(g,{className:"h-4 w-4"}),"Back to Persons"]}),e.jsx(d,{children:e.jsxs(o,{className:"flex flex-col items-center gap-3 py-12 text-center text-muted-foreground",children:[e.jsx(S,{className:"h-10 w-10"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-foreground",children:"Person not found"}),e.jsx("p",{className:"text-sm",children:h||"This person doesn't exist or has been removed."})]}),e.jsx(i,{to:"/second-brain/persons",className:"mt-2 text-sm text-[#00d4ff] hover:underline",children:"Return to directory"})]})})]}):e.jsxs("div",{className:"space-y-8 p-6",children:[e.jsx(n.div,{variants:c,initial:"hidden",animate:"show",children:e.jsxs(i,{to:"/second-brain/persons",className:"inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors",children:[e.jsx(g,{className:"h-4 w-4"}),"Back to Persons"]})}),e.jsxs(n.div,{className:"space-y-4",variants:c,initial:"hidden",animate:"show",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(E,{className:"h-16 w-16",children:e.jsx(D,{className:"bg-[#00d4ff]/10 text-[#00d4ff] text-xl font-semibold",children:a.name.charAt(0).toUpperCase()})}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:a.name}),a.relationship&&e.jsx(l,{variant:"secondary",className:"mt-1 capitalize",children:a.relationship})]})]}),a.summary&&e.jsx("p",{className:"max-w-2xl text-sm leading-relaxed text-muted-foreground",children:a.summary}),a.traits&&a.traits.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.traits.map(s=>e.jsx(l,{variant:"outline",className:"text-xs",children:s},s))})]}),e.jsxs(n.div,{className:"space-y-4",variants:c,initial:"hidden",animate:"show",transition:{delay:.1},children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"h-5 w-5 text-[#00d4ff]"}),e.jsxs("h2",{className:"text-lg font-semibold text-foreground",children:["Memories",e.jsxs("span",{className:"ml-1.5 text-sm font-normal text-muted-foreground",children:["(",w,")"]})]})]}),m.length===0?e.jsx(d,{children:e.jsx(o,{className:"py-8 text-center text-sm text-muted-foreground",children:"No memories associated with this person yet."})}):e.jsx(n.div,{className:"space-y-2",variants:L,initial:"hidden",animate:"show",children:m.map(s=>e.jsx(n.div,{variants:R,children:e.jsx(d,{className:B("transition-colors hover:border-[#00d4ff]/20"),children:e.jsxs(o,{className:"flex items-start gap-3 p-4",children:[e.jsx(l,{variant:T(s.type),className:"mt-0.5 shrink-0 text-[10px] capitalize",children:s.type}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm text-foreground",children:s.summary}),e.jsxs("span",{className:"mt-1 flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(A,{className:"h-3 w-3"}),P(s.createdAt)]})]})]})})},s.id))})]})]})}export{J as PersonDetailPage};
2
+ //# sourceMappingURL=PersonDetail-iZgApJog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonDetail-iZgApJog.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":"gdAYA,MAAMA,EAAS,CACb,OAAQ,CAAE,QAAS,EAAG,EAAG,EAAA,EACzB,KAAM,CAAE,QAAS,EAAG,EAAG,EAAG,WAAY,CAAE,SAAU,IAAM,KAAM,SAAA,CAAmB,CACnF,EAEMC,EAAU,CACd,OAAQ,CAAA,EACR,KAAM,CAAE,WAAY,CAAE,gBAAiB,IAAK,CAC9C,EAEMC,EAAW,CACf,OAAQ,CAAE,QAAS,EAAG,EAAG,EAAA,EACzB,KAAM,CAAE,QAAS,EAAG,EAAG,EAAG,WAAY,CAAE,SAAU,GAAA,CAAK,CACzD,EAIA,SAASC,GAAiB,CACxB,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,EAC3CD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAA,CAAkC,EACjDD,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,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,YACb,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,aACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,EAC3CA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,EAC3CA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,EAC7C,EACAA,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,EAC/C,MAAM,KAAK,CAAE,OAAQ,EAAG,EAAE,IAAI,CAACC,EAAGC,IACjCH,EAAAA,KAAC,MAAA,CAAY,UAAU,gDACrB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAAA,CAA8B,EAC7CA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAAA,CAA4B,CAAA,CAAA,EAFnCE,CAGV,CACD,CAAA,EACH,CAEJ,CAIA,SAASC,EACPC,EAC6D,CAC7D,OAAQA,EAAA,CACN,IAAK,OACH,MAAO,UACT,IAAK,aACH,MAAO,UACT,IAAK,cACH,MAAO,UACT,QACE,MAAO,WAAA,CAEb,CAIO,SAASC,GAAmB,CACjC,KAAM,CAAE,GAAAC,CAAA,EAAOC,EAAA,EACT,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAwB,IAAI,EAClD,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAAmB,CAAA,CAAE,EAC/C,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAS,CAAC,EAC1C,CAACK,EAASC,CAAU,EAAIN,EAAAA,SAAS,EAAI,EACrC,CAACO,EAAOC,CAAQ,EAAIR,EAAAA,SAAwB,IAAI,EAEhDS,EAAYC,EAAAA,YAAY,SAAY,CACxC,GAAKd,EACL,GAAI,CACFY,EAAS,IAAI,EACbF,EAAW,EAAI,EACf,KAAM,CAACK,EAAWC,CAAW,EAAI,MAAM,QAAQ,IAAI,CACjDC,EAAI,MAAM,QAAQ,IAAIjB,CAAE,EACxBiB,EAAI,MAAM,QAAQ,SAASjB,EAAI,EAAE,CAAA,CAClC,EACDG,EAAUY,EAAU,MAAM,EAC1BT,EAAYU,EAAY,QAAQ,EAChCR,EAAeQ,EAAY,KAAK,CAClC,OAASE,EAAK,CACZN,EAASM,aAAe,MAAQA,EAAI,QAAU,uBAAuB,CACvE,QAAA,CACER,EAAW,EAAK,CAClB,CACF,EAAG,CAACV,CAAE,CAAC,EAMP,OAJAmB,EAAAA,UAAU,IAAM,CACdN,EAAA,CACF,EAAG,CAACA,CAAS,CAAC,EAEVJ,EAAgBf,MAACF,EAAA,CAAA,CAAe,EAEhCmB,GAAS,CAACT,EAEVT,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAA,EAAAA,KAAC2B,EAAA,CACC,GAAG,wBACH,UAAU,yGAEV,SAAA,CAAA1B,EAAAA,IAAC2B,EAAA,CAAU,UAAU,SAAA,CAAU,EAAE,iBAAA,CAAA,CAAA,EAGnC3B,MAAC4B,EAAA,CACC,SAAA7B,EAAAA,KAAC8B,EAAA,CAAY,UAAU,2EACrB,SAAA,CAAA7B,EAAAA,IAAC8B,EAAA,CAAW,UAAU,WAAA,CAAY,SACjC,MAAA,CACC,SAAA,CAAA9B,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,mBAAgB,EAC3DA,EAAAA,IAAC,IAAA,CAAE,UAAU,UACV,YAAS,gDAAA,CACZ,CAAA,EACF,EACAA,EAAAA,IAAC0B,EAAA,CACC,GAAG,wBACH,UAAU,8CACX,SAAA,qBAAA,CAAA,CAED,CAAA,CACF,CAAA,CACF,CAAA,EACF,EAKF3B,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEb,SAAA,CAAAC,EAAAA,IAAC+B,EAAO,IAAP,CAAW,SAAUpC,EAAQ,QAAQ,SAAS,QAAQ,OACrD,SAAAI,EAAAA,KAAC2B,EAAA,CACC,GAAG,wBACH,UAAU,yGAEV,SAAA,CAAA1B,EAAAA,IAAC2B,EAAA,CAAU,UAAU,SAAA,CAAU,EAAE,iBAAA,CAAA,CAAA,EAGrC,EAGA5B,EAAAA,KAACgC,EAAO,IAAP,CACC,UAAU,YACV,SAAUpC,EACV,QAAQ,SACR,QAAQ,OAER,SAAA,CAAAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,MAACgC,EAAA,CAAO,UAAU,YAChB,SAAAhC,EAAAA,IAACiC,GAAe,UAAU,uDACvB,SAAAzB,EAAO,KAAK,OAAO,CAAC,EAAE,YAAA,EACzB,EACF,SACC,MAAA,CACC,SAAA,CAAAR,EAAAA,IAAC,KAAA,CAAG,UAAU,qCACX,SAAAQ,EAAO,KACV,EACCA,EAAO,cACNR,MAACkC,EAAA,CAAM,QAAQ,YAAY,UAAU,kBAClC,SAAA1B,EAAO,YAAA,CACV,CAAA,CAAA,CAEJ,CAAA,EACF,EAECA,EAAO,SACNR,EAAAA,IAAC,KAAE,UAAU,0DACV,WAAO,QACV,EAGDQ,EAAO,QAAUA,EAAO,OAAO,OAAS,GACvCR,MAAC,MAAA,CAAI,UAAU,yBACZ,SAAAQ,EAAO,OAAO,IAAK2B,GAClBnC,EAAAA,IAACkC,EAAA,CAAkB,QAAQ,UAAU,UAAU,UAC5C,SAAAC,CAAA,EADSA,CAEZ,CACD,CAAA,CACH,CAAA,CAAA,CAAA,EAKJpC,EAAAA,KAACgC,EAAO,IAAP,CACC,UAAU,YACV,SAAUpC,EACV,QAAQ,SACR,QAAQ,OACR,WAAY,CAAE,MAAO,EAAA,EAErB,SAAA,CAAAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACoC,EAAA,CAAM,UAAU,wBAAA,CAAyB,EAC1CrC,EAAAA,KAAC,KAAA,CAAG,UAAU,wCAAwC,SAAA,CAAA,WAEpDA,EAAAA,KAAC,OAAA,CAAK,UAAU,mDAAmD,SAAA,CAAA,IAC/Dc,EAAY,GAAA,CAAA,CAChB,CAAA,CAAA,CACF,CAAA,EACF,EAECF,EAAS,SAAW,EACnBX,EAAAA,IAAC4B,EAAA,CACC,SAAA5B,EAAAA,IAAC6B,EAAA,CAAY,UAAU,iDAAiD,SAAA,8CAAA,CAExE,CAAA,CACF,EAEA7B,EAAAA,IAAC+B,EAAO,IAAP,CACC,UAAU,YACV,SAAUnC,EACV,QAAQ,SACR,QAAQ,OAEP,SAAAe,EAAS,IAAK0B,SACZN,EAAO,IAAP,CAA2B,SAAUlC,EACpC,SAAAG,EAAAA,IAAC4B,EAAA,CACC,UAAWU,EACT,6CAAA,EAGF,SAAAvC,EAAAA,KAAC8B,EAAA,CAAY,UAAU,6BACrB,SAAA,CAAA7B,EAAAA,IAACkC,EAAA,CACC,QAAS/B,EAAiBkC,EAAO,IAAI,EACrC,UAAU,yCAET,SAAAA,EAAO,IAAA,CAAA,EAEVtC,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,0BACV,SAAAqC,EAAO,QACV,EACAtC,EAAAA,KAAC,OAAA,CAAK,UAAU,6DACd,SAAA,CAAAC,EAAAA,IAACuC,EAAA,CAAM,UAAU,SAAA,CAAU,EAC1BC,EAAWH,EAAO,SAAS,CAAA,CAAA,CAC9B,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,EAvBeA,EAAO,EAwBxB,CACD,CAAA,CAAA,CACH,CAAA,CAAA,CAEJ,EACF,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e,m as f}from"./vendor-motion-Dwx3-JO5.js";import{r as t,L as y}from"./vendor-react-C7pctHW3.js";import{a as w,U as C,B as S,c as P}from"./index-BhxU0YlT.js";import{I as k}from"./input-L1uz5xAQ.js";import{C as c,c as o}from"./card-DAYo4Zl5.js";import{B as p}from"./badge-DfDJNUtd.js";import{C as A,A as E,a as B}from"./avatar-BLsf3GhK.js";import{S as T}from"./search-D1OOxb1X.js";import"./vendor-syntax-xZUI6Op9.js";import"./vendor-radix-3UdfCgs_.js";import"./index-CUT6Fr2C.js";function U(){return e.jsxs("div",{className:"rounded-xl border border-border bg-card p-5 animate-pulse",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx("div",{className:"h-11 w-11 rounded-full bg-muted"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsx("div",{className:"h-4 w-28 rounded bg-muted"}),e.jsx("div",{className:"h-3 w-16 rounded bg-muted"})]})]}),e.jsxs("div",{className:"space-y-2 mb-3",children:[e.jsx("div",{className:"h-3 w-full rounded bg-muted"}),e.jsx("div",{className:"h-3 w-3/4 rounded bg-muted"})]}),e.jsxs("div",{className:"flex gap-1.5",children:[e.jsx("div",{className:"h-5 w-14 rounded bg-muted"}),e.jsx("div",{className:"h-5 w-12 rounded bg-muted"})]})]})}const L={hidden:{},show:{transition:{staggerChildren:.04}}},R={hidden:{opacity:0,y:12},show:{opacity:1,y:0,transition:{duration:.3,ease:"easeOut"}}};function H(){const[n,g]=t.useState([]),[j,N]=t.useState(0),[m,v]=t.useState(""),[r,x]=t.useState(!0),[l,u]=t.useState(null),i=t.useRef(null),d=t.useCallback(async s=>{try{u(null),x(!0);const a=await w.brain.persons.list({q:s||void 0,limit:200});g(a.persons),N(a.total)}catch(a){u(a instanceof Error?a.message:"Failed to load persons")}finally{x(!1)}},[]);t.useEffect(()=>{d("")},[d]);const b=s=>{v(s),i.current&&clearTimeout(i.current),i.current=setTimeout(()=>d(s),300)};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx(C,{className:"h-6 w-6 text-[#00d4ff]"}),e.jsxs("h1",{className:"text-2xl font-semibold text-foreground",children:["Persons",!r&&e.jsxs("span",{className:"ml-2 text-base font-normal text-muted-foreground",children:["(",j,")"]})]})]}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"People Mercury knows about"})]}),e.jsxs("div",{className:"relative max-w-md",children:[e.jsx(T,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(k,{placeholder:"Search by name...",value:m,onChange:s=>b(s.target.value),className:"pl-9"})]}),l&&e.jsx(c,{children:e.jsx(o,{className:"py-8 text-center text-destructive",children:l})}),r&&e.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",children:Array.from({length:6}).map((s,a)=>e.jsx(U,{},a))}),!r&&!l&&n.length===0&&e.jsx(c,{children:e.jsxs(o,{className:"flex flex-col items-center gap-3 py-12 text-center text-muted-foreground",children:[e.jsx(A,{className:"h-10 w-10"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-foreground",children:"No persons found"}),e.jsx("p",{className:"text-sm",children:m?"Try a different search term.":"Mercury hasn't recorded any people yet."})]})]})}),!r&&!l&&n.length>0&&e.jsx(f.div,{className:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",variants:L,initial:"hidden",animate:"show",children:n.map(s=>{var a;return e.jsx(f.div,{variants:R,children:e.jsx(y,{to:`/second-brain/persons/${s.id}`,className:"block",children:e.jsx(c,{className:P("cursor-pointer transition-all duration-200","hover:-translate-y-0.5 hover:shadow-lg hover:border-[#00d4ff]/30"),children:e.jsxs(o,{className:"p-5",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(E,{className:"h-11 w-11",children:e.jsx(B,{className:"bg-[#00d4ff]/10 text-[#00d4ff] font-semibold text-sm",children:s.name.charAt(0).toUpperCase()})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"truncate text-base font-semibold text-foreground",children:s.name}),s.relationship&&e.jsx(p,{variant:"secondary",className:"mt-0.5 text-[10px] capitalize",children:s.relationship})]})]}),s.summary&&e.jsx("p",{className:"mb-3 line-clamp-2 text-sm text-muted-foreground",children:s.summary}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[(a=s.traits)==null?void 0:a.slice(0,4).map(h=>e.jsx(p,{variant:"outline",className:"text-[10px]",children:h},h)),s.memoryCount!=null&&s.memoryCount>0&&e.jsxs("span",{className:"ml-auto flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(S,{className:"h-3 w-3"}),s.memoryCount," memories"]})]})]})})})},s.id)})})]})}export{H as PersonsPage};
2
+ //# sourceMappingURL=Persons-Bs_HhYjC.js.map