openchad-react 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/chunk-VZ7VQBAB.mjs +1525 -0
- package/dist/chunk-VZ7VQBAB.mjs.map +1 -0
- package/dist/iframe-mirror-debug-PCZ5HSWW.mjs +128 -0
- package/dist/iframe-mirror-debug-PCZ5HSWW.mjs.map +1 -0
- package/dist/index.d.mts +246 -0
- package/dist/index.d.ts +246 -0
- package/dist/index.js +11992 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10530 -0
- package/dist/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +358 -0
- package/dist/ui/index.d.ts +358 -0
- package/dist/ui/index.js +1752 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +80 -0
- package/dist/ui/index.mjs.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/animated.tsx","../components/dropdown.tsx","../utils/uuid.ts","../components/iframe-mirror.tsx","../utils/state.tsx","../components/iconPopover.tsx","../components/useWebSocket/useWebSocket.tsx","../components/useWebSocket/index.ts","../../node_modules/.pnpm/tauri-plugin-pytauri-api@0.8.0/node_modules/tauri-plugin-pytauri-api/dist/index.js","../components/usePython/index.ts","../utils/utils.ts","../components/useDatabase/useDatabase.tsx","../components/useDatabase/index.ts","../components/useSettings/index.ts","../components/SearchTab.tsx","../components/settings-menu.tsx","../components/credentials.tsx","../components/localmodel.tsx","../components/customendpoint.tsx","../components/mcp.tsx","../components/sidebar.tsx","../components/topbar.tsx","../components/useFile/index.ts","../components/hooks/useElementSize.tsx","../components/multiview.tsx","../components/record.tsx","../components/composer.tsx","../utils/message-parser.ts","../components/useGlobal/useGlobal.tsx","../components/message.tsx","../components/message-container.tsx","../components/model-selection.tsx","../components/default-page.tsx","../components/useKeyEffect/index.ts","../components/select-workspace.tsx","../components/app-loading.tsx","../components/useFolder/useFolder.tsx","../components/useFolder/index.ts","../components/useGlobal/index.ts","../../node_modules/.pnpm/vite-plugin-splash-screen@0.2.2/node_modules/vite-plugin-splash-screen/dist/runtime/runtime.mjs","../Container.tsx","../index.ts"],"names":["clsx","open","useState","useEffect","jsx","Fragment","value","children","CommandList","CommandEmpty","Icon","jsxs","useCallback","useRef","invoke","isTauri","proxy","pyInvoke","databaseName","tb","dbKey","initialValue","useSnapshot","useMemo","memo","Trash2","Plus","AlertCircle","Toast","CheckCircle2","selectModel","Globe","X","ChevronDown","Search","Copy","ChevronRight","HardDrive","filename","baseDir","useLayoutEffect","React","offset","FileIcon","PRIMITIVE_KEY","isPrimitive","isWrappedPrimitive","wrapPrimitive","unwrapPrimitive","blocksToPlain","stripZW","Video","Volume2","FileText","FileCode","renderToStaticMarkup","useDatabase","b","Mic","Check","ModelItem","backendLabel","Unplug","TooltipProvider","activeId","sha256","motion","contents","useGlobal","Apps","folders","workspace","setWorkspace","active","tabs","layout","Minus","ArrowLeftRight","Key","GitBranch","openUrl","Settings"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\"\r\nimport clsx from \"clsx\"\r\nimport { useEffect, useState } from \"react\"\r\n\r\nexport const Aspan = ({ children, isCollapsed, className }: { children: React.ReactNode, isCollapsed: boolean, className?: string }) => {\r\n const [isHidden, setIsHidden] = useState(isCollapsed)\r\n useEffect(() => {\r\n if (isCollapsed) {\r\n // When collapsing, hide after transition completes\r\n const timer = setTimeout(() => setIsHidden(true), 150)\r\n return () => clearTimeout(timer)\r\n } else {\r\n // When expanding, show immediately so transition can play\r\n setIsHidden(false)\r\n }\r\n }, [isCollapsed])\r\n return (\r\n <span\r\n style={{\r\n opacity: isCollapsed ? 0 : 1,\r\n willChange: \"opacity\",\r\n transitionProperty: \"opacity\",\r\n transitionDuration: isCollapsed ? \"0ms\" : \"50ms\",\r\n transitionTimingFunction: \"ease-out\",\r\n transitionDelay: isCollapsed ? \"0ms\" : \"50ms\",\r\n }}\r\n className={clsx(isHidden ? \"hidden\" : \"\", className)}\r\n >\r\n {children}\r\n </span>\r\n )\r\n}","import {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Command, CommandInput, CommandItem } from \"./ui/command\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport { CommandEmpty, CommandGroup, CommandList } from \"cmdk\";\nimport { Plus } from \"lucide-react\";\nimport { ScrollArea } from \"./ui\";\ninterface DropdownProps {\n children: React.ReactNode;\n content: DropdownMenuItemProps[];\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n search?: string;\n setSearch?: (value: string) => void;\n onOpenChange?: (open: boolean) => void;\n open?: boolean;\n}\n\nexport interface DropdownMenuItemProps {\n content: React.ReactNode;\n category?: string;\n text?: String;\n shortcut?: React.ReactNode | null;\n children?: DropdownMenuItemProps[] | null;\n separator?: boolean;\n trigger?: () => void;\n huggingface?: boolean;\n hidden?: boolean;\n addModel?: boolean;\n}\n\nexport function Dropdown({ children, content, align = \"start\", className = \"w-56\", search, setSearch, onOpenChange, open }: DropdownProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n const [value, setValue] = useState(\"\");\n useEffect(() => {\n if (open !== undefined && open !== null) {\n setMenuOpen(open);\n }\n }, [open])\n return (\n <DropdownMenu open={menuOpen} onOpenChange={(open) => {\n setMenuOpen(open);\n if (onOpenChange) onOpenChange(open);\n }}>\n <DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger>\n <DropdownMenuContent className={className} align={align}>\n {setSearch && <>\n <Command onKeyDown={(e) => {\n e.stopPropagation();\n }} className=\"bg-transparent overflow-visible\">\n <CommandInput\n value={search}\n onValueChange={(value) => {\n if (setSearch) setSearch(value);\n }}\n placeholder=\"Search...\"\n autoFocus={true}\n className=\"h-7 text-[0.875rem]\"\n />\n </Command>\n <DropdownMenuSeparator />\n </>}\n <ScrollArea className=\"max-h-[300px] overflow-y-auto\">\n {content.map((item, index) => (\n <Fragment key={index}>\n {item.children?.length ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>{item.content}</DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {\n item.children.every(({ children }) => children?.length) ?\n <Fragment key=\"sub-grouped\">\n <Command className=\"bg-transparent\">\n <CommandInput\n onValueChange={() => {\n }}\n placeholder=\"Search...\"\n autoFocus={true}\n className=\"h-7 text-[0.875rem]\"\n />\n </Command>\n {item.children.filter(({ hidden }) => !hidden).map((child, childIndex) =>\n <DropdownMenuSub key={childIndex}>\n <DropdownMenuSubTrigger>\n {child.content}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <Command className=\"bg-transparent\">\n <CommandInput\n onValueChange={(value) => {\n setValue(value);\n console.log(value);\n }}\n placeholder=\"Search...\"\n autoFocus={true}\n className=\"h-7 text-[0.875rem]\"\n />\n <CommandList>\n <CommandEmpty className=\"text-[10pt] text-center opacity-[0.5] p-2\">No results found.</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] max-w-none overflow-y-auto overflow-x-hidden\">\n {child.children && child.children.filter(({ hidden }) => !hidden).map((subChild, subChildIndex) => (\n <Fragment key={subChildIndex}>\n {subChild.category && value === \"\" &&\n <>\n {subChildIndex !== 0 && <DropdownMenuSeparator />}\n <div className=\"text-xs text-gray-500\">\n {subChild.category}\n </div>\n </>\n }\n <CommandItem\n className=\"data-[selected=true]:bg-[hsl(var(--hoverfloat))]\"\n value={subChild.text + subChildIndex.toString()}\n onSelect={() => {\n if (subChild.trigger) subChild.trigger();\n }}\n >\n {subChild.content}\n </CommandItem>\n {subChild.separator && <DropdownMenuSeparator />}\n </Fragment>\n ))}\n </CommandGroup>\n </CommandList>\n {item.huggingface && <CommandItem className=\"cursor-pointer flex items-center rounded-none border-solid border-t-[1px] border-[hsl(var(--accent))]/10 \">\n <div>Download model from Hugging Face.</div>\n <Plus className=\"ml-auto\" />\n </CommandItem>}\n </Command>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n </Fragment>\n :\n <Command className=\"bg-transparent\">\n <CommandInput\n onValueChange={(value) => {\n setValue(value);\n console.log(value);\n }}\n placeholder=\"Search...\"\n autoFocus={true}\n className=\"h-7 text-[0.875rem]\"\n />\n <CommandList>\n <CommandEmpty className=\"text-[10pt] text-center opacity-[0.5] p-2\">No results found.</CommandEmpty>\n <CommandGroup className=\"max-h-[300px] max-w-none overflow-y-auto overflow-x-hidden\">\n {item.children.filter(({ hidden }) => !hidden).map((child, childIndex) => (\n <Fragment key={childIndex}>\n {child.category && value === \"\" &&\n <>\n {childIndex !== 0 && <DropdownMenuSeparator />}\n <div className=\"text-xs text-gray-500\">\n {child.category}\n </div>\n </>\n }\n <CommandItem\n className=\"data-[selected=true]:bg-[hsl(var(--hoverfloat))]\"\n value={child.text + childIndex.toString()}\n onSelect={() => {\n setMenuOpen(false);\n if (child.trigger) child.trigger();\n }}\n >\n {child.content}\n </CommandItem>\n {child.separator && <DropdownMenuSeparator />}\n </Fragment>\n ))}\n </CommandGroup>\n </CommandList>\n {item.huggingface && <CommandItem className=\"cursor-pointer flex items-center rounded-none border-solid border-t-[1px] border-[hsl(var(--accent))]/10 \">\n <div>Download model from Hugging Face.</div>\n <Plus className=\"ml-auto\" />\n </CommandItem>}\n </Command>\n }\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem className={item.content == \"Recent\" ? \"focus:bg-transparent opacity-[0.5] text-[10pt] py-1\" : \"\"} onClick={item.trigger}>\n {item.content}\n {item.shortcut && (\n <DropdownMenuShortcut className=\"opacity-100\" >{item.shortcut}</DropdownMenuShortcut>\n )}\n </DropdownMenuItem>\n )}\n {item.separator && <DropdownMenuSeparator />}\n </Fragment>\n ))}\n </ScrollArea>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}","// Declare global msCrypto for legacy IE support\ndeclare global {\n interface Window {\n msCrypto?: Crypto;\n }\n var msCrypto: Crypto | undefined;\n}\n\nconst uuidv4 = (): string => {\n const getRandomValues = (() => {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n return crypto.getRandomValues.bind(crypto);\n }\n if (typeof window !== \"undefined\" && window.msCrypto && window.msCrypto.getRandomValues) {\n return window.msCrypto.getRandomValues.bind(window.msCrypto);\n }\n throw new Error(\"crypto.getRandomValues() not supported.\");\n })();\n const bytes = new Uint8Array(16);\n getRandomValues(bytes);\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex: string[] = [];\n for (let i = 0; i < 256; i++) {\n hex[i] = (i + 256).toString(16).slice(1);\n }\n return [\n hex[bytes[0]], hex[bytes[1]], hex[bytes[2]], hex[bytes[3]], '-',\n hex[bytes[4]], hex[bytes[5]], '-',\n hex[bytes[6]], hex[bytes[7]], '-',\n hex[bytes[8]], hex[bytes[9]], '-',\n hex[bytes[10]], hex[bytes[11]], hex[bytes[12]], hex[bytes[13]], hex[bytes[14]], hex[bytes[15]]\n ].join('');\n};\n\nexport default uuidv4;\n","import { useRef, useEffect, useState, useCallback } from 'react';\r\ninterface IframeMirrorProps {\r\n src: string;\r\n id: string;\r\n className?: string;\r\n title?: string;\r\n visible?: boolean;\r\n}\r\n/**\r\n * IframeMirror component that prevents iframe reloading on reparenting.\r\n * It keeps the actual iframe in a persistent, hidden container and displays\r\n * it by repositioning when visible. This ensures the iframe never unmounts.\r\n */\r\n\r\nexport default function IframeMirror({\r\n src,\r\n id,\r\n className = '',\r\n title = '',\r\n visible = true\r\n}: IframeMirrorProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const iframeContainerIdRef = useRef<string>(`iframe-persistent-${id}`);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const positionUpdateRef = useRef<number | null>(null);\r\n // Get or create the persistent iframe container\r\n const getOrCreatePersistentContainer = useCallback(() => {\r\n const containerId = iframeContainerIdRef.current;\r\n let container = document.getElementById(containerId);\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = containerId;\r\n container.style.cssText = `\r\n position: fixed;\r\n border: none;\r\n overflow: hidden;\r\n z-index: 1;\r\n background: transparent;\r\n `;\r\n document.body.appendChild(container);\r\n // Create the iframe\r\n const iframe = document.createElement('iframe');\r\n iframe.src = src;\r\n iframe.title = title;\r\n iframe.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n display: block;\r\n `;\r\n iframe.onload = () => {\r\n setIsLoaded(true);\r\n };\r\n iframe.onerror = () => {\r\n console.error('Failed to load iframe:', src);\r\n };\r\n container.appendChild(iframe);\r\n }\r\n return container;\r\n }, [id, src, title]);\r\n // Update iframe position and visibility\r\n const updateIframePosition = useCallback(() => {\r\n if (!containerRef.current) return;\r\n const persistentContainer = getOrCreatePersistentContainer();\r\n const rect = containerRef.current.getBoundingClientRect();\r\n if (visible && rect.width > 0 && rect.height > 0) {\r\n // Position the iframe container to match our visible container\r\n persistentContainer.style.left = `${rect.left + window.scrollX}px`;\r\n persistentContainer.style.top = `${rect.top + window.scrollY}px`;\r\n persistentContainer.style.width = `${rect.width}px`;\r\n persistentContainer.style.height = `${rect.height}px`;\r\n persistentContainer.style.pointerEvents = 'auto';\r\n persistentContainer.style.opacity = '1';\r\n } else {\r\n // Hide the iframe when not visible\r\n persistentContainer.style.left = '-10000px';\r\n persistentContainer.style.top = '-10000px';\r\n persistentContainer.style.pointerEvents = 'none';\r\n persistentContainer.style.opacity = '0';\r\n }\r\n }, [visible, getOrCreatePersistentContainer]);\r\n // Set up continuous position updates\r\n useEffect(() => {\r\n const updateLoop = () => {\r\n updateIframePosition();\r\n positionUpdateRef.current = requestAnimationFrame(updateLoop);\r\n };\r\n updateLoop();\r\n return () => {\r\n if (positionUpdateRef.current) {\r\n cancelAnimationFrame(positionUpdateRef.current);\r\n }\r\n };\r\n }, [updateIframePosition]);\r\n // Handle window events\r\n useEffect(() => {\r\n const handleEvent = () => updateIframePosition();\r\n window.addEventListener('resize', handleEvent);\r\n window.addEventListener('scroll', handleEvent, true);\r\n return () => {\r\n window.removeEventListener('resize', handleEvent);\r\n window.removeEventListener('scroll', handleEvent, true);\r\n };\r\n }, [updateIframePosition]);\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n // When component unmounts, hide the iframe but don't destroy it\r\n const persistentContainer = document.getElementById(iframeContainerIdRef.current);\r\n if (persistentContainer) {\r\n persistentContainer.style.left = '-10000px';\r\n persistentContainer.style.top = '-10000px';\r\n persistentContainer.style.pointerEvents = 'none';\r\n }\r\n };\r\n }, []);\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`relative w-full h-full ${className}`}\r\n style={{ background: 'transparent' }}\r\n >\r\n {!isLoaded && (\r\n <div className=\"absolute inset-0 flex items-center justify-center bg-card\">\r\n <div className=\"flex flex-col items-center gap-2\">\r\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\r\n <span className=\"text-sm text-muted-foreground\">Loading iframe...</span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n/**\r\n * Hook to cleanup all persistent iframe containers when needed\r\n */\r\n\r\nexport function useCleanupPersistentIframes() {\r\n return useCallback(() => {\r\n const containers = document.querySelectorAll('[id^=\"iframe-persistent-\"]');\r\n containers.forEach(container => container.remove());\r\n }, []);\r\n}\r\n/**\r\n * Cleanup a specific persistent iframe container by ID\r\n */\r\n\r\nexport function cleanupPersistentIframe(id: string) {\r\n const container = document.getElementById(`iframe-persistent-${id}`);\r\n if (container) {\r\n container.remove();\r\n }\r\n}\r\n","import { proxy } from 'valtio';\nimport uuidv4 from \"./uuid\";\nimport { cleanupPersistentIframe } from \"../components/iframe-mirror\";\nimport * as Icons from \"lucide-react\"\nimport type { AppInfo } from \"./utils\";\nimport clsx from 'clsx';\n\nexport const LucideIcons = Icons\n\nexport const iconList = Object.keys(LucideIcons).filter((key) => {\n // Icons are React components (functions or objects with render) and usually start with uppercase\n // Some exports might be 'createLucideIcon', 'icons', etc.\n return key !== \"icons\" && key !== \"createLucideIcon\" && key !== \"Icon\" && /^[A-Z]/.test(key)\n}) as (keyof typeof LucideIcons)[];\n\nexport interface Model {\n id: string;\n name: string;\n uncensored: boolean;\n audio: boolean;\n image: boolean;\n video: boolean;\n media: boolean;\n local: boolean;\n url?: string;\n downloaded?: boolean;\n}\n\nexport const Workspace = proxy({\n workspace: null as string | null,\n setWorkspace: (workspace: string | null) => {\n Workspace.workspace = workspace;\n }\n})\n\nexport function formatTaskTime(timestamp: number) {\n const date = new Date(timestamp);\n const now = new Date();\n const time = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n const isToday =\n date.getDate() === now.getDate() &&\n date.getMonth() === now.getMonth() &&\n date.getFullYear() === now.getFullYear();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const isYesterday =\n date.getDate() === yesterday.getDate() &&\n date.getMonth() === yesterday.getMonth() &&\n date.getFullYear() === yesterday.getFullYear();\n if (isToday) return `${time} Today`;\n if (isYesterday) return `${time} Yesterday`;\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n return `${time} ${day}/${month}/${year}`;\n}\n\nexport const Theme = proxy({\n theme: \"dark\",\n layout: \"rightToLeft\",\n})\n// Interface for credential structure\n\nexport interface Credential {\n activity: Record<number, number>; // timestamp -> amount\n value: string; // API key value\n credits: string;\n addActivity: (amount: number) => void;\n spending: (startDate?: number) => number;\n}\n\nexport interface ITab {\n iconOverride: string | null;\n defaultIcon: React.ComponentType<{ className: string }>;\n IconOverrideComponent: ({ className }: { className: string }) => React.ReactNode;\n icon: ({ className }: { className: string }) => React.ReactNode;\n title: string | null;\n layout: string;\n hasChildren: boolean;\n children: string[];\n group: string | null;\n size: number[],\n childrenProps: Record<string, {\n title: string | null,\n appname: string,\n icon: string,\n data: any,\n }>;\n}\n\nexport const AppComponents = proxy<Record<string, React.ComponentType<any> | React.ComponentType>>({});\n\nexport const Apps = proxy<Record<string, Record<string, React.ComponentType<any> | React.ComponentType>>>({});\n\nexport const icons: Record<string, React.ComponentType<{ className: string }>> = {\n default: LucideIcons.Compass,\n}\n\nexport interface ChildProp {\n title: string | null;\n appname: string;\n icon: string;\n data: any;\n}\ninterface CreateTabParams {\n group?: string | null;\n title?: string | null;\n iconOverride?: string | null;\n layout?: string | null;\n childrenProps?: Record<string, ChildProp>;\n size?: number[],\n}\n\nexport function createTab({\n group = null,\n title = null,\n iconOverride = null,\n layout = null,\n childrenProps = {},\n size = [50, 50, 50, 50, 50],\n}: CreateTabParams = {}): ITab {\n // Create default children if none provided\n const finalChildrenProps = Object.keys(childrenProps).length === 4\n ? childrenProps\n : {\n [uuidv4()]: {\n icon: \"default\",\n title: title,\n appname: \"default\",\n data: null,\n },\n [uuidv4()]: {\n icon: \"default\",\n title: title,\n appname: \"default\",\n data: null,\n },\n [uuidv4()]: {\n icon: \"default\",\n title: title,\n appname: \"default\",\n data: null,\n },\n [uuidv4()]: {\n icon: \"default\",\n title: title,\n appname: \"default\",\n data: null,\n },\n };\n return {\n group,\n iconOverride,\n size,\n get IconOverrideComponent() {\n return ({ className }: { className: string }) => {\n if (typeof this.iconOverride === 'string' && (this.iconOverride.startsWith('/') || this.iconOverride.startsWith('http') || /\\.(png|jpg|jpeg|ico|svg|webp)$/i.test(this.iconOverride))) {\n return <img src={this.iconOverride} className=\"w-4 h-4 object-contain rounded-sm\" alt=\"\" />;\n }\n if ((window as any).defaultIconRegistry && this.iconOverride) {\n const Icon = (window as any).defaultIconRegistry[this.iconOverride] as React.ComponentType<{ className: string }>;\n if (Icon) {\n return <Icon className={className} />;\n }\n }\n const Icon = LucideIcons[this.iconOverride as keyof typeof LucideIcons] as React.ComponentType<{ className: string }>;\n if (!Icon) return null;\n return <Icon className={className} />;\n };\n },\n get defaultIcon() {\n const firstChildKey = Object.keys(this.childrenProps)[0];\n const iconName = this.childrenProps[firstChildKey]?.icon || 'default';\n const Icon = LucideIcons[iconName as keyof typeof LucideIcons] as React.ComponentType<{ className: string }>;\n return Icon || icons.default;\n },\n get icon() {\n return ({ className }: { className: string }) => {\n if (typeof this.iconOverride === 'string' && (this.iconOverride.startsWith('/') || this.iconOverride.startsWith('http') || /\\.(png|jpg|jpeg|ico|svg|webp)$/i.test(this.iconOverride))) {\n return <img src={this.iconOverride} className={clsx(className, \"object-contain\")} alt=\"\" />;\n }\n const Icon = LucideIcons[this.iconOverride as keyof typeof LucideIcons] as React.ComponentType<{ className: string }>;\n if (Icon) {\n return <Icon className={className} />;\n }\n if ((window as any).defaultIconRegistry && this.iconOverride) {\n const Icon = (window as any).defaultIconRegistry[this.iconOverride] as React.ComponentType<{ className: string }>;\n if (Icon) {\n return <Icon className={className} />;\n }\n }\n return <LucideIcons.Compass className={className} />;\n };\n },\n title: title,\n layout: layout || \"single\",\n get hasChildren() {\n return this.children.length > 0;\n },\n get children() {\n return Object.keys(this.childrenProps);\n },\n childrenProps: finalChildrenProps,\n };\n}\n\nexport const KeyState = proxy({\n keys: {\n // =====================\n // Letters\n // =====================\n a: false, b: false, c: false, d: false, e: false, f: false, g: false,\n h: false, i: false, j: false, k: false, l: false, m: false, n: false,\n o: false, p: false, q: false, r: false, s: false, t: false, u: false,\n v: false, w: false, x: false, y: false, z: false,\n // =====================\n // Numbers (top row)\n // =====================\n \"0\": false, \"1\": false, \"2\": false, \"3\": false, \"4\": false,\n \"5\": false, \"6\": false, \"7\": false, \"8\": false, \"9\": false,\n // =====================\n // Function keys\n // =====================\n f1: false, f2: false, f3: false, f4: false, f5: false, f6: false,\n f7: false, f8: false, f9: false, f10: false, f11: false, f12: false,\n // =====================\n // Modifiers\n // =====================\n shift: false,\n control: false,\n alt: false,\n meta: false, // Windows / Command key\n // =====================\n // Navigation\n // =====================\n arrowup: false,\n arrowdown: false,\n arrowleft: false,\n arrowright: false,\n home: false,\n end: false,\n pageup: false,\n pagedown: false,\n // =====================\n // Editing / system\n // =====================\n space: false,\n enter: false,\n escape: false,\n backspace: false,\n tab: false,\n delete: false,\n // =====================\n // Symbols\n // =====================\n \"`\": false,\n \"-\": false,\n \"=\": false,\n \"[\": false,\n \"]\": false,\n \"\\\\\": false,\n \";\": false,\n \"'\": false,\n \",\": false,\n \".\": false,\n \"/\": false,\n // =====================\n // Numpad\n // =====================\n numpad0: false,\n numpad1: false,\n numpad2: false,\n numpad3: false,\n numpad4: false,\n numpad5: false,\n numpad6: false,\n numpad7: false,\n numpad8: false,\n numpad9: false,\n numpadadd: false,\n numpadsubtract: false,\n numpadmultiply: false,\n numpaddivide: false,\n numpaddecimal: false,\n numpadenter: false,\n // =====================\n // Locks\n // =====================\n capslock: false,\n numlock: false,\n scrolllock: false,\n } as Record<string, boolean>,\n setKey: (key: string, pressed: boolean) => {\n KeyState.keys[key] = pressed\n },\n clearKeys: () => {\n Object.keys(KeyState.keys).forEach(key => {\n KeyState.keys[key] = false;\n });\n KeyState.ctrl = false;\n KeyState.shift = false;\n KeyState.alt = false;\n },\n ctrl: false,\n setCtrl: (ctrl: boolean) => {\n KeyState.ctrl = ctrl;\n },\n shift: false,\n setShift: (shift: boolean) => {\n KeyState.shift = shift;\n },\n alt: false,\n setAlt: (alt: boolean) => {\n KeyState.alt = alt;\n },\n})\n\nexport const TabState = proxy<Record<string, ITab>>({})\n\nexport const DragState = proxy(\n {\n active: false,\n record: {\n id: null as string | null,\n over: null as string | null\n } as Record<string, string | null>,\n set: (key: string, id: string | null) => {\n DragState.record[key] = id;\n },\n clear: () => {\n DragState.record = {};\n },\n timeout: null as NodeJS.Timeout | null,\n get id() {\n return DragState.record[\"id\"];\n },\n get over() {\n return DragState.record[\"over\"];\n }\n }\n)\n\nexport const Viewport = proxy({\n width: 0,\n height: 0,\n overflowX: false,\n overflowY: false,\n aspectRatio: \"16:9\",\n})\n\nexport const TabInfo = proxy({\n active: \"\",\n get icon() {\n return TabState[this.active]?.icon || (() => null);\n },\n children: [] as string[],\n layout: \"single\",\n switchMode: false,\n size: [100],\n SetActive: (uuid: string) => {\n TabInfo.active = uuid;\n TabInfo.switchMode = false;\n const tab = TabState[uuid];\n if (tab) {\n TabInfo.layout = tab.layout;\n TabInfo.children = tab.children;\n TabInfo.size = tab.size;\n }\n }\n})\n// Helper functions for tab management\n\nexport const reorderTabs = (fromIndex: number, toIndex: number) => {\n const entries = Object.entries(TabState);\n const [removed] = entries.splice(fromIndex, 1);\n entries.splice(toIndex, 0, removed);\n // Clear current state\n Object.keys(TabState).forEach(key => {\n delete TabState[key];\n });\n // Re-add with new indices\n entries.forEach(([key, value]) => {\n TabState[key] = value;\n });\n};\n// Helper functions for tab management\n\nexport const reorderChildren = (uuid: string, fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) {\n return Object.keys(TabState[uuid].childrenProps);\n }\n console.log('Reorder called:', { fromIndex, toIndex });\n const entries = Object.entries(TabState[uuid].childrenProps);\n console.log('Before:', entries.map(([k]) => k));\n // SWAP instead of move\n const temp = entries[fromIndex];\n entries[fromIndex] = entries[toIndex];\n entries[toIndex] = temp;\n console.log('After swap:', entries.map(([k]) => k));\n // Rebuild the object completely fresh\n const newChildrenProps = {} as Record<string, any>;\n entries.forEach(([key, value]) => {\n newChildrenProps[key] = value;\n });\n TabState[uuid].childrenProps = newChildrenProps;\n console.log(Object.keys(TabState[uuid].childrenProps));\n return Object.keys(TabState[uuid].childrenProps);\n};\n\nexport const deleteTab = (uuid: string) => {\n delete TabState[uuid];\n // Filter out any entries where childrenProps is undefined/empty\n Object.keys(TabState).forEach((key) => {\n const entry = TabState[key];\n const children = entry?.childrenProps;\n if (!children || (typeof children === \"object\" && Object.keys(children).length === 0)) {\n delete TabState[key];\n }\n });\n cleanupPersistentIframe(uuid);\n};\ninterface AddTabParams {\n uuid?: string;\n title?: string;\n iconOverride?: string | null;\n group?: string | null;\n layout?: string;\n childrenProps?: Record<string, ChildProp>;\n size?: number[];\n}\n\nexport const addTab = ({\n uuid: predefinedUuid,\n title,\n iconOverride = null,\n group = null,\n layout,\n childrenProps,\n size\n}: AddTabParams = {}): string => {\n const uuid = predefinedUuid ?? uuidv4();\n // When called with no childrenProps, fall back to the defaultTab\n // registered by Container via window.defaultTabs / window.defaultLayout\n let resolvedLayout = layout;\n let resolvedChildrenProps = childrenProps;\n const defaultSize: number[] =\n (window as any).defaultSize ?? [50, 50, 50, 50, 50];\n if (!resolvedChildrenProps) {\n const defaultTabs: Array<{ appname: string; data: any }> =\n (window as any).defaultTabs ?? [];\n const defaultLayout: string =\n (window as any).defaultLayout ?? \"single\";\n const defaultIcon: string =\n (window as any).defaultIcon ?? \"default\";\n resolvedLayout = resolvedLayout ?? defaultLayout;\n iconOverride = iconOverride ?? defaultIcon;\n if (defaultTabs.length > 0) {\n resolvedChildrenProps = {} as Record<string, ChildProp>;\n for (let i = 0; i < 4; i++) {\n if (defaultTabs[i]) {\n resolvedChildrenProps[uuidv4()] = {\n icon: defaultIcon,\n title: null,\n appname: defaultTabs[i].appname,\n data: defaultTabs[i].data ?? {},\n };\n } else {\n resolvedChildrenProps[uuidv4()] = {\n icon: \"default\",\n title: null,\n appname: \"default\",\n data: null,\n };\n }\n }\n }\n }\n TabState[uuid] = createTab({\n group,\n title,\n iconOverride,\n layout: resolvedLayout,\n childrenProps: resolvedChildrenProps,\n size: size ?? defaultSize\n });\n TabInfo.SetActive(uuid);\n return uuid;\n};\n\nexport const relayoutTab = (pkey: string) => {\n const currentProps = TabState[pkey].childrenProps;\n const entries = Object.entries(currentProps);\n // Separate real apps and dummy apps\n const realApps = entries.filter(([_, prop]) => prop.appname !== \"default\" && prop.appname !== \"select-tab\");\n // Construct new childrenProps with real apps first\n const newChildrenProps: Record<string, any> = {};\n realApps.forEach(([k, v]) => {\n newChildrenProps[k] = v;\n });\n // Fill remaining slots with dummies\n const dummyKeys = [\"default1\", \"default2\", \"default3\"];\n let dummyIdx = 0;\n while (Object.keys(newChildrenProps).length < 4) {\n if (Object.keys(newChildrenProps).length === 0) {\n newChildrenProps[uuidv4()] = {\n icon: \"default\",\n title: null,\n appname: \"default\",\n data: null,\n };\n } else {\n const dKey = dummyKeys[dummyIdx] || `default${dummyIdx + 1}`;\n newChildrenProps[dKey] = {\n icon: \"default\",\n title: null,\n appname: \"default\",\n data: null,\n };\n dummyIdx++;\n }\n }\n TabState[pkey].childrenProps = newChildrenProps;\n const realCount = realApps.length;\n if (realCount === 0) {\n const tabKeys = Object.keys(TabState);\n const oldIndex = tabKeys.indexOf(pkey);\n delete TabState[pkey];\n if (TabInfo.active === pkey) {\n const otherTabs = Object.keys(TabState);\n if (otherTabs.length > 0) {\n const nextIndex = Math.min(oldIndex, otherTabs.length - 1);\n TabInfo.SetActive(otherTabs[nextIndex]);\n } else {\n TabInfo.active = \"\";\n TabInfo.children = [];\n TabInfo.layout = \"single\";\n TabInfo.size = [50, 50, 50, 50, 50];\n }\n }\n } else {\n if (realCount === 1) {\n TabState[pkey].layout = \"single\";\n } else if (realCount === 2) {\n TabState[pkey].layout = \"horizontal\";\n } else if (realCount === 3) {\n TabState[pkey].layout = \"triple\";\n } else if (realCount === 4) {\n TabState[pkey].layout = \"grid2x2\";\n }\n if (TabInfo.active === pkey) {\n TabInfo.layout = TabState[pkey].layout;\n TabInfo.children = Object.keys(newChildrenProps);\n TabInfo.size = TabState[pkey].size;\n }\n }\n};\n\nexport const closeTab = (childrenKey: string) => {\n const parentKey = Object.entries(TabState).find(([_, v]) => v.children.includes(childrenKey))?.[0];\n if (parentKey) {\n delete TabState[parentKey].childrenProps[childrenKey];\n relayoutTab(parentKey);\n }\n};\n\nexport interface IApp {\n tabicon: string;\n data: Record<string, any>;\n title: string | null;\n MainComponent: React.ComponentType<AppInfo> | null;\n}\n\nexport const detachTab = (childrenKey: string) => {\n const parentKey = Object.entries(TabState).find(([_, v]) => v.children.includes(childrenKey))?.[0];\n if (parentKey) {\n const childProp = TabState[parentKey].childrenProps[childrenKey];\n addTab({\n layout: \"single\",\n childrenProps: {\n [uuidv4()]: childProp,\n \"default1\": { icon: \"default\", title: null, appname: \"default\", data: null },\n \"default2\": { icon: \"default\", title: null, appname: \"default\", data: null },\n \"default3\": { icon: \"default\", title: null, appname: \"default\", data: null },\n }\n });\n delete TabState[parentKey].childrenProps[childrenKey];\n relayoutTab(parentKey);\n }\n};\n// Tab Group Management Utilities\n/**\n * Get all tabs belonging to a specific group\n * @param group - Group name (null for ungrouped tabs)\n */\n\nexport const getTabsByGroup = (group: string | null): Record<string, ITab> => {\n return Object.fromEntries(\n Object.entries(TabState).filter(([_, tab]) => tab.group === group)\n );\n};\n/**\n * Get all unique group names from TabState\n */\n\nexport const getAllGroups = (): (string | null)[] => {\n const groups = new Set<string | null>();\n Object.values(TabState).forEach(tab => groups.add(tab.group));\n return Array.from(groups);\n};\n/**\n * Set a tab's group\n * @param uuid - Tab ID\n * @param group - Group name or null for ungrouped\n */\n\nexport const setTabGroup = (uuid: string, group: string | null) => {\n if (TabState[uuid]) {\n TabState[uuid].group = group;\n }\n};\n/**\n * Reorder tabs within a specific group\n * @param group - Group to reorder within\n * @param fromIndex - Original index within the group\n * @param toIndex - Target index within the group\n */\n\nexport const reorderTabsInGroup = (group: string | null, fromIndex: number, toIndex: number) => {\n // Get all tabs, separating by group\n const allEntries = Object.entries(TabState);\n const groupEntries = allEntries.filter(([_, tab]) => tab.group === group);\n // Reorder within the group\n const [removed] = groupEntries.splice(fromIndex, 1);\n groupEntries.splice(toIndex, 0, removed);\n // Reconstruct TabState maintaining group order\n // First reconstruct groups in their original order\n const groupOrder = getAllGroups();\n // Clear current state\n Object.keys(TabState).forEach(key => {\n delete TabState[key];\n });\n // Re-add tabs in order: null group first, then named groups alphabetically\n groupOrder.sort((a, b) => {\n if (a === null) return -1;\n if (b === null) return 1;\n return a.localeCompare(b);\n });\n groupOrder.forEach(g => {\n const entries = g === group ? groupEntries : allEntries.filter(([_, tab]) => tab.group === g);\n entries.forEach(([key, value]) => {\n TabState[key] = value;\n });\n });\n};\n/**\n * Delete a tab with auto-selection of next tab in the same group\n * @param uuid - Tab ID to delete\n * @returns The ID of the newly selected tab, or null if no tabs remain\n */\n\nexport const deleteTabWithGroupSelection = (uuid: string): string | null => {\n const tabToDelete = TabState[uuid];\n if (!tabToDelete) return null;\n const group = tabToDelete.group;\n const groupTabs = Object.keys(getTabsByGroup(group));\n const indexInGroup = groupTabs.indexOf(uuid);\n // Find next tab in the same group first\n let nextTabId: string | null = null;\n if (groupTabs.length > 1) {\n // Try to select next tab in same group\n if (indexInGroup > 0) {\n nextTabId = groupTabs[indexInGroup - 1];\n } else if (indexInGroup < groupTabs.length - 1) {\n nextTabId = groupTabs[indexInGroup + 1];\n }\n } else {\n // No more tabs in this group, find next in any group\n const allTabs = Object.keys(TabState).filter(id => id !== uuid);\n if (allTabs.length > 0) {\n // Prefer ungrouped tabs, then any other group\n const ungroupedTabs = allTabs.filter(id => TabState[id].group === null);\n nextTabId = ungroupedTabs.length > 0 ? ungroupedTabs[0] : allTabs[0];\n }\n }\n // Delete the tab\n deleteTab(uuid);\n // Update active tab if the deleted tab was active\n if (TabInfo.active === uuid && nextTabId && typeof TabState[nextTabId].childrenProps !== \"undefined\" && TabState[nextTabId].childrenProps !== null) {\n TabInfo.SetActive(nextTabId);\n }\n return nextTabId;\n};\n/**\n * Move a tab from one group to another\n * @param uuid - Tab ID\n * @param targetGroup - Target group name or null\n * @param insertAtIndex - Optional index to insert at within target group\n */\n\nexport const moveTabToGroup = (uuid: string, targetGroup: string | null, insertAtIndex?: number) => {\n if (!TabState[uuid]) return;\n const tab = TabState[uuid];\n const sourceGroup = tab.group;\n // If moving to the same group, just reorder\n if (sourceGroup === targetGroup && insertAtIndex !== undefined) {\n const groupTabs = Object.keys(getTabsByGroup(targetGroup));\n const currentIndex = groupTabs.indexOf(uuid);\n if (currentIndex !== -1 && currentIndex !== insertAtIndex) {\n reorderTabsInGroup(targetGroup, currentIndex, insertAtIndex);\n }\n return;\n }\n // Change the group\n tab.group = targetGroup;\n // If insert position specified, reorder to that position\n if (insertAtIndex !== undefined) {\n const groupTabs = Object.keys(getTabsByGroup(targetGroup));\n const currentIndex = groupTabs.indexOf(uuid);\n if (currentIndex !== -1 && currentIndex !== insertAtIndex) {\n reorderTabsInGroup(targetGroup, currentIndex, insertAtIndex);\n }\n }\n};\n\nexport const HoverState = proxy<{\n current: HTMLElement | null;\n mousePos: { x: number, y: number };\n}>({\n current: null,\n mousePos: { x: 0, y: 0 }\n});\n","import * as React from \"react\"\r\nimport { Loader2 } from \"lucide-react\"\r\nimport { iconList, LucideIcons } from \"../utils/state\"\r\nimport { cn } from \"../lib/utils\"\r\nimport {\r\n Command,\r\n CommandEmpty,\r\n CommandInput,\r\n CommandList,\r\n} from \"./ui/command\"\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from \"./ui/popover\"\r\n// Filter out non-icon exports from lucide-react\r\ninterface IconPopoverProps {\r\n children: React.ReactNode\r\n onSelect: (iconName: string) => void\r\n className?: string\r\n}\r\n\r\nexport function IconPopover({ children, onSelect }: IconPopoverProps) {\r\n const [open, setOpen] = React.useState(false)\r\n const [searchQuery, setSearchQuery] = React.useState(\"\")\r\n const [limit, setLimit] = React.useState(50)\r\n const fullIconList = React.useMemo(() => {\r\n const defaultIconRegistry = (window as any).defaultIconRegistry || {};\r\n return Array.from(new Set([...Object.keys(defaultIconRegistry), ...iconList]));\r\n }, []);\r\n // Use a callback ref to setup observer when the element is mounted\r\n const observer = React.useRef<IntersectionObserver | null>(null)\r\n const lastElementRef = React.useCallback((node: HTMLDivElement | null) => {\r\n if (observer.current) observer.current.disconnect()\r\n observer.current = new IntersectionObserver(entries => {\r\n if (entries[0].isIntersecting && limit < fullIconList.length) { // Use simpler condition first\r\n setLimit(prev => prev + 50)\r\n }\r\n })\r\n if (node) observer.current.observe(node)\r\n }, [limit, fullIconList.length])\r\n // Filter icons based on search\r\n const allFilteredIcons = React.useMemo(() => {\r\n if (!searchQuery) return fullIconList;\r\n return fullIconList.filter((name) => name.toLowerCase().includes(searchQuery.toLowerCase()));\r\n }, [searchQuery, fullIconList]);\r\n const displayedIcons = React.useMemo(() => {\r\n return allFilteredIcons.slice(0, limit)\r\n }, [allFilteredIcons, limit])\r\n const hasMore = limit < allFilteredIcons.length\r\n // Reset limit when search changes\r\n React.useEffect(() => {\r\n setLimit(50)\r\n }, [searchQuery])\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n {children}\r\n </PopoverTrigger>\r\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\r\n <Command shouldFilter={false}>\r\n <CommandInput\r\n placeholder=\"Search icon...\"\r\n value={searchQuery}\r\n onValueChange={setSearchQuery}\r\n />\r\n {/* CommandList has max-h-[300px] and overflow-y-auto by default in shadcn/ui */}\r\n <CommandList className=\"h-[300px] max-h-[300px]\">\r\n {allFilteredIcons.length === 0 && <CommandEmpty>No icon found.</CommandEmpty>}\r\n <div className=\"grid grid-cols-7 gap-1 p-1\">\r\n {displayedIcons.map((iconName) => {\r\n const defaultIconRegistry = (window as any).defaultIconRegistry || {};\r\n const Icon = defaultIconRegistry[iconName] || (LucideIcons as any)[iconName]\r\n if (!Icon) return null;\r\n return (\r\n <div\r\n key={iconName}\r\n className={cn(\r\n \"flex flex-col py-2 items-center justify-center gap-1 rounded-md hover:bg-accent hover:text-accent-foreground cursor-pointer transition-colors\",\r\n )}\r\n onClick={() => {\r\n onSelect(iconName)\r\n setOpen(false)\r\n }}\r\n title={iconName}\r\n >\r\n <Icon className=\"h-4 w-4\" />\r\n </div>\r\n )\r\n })}\r\n </div>\r\n {hasMore && (\r\n <div ref={lastElementRef} className=\"flex justify-center p-4 w-full\">\r\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\r\n </div>\r\n )}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport type { EventHandler } from '../usePython';\r\n// Type definitions\r\ninterface WebSocketMessage {\r\n id: number | string;\r\n [key: string]: any;\r\n}\r\ninterface WebSocketResponse<T = any> {\r\n id?: number | string;\r\n event?: string;\r\n response?: T;\r\n error?: string;\r\n}\r\ninterface PendingRequest<T = any> {\r\n resolve: (value: T | AsyncGenerator<T, void, unknown>) => void;\r\n reject: (reason: Error) => void;\r\n}\r\nclass AsyncStream<T> {\r\n private queue: T[] = [];\r\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\r\n private ended = false;\r\n private error: Error | null = null;\r\n push(value: T) {\r\n if (this.resolvers.length > 0) {\r\n this.resolvers.shift()!({ value, done: false });\r\n } else {\r\n this.queue.push(value);\r\n }\r\n }\r\n end() {\r\n this.ended = true;\r\n while (this.resolvers.length > 0) {\r\n this.resolvers.shift()!({ value: undefined as any, done: true });\r\n }\r\n }\r\n fail(err: Error) {\r\n this.error = err;\r\n while (this.resolvers.length > 0) {\r\n this.resolvers.shift()!(Promise.reject(err) as any);\r\n }\r\n }\r\n async *[Symbol.asyncIterator](): AsyncGenerator<T, void, unknown> {\r\n while (true) {\r\n if (this.error) throw this.error;\r\n if (this.queue.length > 0) {\r\n yield this.queue.shift()!;\r\n continue;\r\n }\r\n if (this.ended) break;\r\n const result = await new Promise<IteratorResult<T>>((resolve) => {\r\n this.resolvers.push(resolve);\r\n });\r\n if (result.done) break;\r\n yield result.value;\r\n }\r\n }\r\n}\r\n\r\nexport type UseWebSocketReturn<T = any> = readonly [<R = T>(message: Omit<WebSocketMessage, 'id'> & { id?: number | string }, timeout?: number) => Promise<R | AsyncGenerator<R, void, unknown>>, boolean];\r\n\r\nexport class WebSocketManager {\r\n private static instance: WebSocketManager;\r\n private ws: WebSocket | null = null;\r\n private url: string = typeof window !== 'undefined' ? `ws${window.location.protocol === 'https:' ? 's' : ''}://${window.location.host}/ws` : \"ws://localhost:3000/ws\";\r\n private isConnected: boolean = false;\r\n private subscribers: Set<(connected: boolean) => void> = new Set();\r\n private pendingRequests: Map<number | string, PendingRequest> = new Map();\r\n private activeStreams: Map<number | string, AsyncStream<any>> = new Map();\r\n private messageId: number = 0;\r\n private reconnectTimer: NodeJS.Timeout | null = null;\r\n // Event emitter functionality\r\n private eventHandlers: Map<string, Set<EventHandler>> = new Map();\r\n private onceHandlers: Map<string, Set<EventHandler>> = new Map();\r\n private constructor() { }\r\n public static getInstance(): WebSocketManager {\r\n if (!WebSocketManager.instance) {\r\n WebSocketManager.instance = new WebSocketManager();\r\n }\r\n return WebSocketManager.instance;\r\n }\r\n /**\r\n * Subscribe to a specific event from the backend.\r\n * @param event Event name (e.g., \"task:progress\", \"notification\")\r\n * @param handler Callback function that receives the event data\r\n * @returns Unsubscribe function\r\n */\r\n public on<T = any>(event: string, handler: EventHandler<T>): () => void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler as EventHandler);\r\n return () => this.off(event, handler);\r\n }\r\n /**\r\n * Unsubscribe from a specific event.\r\n * @param event Event name\r\n * @param handler The handler function to remove\r\n */\r\n public off<T = any>(event: string, handler: EventHandler<T>): void {\r\n if (this.eventHandlers.has(event)) {\r\n this.eventHandlers.get(event)!.delete(handler as EventHandler);\r\n if (this.eventHandlers.get(event)!.size === 0) {\r\n this.eventHandlers.delete(event);\r\n }\r\n }\r\n if (this.onceHandlers.has(event)) {\r\n this.onceHandlers.get(event)!.delete(handler as EventHandler);\r\n if (this.onceHandlers.get(event)!.size === 0) {\r\n this.onceHandlers.delete(event);\r\n }\r\n }\r\n }\r\n /**\r\n * Subscribe to an event for a single occurrence.\r\n * @param event Event name\r\n * @param handler Callback function that receives the event data\r\n * @returns Unsubscribe function\r\n */\r\n public once<T = any>(event: string, handler: EventHandler<T>): () => void {\r\n if (!this.onceHandlers.has(event)) {\r\n this.onceHandlers.set(event, new Set());\r\n }\r\n this.onceHandlers.get(event)!.add(handler as EventHandler);\r\n return () => this.off(event, handler);\r\n }\r\n /**\r\n * Emit an event to all registered handlers (internal use).\r\n */\r\n private emitEvent(event: string, data: any): void {\r\n // Call regular handlers\r\n if (this.eventHandlers.has(event)) {\r\n this.eventHandlers.get(event)!.forEach(handler => {\r\n try {\r\n handler(data);\r\n } catch (err) {\r\n console.error(`Error in event handler for '${event}':`, err);\r\n }\r\n });\r\n }\r\n // Call once handlers and remove them\r\n if (this.onceHandlers.has(event)) {\r\n const handlers = this.onceHandlers.get(event)!;\r\n this.onceHandlers.delete(event);\r\n handlers.forEach(handler => {\r\n try {\r\n handler(data);\r\n } catch (err) {\r\n console.error(`Error in once handler for '${event}':`, err);\r\n }\r\n });\r\n }\r\n // Also dispatch as CustomEvent for backwards compatibility\r\n if (typeof window !== 'undefined') {\r\n window.dispatchEvent(new CustomEvent(event, {\r\n detail: { response: data }\r\n }));\r\n }\r\n }\r\n /**\r\n * Get the number of handlers for a specific event.\r\n */\r\n public listenerCount(event: string): number {\r\n const regular = this.eventHandlers.get(event)?.size || 0;\r\n const once = this.onceHandlers.get(event)?.size || 0;\r\n return regular + once;\r\n }\r\n /**\r\n * Remove all handlers for a specific event or all events.\r\n */\r\n public removeAllListeners(event?: string): void {\r\n if (event) {\r\n this.eventHandlers.delete(event);\r\n this.onceHandlers.delete(event);\r\n } else {\r\n this.eventHandlers.clear();\r\n this.onceHandlers.clear();\r\n }\r\n }\r\n public connect(url: string) {\r\n // If already connected to the same URL, do nothing\r\n if (this.ws?.readyState === WebSocket.OPEN && this.url === url) {\r\n return;\r\n }\r\n // If connecting to the same URL, do nothing\r\n if (this.ws?.readyState === WebSocket.CONNECTING && this.url === url) {\r\n return;\r\n }\r\n // If URL changed or not connected, close existing and connect new\r\n if (this.ws) {\r\n this.ws.close();\r\n }\r\n this.url = url;\r\n this.ws = new WebSocket(url);\r\n this.ws.onopen = () => {\r\n this.isConnected = true;\r\n this.notifySubscribers();\r\n console.log('WebSocket connected');\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n };\r\n this.ws.onmessage = async (event: MessageEvent) => {\r\n try {\r\n let data: WebSocketResponse;\r\n // Handle different data types\r\n if (typeof event.data === 'string') {\r\n data = JSON.parse(event.data);\r\n } else if (event.data instanceof Blob) {\r\n // Binary data as Blob - convert to text first\r\n const text = await event.data.text();\r\n data = JSON.parse(text);\r\n } else if (event.data instanceof ArrayBuffer) {\r\n // Binary data as ArrayBuffer - decode to text\r\n const text = new TextDecoder().decode(event.data);\r\n data = JSON.parse(text);\r\n } else {\r\n console.error('Unknown message type:', typeof event.data);\r\n return;\r\n }\r\n if (data) {\r\n const { id, event: e, response, error, stream_end } = data as WebSocketResponse & { stream_end?: boolean };\r\n if (id !== undefined) {\r\n // Check for active stream first\r\n if (this.activeStreams.has(id)) {\r\n const stream = this.activeStreams.get(id)!;\r\n if (error) {\r\n stream.fail(new Error(error));\r\n this.activeStreams.delete(id);\r\n } else if (stream_end) {\r\n stream.end();\r\n this.activeStreams.delete(id);\r\n // Clean up alias key (effective stream id) if present\r\n if (response && (response as any)?.id !== undefined) {\r\n this.activeStreams.delete((response as any).id);\r\n }\r\n } else if (response !== undefined) {\r\n stream.push(response);\r\n }\r\n } else if (this.pendingRequests.has(id)) {\r\n const { resolve, reject } = this.pendingRequests.get(id)!;\r\n if (error) {\r\n reject(new Error(error));\r\n } else if (stream_end !== undefined) {\r\n // It's a stream!\r\n const stream = new AsyncStream<any>();\r\n if (response !== undefined) {\r\n stream.push(response);\r\n }\r\n if (stream_end) {\r\n stream.end();\r\n } else {\r\n // Register under WS correlation id\r\n this.activeStreams.set(id, stream);\r\n // ALSO register under the effective stream id (response.id) if\r\n // different, because the backend sends subsequent chunks keyed\r\n // by the chat-specific id (e.g. \"tabId_response_...\"), not\r\n // the numeric WS correlation id.\r\n const effectiveStreamId = (response as any)?.id;\r\n if (effectiveStreamId !== undefined && effectiveStreamId !== id) {\r\n this.activeStreams.set(effectiveStreamId, stream);\r\n }\r\n }\r\n resolve(stream[Symbol.asyncIterator]()); // Resolve with the async generator\r\n } else {\r\n resolve(response);\r\n }\r\n this.pendingRequests.delete(id);\r\n }\r\n }\r\n // Handle events via the event emitter system\r\n if (typeof e === \"string\") {\r\n this.emitEvent(e, response);\r\n }\r\n }\r\n } catch (err) {\r\n console.error('Error parsing message:', err);\r\n }\r\n };\r\n this.ws.onclose = () => {\r\n const wasConnected = this.isConnected;\r\n this.isConnected = false;\r\n if (wasConnected) {\r\n this.notifySubscribers();\r\n }\r\n console.log('WebSocket disconnected');\r\n this.cleanupPendingRequests('WebSocket connection closed');\r\n this.cleanupActiveStreams('WebSocket connection closed');\r\n // Attempt reconnect\r\n if (!this.reconnectTimer) {\r\n this.reconnectTimer = setTimeout(() => this.connect(this.url), 3000);\r\n }\r\n };\r\n this.ws.onerror = (error) => {\r\n console.error('WebSocket error:', error);\r\n };\r\n }\r\n public send<R>(message: Omit<WebSocketMessage, 'id'> & { id?: number | string }, timeout: number = 500): Promise<R | AsyncGenerator<R, void, unknown>> {\r\n return new Promise<R | AsyncGenerator<R, void, unknown>>((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('WebSocket is not connected'));\r\n return;\r\n }\r\n const id = message.id ?? this.messageId++;\r\n const payload: WebSocketMessage = { ...message, id };\r\n const m = JSON.stringify(payload);\r\n const timeoutId = setTimeout(() => {\r\n if (this.pendingRequests.has(id)) {\r\n this.pendingRequests.delete(id);\r\n reject(new Error('Request timeout'));\r\n }\r\n }, timeout);\r\n this.pendingRequests.set(id, {\r\n resolve: (data: any) => {\r\n clearTimeout(timeoutId);\r\n resolve(data);\r\n },\r\n reject: (err: Error) => {\r\n clearTimeout(timeoutId);\r\n reject(err);\r\n }\r\n });\r\n try {\r\n this.ws.send(m);\r\n } catch (err) {\r\n this.pendingRequests.delete(id);\r\n clearTimeout(timeoutId);\r\n reject(new Error(`Failed to send message: ${err}`));\r\n }\r\n });\r\n }\r\n public subscribe(callback: (connected: boolean) => void): () => void {\r\n this.subscribers.add(callback);\r\n callback(this.isConnected);\r\n return () => this.subscribers.delete(callback);\r\n }\r\n private notifySubscribers() {\r\n this.subscribers.forEach(cb => cb(this.isConnected));\r\n }\r\n private cleanupPendingRequests(reason: string) {\r\n this.pendingRequests.forEach(({ reject }) => reject(new Error(reason)));\r\n this.pendingRequests.clear();\r\n }\r\n private cleanupActiveStreams(reason: string) {\r\n this.activeStreams.forEach((stream) => stream.fail(new Error(reason)));\r\n this.activeStreams.clear();\r\n }\r\n public get getWs() {\r\n return this.ws;\r\n }\r\n}\r\n\r\nexport const useWebSocketSingleton = <T = any>(url: string = typeof window !== 'undefined' ? `ws${window.location.protocol === 'https:' ? 's' : ''}://${window.location.host}/ws` : \"ws://localhost:3000/ws\"): UseWebSocketReturn<T> => {\r\n const [isConnected, setIsConnected] = useState(false);\r\n const manager = WebSocketManager.getInstance();\r\n useEffect(() => {\r\n manager.connect(url);\r\n return manager.subscribe(setIsConnected);\r\n }, [url]);\r\n const send = useCallback(<R = T>(message: Omit<WebSocketMessage, 'id'> & { id?: number | string }, timeout?: number) => {\r\n return manager.send<R>(message, timeout);\r\n }, []);\r\n return [send, isConnected] as const;\r\n};\r\n/**\r\n * React hook for subscribing to WebSocket events.\r\n * Automatically cleans up the subscription on unmount.\r\n * \r\n * @param event Event name to subscribe to\r\n * @param handler Callback function that receives the event data\r\n * \r\n * @example\r\n * ```tsx\r\n * useWebSocketEvent('task:progress', (data) => {\r\n * console.log('Progress:', data.progress);\r\n * });\r\n * ```\r\n */\r\n\r\nexport const useWebSocketEvent = <T = any>(event: string, handler: EventHandler<T>): void => {\r\n const manager = WebSocketManager.getInstance();\r\n useEffect(() => {\r\n return manager.on(event, handler);\r\n }, [event, handler]);\r\n};","import type { EventHandler } from \"../usePython\";\r\nimport type { UseWebSocketReturn } from \"./useWebSocket\";\r\nimport { useWebSocketSingleton, useWebSocketEvent as useWebSocketEventImpl } from \"./useWebSocket\";\r\n\r\nexport function useWebSocket<T>(): UseWebSocketReturn<T> {\r\n const url = typeof window !== 'undefined' ? `ws${window.location.protocol === 'https:' ? 's' : ''}://${window.location.host}/ws` : \"ws://localhost:3000/ws\";\r\n return useWebSocketSingleton<T>(url);\r\n}\r\n\r\nexport const useWebSocketEvent = <T = any>(event: string, handler: EventHandler<T>): void => {\r\n return useWebSocketEventImpl(event, handler)\r\n};","import { invoke } from '@tauri-apps/api/core';\n\nconst PY_INVOKE_TAURI_CMD = \"plugin:pytauri|pyfunc\";\nconst PY_INVOKE_HEADER = \"pyfunc\";\n/**\n * Invokes a Python function through the Tauri IPC mechanism.\n *\n * @param funcName - The name of the Python function to invoke.\n * @param body - The body to send to the Python function.\n * @param options - See {@link invoke} for more details.\n * @template T - The expected return type of the Python function.\n *\n * ### NOTE\n *\n * The following headers are reserved and you should not set them in the options:\n * - `pyfunc`\n * - `__PYTAURI*`\n * - `PyTauri*`\n * @returns A promise resolving or rejecting to the backend response.\n */\nasync function pyInvoke(funcName, body, options) {\n let bodyEncoded;\n if (body === undefined || (body instanceof ArrayBuffer) || (body instanceof Uint8Array)) {\n bodyEncoded = body;\n }\n else {\n const bodyJson = JSON.stringify(body);\n bodyEncoded = new TextEncoder().encode(bodyJson);\n }\n const headers = new Headers(options?.headers);\n // We silently override it without throwing an exception, because Tauri does the same:\n // ref: <https://github.com/tauri-apps/tauri/pull/13227#discussion_r2041442439>\n headers.set(PY_INVOKE_HEADER, funcName);\n return await invoke(PY_INVOKE_TAURI_CMD, bodyEncoded, {\n ...options,\n headers,\n });\n}\n\nexport { pyInvoke };\n//# sourceMappingURL=index.js.map\n","import { useWebSocket } from \"../useWebSocket\";\r\nimport { pyInvoke } from \"tauri-plugin-pytauri-api\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { WebSocketManager } from \"../useWebSocket/useWebSocket\";\r\n\r\nexport type EventHandler<T = any> = (data: T) => void;\r\n\r\nconst isTauri = typeof window !== 'undefined' && !!(window as any).__TAURI__;\r\n/**\r\n * React hook for subscribing to Python backend events.\r\n * Works seamlessly with both WebSocket (browser) and Tauri (desktop) modes.\r\n * \r\n * @param event Event name to subscribe to (e.g., \"task:progress\", \"notification\")\r\n * @param handler Callback function that receives the event data\r\n * \r\n * @example\r\n * ```tsx\r\n * usePythonEvent('task:progress', (data) => {\r\n * console.log('Progress:', data.progress);\r\n * });\r\n * \r\n * usePythonEvent<{ result: string }>('task:complete', (data) => {\r\n * console.log('Completed:', data.result);\r\n * });\r\n * ```\r\n */\r\n\r\nexport function usePythonEvent<T = any>(event: string, handler: EventHandler<T>): void {\r\n // Use ref to always have latest handler without re-subscribing\r\n const handlerRef = useRef(handler);\r\n handlerRef.current = handler;\r\n useEffect(() => {\r\n if (isTauri) {\r\n // Tauri mode: Use @tauri-apps/api/event\r\n let unlisten: (() => void) | undefined;\r\n let mounted = true;\r\n // Dynamic import to avoid bundling issues in browser mode\r\n import('@tauri-apps/api/event').then(({ listen }) => {\r\n if (!mounted) return;\r\n listen<T>(event, (e) => {\r\n handlerRef.current(e.payload);\r\n }).then((unlistenFn) => {\r\n if (mounted) {\r\n unlisten = unlistenFn;\r\n } else {\r\n // Component unmounted before listener was ready\r\n unlistenFn();\r\n }\r\n }).catch((err) => {\r\n console.error(`Failed to listen to Tauri event '${event}':`, err);\r\n });\r\n }).catch((err) => {\r\n console.error(`Failed to import @tauri-apps/api/event:`, err);\r\n });\r\n return () => {\r\n mounted = false;\r\n unlisten?.();\r\n };\r\n } else {\r\n // WebSocket mode: Use WebSocketManager event system\r\n const manager = WebSocketManager.getInstance();\r\n const wrappedHandler = (data: T) => handlerRef.current(data);\r\n return manager.on(event, wrappedHandler);\r\n }\r\n }, [event]); // Only re-subscribe when event name changes\r\n}\r\n/**\r\n * Listen to a Python event once (one-time subscription).\r\n * Works with both WebSocket and Tauri modes.\r\n * \r\n * @param event Event name to subscribe to\r\n * @returns Promise that resolves with the event data\r\n */\r\n\r\nexport function oncePythonEvent<T = any>(event: string): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n if (isTauri) {\r\n import('@tauri-apps/api/event').then(({ once }) => {\r\n once<T>(event, (e) => {\r\n resolve(e.payload);\r\n }).catch(reject);\r\n }).catch(reject);\r\n } else {\r\n const manager = WebSocketManager.getInstance();\r\n manager.once<T>(event, resolve);\r\n }\r\n });\r\n}\r\n\r\nexport function usePython() {\r\n const [, isWsConnected] = useWebSocket();\r\n const [isStreamReady, setIsStreamReady] = useState(false);\r\n const [refresh, setRefresh] = useState(0);\r\n useEffect(() => {\r\n if (isTauri) {\r\n setIsStreamReady(true);\r\n return;\r\n }\r\n if (isWsConnected) {\r\n const manager = WebSocketManager.getInstance();\r\n const ws = manager.getWs;\r\n if (ws && ws.readyState === WebSocket.OPEN) {\r\n manager.send({ api: \"stream_ready\" }, 500)\r\n .then(() => {\r\n setIsStreamReady(true);\r\n })\r\n .catch(() => {\r\n setRefresh(prev => (prev + 1) % 2);\r\n });\r\n }\r\n }\r\n }, [isWsConnected, refresh]);\r\n /**\r\n * Send a command to the Python backend\r\n * @param api - The command name (must be registered in Python via @commands.command())\r\n * @param body - Parameters to pass to the command\r\n * @param timeout - Optional timeout for the request in ms\r\n * @returns Promise with the command result or AsyncGenerator for streaming\r\n */\r\n const send = useCallback(async <T = any>(api: string, body: Record<string, unknown> = {}, timeout?: number): Promise<T | AsyncGenerator<T, void, unknown>> => {\r\n const manager = WebSocketManager.getInstance();\r\n const ws = manager.getWs;\r\n // Auto-reroute api/{name} → command \"api\" with { api: \"{name}\", ...body }\r\n if (api.startsWith(\"api/\") && api.split(\"/\").length >= 2) {\r\n const apiPath = api.slice(4); // strip \"api/\"\r\n body = { ...body, api: apiPath };\r\n api = \"api\";\r\n }\r\n try {\r\n if (isTauri) {\r\n // Handle streaming for Tauri\r\n if (body.stream) {\r\n const msgId = (body.id as string) || Math.random().toString(36).substring(7);\r\n const requestBody = { ...body, id: msgId };\r\n const eventName = `chat_stream:${msgId}`;\r\n const { listen } = await import('@tauri-apps/api/event');\r\n let resolveNext: ((value: IteratorResult<T, void>) => void) | null = null;\r\n const queue: T[] = [];\r\n let isDone = false;\r\n let error: any = null;\r\n let rejectNext: ((reason?: any) => void) | null = null;\r\n const unlisten = await listen<any>(eventName, (event) => {\r\n const payload = event.payload;\r\n if (payload.error) {\r\n error = payload.error;\r\n if (rejectNext) {\r\n rejectNext(error);\r\n rejectNext = null;\r\n resolveNext = null;\r\n }\r\n } else if (payload.stream_end) {\r\n isDone = true;\r\n if (resolveNext) {\r\n resolveNext({ value: undefined, done: true });\r\n resolveNext = null;\r\n rejectNext = null;\r\n }\r\n } else if (payload.response) {\r\n if (resolveNext) {\r\n resolveNext({ value: payload.response, done: false });\r\n resolveNext = null;\r\n rejectNext = null;\r\n } else {\r\n queue.push(payload.response);\r\n }\r\n }\r\n });\r\n // Start command\r\n await pyInvoke(\"pytauri_command\", {\r\n command: api,\r\n request: requestBody\r\n });\r\n return (async function* () {\r\n try {\r\n while (true) {\r\n if (queue.length > 0) {\r\n yield queue.shift()!;\r\n continue;\r\n }\r\n if (isDone) return;\r\n if (error) throw error;\r\n const result = await new Promise<IteratorResult<T, void>>((resolve, reject) => {\r\n resolveNext = resolve;\r\n rejectNext = reject;\r\n // Handle race condition where done/error happened while setting up promise\r\n if (isDone) resolve({ value: undefined, done: true });\r\n if (error) reject(error);\r\n });\r\n if (result.done) return;\r\n yield result.value;\r\n }\r\n } finally {\r\n unlisten();\r\n }\r\n })();\r\n }\r\n // Running in Tauri - use pyInvoke\r\n return await pyInvoke<T>(\"pytauri_command\", {\r\n command: api,\r\n request: body\r\n });\r\n } else if (ws && ws.readyState === WebSocket.OPEN) {\r\n // Running in browser with WebSocket connection\r\n try {\r\n return await manager.send<T>({ api, body }, timeout ?? 500);\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n // Fallback to HTTP API\r\n const httpUrl = (api === \"api\" && body.api)\r\n ? `/api/custom/${body.api}`\r\n : `/api/${api}`;\r\n const response : any = await fetch(httpUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(body)\r\n });\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n if (response.body) {\r\n // We return a generator that yields chunks\r\n async function* streamResponse(): AsyncGenerator<T, void, unknown> {\r\n const reader = response.body!.getReader();\r\n const decoder = new TextDecoder();\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n const text = decoder.decode(value, { stream: true });\r\n try {\r\n yield JSON.parse(text) as T;\r\n } catch {\r\n yield text as any as T;\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n if (body.stream) {\r\n return streamResponse();\r\n } else {\r\n return await response.json() as T;\r\n }\r\n }\r\n return await response.json() as T;\r\n } catch (error) {\r\n console.error(`Python command \"${api}\" failed:`, error);\r\n throw error;\r\n }\r\n }, [isStreamReady]);\r\n function encodeMessage(label: string, data: ArrayBufferLike | Blob | ArrayBufferView) {\r\n const labelBytes = new TextEncoder().encode(label);\r\n const header = new Uint8Array([labelBytes.length]);\r\n // Convert data to Uint8Array based on its type\r\n let dataBytes: Uint8Array;\r\n if (data instanceof Blob) {\r\n // Blobs need async handling, so use Blob approach instead\r\n return new Blob([header, labelBytes, data]);\r\n } else if (data instanceof ArrayBuffer) {\r\n dataBytes = new Uint8Array(data);\r\n } else if (ArrayBuffer.isView(data)) {\r\n dataBytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\r\n } else {\r\n throw new Error('Unsupported data type');\r\n }\r\n // Combine: [1 byte: length] [variable: label] [variable: data]\r\n const message = new Uint8Array(1 + labelBytes.length + dataBytes.length);\r\n message.set(header, 0);\r\n message.set(labelBytes, 1);\r\n message.set(dataBytes, 1 + labelBytes.length);\r\n return message;\r\n }\r\n const stream = useCallback(async <T = any>(label: string, data: ArrayBufferLike | Blob | ArrayBufferView) => {\r\n const manager = WebSocketManager.getInstance();\r\n const ws = manager.getWs;\r\n try {\r\n if (isTauri) {\r\n await pyInvoke<T>(\"pytauri_command\", {\r\n command: label,\r\n request: data\r\n });\r\n } else if (ws && ws.readyState === WebSocket.OPEN) {\r\n try {\r\n ws.send(encodeMessage(label, data));\r\n } catch (err) {\r\n // Silently fail for stream data - connection may have closed mid-stream\r\n console.warn(`Stream send failed (connection may have closed): ${err}`);\r\n }\r\n }\r\n // Don't throw if not connected - stream data is fire-and-forget\r\n } catch (error) {\r\n console.error(`Python stream \"${label}\" failed:`, error);\r\n throw error;\r\n }\r\n }, [isStreamReady]);\r\n function isBinaryData(data: unknown): data is ArrayBufferLike | Blob | ArrayBufferView {\r\n return data instanceof ArrayBuffer ||\r\n data instanceof Blob ||\r\n ArrayBuffer.isView(data);\r\n }\r\n const invoke = useCallback(async <T = any>(\r\n label: string,\r\n data?: Record<string, unknown> | ArrayBufferLike | Blob | ArrayBufferView,\r\n timeout?: number\r\n ): Promise<T | void | AsyncGenerator<T, void, unknown>> => {\r\n if (data && isBinaryData(data)) {\r\n await stream(label, data);\r\n } else {\r\n return await send<T>(label, (data ?? {}) as Record<string, unknown>, timeout);\r\n }\r\n }, [send, stream, isStreamReady]);\r\n return {\r\n pyInvoke: invoke,\r\n isStreamReady,\r\n };\r\n}","import type { UseDatabaseReturn } from \"../components/useDatabase/useDatabase\";\r\nimport type { ITab } from \"./state\";\r\nimport type { UseFileReturn } from \"../components/useFile\";\r\nimport type { UseFolderReturn } from \"../components/useFolder\";\r\nimport type { UseGlobalReturn } from \"../components/useGlobal/useGlobal\";\r\nimport type { SettingItem } from \"../components/useSettings\";\r\n\r\nexport interface Model {\r\n id?: string | null;\r\n name?: string | null;\r\n backend?: string;\r\n modelType?: string[];\r\n modelPath?: string;\r\n mmproj?: string | null;\r\n fileName?: string | null;\r\n apiBase?: string | null;\r\n isLoaded?: boolean;\r\n isLocal?: boolean;\r\n lastError?: string | null;\r\n}\r\n\r\nexport function sanitizeTauriEvent(event: string): string {\r\n return event\r\n .replace(/\\\\/g, '/') // backslash → forward slash (allowed)\r\n .replace(/[^a-zA-Z0-9\\-/:_]/g, '_'); // everything else illegal → underscore\r\n}\r\n\r\nexport interface AppInfo {\r\n appname: string;\r\n useWorkspace: () => {\r\n workspace: string;\r\n setWorkspace: (workspace: string) => void;\r\n };\r\n tabId: string;\r\n appId: string;\r\n useActiveTabId: () => string;\r\n useTitle: () => string | null;\r\n setTitle: (title: string) => void;\r\n settings: Record<string, SettingItem>;\r\n useNotchVisible: () => boolean;\r\n useTheme: () => {\r\n theme: string,\r\n layout: string,\r\n };\r\n useTab: () => ITab;\r\n addTab: (tabs: { app: string; data?: Record<string, any> }[] | { app: string; data?: Record<string, any> }, layout?: string) => string[];\r\n closeTab: () => void;\r\n detachTab: () => void;\r\n useTool: () => (tool: string, parameters: Record<string, any>) => Promise<any>;\r\n useTabDatabase: <T>(tb: string, options?: {\r\n initialValue?: T | undefined;\r\n }) => UseDatabaseReturn<T>;\r\n useModel: () => UseDatabaseReturn<Model>;\r\n getAvailableModels: () => Promise<Model[]>;\r\n useGlobal: <T>(name: string, options?: { initialValue?: T }) => UseGlobalReturn<T>;\r\n useFile: (filename: string, options?: {\r\n initialValue?: string;\r\n baseDir?: string;\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n bitrate?: string;\r\n resolution?: string;\r\n fps?: number;\r\n thumbnail?: boolean;\r\n thumb_time?: string;\r\n format?: string;\r\n download?: boolean;\r\n }) => UseFileReturn;\r\n useFolder: (path: string, options?: { baseDir?: string }) => UseFolderReturn;\r\n pyInvoke: <T = any>(\r\n label: string,\r\n data?: Record<string, unknown> | ArrayBufferLike | Blob | ArrayBufferView,\r\n timeout?: number\r\n ) => Promise<T | void | AsyncGenerator<T, void, unknown>>\r\n}\r\n","import { proxy, useSnapshot } from \"valtio\";\r\nimport { type SetStateAction, type Dispatch, useEffect, useState } from \"react\";\r\nimport { usePython } from \"../usePython\";\r\nimport { sanitizeTauriEvent } from \"../../utils/utils\";\r\n\r\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\r\n// ============================================================================\r\n// Type Utilities for useState-like experience\r\n// ============================================================================\r\n/**\r\n * Supported primitive types that can be stored in the database\r\n */\r\ntype Primitive = string | number | boolean | null | undefined;\r\n/**\r\n * Supported data types for useDatabase\r\n */\r\ntype DatabaseValue =\r\n | Primitive\r\n | Primitive[]\r\n | Record<string, unknown>\r\n | unknown[];\r\n/**\r\n * The setter function type - identical to React's useState setter\r\n */\r\ntype DatabaseSetter<T> = Dispatch<SetStateAction<T>>;\r\n/**\r\n * Query utilities returned as the third element\r\n */\r\ninterface DatabaseUtils {\r\n query: (sql: string) => Promise<unknown>;\r\n ready: boolean,\r\n}\r\n/**\r\n * The return type of useDatabase - a tuple like useState\r\n * [data, setData, { query }]\r\n */\r\ntype UseDatabaseReturn<T> = readonly [T, DatabaseSetter<T>, DatabaseUtils];\r\n// ============================================================================\r\n// Internal Wrapper for Primitives\r\n// ============================================================================\r\n\r\nconst PRIMITIVE_KEY = \"__value__\";\r\ninterface PrimitiveWrapper<T> {\r\n [PRIMITIVE_KEY]: T;\r\n}\r\n/**\r\n * Check if a value is a primitive (not object/array)\r\n */\r\n\r\nfunction isPrimitive(value: unknown): value is Primitive {\r\n return value === null ||\r\n value === undefined ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean';\r\n}\r\n/**\r\n * Check if stored data is our primitive wrapper\r\n */\r\n\r\nfunction isWrappedPrimitive<T>(data: unknown): data is PrimitiveWrapper<T> {\r\n return typeof data === 'object' &&\r\n data !== null &&\r\n PRIMITIVE_KEY in data &&\r\n Object.keys(data).length === 1;\r\n}\r\n/**\r\n * Wrap a primitive value for storage\r\n */\r\n\r\nfunction wrapPrimitive<T>(value: T): PrimitiveWrapper<T> {\r\n return { [PRIMITIVE_KEY]: value } as PrimitiveWrapper<T>;\r\n}\r\n/**\r\n * Unwrap a primitive value from storage\r\n */\r\n\r\nfunction unwrapPrimitive<T>(data: PrimitiveWrapper<T>): T {\r\n return data[PRIMITIVE_KEY];\r\n}\r\n// ============================================================================\r\n// Internal Implementation\r\n// ============================================================================\r\ninterface IDatabase {\r\n data: unknown;\r\n setData: (data: SetStateAction<unknown>) => void;\r\n query: (query: string) => Promise<unknown>;\r\n // Track if this database stores a primitive value\r\n _isPrimitive: boolean;\r\n // Track if this database stores an array value\r\n _isArray: boolean;\r\n // Track last modification timestamp\r\n _lastModified: number;\r\n // Track subscription count\r\n _subscriptionCount: number;\r\n}\r\n\r\nconst database = proxy<Record<string, IDatabase>>({});\r\n\r\nconst initialValues = {} as Record<string, any>;\r\n// ============================================================================\r\n// Public API - useState-like Hook\r\n// ============================================================================\r\n/**\r\n * A database-backed state hook with a useState-like API.\r\n * \r\n * @example\r\n * // String value (requires initial value)\r\n * const [name, setName] = useDatabase(\"username\", \"\");\r\n * setName(\"John\");\r\n * \r\n * @example\r\n * // Boolean flag\r\n * const [enabled, setEnabled] = useDatabase(\"settings.enabled\", false);\r\n * setEnabled(true);\r\n * \r\n * @example\r\n * // Number counter\r\n * const [count, setCount] = useDatabase(\"counter\", 0);\r\n * setCount(prev => prev + 1);\r\n * \r\n * @example\r\n * // Simple string array\r\n * const [tags, setTags] = useDatabase<string[]>(\"tags\");\r\n * setTags(prev => [...prev, \"new-tag\"]);\r\n * \r\n * @example\r\n * // Record/Object with typed values\r\n * interface User { name: string; age: number; }\r\n * const [users, setUsers] = useDatabase<Record<string, User>>(\"users\");\r\n * setUsers(prev => ({ ...prev, user1: { name: \"John\", age: 30 } }));\r\n * \r\n * @example\r\n * // With query utility\r\n * const [data, setData, { query }] = useDatabase<Record<string, Item>>(\"items\");\r\n * const results = await query(\"SELECT * FROM items WHERE active = 1\");\r\n * \r\n * @param db - The database table/key name\r\n * @param initialValue - Optional initial value (required for primitives to enable type inference)\r\n * @returns A tuple [data, setData, { query }] similar to useState\r\n */\r\n\r\nexport function useDatabaseImplBase<T = Record<string, unknown>>(databaseName: string, tb: string): UseDatabaseReturn<T>;\r\n/**\r\n * Overload with initial value for type inference (required for primitives)\r\n */\r\n\r\nexport function useDatabaseImplBase<T>(databaseName: string, tb: string, initialValue: T): UseDatabaseReturn<T>;\r\n\r\nexport function useDatabaseImplBase<T = Record<string, unknown>>(\r\n databaseName: string,\r\n tb: string,\r\n initialValue?: T\r\n): UseDatabaseReturn<T> {\r\n const dbKey = `${databaseName}.${tb}`;\r\n const [ready, setReady] = useState(false)\r\n if (!initialValues[dbKey] && typeof initialValue !== \"undefined\") {\r\n initialValues[dbKey] = initialValue;\r\n }\r\n const { pyInvoke, isStreamReady } = usePython();\r\n function deepParseJson(value: unknown): unknown {\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim();\r\n if (\r\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\r\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\r\n ) {\r\n try {\r\n return deepParseJson(JSON.parse(trimmed));\r\n } catch {\r\n return value;\r\n }\r\n }\r\n // Handle quoted/multi-encoded strings like '\"{\\\\\"key\\\\\":\\\\\"val\\\\\"}\"'\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n if (parsed !== value) {\r\n return deepParseJson(parsed);\r\n }\r\n } catch {\r\n // not JSON, return as-is\r\n }\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(deepParseJson);\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return Object.fromEntries(\r\n Object.entries(value as Record<string, unknown>).map(\r\n ([k, v]) => [k, deepParseJson(v)]\r\n )\r\n );\r\n }\r\n return value;\r\n }\r\n async function request(body: any): Promise<any> {\r\n try {\r\n const res = await pyInvoke('sqlite', body);\r\n return deepParseJson(res.data); // ← parsing happens here\r\n } catch (e) {\r\n console.error(\"SQLite request failed\", e);\r\n return null;\r\n }\r\n }\r\n async function refreshTable(databaseName: string, tb: string) {\r\n const rows = await request({ db: databaseName, table: tb, command: 'query', sql: `SELECT * FROM ${tb}` });\r\n if (Array.isArray(rows)) {\r\n const dataMap: Record<string, unknown> = {};\r\n let detectedPrimitive = false;\r\n let primitiveValue: unknown = undefined;\r\n rows.forEach((row: Record<string, unknown>) => {\r\n // Use != null to handle both null and undefined, but allow 0 (falsy but valid)\r\n if (row.id != null) {\r\n const rowId = String(row.id);\r\n const parsedRow = { ...row };\r\n // Check for wrapped value \"_v\"\r\n if (Object.prototype.hasOwnProperty.call(parsedRow, '_v')) {\r\n let val = parsedRow._v;\r\n // Always try JSON.parse on strings the backend serializes all _v values\r\n // as JSON, so \"false\" -> false, \"0\" -> 0, \"\\\"hello\\\"\" -> \"hello\", etc.\r\n if (typeof val === 'string') {\r\n try {\r\n val = JSON.parse(val);\r\n } catch {\r\n // Not valid JSON, keep as-is (raw string)\r\n }\r\n }\r\n // Check if this is our primitive wrapper row (id === \"__value__\")\r\n if (rowId === PRIMITIVE_KEY) {\r\n detectedPrimitive = true;\r\n primitiveValue = val;\r\n } else {\r\n dataMap[rowId] = val;\r\n }\r\n } else {\r\n // Legacy behavior: parse JSON strings in all fields\r\n for (const key in parsedRow) {\r\n const val = parsedRow[key];\r\n if (typeof val === 'string') {\r\n const trimmed = val.trim();\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n try {\r\n const parsed = JSON.parse(val);\r\n if (parsed && typeof parsed === 'object') {\r\n parsedRow[key] = parsed;\r\n }\r\n } catch {\r\n // ignore parse errors\r\n }\r\n }\r\n }\r\n }\r\n dataMap[rowId] = parsedRow;\r\n }\r\n }\r\n });\r\n // If we detected a primitive wrapper row, use primitive mode\r\n if (detectedPrimitive) {\r\n const storedInitialValue = initialValues[`${databaseName}.${tb}`];\r\n let reconciledValue = primitiveValue;\r\n // Reconcile primitive type if needed\r\n if (typeof storedInitialValue === 'boolean' && typeof reconciledValue === 'number') {\r\n reconciledValue = reconciledValue !== 0;\r\n }\r\n const newData = wrapPrimitive(reconciledValue);\r\n if (!deepEqual(database[`${databaseName}.${tb}`].data, newData)) {\r\n database[`${databaseName}.${tb}`]._isPrimitive = true;\r\n database[`${databaseName}.${tb}`]._isArray = false;\r\n database[`${databaseName}.${tb}`].data = newData;\r\n }\r\n } else {\r\n // Check if this should be reconstructed as an array\r\n // An array has sequential numeric keys starting from 0\r\n const keys = Object.keys(dataMap);\r\n const sortedKeys = [...keys].sort((a, b) => parseInt(a) - parseInt(b));\r\n const isArrayLike = keys.length > 0 && sortedKeys.every((key, index) => key === String(index));\r\n const storedInitialValue = initialValues[`${databaseName}.${tb}`];\r\n const wasInitiallyArray = Array.isArray(storedInitialValue);\r\n const reconcileTypes = (data: Record<string, unknown>, schema: Record<string, unknown>): Record<string, unknown> => {\r\n const result: Record<string, unknown> = { ...data };\r\n for (const key in schema) {\r\n const schemaVal = schema[key];\r\n const dataVal = result[key];\r\n if (typeof schemaVal === 'boolean') {\r\n if (typeof dataVal === 'number') {\r\n result[key] = dataVal !== 0;\r\n } else if (typeof dataVal === 'string') {\r\n if (dataVal.toLowerCase() === 'true' || dataVal === '1') result[key] = true;\r\n if (dataVal.toLowerCase() === 'false' || dataVal === '0') result[key] = false;\r\n }\r\n } else if (typeof schemaVal === 'number' && typeof dataVal === 'string') {\r\n const num = Number(dataVal);\r\n if (!isNaN(num)) result[key] = num;\r\n }\r\n }\r\n return result;\r\n };\r\n let finalData: unknown;\r\n if (keys.length === 0 && typeof storedInitialValue !== \"undefined\") {\r\n finalData = storedInitialValue;\r\n database[`${databaseName}.${tb}`]._isArray = wasInitiallyArray;\r\n database[`${databaseName}.${tb}`]._isPrimitive = typeof storedInitialValue !== 'object' && storedInitialValue !== null;\r\n } else if (isArrayLike && wasInitiallyArray) {\r\n // Reconstruct as array, sorted by index\r\n finalData = sortedKeys.map(key => dataMap[key]);\r\n database[`${databaseName}.${tb}`]._isArray = true;\r\n } else if (keys.length === 0 && wasInitiallyArray) {\r\n // Empty result but initial was array - return empty array\r\n finalData = [];\r\n database[`${databaseName}.${tb}`]._isArray = true;\r\n } else {\r\n // Apply type reconciliation using initialValue as schema\r\n finalData = (storedInitialValue && typeof storedInitialValue === 'object' && !Array.isArray(storedInitialValue))\r\n ? reconcileTypes(dataMap, storedInitialValue as Record<string, unknown>)\r\n : dataMap;\r\n database[`${databaseName}.${tb}`]._isArray = false;\r\n }\r\n if (!deepEqual(database[`${databaseName}.${tb}`].data, finalData)) {\r\n // Only update if we have data OR if the state was already initialized\r\n // This prevents clearing the initialValue when the table is empty on first load\r\n if (rows.length > 0 || typeof database[`${databaseName}.${tb}`].data !== \"undefined\") {\r\n database[`${databaseName}.${tb}`]._isPrimitive = false;\r\n database[`${databaseName}.${tb}`].data = finalData;\r\n if(!ready) setReady(true)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n function deepEqual(obj1: any, obj2: any): boolean {\r\n if (obj1 === obj2) return true;\r\n if (typeof obj1 !== 'object' || obj1 === null || obj2 === null || typeof obj2 !== 'object') {\r\n return false;\r\n }\r\n if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;\r\n if (Array.isArray(obj1)) {\r\n if (obj1.length !== obj2.length) return false;\r\n for (let i = 0; i < obj1.length; i++) {\r\n if (!deepEqual(obj1[i], obj2[i])) return false;\r\n }\r\n return true;\r\n }\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n if (keys1.length !== keys2.length) return false;\r\n for (const key of keys1) {\r\n if (!Object.prototype.hasOwnProperty.call(obj2, key)) return false;\r\n if (!deepEqual(obj1[key], obj2[key])) return false;\r\n }\r\n return true;\r\n }\r\n function setData(data: SetStateAction<unknown>) {\r\n const db = database[`${databaseName}.${tb}`];\r\n const sync = async (obj: object) => {\r\n db._lastModified = Date.now() + 500;\r\n await request({ db: databaseName, table: tb, command: 'sync_table', data: obj });\r\n };\r\n const processDataForSync = (inputData: unknown): Record<string, unknown> => {\r\n const payload: Record<string, unknown> = {};\r\n // Check if we need to enforce primitive wrapping for consistency\r\n // If ANY value is a primitive/array, we must wrap ALL values to ensure consistent schema (id, _v)\r\n const values = Array.isArray(inputData)\r\n ? inputData\r\n : Object.values(inputData as object || {});\r\n const hasPrimitive = values.some(val =>\r\n typeof val !== 'object' || val === null || Array.isArray(val)\r\n );\r\n if (Array.isArray(inputData)) {\r\n // For arrays, use numeric indices as keys\r\n [...inputData].forEach((val, index) => {\r\n if (hasPrimitive || typeof val !== 'object' || val === null || Array.isArray(val)) {\r\n payload[String(index)] = { _v: val };\r\n } else {\r\n // Only safe to unwrap if ALL items are objects\r\n payload[String(index)] = val;\r\n }\r\n });\r\n } else if (typeof inputData === 'object' && inputData !== null) {\r\n for (const key in { ...inputData } as Record<string, unknown>) {\r\n const val = ({ ...inputData } as Record<string, unknown>)[key];\r\n if (hasPrimitive || typeof val !== 'object' || val === null || Array.isArray(val)) {\r\n payload[key] = { _v: val };\r\n } else {\r\n // Only safe to unwrap if ALL items are objects\r\n payload[key] = val;\r\n }\r\n }\r\n }\r\n return payload;\r\n };\r\n let newUserData: unknown;\r\n // Get the current user-facing value (unwrapped if primitive)\r\n const currentUserData = db._isPrimitive && isWrappedPrimitive(db.data)\r\n ? unwrapPrimitive(db.data)\r\n : db.data;\r\n const dbKey = `${databaseName}.${tb}`;\r\n const effectivePrevState = typeof currentUserData !== \"undefined\" ? currentUserData : (initialValues[dbKey] || undefined);\r\n if (typeof data === \"function\") {\r\n newUserData = (data as (prevState: unknown) => unknown)(effectivePrevState);\r\n } else {\r\n newUserData = data;\r\n }\r\n // Determine new internal data\r\n let newInternalData: unknown;\r\n // Check if the new value is primitive\r\n if (isPrimitive(newUserData)) {\r\n // Mark as primitive mode and wrap\r\n db._isPrimitive = true;\r\n db._isArray = false;\r\n newInternalData = wrapPrimitive(newUserData);\r\n } else if (Array.isArray(newUserData)) {\r\n // Mark as array mode\r\n db._isPrimitive = false;\r\n db._isArray = true;\r\n newInternalData = newUserData;\r\n } else {\r\n // Not primitive - store directly\r\n db._isPrimitive = false;\r\n db._isArray = false;\r\n newInternalData = newUserData;\r\n }\r\n // Update local state immediately\r\n db.data = newInternalData;\r\n // Sync to DB if it's an object/map or array (which includes wrapped primitives)\r\n if (typeof newInternalData === \"object\" && newInternalData !== null) {\r\n const syncPayload = processDataForSync(newInternalData);\r\n sync(syncPayload).catch(e => console.error(\"Sync failed\", e));\r\n }\r\n }\r\n function createDatabase<T>(databaseName: string, tb: string, initialValue?: T): void {\r\n const primitiveMode = initialValue !== undefined && isPrimitive(initialValue);\r\n const arrayMode = Array.isArray(initialValue);\r\n database[`${databaseName}.${tb}`] = {\r\n data: undefined,\r\n _isPrimitive: primitiveMode,\r\n _isArray: arrayMode,\r\n _lastModified: Date.now(),\r\n _subscriptionCount: 0,\r\n query: async (sql: string) => {\r\n const result = await request({ db: databaseName, command: \"query\", sql });\r\n // If the query is a modifying command, refresh the table data\r\n const command = sql.trim().split(/\\s+/)[0].toUpperCase();\r\n if (['INSERT', 'UPDATE', 'DELETE', 'REPLACE', 'CREATE', 'DROP', 'ALTER'].includes(command)) {\r\n await refreshTable(databaseName, tb);\r\n }\r\n return result;\r\n },\r\n setData: setData,\r\n };\r\n // Fetch existing data from database\r\n (async () => {\r\n await refreshTable(databaseName, tb);\r\n // If no data exists in DB, set the initial value locally WITHOUT syncing to DB\r\n // This prevents clearing existing data on first load\r\n if (typeof database[`${databaseName}.${tb}`].data === \"undefined\" && typeof initialValue !== \"undefined\") {\r\n const db = database[`${databaseName}.${tb}`];\r\n // Set initial data locally without syncing to database\r\n if (isPrimitive(initialValue)) {\r\n db._isPrimitive = true;\r\n db._isArray = false;\r\n db.data = wrapPrimitive(initialValue);\r\n } else if (Array.isArray(initialValue)) {\r\n db._isPrimitive = false;\r\n db._isArray = true;\r\n db.data = initialValue;\r\n } else {\r\n db._isPrimitive = false;\r\n db._isArray = false;\r\n db.data = initialValue;\r\n }\r\n // Note: We intentionally do NOT sync here - the table doesn't exist yet\r\n // or has no data. We only sync when the user explicitly changes the data.\r\n }\r\n })();\r\n }\r\n if (!database[dbKey]) {\r\n createDatabase<T>(databaseName, tb, initialValue);\r\n }\r\n // Subscribe to database change events works in both WebSocket and Tauri modes\r\n useEffect(() => {\r\n const db = database[dbKey];\r\n if (!isStreamReady || !db) return;\r\n // Tauri: store the unlisten function\r\n let tauriUnlisten: (() => void) | undefined;\r\n const eventName = `db_changed:${databaseName}.${tb}`;\r\n db._subscriptionCount++;\r\n if (db._subscriptionCount >= 1) {\r\n pyInvoke('db_subscribe', { db: databaseName, table: tb }).then(() => {\r\n refreshTable(databaseName, tb);\r\n }).catch(() => {});\r\n }\r\n // WebSocket mode: event arrives as window CustomEvent with {detail: {response: {timestamp}}}\r\n const handleDbChangeWS = (event: Event) => {\r\n const customEvent = event as CustomEvent<{ response: { timestamp: number } }>;\r\n let timestamp: number;\r\n if (customEvent.detail.response && typeof customEvent.detail.response.timestamp === 'number') {\r\n timestamp = customEvent.detail.response.timestamp;\r\n } else if ('timestamp' in customEvent.detail) {\r\n // @ts-ignore\r\n timestamp = customEvent.detail.timestamp;\r\n } else {\r\n return;\r\n }\r\n const currentDb = database[dbKey];\r\n if (currentDb && timestamp > currentDb._lastModified) {\r\n currentDb._lastModified = timestamp;\r\n refreshTable(databaseName, tb);\r\n }\r\n };\r\n // Tauri mode: event payload arrives directly as {timestamp}\r\n const handleDbChangeTauri = (data: { timestamp: number }) => {\r\n const { timestamp } = data;\r\n const currentDb = database[dbKey];\r\n if (currentDb && timestamp > currentDb._lastModified) {\r\n currentDb._lastModified = timestamp;\r\n refreshTable(databaseName, tb);\r\n }\r\n };\r\n if (isTauri) {\r\n import(\"@tauri-apps/api/event\").then(({ listen }) => {\r\n listen<{ timestamp: number }>(sanitizeTauriEvent(eventName), (e) => handleDbChangeTauri(e.payload))\r\n .then((fn) => { tauriUnlisten = fn; })\r\n .catch(() => {});\r\n });\r\n } else {\r\n window.addEventListener(eventName, handleDbChangeWS);\r\n }\r\n return () => {\r\n if (isStreamReady) {\r\n if (isTauri) {\r\n tauriUnlisten?.();\r\n } else {\r\n window.removeEventListener(eventName, handleDbChangeWS);\r\n }\r\n const currentDb = database[dbKey];\r\n if (currentDb) {\r\n currentDb._subscriptionCount--;\r\n if (currentDb._subscriptionCount === 0) {\r\n pyInvoke('db_unsubscribe', { db: databaseName, table: tb }).catch(() => {});\r\n }\r\n }\r\n }\r\n };\r\n }, [databaseName, tb, dbKey, isStreamReady]);\r\n const snap = useSnapshot(database[dbKey]);\r\n // Bridge: unwrap primitive values for seamless user experience\r\n const userData = snap._isPrimitive && isWrappedPrimitive<T>(snap.data)\r\n ? unwrapPrimitive<T>(snap.data)\r\n : snap.data as T;\r\n // Bridge: the setter already handles wrapping internally\r\n const setUserData = snap.setData as DatabaseSetter<T>;\r\n return [\r\n userData ?? initialValues[dbKey] as T ?? initialValue as T,\r\n setUserData,\r\n {\r\n query: snap.query,\r\n ready: isStreamReady && ready\r\n }\r\n ] as const;\r\n}\r\n// ============================================================================\r\n// Type Exports for Advanced Usage\r\n// ============================================================================\r\n\r\nexport type {\r\n DatabaseValue,\r\n DatabaseSetter,\r\n DatabaseUtils,\r\n UseDatabaseReturn,\r\n Primitive\r\n};","import { useDatabaseImplBase, type UseDatabaseReturn } from \"./useDatabase\";\r\nimport { useSnapshot } from \"valtio\";\r\nimport { Workspace } from \"../../utils/state\";\r\n\r\nexport function useDatabaseImpl<T>(\r\n tb: string,\r\n options?: { initialValue?: T }\r\n): UseDatabaseReturn<T> {\r\n const initialValue = options?.initialValue;\r\n const { workspace } = useSnapshot(Workspace);\r\n const dbName = workspace || \"global\";\r\n return (initialValue !== undefined)\r\n ? useDatabaseImplBase<T>(dbName, tb, initialValue)\r\n : useDatabaseImplBase<T>(dbName, tb);\r\n}\r\n\r\nexport type { UseDatabaseReturn };\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { usePython } from \"../usePython\";\r\n\r\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface SettingItem {\r\n key: string;\r\n value: any;\r\n type: \"string\" | \"int\" | \"float\" | \"boolean\" | \"array\";\r\n source: string;\r\n section: string;\r\n default_value: any;\r\n updated_at: string;\r\n}\r\n\r\nexport interface UseSettingsReturn {\r\n settings: Record<string, SettingItem>;\r\n sources: string[];\r\n loading: boolean;\r\n updateSetting: (key: string, value: any) => Promise<boolean>;\r\n resetSetting: (key: string) => Promise<boolean>;\r\n refresh: () => Promise<void>;\r\n}\r\n// ============================================================================\r\n// Hook\r\n// ============================================================================\r\n/**\r\n * Hook for accessing and editing settings from the backend.\r\n * Returns all settings across all sources for the current workspace.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { settings, sources, updateSetting, resetSetting } = useSettings();\r\n * ```\r\n */\r\n\r\nexport function useSettings(): UseSettingsReturn {\r\n const { pyInvoke, isStreamReady } = usePython();\r\n const [settings, setSettings] = useState<Record<string, SettingItem>>({});\r\n const [sources, setSources] = useState<string[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const mountedRef = useRef(true);\r\n const fetchSettings = useCallback(async () => {\r\n if (!isStreamReady) return;\r\n setLoading(true);\r\n try {\r\n // Fetch all settings\r\n const res: any = await pyInvoke(\"settings/get_all\");\r\n if (mountedRef.current && res?.settings) {\r\n const items = res.settings as SettingItem[];\r\n const record: Record<string, SettingItem> = {};\r\n // Backend returns items sorted by source, section, key\r\n // \"First one wins\" for short names\r\n items.forEach(item => {\r\n const fullKey = item.key;\r\n // 1. Full Key (Primary) - e.g. \"Others/app_settings/string.pipeline\"\r\n record[fullKey] = item;\r\n });\r\n setSettings(record);\r\n }\r\n // Fetch sources\r\n const srcRes: any = await pyInvoke(\"settings/sources\");\r\n if (mountedRef.current && srcRes?.sources) {\r\n setSources(srcRes.sources);\r\n }\r\n } catch (err) {\r\n console.error(\"Failed to fetch settings:\", err);\r\n } finally {\r\n if (mountedRef.current) setLoading(false);\r\n }\r\n }, [isStreamReady, pyInvoke]);\r\n useEffect(() => {\r\n mountedRef.current = true;\r\n fetchSettings();\r\n return () => {\r\n mountedRef.current = false;\r\n };\r\n }, [fetchSettings]);\r\n // Real-time subscription works in both WebSocket and Tauri modes\r\n useEffect(() => {\r\n if (!isStreamReady) return;\r\n pyInvoke(\"settings/subscribe\").catch(console.error);\r\n const eventName = \"settings_changed\";\r\n let tauriUnlisten: (() => void) | undefined;\r\n const handleSettingsChange = () => {\r\n fetchSettings();\r\n };\r\n if (isTauri) {\r\n // Tauri: listen via @tauri-apps/api/event; payload is ignored (we just re-fetch)\r\n import(\"@tauri-apps/api/event\").then(({ listen }) => {\r\n listen(eventName, () => fetchSettings())\r\n .then((fn) => { tauriUnlisten = fn; })\r\n .catch(console.error);\r\n });\r\n } else {\r\n // WebSocket: event arrives as a window CustomEvent\r\n window.addEventListener(eventName, handleSettingsChange);\r\n }\r\n return () => {\r\n if (isTauri) {\r\n tauriUnlisten?.();\r\n } else {\r\n window.removeEventListener(eventName, handleSettingsChange);\r\n }\r\n pyInvoke(\"settings/unsubscribe\").catch(console.error);\r\n };\r\n }, [isStreamReady, pyInvoke, fetchSettings]);\r\n const updateSetting = useCallback(\r\n async (aliasedKey: string, value: any): Promise<boolean> => {\r\n const actualKey = settings[aliasedKey]?.key || aliasedKey;\r\n try {\r\n const res: any = await pyInvoke(\"settings/set\", { key: actualKey, value });\r\n if (res?.success) {\r\n // Optimistic local update for all aliases pointing to this setting\r\n setSettings((prev) => {\r\n if (!prev[actualKey]) return prev;\r\n const next = { ...prev };\r\n const updatedItem = { ...prev[actualKey], value };\r\n Object.keys(prev).forEach(k => {\r\n if (prev[k].key === actualKey) {\r\n next[k] = updatedItem;\r\n }\r\n });\r\n return next;\r\n });\r\n return true;\r\n }\r\n return false;\r\n } catch (err) {\r\n console.error(\"Failed to update setting:\", err);\r\n return false;\r\n }\r\n },\r\n [pyInvoke, settings]\r\n );\r\n const resetSetting = useCallback(\r\n async (aliasedKey: string): Promise<boolean> => {\r\n const actualKey = settings[aliasedKey]?.key || aliasedKey;\r\n try {\r\n const res: any = await pyInvoke(\"settings/reset\", { key: actualKey });\r\n if (res?.success) {\r\n // Refresh to get the default value from backend\r\n await fetchSettings();\r\n return true;\r\n }\r\n return false;\r\n } catch (err) {\r\n console.error(\"Failed to reset setting:\", err);\r\n return false;\r\n }\r\n },\r\n [pyInvoke, fetchSettings, settings]\r\n );\r\n return {\r\n settings,\r\n sources,\r\n loading,\r\n updateSetting,\r\n resetSetting,\r\n refresh: fetchSettings,\r\n };\r\n}","import { useState, useEffect, useCallback, useRef, memo } from \"react\";\nimport { Trash2 } from \"lucide-react\";\nimport { Checkbox } from \"./ui/checkbox\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { Table, TableBody, TableCell, TableRow } from \"./ui/table\";\nimport { usePython } from \"./usePython\";\nimport { formatTaskTime, LucideIcons, addTab } from \"../utils/state\";\nimport { Spinner } from \"./ui/spinner\";\nimport clsx from \"clsx\";\n\n\nconst TabIcon = memo(({ iconVal }: { iconVal: string | undefined }) => {\n if (\n typeof iconVal === \"string\" &&\n (iconVal.startsWith(\"/\") ||\n iconVal.startsWith(\"http\") ||\n /\\.(png|jpg|jpeg|ico|svg|webp)$/i.test(iconVal))\n ) {\n return <img src={iconVal} className=\"w-8 h-8 object-contain rounded-sm\" alt=\"\" />;\n }\n const Icon = (LucideIcons as any)[iconVal as string] || LucideIcons.Compass;\n return <Icon className=\"w-4 h-4\" />;\n});\n\nconst TabRow = memo((\n { tab, isSelected, onToggle, onOpen, onDelete }: {\n tab: any;\n isSelected: boolean;\n onToggle: (id: string) => void;\n onOpen: (id: string) => void;\n onDelete: (id: string) => void;\n }\n) => {\n const handleToggle = useCallback(() => onToggle(tab.id), [tab.id, onToggle]);\n const handleOpen = useCallback(() => onOpen(tab.id), [tab.id, onOpen]);\n const handleDelete = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n onDelete(tab.id);\n }, [tab.id, onDelete]);\n return (\n <TableRow className=\"border-accent/5 hover:bg-accent/5 transition-colors cursor-pointer h-12 group\">\n <TableCell className=\"w-10 cursor-default\" onClick={e => e.stopPropagation()}>\n <Checkbox checked={isSelected} onCheckedChange={handleToggle} />\n </TableCell>\n <TableCell onClick={handleOpen} className=\"w-8 text-xs text-muted-foreground\">\n <TabIcon iconVal={tab.iconOverride} />\n </TableCell>\n <TableCell onClick={handleOpen} className=\"max-w-[200px] truncate font-medium\">\n {tab.title || \"Untitled Tab\"}\n </TableCell>\n <TableCell onClick={handleOpen} className=\"text-[11px] text-muted-foreground whitespace-nowrap flex justify-end items-center gap-2 pr-4 h-12\">\n <span className=\"opacity-60\">{formatTaskTime(tab.timestamp)}</span>\n <Trash2\n className=\"w-4 h-4 hover:text-destructive cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={handleDelete}\n />\n </TableCell>\n </TableRow>\n );\n});\n \n\nexport default function SearchTab({\n workspace, isOpen, setOpen, query\n}: {\n workspace?: string | null;\n isOpen: boolean;\n setOpen: (open: boolean) => void;\n query: string;\n}) {\n const { pyInvoke } = usePython();\n const [tabs, setTabs] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n // Refs live values readable from async callbacks without stale closures\n const pageRef = useRef(0);\n const hasMoreRef = useRef(true);\n const loadingRef = useRef(false);\n const tabsRef = useRef<any[]>([]);\n const queryRef = useRef(query);\n const sentinelRef = useRef<HTMLDivElement>(null);\n // Prevents the IntersectionObserver from firing before the first page is loaded\n const initializedRef = useRef(false);\n // Keep refs in sync with latest render values\n tabsRef.current = tabs;\n queryRef.current = query;\n const setLoadingBoth = (val: boolean) => {\n loadingRef.current = val;\n setLoading(val);\n };\n // Core fetch (no stale-closure risk; reads from refs) \n const loadTabs = useCallback(async (pageNum: number, reset: boolean) => {\n if (loadingRef.current) return;\n setLoadingBoth(true);\n // Lock the observer out during a reset so it can't race the initial fetch\n if (reset) initializedRef.current = false;\n try {\n const db = workspace ?? \"global\";\n const limit = 50;\n const offset = pageNum * limit;\n const q = queryRef.current;\n const searchClause = q ? \"WHERE metadata LIKE ?\" : \"\";\n const res = await pyInvoke(\"sqlite\", {\n db,\n command: \"query\",\n sql: `SELECT id, metadata FROM tab_metadata ${searchClause} ORDER BY rowid DESC LIMIT ${limit} OFFSET ${offset}`,\n params: q ? [`%${q}%`] : []\n });\n const rows: any[] = res?.data ?? (Array.isArray(res) ? res : []);\n if (!Array.isArray(rows)) return;\n hasMoreRef.current = rows.length === limit;\n const parsed = rows.map((row: any) => {\n try { return { id: row.id, ...JSON.parse(row.metadata) }; }\n catch { return { id: row.id, title: \"Unknown\" }; }\n });\n setTabs(prev => reset ? parsed : [...prev, ...parsed]);\n // Unlock the observer only after the first page has settled\n if (reset) initializedRef.current = true;\n } catch (e) {\n console.error(e);\n } finally {\n setLoadingBoth(false);\n }\n }, [workspace, pyInvoke]);\n // Debounced reset on query / open change \n useEffect(() => {\n if (!isOpen) return;\n const timer = setTimeout(() => {\n pageRef.current = 0;\n hasMoreRef.current = true;\n loadTabs(0, true);\n }, 300);\n return () => clearTimeout(timer);\n }, [isOpen, query, loadTabs]);\n // IntersectionObserver sentinel fires the instant the bottom div enters view\n // Far more reliable than scroll events: works inside any overflow container,\n // no stale closures, no throttle hacks needed.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting && !loadingRef.current && hasMoreRef.current && initializedRef.current) {\n pageRef.current += 1;\n loadTabs(pageRef.current, false);\n }\n },\n { threshold: 0 }\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [loadTabs]);\n // Selection helpers \n const toggleSelect = useCallback((id: string) => {\n setSelectedIds(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n }, []);\n const toggleSelectAll = useCallback(() => {\n setSelectedIds(prev =>\n prev.size === tabsRef.current.length && tabsRef.current.length > 0\n ? new Set()\n : new Set(tabsRef.current.map((t: any) => t.id))\n );\n }, []);\n // Delete \n const handleDelete = useCallback(async (id?: string) => {\n const ids = id ? [id] : Array.from(selectedIds);\n if (ids.length === 0) return;\n try {\n const db = workspace ?? \"global\";\n const placeholders = ids.map(() => \"?\").join(\",\");\n await pyInvoke(\"sqlite\", {\n db,\n command: \"execute\",\n sql: `DELETE FROM tab_metadata WHERE id IN (${placeholders})`,\n params: ids\n });\n setSelectedIds(prev => {\n const next = new Set(prev);\n ids.forEach(i => next.delete(i));\n return next;\n });\n pageRef.current = 0;\n hasMoreRef.current = true;\n loadTabs(0, true);\n } catch (e) {\n console.error(e);\n }\n }, [selectedIds, workspace, pyInvoke, loadTabs]);\n // Open selected / open single \n const openTab = (id: string) => {\n const tab = tabsRef.current.find((t: any) => t.id === id);\n if (tab) addTab({ uuid: id, title: tab.title, layout: tab.layout, iconOverride: tab.iconOverride, group: tab.group, childrenProps: tab.childrenProps, size: tab.size });\n };\n const handleOpen = useCallback(() => {\n if (selectedIds.size === 0) return;\n selectedIds.forEach(id => openTab(id));\n setOpen(false);\n }, [selectedIds, setOpen]);\n const handleOpenId = useCallback((id: string) => {\n openTab(id);\n setOpen(false);\n }, [setOpen]);\n const handleDeleteRow = useCallback((id: string) => handleDelete(id), [handleDelete]);\n const handleDeleteSelected = useCallback(() => handleDelete(), [handleDelete]);\n // Render \n const allSelected = tabs.length > 0 && selectedIds.size === tabs.length;\n const isEmpty = tabs.length === 0;\n return (\n <>\n <div className=\"flex justify-center items-center w-[97.5%] mx-auto px-2\">\n <div className=\"w-6\">\n <Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} />\n </div>\n <div className=\"flex-1\" />\n </div>\n <ScrollArea\n className=\"flex-1 -mx-6 w-[97.5%] mx-auto border-t border-b border-[hsl(var(--chat-border))]\"\n >\n <Table>\n <TableBody>\n {isEmpty ? (\n <TableRow>\n <TableCell colSpan={4} className=\"h-12 text-center text-muted-foreground text-xs\">\n <div className=\"flex items-center justify-center gap-2\">\n {loading\n ? <><Spinner /><span>Searching...</span></>\n : <>No results</>}\n </div>\n </TableCell>\n </TableRow>\n ) : (\n tabs.map(tab => (\n <TabRow\n key={tab.id}\n tab={tab}\n isSelected={selectedIds.has(tab.id)}\n onToggle={toggleSelect}\n onOpen={handleOpenId}\n onDelete={handleDeleteRow}\n />\n ))\n )}\n </TableBody>\n </Table>\n {/* Sentinel: IntersectionObserver watches this triggers next-page load */}\n <div ref={sentinelRef} className=\"h-px\" />\n {/* Bottom loading indicator for subsequent pages */}\n {loading && tabs.length > 0 && (\n <div className=\"flex justify-center items-center gap-2 py-3 text-xs text-muted-foreground\">\n <Spinner />\n <span>Loading more...</span>\n </div>\n )}\n </ScrollArea>\n <div className={clsx(\n selectedIds.size > 0 ? \"flex justify-center items-center \" : \"hidden\",\n \"relative transform translate-y-[-6px] px-4\"\n )}>\n <span>{selectedIds.size} Selected</span>\n <div className=\"flex-1 flex justify-end gap-2\">\n <button onClick={handleOpen} className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20\">Open</button>\n <button onClick={handleDeleteSelected} className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20\">Delete</button>\n </div>\n </div>\n </>\n );\n}","import { ScrollArea } from \"./ui/scroll-area\";\r\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"./ui/table\";\r\nimport { Checkbox } from \"./ui/checkbox\";\r\nimport { useMemo } from \"react\";\r\nimport { Button } from \"./ui/button\";\r\n\r\nexport default function SettingsMenu() {\r\n const configText = \"{}\"\r\n const config = useMemo(() => {\r\n try {\r\n return JSON.parse(configText);\r\n } catch (e) {\r\n return { models: {}, available_models: {} };\r\n }\r\n }, [configText]);\r\n const availableModels = useMemo(() => {\r\n const models = config.available_models || {};\r\n return Object.values(models).sort((a: any, b: any) => (a.name || \"\").localeCompare(b.name || \"\"));\r\n }, [config]);\r\n const toggleModel = (_model: any) => {\r\n };\r\n return (\r\n <ScrollArea className=\"flex-1\">\r\n <div className=\"flex px-6 pb-3\">\r\n <div className=\"flex justify-center items-end w-12 text-center px-2\">\r\n <Checkbox />\r\n </div>\r\n <span className=\"flex-1 text-accent\">Model</span>\r\n <span className=\"text-right text-accent\">Provider</span>\r\n </div>\r\n <ScrollArea className=\"px-6 border-t h-75 border-[hsl(var(--chat-border))]\">\r\n <Table>\r\n <TableHeader className=\"hidden\">\r\n <TableRow className=\"hover:bg-transparent border-accent/10\">\r\n <TableHead className=\"w-12 text-accent/70 px-2 text-center\">\r\n {/* Header checkbox could be \"Select All\" if needed */}\r\n </TableHead>\r\n <TableHead className=\"text-accent/70 font-funnel uppercase text-[10px] tracking-wider\">Model Name</TableHead>\r\n <TableHead className=\"text-accent/70 font-funnel uppercase text-[10px] tracking-wider\">Provider</TableHead>\r\n </TableRow>\r\n </TableHeader>\r\n <TableBody>\r\n {availableModels.length === 0 ? (\r\n <TableRow>\r\n <TableCell colSpan={3} className=\"h-24 text-center text-muted-foreground font-funnel text-sm\">\r\n No models available in config.json\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n availableModels.map((model: any) => (\r\n <TableRow\r\n key={model.id}\r\n className=\"border-accent/5 hover:bg-accent/5 transition-colors cursor-pointer h-11\"\r\n onClick={() => toggleModel(model)}\r\n >\r\n <TableCell className=\"w-12 text-center px-2\" onClick={(e) => e.stopPropagation()}>\r\n <div className=\"flex justify-center\">\r\n <Checkbox\r\n onCheckedChange={() => toggleModel(model)}\r\n />\r\n </div>\r\n </TableCell>\r\n <TableCell className=\"font-medium text-sm\">\r\n <div className=\"flex flex-col\">\r\n <span>{model.name}</span>\r\n <span className=\"text-[10px] text-muted-foreground truncate max-w-[200px]\" title={model.id}>\r\n {model.id}\r\n </span>\r\n </div>\r\n </TableCell>\r\n <TableCell className=\"text-xs text-right text-muted-foreground\">\r\n {model.provider || \"Unknown\"}\r\n </TableCell>\r\n </TableRow>\r\n ))\r\n )}\r\n </TableBody>\r\n </Table>\r\n </ScrollArea>\r\n <div className=\"w-full flex justify-end py-2\">\r\n <Button>\r\n Add Models\r\n </Button>\r\n </div>\r\n </ScrollArea>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, memo, useRef } from \"react\";\r\nimport { Trash2, Plus, Eye, EyeOff, ChevronDown, KeyRound, CheckCircle2, AlertCircle, Search, X, Copy } from \"lucide-react\";\r\nimport { Checkbox } from \"./ui/checkbox\";\r\nimport { ScrollArea } from \"./ui/scroll-area\";\r\nimport { Table, TableBody, TableCell, TableRow } from \"./ui/table\";\r\nimport { usePython } from \"./usePython\";\r\nimport { Spinner } from \"./ui/spinner\";\r\nimport clsx from \"clsx\";\r\n\r\nconst PROVIDER_KEYS: Record<string, string[]> = {\r\n \"openai\": [\"OPENAI_API_KEY\"],\r\n \"anthropic\": [\"ANTHROPIC_API_KEY\"],\r\n \"gemini\": [\"GEMINI_API_KEY\"],\r\n \"groq\": [\"GROQ_API_KEY\"],\r\n \"mistral\": [\"MISTRAL_API_KEY\"],\r\n \"cohere\": [\"COHERE_API_KEY\"],\r\n \"openrouter\": [\"OPENROUTER_API_KEY\"],\r\n \"xai\": [\"XAI_API_KEY\"],\r\n \"deepseek\": [\"DEEPSEEK_API_KEY\"],\r\n \"perplexity\": [\"PERPLEXITYAI_API_KEY\"],\r\n \"azure\": [\"AZURE_API_KEY\", \"AZURE_AD_TOKEN\"],\r\n \"vertex_ai\": [\"GOOGLE_APPLICATION_CREDENTIALS\", \"VERTEX_AI_PROJECT\", \"VERTEX_AI_LOCATION\"],\r\n \"bedrock\": [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\", \"AWS_REGION\"],\r\n \"aws\": [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\", \"AWS_REGION\"],\r\n \"huggingface\": [\"HUGGINGFACE_API_KEY\"],\r\n \"together_ai\": [\"TOGETHERAI_API_KEY\"],\r\n \"replicate\": [\"REPLICATE_API_KEY\"],\r\n \"fireworks_ai\": [\"FIREWORKSAI_API_KEY\"],\r\n \"cerebras\": [\"CEREBRAS_API_KEY\"],\r\n \"ai21\": [\"AI21_API_KEY\"],\r\n \"aleph_alpha\": [\"ALEPHALPHA_API_KEY\"],\r\n \"anyscale\": [\"ANYSCALE_API_KEY\"],\r\n \"baseten\": [\"BASETEN_API_KEY\"],\r\n \"black_forest_labs\": [\"BLACK_FOREST_LABS_API_KEY\"],\r\n \"bytez\": [\"BYTEZ_API_KEY\"],\r\n \"chutes\": [\"CHUTES_API_KEY\"],\r\n \"clarifai\": [\"CLARIFAI_API_KEY\"],\r\n \"cloudflare\": [\"CLOUDFLARE_API_KEY\", \"CLOUDFLARE_ACCOUNT_ID\"],\r\n \"codestral\": [\"CODESTRAL_API_KEY\"],\r\n \"cometapi\": [\"COMETAPI_API_KEY\"],\r\n \"compactifai\": [\"COMPACTIFAI_API_KEY\"],\r\n \"dashscope\": [\"DASHSCOPE_API_KEY\"],\r\n \"databricks\": [\"DATABRICKS_API_KEY\"],\r\n \"deepgram\": [\"DEEPGRAM_API_KEY\"],\r\n \"deepinfra\": [\"DEEPINFRA_API_KEY\"],\r\n \"elevenlabs\": [\"ELEVENLABS_API_KEY\"],\r\n \"fal_ai\": [\"FAL_AI_API_KEY\"],\r\n \"featherless_ai\": [\"FEATHERLESS_AI_API_KEY\"],\r\n \"friendliai\": [\"FRIENDLIAI_API_KEY\"],\r\n \"galadriel\": [\"GALADRIEL_API_KEY\"],\r\n \"github\": [\"GITHUB_API_KEY\"],\r\n \"gradient_ai\": [\"GRADIENT_AI_API_KEY\"],\r\n \"helicone\": [\"HELICONE_API_KEY\"],\r\n \"heroku\": [\"HEROKU_API_KEY\"],\r\n \"hyperbolic\": [\"HYPERBOLIC_API_KEY\"],\r\n \"jina_ai\": [\"JINA_AI_API_KEY\"],\r\n \"lambda_ai\": [\"LAMBDA_API_KEY\"],\r\n \"langgraph\": [\"LANGGRAPH_API_KEY\"],\r\n \"lemonade\": [\"LEMONADE_API_KEY\"],\r\n \"llamafile\": [\"LLAMAFILE_API_KEY\"],\r\n \"lm_studio\": [\"LM_STUDIO_API_KEY\"],\r\n \"manus\": [\"MANUS_API_KEY\"],\r\n \"minimax\": [\"MINIMAX_API_KEY\"],\r\n \"moonshot\": [\"MOONSHOT_API_KEY\"],\r\n \"morph\": [\"MORPH_API_KEY\"],\r\n \"nebius\": [\"NEBIUS_API_KEY\"],\r\n \"novita\": [\"NOVITA_API_KEY\"],\r\n \"nscale\": [\"NSCALE_API_KEY\"],\r\n \"nvidia_nim\": [\"NVIDIA_NIM_API_KEY\"],\r\n \"oci\": [\"OCI_API_KEY\"],\r\n \"ovhcloud\": [\"OVHCLOUD_API_KEY\"],\r\n \"poe\": [\"POE_API_KEY\"],\r\n \"predibase\": [\"PREDIBASE_API_KEY\"],\r\n \"publicai\": [\"PUBLICAI_API_KEY\"],\r\n \"ragflow\": [\"RAGFLOW_API_KEY\"],\r\n \"recraft\": [\"RECRAFT_API_KEY\"],\r\n \"runwayml\": [\"RUNWAYML_API_SECRET\"],\r\n \"sambanova\": [\"SAMBANOVA_API_KEY\"],\r\n \"scaleway\": [\"SCALEWAY_API_KEY\"],\r\n \"snowflake\": [\"SNOWFLAKE_API_KEY\", \"SNOWFLAKE_ACCOUNT_ID\"],\r\n \"stability\": [\"STABILITY_API_KEY\"],\r\n \"synthetic\": [\"SYNTHETIC_API_KEY\"],\r\n \"stima\": [\"STIMA_API_KEY\"],\r\n \"topaz\": [\"TOPAZ_API_KEY\"],\r\n \"v0\": [\"V0_API_KEY\"],\r\n \"volcengine\": [\"VOLCENGINE_API_KEY\"],\r\n \"voyage\": [\"VOYAGE_API_KEY\"],\r\n \"watsonx\": [\"WATSONX_API_KEY\", \"WATSONX_TOKEN\", \"WATSONX_REGION\"],\r\n \"xinference\": [\"XINFERENCE_API_KEY\"],\r\n \"zai\": [\"ZAI_API_KEY\"]\r\n};\r\n\r\nconst PROVIDERS = Object.keys(PROVIDER_KEYS).sort();\r\n\r\n\r\nfunction providerLabel(p: string) {\r\n return p.replace(/_/g, \" \");\r\n}\r\n/** Returns true if every key required by this provider is already stored. */\r\n\r\nfunction isProviderFullyAdded(provider: string, storedNames: Set<string>): boolean {\r\n return (PROVIDER_KEYS[provider] ?? []).every(k => storedNames.has(k));\r\n}\r\n \r\n\r\nconst CredentialRow = memo(({\r\n cred, isSelected, onToggle, onCopy, onDelete\r\n}: {\r\n cred: { name: string; value: string; length: number };\r\n isSelected: boolean;\r\n onToggle: (name: string) => void;\r\n onCopy: (name: string) => void;\r\n onDelete: (name: string) => void;\r\n}) => (\r\n <TableRow className=\"border-accent/5 hover:bg-accent/5 transition-colors h-12 group\">\r\n {/* Checkbox */}\r\n <TableCell className=\"w-10 cursor-default\" onClick={e => e.stopPropagation()}>\r\n <Checkbox checked={isSelected} onCheckedChange={() => onToggle(cred.name)} />\r\n </TableCell>\r\n {/* Key icon */}\r\n <TableCell className=\"w-8\">\r\n <KeyRound className=\"w-3.5 h-3.5 text-muted-foreground/60\" />\r\n </TableCell>\r\n {/* Name */}\r\n <TableCell className=\"font-mono text-xs font-medium max-w-[180px] truncate\">\r\n {cred.name}\r\n </TableCell>\r\n {/* Value */}\r\n <TableCell className=\"font-mono text-xs text-muted-foreground max-w-[160px] truncate select-none\">\r\n ●●●●●●●●●●●●●●●●●●●\r\n </TableCell>\r\n {/* Actions */}\r\n <TableCell className=\"w-20 text-right pr-3\">\r\n <span className=\"inline-flex items-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <button\r\n className=\"hover:text-foreground text-muted-foreground transition-colors\"\r\n onClick={e => { e.stopPropagation(); onCopy(cred.name); }}\r\n >\r\n <Copy className=\"w-3.5 h-3.5\"/>\r\n </button>\r\n <button\r\n className=\"hover:text-destructive text-muted-foreground transition-colors\"\r\n onClick={e => { e.stopPropagation(); onDelete(cred.name); }}\r\n title=\"Delete\"\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n));\r\n \r\n\r\nfunction AddCredentialForm({\r\n onSave,\r\n onCancel,\r\n saving,\r\n storedNames,\r\n}: {\r\n onSave: (entries: Record<string, string>) => Promise<void>;\r\n onCancel: () => void;\r\n saving: boolean;\r\n /** Set of credential key names already stored used to hide fully-configured providers. */\r\n storedNames: Set<string>;\r\n}) {\r\n const [provider, setProvider] = useState<string>(\"\");\r\n const [open, setOpen] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n const [focusedIdx, setFocusedIdx] = useState(-1);\r\n const [values, setValues] = useState<Record<string, string>>({});\r\n const [showPwd, setShowPwd] = useState<Record<string, boolean>>({});\r\n const [showAdded, setShowAdded] = useState(false);\r\n const searchRef = useRef<HTMLInputElement>(null);\r\n const listRef = useRef<HTMLDivElement>(null);\r\n const wrapRef = useRef<HTMLDivElement>(null);\r\n const keys = provider ? PROVIDER_KEYS[provider] ?? [] : [];\r\n // Split providers into available vs already-added\r\n const { availableProviders, addedProviders } = PROVIDERS.reduce<{\r\n availableProviders: string[];\r\n addedProviders: string[];\r\n }>(\r\n (acc, p) => {\r\n if (isProviderFullyAdded(p, storedNames)) {\r\n acc.addedProviders.push(p);\r\n } else {\r\n acc.availableProviders.push(p);\r\n }\r\n return acc;\r\n },\r\n { availableProviders: [], addedProviders: [] }\r\n );\r\n // The visible pool depends on whether the user wants to see already-added ones too\r\n const providerPool = showAdded ? PROVIDERS : availableProviders;\r\n // Filter by search query\r\n const filteredProviders = providerPool.filter(p => {\r\n const q = search.toLowerCase();\r\n return (\r\n p.toLowerCase().includes(q) ||\r\n providerLabel(p).toLowerCase().includes(q) ||\r\n (PROVIDER_KEYS[p]?.[0] ?? \"\").toLowerCase().includes(q)\r\n );\r\n });\r\n // Reset values when provider changes\r\n const handleProvider = (p: string) => {\r\n setProvider(p);\r\n setValues({});\r\n setShowPwd({});\r\n setOpen(false);\r\n setSearch(\"\");\r\n setFocusedIdx(-1);\r\n };\r\n // Open dropdown and focus search\r\n const handleOpen = () => {\r\n setOpen(o => {\r\n if (!o) {\r\n setSearch(\"\");\r\n setFocusedIdx(-1);\r\n setTimeout(() => searchRef.current?.focus(), 10);\r\n }\r\n return !o;\r\n });\r\n };\r\n // Close on outside click\r\n useEffect(() => {\r\n const handler = (e: MouseEvent) => {\r\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n setSearch(\"\");\r\n setFocusedIdx(-1);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, []);\r\n // Scroll focused item into view\r\n useEffect(() => {\r\n if (focusedIdx < 0 || !listRef.current) return;\r\n const items = listRef.current.querySelectorAll<HTMLButtonElement>(\"[data-item]\");\r\n items[focusedIdx]?.scrollIntoView({ block: \"nearest\" });\r\n }, [focusedIdx]);\r\n const handleSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n setFocusedIdx(i => Math.min(i + 1, filteredProviders.length - 1));\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setFocusedIdx(i => Math.max(i - 1, 0));\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n if (focusedIdx >= 0 && filteredProviders[focusedIdx]) {\r\n handleProvider(filteredProviders[focusedIdx]);\r\n }\r\n } else if (e.key === \"Escape\") {\r\n setOpen(false);\r\n setSearch(\"\");\r\n setFocusedIdx(-1);\r\n }\r\n };\r\n const filled = keys.length > 0 && keys.every(k => (values[k] ?? \"\").trim().length > 0);\r\n const handleSubmit = async () => {\r\n if (!filled) return;\r\n const filtered = Object.fromEntries(\r\n Object.entries(values).filter(([, v]) => v.trim().length > 0)\r\n );\r\n await onSave(filtered);\r\n };\r\n return (\r\n <div className=\"flex flex-col gap-3 p-4 border border-[hsl(var(--chat-border))] rounded-xl bg-accent/5 mx-auto w-[97.5%]\">\r\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\r\n Add Credentials\r\n </p>\r\n {/* Provider dropdown */}\r\n <div ref={wrapRef} className=\"relative\">\r\n <button\r\n type=\"button\"\r\n onClick={handleOpen}\r\n className={clsx(\r\n \"w-full flex items-center justify-between px-3 py-2 rounded-lg text-sm\",\r\n \"border border-[hsl(var(--chat-border))] bg-background hover:bg-accent/10 transition-colors\",\r\n open && \"rounded-b-none border-b-0\"\r\n )}\r\n >\r\n <span className={provider ? \"text-foreground\" : \"text-muted-foreground\"}>\r\n {provider ? providerLabel(provider) : \"Select provider…\"}\r\n </span>\r\n <ChevronDown className={clsx(\"w-4 h-4 text-muted-foreground transition-transform\", open && \"rotate-180\")} />\r\n </button>\r\n {open && (\r\n <div className=\"absolute z-50 w-full rounded-b-lg border border-t-0 border-[hsl(var(--chat-border))] bg-background shadow-lg\">\r\n {/* Search input */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-[hsl(var(--chat-border))]\">\r\n <Search className=\"w-3.5 h-3.5 text-muted-foreground shrink-0\" />\r\n <input\r\n ref={searchRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={e => { setSearch(e.target.value); setFocusedIdx(-1); }}\r\n onKeyDown={handleSearchKeyDown}\r\n placeholder=\"Search providers…\"\r\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground/50\"\r\n />\r\n {search && (\r\n <button\r\n type=\"button\"\r\n onClick={() => { setSearch(\"\"); setFocusedIdx(-1); searchRef.current?.focus(); }}\r\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\r\n aria-label=\"Clear search\"\r\n >\r\n <X className=\"w-3 h-3\" />\r\n </button>\r\n )}\r\n </div>\r\n {/* Results count + toggle for already-added */}\r\n <div className=\"flex items-center justify-between px-3 py-1\">\r\n <span className=\"text-[10px] text-muted-foreground/60\">\r\n {filteredProviders.length} provider{filteredProviders.length !== 1 ? \"s\" : \"\"}\r\n {search ? ` for \"${search}\"` : \"\"}\r\n </span>\r\n {addedProviders.length > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={() => { setShowAdded(v => !v); setFocusedIdx(-1); }}\r\n className=\"text-[10px] text-muted-foreground/60 hover:text-muted-foreground transition-colors flex items-center gap-1\"\r\n >\r\n {showAdded\r\n ? <EyeOff className=\"w-2.5 h-2.5\" />\r\n : <Eye className=\"w-2.5 h-2.5\" />}\r\n {showAdded\r\n ? `Hide ${addedProviders.length} added`\r\n : `Show ${addedProviders.length} already added`}\r\n </button>\r\n )}\r\n </div>\r\n {/* List */}\r\n <div ref={listRef} className=\"max-h-52 overflow-y-auto\">\r\n {filteredProviders.length === 0 ? (\r\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\r\n {!showAdded && addedProviders.length > 0\r\n ? \"All matching providers are already added\"\r\n : \"No providers found\"}\r\n </div>\r\n ) : (\r\n filteredProviders.map((p, i) => {\r\n const alreadyAdded = isProviderFullyAdded(p, storedNames);\r\n return (\r\n <button\r\n key={p}\r\n data-item\r\n type=\"button\"\r\n onClick={() => handleProvider(p)}\r\n onMouseEnter={() => setFocusedIdx(i)}\r\n className={clsx(\r\n \"w-full text-left px-3 py-2 text-sm transition-colors flex items-center justify-between gap-2\",\r\n (provider === p || i === focusedIdx) && \"bg-accent/20\",\r\n provider === p && \"font-medium\",\r\n alreadyAdded && \"opacity-50\"\r\n )}\r\n >\r\n <span className=\"flex items-center gap-1.5\">\r\n {providerLabel(p)}\r\n {alreadyAdded && (\r\n <CheckCircle2 className=\"w-3 h-3 text-green-500 shrink-0\" />\r\n )}\r\n </span>\r\n <span className=\"text-[10px] text-muted-foreground font-mono truncate shrink-0 max-w-[140px]\">\r\n {PROVIDER_KEYS[p]?.[0]}\r\n </span>\r\n </button>\r\n );\r\n })\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n {/* Key inputs */}\r\n {keys.map(key => (\r\n <div key={key} className=\"flex flex-col gap-1\">\r\n <label className=\"text-[11px] font-mono text-muted-foreground\">{key}</label>\r\n <div className=\"relative\">\r\n <input\r\n type={showPwd[key] ? \"text\" : \"password\"}\r\n placeholder={`Enter ${key}`}\r\n value={values[key] ?? \"\"}\r\n onChange={e => setValues(prev => ({ ...prev, [key]: e.target.value }))}\r\n className={clsx(\r\n \"w-full px-3 py-2 pr-8 rounded-lg text-sm font-mono\",\r\n \"border border-[hsl(var(--chat-border))] bg-background\",\r\n \"focus:outline-none focus:ring-1 focus:ring-accent/50 transition\"\r\n )}\r\n />\r\n <button\r\n type=\"button\"\r\n tabIndex={-1}\r\n onClick={() => setShowPwd(prev => ({ ...prev, [key]: !prev[key] }))}\r\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\r\n >\r\n {showPwd[key]\r\n ? <EyeOff className=\"w-3.5 h-3.5\" />\r\n : <Eye className=\"w-3.5 h-3.5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n ))}\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-2 pt-1\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n disabled={saving}\r\n className=\"px-4 py-1.5 text-sm rounded-full border border-[hsl(var(--chat-border))] hover:bg-accent/10 transition-colors disabled:opacity-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={!filled || saving}\r\n className={clsx(\r\n \"px-4 py-1.5 text-sm rounded-full border transition-colors flex items-center gap-1.5\",\r\n filled && !saving\r\n ? \"border-accent bg-accent/20 hover:bg-accent/30 text-foreground\"\r\n : \"border-[hsl(var(--chat-border))] opacity-40 cursor-not-allowed\"\r\n )}\r\n >\r\n {saving ? <><Spinner /><span>Saving…</span></> : \"Save\"}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\nfunction Toast({ message, type }: { message: string; type: \"success\" | \"error\" }) {\r\n return (\r\n <div className={clsx(\r\n \"flex items-center gap-2 px-3 py-2 rounded-lg text-xs animate-in fade-in slide-in-from-bottom-2 duration-200\",\r\n type === \"success\" ? \"bg-green-500/10 text-green-600 border border-green-500/20\"\r\n : \"bg-destructive/10 text-destructive border border-destructive/20\"\r\n )}>\r\n {type === \"success\"\r\n ? <CheckCircle2 className=\"w-3.5 h-3.5\" />\r\n : <AlertCircle className=\"w-3.5 h-3.5\" />}\r\n {message}\r\n </div>\r\n );\r\n}\r\n \r\n\r\nexport default function Credentials({\r\n isOpen,\r\n}: {\r\n isOpen: boolean;\r\n}) {\r\n const { pyInvoke } = usePython();\r\n const [creds, setCreds] = useState<{ name: string; value: string; length: number }[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [adding, setAdding] = useState(false);\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n const [toast, setToast] = useState<{ message: string; type: \"success\" | \"error\" } | null>(null);\r\n // Toast helper \r\n const showToast = (message: string, type: \"success\" | \"error\" = \"success\") => {\r\n setToast({ message, type });\r\n setTimeout(() => setToast(null), 2500);\r\n };\r\n // Load credentials \r\n const loadCredentials = useCallback(async () => {\r\n if (!isOpen) return;\r\n setLoading(true);\r\n try {\r\n const res = await pyInvoke(\"credentials\", { command: \"list\" });\r\n const list = res?.data?.credentials ?? res?.credentials ?? [];\r\n // Get unmasked values for display\r\n const withValues = await Promise.all(\r\n list.map(async (c: { name: string }) => {\r\n const r = await pyInvoke(\"credentials\", { command: \"get\", name: c.name, unmask: true });\r\n return { name: c.name, value: r?.data?.value ?? \"••••••••\", length: r?.data?.value?.length ?? 0 };\r\n })\r\n );\r\n setCreds(withValues);\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to load credentials\", \"error\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [isOpen, pyInvoke]);\r\n useEffect(() => { loadCredentials(); }, [loadCredentials]);\r\n // Save new credentials \r\n const handleSave = useCallback(async (entries: Record<string, string>) => {\r\n setSaving(true);\r\n try {\r\n await Promise.all(\r\n Object.entries(entries).map(([name, value]) =>\r\n pyInvoke(\"credentials\", { command: \"set\", name, value })\r\n )\r\n );\r\n showToast(`Saved ${Object.keys(entries).length} key(s)`);\r\n setAdding(false);\r\n await loadCredentials();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to save credentials\", \"error\");\r\n } finally {\r\n setSaving(false);\r\n }\r\n }, [pyInvoke, loadCredentials]);\r\n // Delete one \r\n const handleDelete = useCallback(async (name: string) => {\r\n try {\r\n await pyInvoke(\"credentials\", { command: \"delete\", name });\r\n setSelectedIds(prev => { const n = new Set(prev); n.delete(name); return n; });\r\n showToast(`Deleted ${name}`);\r\n await loadCredentials();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to delete credential\", \"error\");\r\n }\r\n }, [pyInvoke, loadCredentials]);\r\n // Delete selected \r\n const handleDeleteSelected = useCallback(async () => {\r\n const ids = Array.from(selectedIds);\r\n if (ids.length === 0) return;\r\n try {\r\n await Promise.all(ids.map(name => pyInvoke(\"credentials\", { command: \"delete\", name })));\r\n setSelectedIds(new Set());\r\n showToast(`Deleted ${ids.length} credential(s)`);\r\n await loadCredentials();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to delete credentials\", \"error\");\r\n }\r\n }, [selectedIds, pyInvoke, loadCredentials]);\r\n // Selection helpers \r\n const toggleSelect = useCallback((name: string) => {\r\n setSelectedIds(prev => {\r\n const n = new Set(prev);\r\n n.has(name) ? n.delete(name) : n.add(name);\r\n return n;\r\n });\r\n }, []);\r\n const toggleSelectAll = useCallback(() => {\r\n setSelectedIds(prev =>\r\n prev.size === creds.length && creds.length > 0\r\n ? new Set()\r\n : new Set(creds.map(c => c.name))\r\n );\r\n }, [creds]);\r\n // Derive the set of stored credential names for the form to use\r\n const storedNames = new Set(creds.map(c => c.name));\r\n // Render \r\n const allSelected = creds.length > 0 && selectedIds.size === creds.length;\r\n const isEmpty = creds.length === 0;\r\n return (\r\n <div className=\"flex flex-col gap-2 h-full pt-10\">\r\n {/* Header row */}\r\n <div className=\"flex justify-center items-center w-[97.5%] mx-auto px-2\">\r\n <div className=\"w-6\">\r\n <Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} />\r\n </div>\r\n <div className=\"flex-1\" />\r\n <button\r\n type=\"button\"\r\n onClick={() => { setAdding(a => !a); }}\r\n className={clsx(\r\n \"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs border transition-colors\",\r\n adding\r\n ? \"bg-accent/20 border-accent/50 text-foreground\"\r\n : \"border-[hsl(var(--chat-border))] hover:bg-accent/10 text-muted-foreground hover:text-foreground\"\r\n )}\r\n >\r\n <Plus className=\"w-3.5 h-3.5\" />\r\n Add\r\n </button>\r\n </div>\r\n {/* Add form */}\r\n {adding && (\r\n <AddCredentialForm\r\n onSave={handleSave}\r\n onCancel={() => setAdding(false)}\r\n saving={saving}\r\n storedNames={storedNames}\r\n />\r\n )}\r\n {/* Table */}\r\n <ScrollArea className=\"flex-1 -mx-6 w-[97.5%] mx-auto border-t border-b border-[hsl(var(--chat-border))]\">\r\n <Table>\r\n <TableBody>\r\n {isEmpty ? (\r\n <TableRow>\r\n <TableCell colSpan={5} className=\"h-24 text-center text-muted-foreground text-xs\">\r\n <div className=\"flex flex-col items-center justify-center gap-2\">\r\n {loading\r\n ? <><Spinner /><span>Loading…</span></>\r\n : (\r\n <>\r\n <KeyRound className=\"w-6 h-6 opacity-20\" />\r\n <span className=\"opacity-50\">No credentials stored</span>\r\n </>\r\n )}\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n creds.map(cred => (\r\n <CredentialRow\r\n key={cred.name}\r\n cred={cred}\r\n isSelected={selectedIds.has(cred.name)}\r\n onToggle={toggleSelect}\r\n onCopy={async() => {\r\n await navigator.clipboard.writeText(cred.value);\r\n }}\r\n onDelete={handleDelete}\r\n />\r\n ))\r\n )}\r\n </TableBody>\r\n </Table>\r\n {loading && creds.length > 0 && (\r\n <div className=\"flex justify-center items-center gap-2 py-3 text-xs text-muted-foreground\">\r\n <Spinner />\r\n <span>Refreshing…</span>\r\n </div>\r\n )}\r\n </ScrollArea>\r\n {/* Bulk action bar */}\r\n <div className={clsx(\r\n selectedIds.size > 0 ? \"flex justify-center items-center\" : \"hidden\",\r\n \"pt-2 relative transform translate-y-[-6px] px-4\"\r\n )}>\r\n <span className=\"text-xs text-muted-foreground\">{selectedIds.size} selected</span>\r\n <div className=\"flex-1 flex justify-end gap-2\">\r\n <button\r\n onClick={handleDeleteSelected}\r\n className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:border-destructive/50 hover:text-destructive transition-colors\"\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n {/* Toast */}\r\n {toast && (\r\n <div className=\"px-4 pb-1\">\r\n <Toast message={toast.message} type={toast.type} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}","import { useState, useEffect, useCallback, memo } from \"react\";\r\nimport { Trash2, HardDrive, CheckCircle2, AlertCircle, FolderOpen } from \"lucide-react\";\r\nimport { Checkbox } from \"./ui/checkbox\";\r\nimport { ScrollArea } from \"./ui/scroll-area\";\r\nimport { Table, TableBody, TableCell, TableRow } from \"./ui/table\";\r\nimport { usePython } from \"./usePython\";\r\nimport { Spinner } from \"./ui/spinner\";\r\nimport clsx from \"clsx\";\r\nimport { revealItemInDir } from '@tauri-apps/plugin-opener';\r\n\r\ninterface LocalModel {\r\n id: string;\r\n name: string;\r\n backend: string | null;\r\n modelPath: string | null;\r\n fileName: string | null;\r\n mmproj: string | null;\r\n isLocal: boolean;\r\n isLoaded: boolean;\r\n lastError: string | null;\r\n multimodal?: boolean;\r\n}\r\n\r\n/** Returns true if the model_path starts with \"Models\\\\\" these are bundled/internal and should be hidden. */\r\n\r\nfunction isBundledModel(modelPath: string | null): boolean {\r\n if (!modelPath) return false;\r\n return modelPath.startsWith(\"Models\\\\\") || modelPath.startsWith(\"Models/\");\r\n}\r\n\r\nfunction parseLocalModels(raw: string): LocalModel[] {\r\n const parsed = JSON.parse(raw);\r\n const available = parsed.available_models ?? {};\r\n const loaded = parsed.models ?? {};\r\n return (Object.entries(available) as [string, Record<string, unknown>][])\r\n .filter(([, m]) => m.is_local === true)\r\n .filter(([, m]) => !isBundledModel(m.model_path as string | null))\r\n .map(([id, m]) => ({\r\n id,\r\n name: (m.name as string) ?? \"Unknown\",\r\n backend: (m.backend as string) ?? null,\r\n modelPath: (m.model_path as string) ?? null,\r\n fileName: (m.filename as string) ?? null,\r\n mmproj: (m.mmproj_path as string) ?? null,\r\n isLocal: true,\r\n isLoaded:\r\n Object.prototype.hasOwnProperty.call(loaded, id) &&\r\n !(loaded as Record<string, { last_error?: unknown }>)[id]?.last_error,\r\n lastError:\r\n (loaded as Record<string, { last_error?: unknown }>)?.[id]?.last_error\r\n ? String((loaded as Record<string, { last_error?: unknown }>)[id].last_error)\r\n : null,\r\n multimodal: (m.multimodal as boolean) ?? false,\r\n }));\r\n}\r\n/** Returns a human-readable short path just the filename + parent folder. */\r\n\r\nfunction shortPath(modelPath: string | null, fileName: string | null): string {\r\n if (!modelPath && !fileName) return \"\";\r\n if (!fileName) return modelPath ?? \"\";\r\n const full = modelPath ? `${modelPath}${fileName}` : fileName;\r\n // Show only the last two path segments\r\n const parts = full.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\r\n return parts.length > 2 ? `…/${parts.slice(-2).join(\"/\")}` : parts.join(\"/\");\r\n}\r\n\r\nfunction backendLabel(backend: string | null): string {\r\n if (!backend) return \"\";\r\n return backend.split(\"/\").pop() ?? backend;\r\n}\r\n\r\nconst ModelRow = memo(({\r\n model,\r\n isSelected,\r\n onToggle,\r\n onDelete,\r\n}: {\r\n model: LocalModel;\r\n isSelected: boolean;\r\n onToggle: (id: string) => void;\r\n onDelete: (fullPath: string) => void;\r\n}) => (\r\n <TableRow className=\"border-accent/5 hover:bg-accent/5 transition-colors h-12 group\">\r\n {/* Checkbox */}\r\n <TableCell className=\"w-10 cursor-default\" onClick={e => e.stopPropagation()}>\r\n <Checkbox checked={isSelected} onCheckedChange={() => onToggle(model.id)} />\r\n </TableCell>\r\n {/* Icon */}\r\n <TableCell className=\"w-8\">\r\n <HardDrive className=\"w-3.5 h-3.5 text-muted-foreground/60\" />\r\n </TableCell>\r\n {/* Name */}\r\n <TableCell className=\"font-medium text-xs max-w-[160px] truncate\">\r\n <div className=\"flex items-center gap-1.5\">\r\n <span className=\"truncate\">{model.name}</span>\r\n {model.multimodal && (\r\n <span className=\"shrink-0 text-[9px] px-1 py-0.5 rounded bg-accent/20 text-muted-foreground font-mono\">\r\n VLM\r\n </span>\r\n )}\r\n </div>\r\n </TableCell>\r\n {/* Path */}\r\n <TableCell\r\n className=\"font-mono text-[10px] text-muted-foreground max-w-[180px] truncate select-none\"\r\n title={[model.modelPath, model.fileName].filter(Boolean).join(\"\")}\r\n >\r\n {shortPath(model.modelPath, model.fileName)}\r\n </TableCell>\r\n {/* Status + backend */}\r\n <TableCell className=\"w-28 text-right pr-3\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n {/* Backend badge */}\r\n {model.backend && (\r\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-accent/10 text-muted-foreground font-mono opacity-0 group-hover:opacity-100 transition-opacity\">\r\n {backendLabel(model.backend)}\r\n </span>\r\n )}\r\n {/* Loaded indicator */}\r\n {model.isLoaded && !model.lastError && (\r\n <span className=\"w-2 h-2 rounded-full bg-green-500 shrink-0\" title=\"Loaded\" />\r\n )}\r\n {model.lastError && (\r\n <AlertCircle\r\n className=\"w-3.5 h-3.5 text-destructive shrink-0\"\r\n />\r\n )}\r\n <button\r\n className=\"hover:text-destructive text-muted-foreground transition-colors opacity-0 group-hover:opacity-100\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n // Tauri API: reveal the file in Explorer / Finder\r\n // console.warn();\r\n revealItemInDir([model.modelPath, model.fileName].filter(Boolean).join(\"\"));\r\n }}\r\n title=\"Open containing folder\"\r\n >\r\n <FolderOpen className=\"w-3.5 h-3.5\" />\r\n </button>\r\n {/* Delete */}\r\n <button\r\n className=\"hover:text-destructive text-muted-foreground transition-colors opacity-0 group-hover:opacity-100\"\r\n onClick={e => { e.stopPropagation(); onDelete([model.modelPath, model.fileName].filter(Boolean).join(\"\")); }}\r\n title=\"Remove model\"\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </span>\r\n </TableCell>\r\n </TableRow>\r\n));\r\n\r\n\r\nfunction Toast({ message, type }: { message: string; type: \"success\" | \"error\" }) {\r\n return (\r\n <div className={clsx(\r\n \"flex items-center gap-2 px-3 py-2 rounded-lg text-xs animate-in fade-in slide-in-from-bottom-2 duration-200\",\r\n type === \"success\"\r\n ? \"bg-green-500/10 text-green-600 border border-green-500/20\"\r\n : \"bg-destructive/10 text-destructive border border-destructive/20\"\r\n )}>\r\n {type === \"success\"\r\n ? <CheckCircle2 className=\"w-3.5 h-3.5 shrink-0\" />\r\n : <AlertCircle className=\"w-3.5 h-3.5 shrink-0\" />}\r\n <span className=\"truncate\">{message}</span>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function LocalModel({\r\n isOpen,\r\n selectModel,\r\n addLocalModel,\r\n deleteLocalModel,\r\n}: {\r\n isOpen: boolean;\r\n /** Opens the native file picker and returns the selected paths. */\r\n selectModel: () => Promise<string[] | undefined>;\r\n /** Called after selectModel resolves persists the new paths to settings. */\r\n addLocalModel: (paths: string[]) => Promise<void>;\r\n /** Called when the user removes a model persists the change to settings. */\r\n deleteLocalModel: (modelId: string) => Promise<void>;\r\n}) {\r\n const { pyInvoke } = usePython();\r\n const [models, setModels] = useState<LocalModel[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [adding, setAdding] = useState(false);\r\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\r\n const [toast, setToast] = useState<{ message: string; type: \"success\" | \"error\" } | null>(null);\r\n // Toast helper \r\n const showToast = useCallback((message: string, type: \"success\" | \"error\" = \"success\") => {\r\n setToast({ message, type });\r\n setTimeout(() => setToast(null), 2500);\r\n }, []);\r\n // Load models from config.json \r\n const loadModels = useCallback(async () => {\r\n if (!isOpen) return;\r\n setLoading(true);\r\n try {\r\n const res : any = await pyInvoke<{ data?: Record<string, unknown> }>('file', {\r\n command: \"read\",\r\n filename: \"config.json\",\r\n base_dir: \"python\",\r\n });\r\n const content = res?.data?.content as string | undefined;\r\n if (!content) {\r\n setModels([]);\r\n return;\r\n }\r\n setModels(parseLocalModels(content));\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to load models\", \"error\");\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [isOpen, pyInvoke, showToast]);\r\n useEffect(() => { loadModels(); }, [loadModels]);\r\n // Add via file picker \r\n const handleAdd = useCallback(async () => {\r\n setAdding(true);\r\n try {\r\n const paths = await selectModel();\r\n if (!paths || paths.length === 0) return;\r\n await addLocalModel(paths);\r\n showToast(`Added ${paths.length} model${paths.length > 1 ? \"s\" : \"\"}`);\r\n await loadModels();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to add model\", \"error\");\r\n } finally {\r\n setAdding(false);\r\n }\r\n }, [selectModel, addLocalModel, loadModels, showToast]);\r\n // Delete one (receives the reconstructed full path from ModelRow) \r\n const handleDelete = useCallback(async (fullPath: string) => {\r\n try {\r\n await deleteLocalModel(fullPath);\r\n setSelectedIds(prev => {\r\n const n = new Set(prev);\r\n const match = models.find(\r\n m => [m.modelPath, m.fileName].filter(Boolean).join(\"\") === fullPath\r\n );\r\n if (match) n.delete(match.id);\r\n return n;\r\n });\r\n showToast(\"Model removed\");\r\n await loadModels();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to remove model\", \"error\");\r\n }\r\n }, [deleteLocalModel, loadModels, models, showToast]);\r\n // Delete selected \r\n const handleDeleteSelected = useCallback(async () => {\r\n if (selectedIds.size === 0) return;\r\n const selected = models.filter(m => selectedIds.has(m.id));\r\n const fullPaths = selected.map(m => [m.modelPath, m.fileName].filter(Boolean).join(\"\"));\r\n try {\r\n await Promise.all(fullPaths.map(p => deleteLocalModel(p)));\r\n setSelectedIds(new Set());\r\n showToast(`Removed ${selected.length} model${selected.length > 1 ? \"s\" : \"\"}`);\r\n await loadModels();\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to remove models\", \"error\");\r\n }\r\n }, [selectedIds, models, deleteLocalModel, loadModels, showToast]);\r\n // Selection helpers \r\n const toggleSelect = useCallback((id: string) => {\r\n setSelectedIds(prev => {\r\n const n = new Set(prev);\r\n n.has(id) ? n.delete(id) : n.add(id);\r\n return n;\r\n });\r\n }, []);\r\n const toggleSelectAll = useCallback(() => {\r\n setSelectedIds(prev =>\r\n prev.size === models.length && models.length > 0\r\n ? new Set()\r\n : new Set(models.map(m => m.id))\r\n );\r\n }, [models]);\r\n const allSelected = models.length > 0 && selectedIds.size === models.length;\r\n const isEmpty = models.length === 0;\r\n // Rende\r\n return (\r\n <div className=\"flex flex-col gap-2 h-full pt-10\">\r\n {/* Header row */}\r\n <div className=\"flex justify-center items-center w-[97.5%] mx-auto px-2\">\r\n <div className=\"w-6\">\r\n <Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} />\r\n </div>\r\n <div className=\"flex-1\" />\r\n <button\r\n type=\"button\"\r\n onClick={handleAdd}\r\n disabled={adding}\r\n className={clsx(\r\n \"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs border transition-colors\",\r\n adding\r\n ? \"bg-accent/20 border-accent/50 text-foreground opacity-60 cursor-not-allowed\"\r\n : \"border-[hsl(var(--chat-border))] hover:bg-accent/10 text-muted-foreground hover:text-foreground\"\r\n )}\r\n >\r\n {adding ? (\r\n <><Spinner /><span>Selecting…</span></>\r\n ) : (\r\n <><FolderOpen className=\"w-3.5 h-3.5\" /><span>Add</span></>\r\n )}\r\n </button>\r\n </div>\r\n {/* Table */}\r\n <ScrollArea className=\"flex-1 -mx-6 w-[97.5%] mx-auto border-t border-b border-[hsl(var(--chat-border))]\">\r\n <Table>\r\n <TableBody>\r\n {isEmpty ? (\r\n <TableRow>\r\n <TableCell colSpan={5} className=\"h-24 text-center text-muted-foreground text-xs\">\r\n <div className=\"flex flex-col items-center justify-center gap-2\">\r\n {loading ? (\r\n <><Spinner /><span>Loading…</span></>\r\n ) : (\r\n <>\r\n <HardDrive className=\"w-6 h-6 opacity-20\" />\r\n <span className=\"opacity-50\">No local models configured</span>\r\n </>\r\n )}\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n models.map(model => (\r\n <ModelRow\r\n key={model.id}\r\n model={model}\r\n isSelected={selectedIds.has(model.id)}\r\n onToggle={toggleSelect}\r\n onDelete={handleDelete}\r\n />\r\n ))\r\n )}\r\n </TableBody>\r\n </Table>\r\n {loading && models.length > 0 && (\r\n <div className=\"flex justify-center items-center gap-2 py-3 text-xs text-muted-foreground\">\r\n <Spinner />\r\n <span>Refreshing…</span>\r\n </div>\r\n )}\r\n </ScrollArea>\r\n {/* Bulk action bar */}\r\n <div className={clsx(\r\n selectedIds.size > 0 ? \"flex justify-center items-center\" : \"hidden\",\r\n \"pt-2 relative transform translate-y-[-6px] px-4\"\r\n )}>\r\n <span className=\"text-xs text-muted-foreground\">{selectedIds.size} selected</span>\r\n <div className=\"flex-1 flex justify-end gap-2\">\r\n <button\r\n onClick={handleDeleteSelected}\r\n className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:border-destructive/50 hover:text-destructive transition-colors\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n </div>\r\n {/* Toast */}\r\n {toast && (\r\n <div className=\"px-4 pb-1\">\r\n <Toast message={toast.message} type={toast.type} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}","import { useState, useCallback, memo } from \"react\";\r\nimport { Trash2, Plus, Link2, CheckCircle2, AlertCircle, Globe } from \"lucide-react\";\r\nimport { Checkbox } from \"./ui/checkbox\";\r\nimport { ScrollArea } from \"./ui/scroll-area\";\r\nimport { Table, TableBody, TableCell, TableRow } from \"./ui/table\";\r\nimport { Spinner } from \"./ui/spinner\";\r\nimport clsx from \"clsx\";\r\n\r\n\r\nfunction isValidUrl(value: string): boolean {\r\n try {\r\n const url = new URL(value.trim());\r\n return url.protocol === \"http:\" || url.protocol === \"https:\";\r\n } catch {\r\n return false;\r\n }\r\n}\r\n/** Shortens a URL for display keeps host + first path segment. */\r\n\r\nfunction shortUrl(url: string): string {\r\n try {\r\n const u = new URL(url);\r\n const segments = u.pathname.split(\"/\").filter(Boolean);\r\n const short = segments.length > 0\r\n ? `${u.host}/${segments[0]}${segments.length > 1 ? \"/…\" : \"\"}`\r\n : u.host;\r\n return `${u.protocol}//${short}`;\r\n } catch {\r\n return url;\r\n }\r\n}\r\n \r\n\r\nconst EndpointRow = memo(({\r\n url,\r\n isSelected,\r\n onToggle,\r\n onDelete,\r\n}: {\r\n url: string;\r\n isSelected: boolean;\r\n onToggle: (url: string) => void;\r\n onDelete: (url: string) => void;\r\n}) => (\r\n <TableRow className=\"border-accent/5 hover:bg-accent/5 transition-colors h-12 group\">\r\n {/* Checkbox */}\r\n <TableCell className=\"w-10 cursor-default\" onClick={e => e.stopPropagation()}>\r\n <Checkbox checked={isSelected} onCheckedChange={() => onToggle(url)} />\r\n </TableCell>\r\n {/* Icon */}\r\n <TableCell className=\"w-8\">\r\n <Link2 className=\"w-3.5 h-3.5 text-muted-foreground/60\" />\r\n </TableCell>\r\n {/* Shortened URL */}\r\n <TableCell className=\"font-mono text-xs font-medium max-w-[200px] truncate\">\r\n <span title={url}>{shortUrl(url)}</span>\r\n </TableCell>\r\n {/* Full URL (faded, shown on hover) */}\r\n <TableCell className=\"font-mono text-[10px] text-muted-foreground max-w-[180px] truncate select-none opacity-0 group-hover:opacity-60 transition-opacity\">\r\n {url}\r\n </TableCell>\r\n {/* Delete */}\r\n <TableCell className=\"w-12 text-right pr-3\">\r\n <button\r\n className=\"hover:text-destructive text-muted-foreground transition-colors opacity-0 group-hover:opacity-100\"\r\n onClick={e => { e.stopPropagation(); onDelete(url); }}\r\n title=\"Remove endpoint\"\r\n >\r\n <Trash2 className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </TableCell>\r\n </TableRow>\r\n));\r\n \r\n\r\nfunction AddEndpointForm({\r\n onSave,\r\n onCancel,\r\n saving,\r\n existing,\r\n}: {\r\n onSave: (url: string) => Promise<void>;\r\n onCancel: () => void;\r\n saving: boolean;\r\n existing: string[];\r\n}) {\r\n const [value, setValue] = useState(\"\");\r\n const trimmed = value.trim();\r\n const valid = isValidUrl(trimmed);\r\n const duplicate = existing.includes(trimmed);\r\n const canSave = valid && !duplicate && !saving;\r\n const handleSubmit = async () => {\r\n if (!canSave) return;\r\n await onSave(trimmed);\r\n setValue(\"\");\r\n };\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === \"Enter\") handleSubmit();\r\n if (e.key === \"Escape\") onCancel();\r\n };\r\n return (\r\n <div className=\"flex flex-col gap-3 p-4 border border-[hsl(var(--chat-border))] rounded-xl bg-accent/5 mx-auto w-[97.5%]\">\r\n {/* Header + description */}\r\n <div className=\"flex flex-col gap-0.5\">\r\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\r\n Add Endpoint\r\n </p>\r\n <p className=\"text-[11px] text-muted-foreground/70 leading-relaxed\">\r\n Point to any OpenAI-compatible base URL ideal for self-hosted inference servers or corporate proxies.\r\n </p>\r\n </div>\r\n {/* URL input */}\r\n <div className=\"flex flex-col gap-1\">\r\n <label className=\"text-[11px] font-mono text-muted-foreground\">Base URL</label>\r\n <div className=\"relative\">\r\n <Globe className=\"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground/50 pointer-events-none\" />\r\n <input\r\n type=\"url\"\r\n autoFocus\r\n placeholder=\"https://my-server.local/v1\"\r\n value={value}\r\n onChange={e => setValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n className={clsx(\r\n \"w-full pl-9 pr-3 py-2 rounded-lg text-sm font-mono\",\r\n \"border bg-background\",\r\n \"focus:outline-none focus:ring-1 transition\",\r\n duplicate\r\n ? \"border-destructive/50 focus:ring-destructive/30\"\r\n : trimmed && !valid\r\n ? \"border-destructive/50 focus:ring-destructive/30\"\r\n : \"border-[hsl(var(--chat-border))] focus:ring-accent/50\"\r\n )}\r\n />\r\n </div>\r\n {/* Inline validation hint */}\r\n {duplicate && (\r\n <p className=\"text-[10px] text-destructive flex items-center gap-1\">\r\n <AlertCircle className=\"w-3 h-3\" /> This endpoint is already saved.\r\n </p>\r\n )}\r\n {trimmed && !valid && !duplicate && (\r\n <p className=\"text-[10px] text-destructive flex items-center gap-1\">\r\n <AlertCircle className=\"w-3 h-3\" /> Enter a valid http:// or https:// URL.\r\n </p>\r\n )}\r\n </div>\r\n {/* Actions */}\r\n <div className=\"flex justify-end gap-2 pt-1\">\r\n <button\r\n type=\"button\"\r\n onClick={onCancel}\r\n disabled={saving}\r\n className=\"px-4 py-1.5 text-sm rounded-full border border-[hsl(var(--chat-border))] hover:bg-accent/10 transition-colors disabled:opacity-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={!canSave}\r\n className={clsx(\r\n \"px-4 py-1.5 text-sm rounded-full border transition-colors flex items-center gap-1.5\",\r\n canSave\r\n ? \"border-accent bg-accent/20 hover:bg-accent/30 text-foreground\"\r\n : \"border-[hsl(var(--chat-border))] opacity-40 cursor-not-allowed\"\r\n )}\r\n >\r\n {saving ? <><Spinner /><span>Saving…</span></> : \"Save\"}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\nfunction Toast({ message, type }: { message: string; type: \"success\" | \"error\" }) {\r\n return (\r\n <div className={clsx(\r\n \"flex items-center gap-2 px-3 py-2 rounded-lg text-xs animate-in fade-in slide-in-from-bottom-2 duration-200\",\r\n type === \"success\"\r\n ? \"bg-green-500/10 text-green-600 border border-green-500/20\"\r\n : \"bg-destructive/10 text-destructive border border-destructive/20\"\r\n )}>\r\n {type === \"success\"\r\n ? <CheckCircle2 className=\"w-3.5 h-3.5 shrink-0\" />\r\n : <AlertCircle className=\"w-3.5 h-3.5 shrink-0\" />}\r\n <span className=\"truncate\">{message}</span>\r\n </div>\r\n );\r\n}\r\n \r\n\r\nexport default function CustomEndpoint({\r\n endpoints,\r\n addEndpoint,\r\n deleteEndpoint,\r\n}: {\r\n /** Current list of saved base URLs read from settings by the parent. */\r\n endpoints: string[];\r\n /** Persists a new URL into settings. */\r\n addEndpoint: (url: string) => Promise<void>;\r\n /** Removes a URL from settings. */\r\n deleteEndpoint: (url: string) => Promise<void>;\r\n}) {\r\n const [adding, setAdding] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [selectedUrls, setSelectedUrls] = useState<Set<string>>(new Set());\r\n const [toast, setToast] = useState<{ message: string; type: \"success\" | \"error\" } | null>(null);\r\n // Toast helper \r\n const showToast = useCallback((message: string, type: \"success\" | \"error\" = \"success\") => {\r\n setToast({ message, type });\r\n setTimeout(() => setToast(null), 2500);\r\n }, []);\r\n // Save new endpoint \r\n const handleSave = useCallback(async (url: string) => {\r\n setSaving(true);\r\n try {\r\n await addEndpoint(url);\r\n setAdding(false);\r\n showToast(\"Endpoint saved\");\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to save endpoint\", \"error\");\r\n } finally {\r\n setSaving(false);\r\n }\r\n }, [addEndpoint, showToast]);\r\n // Delete one \r\n const handleDelete = useCallback(async (url: string) => {\r\n try {\r\n await deleteEndpoint(url);\r\n setSelectedUrls(prev => { const n = new Set(prev); n.delete(url); return n; });\r\n showToast(\"Endpoint removed\");\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to remove endpoint\", \"error\");\r\n }\r\n }, [deleteEndpoint, showToast]);\r\n // Delete selected \r\n const handleDeleteSelected = useCallback(async () => {\r\n if (selectedUrls.size === 0) return;\r\n const urls = Array.from(selectedUrls);\r\n try {\r\n await Promise.all(urls.map(url => deleteEndpoint(url)));\r\n setSelectedUrls(new Set());\r\n showToast(`Removed ${urls.length} endpoint${urls.length > 1 ? \"s\" : \"\"}`);\r\n } catch (e) {\r\n console.error(e);\r\n showToast(\"Failed to remove endpoints\", \"error\");\r\n }\r\n }, [selectedUrls, deleteEndpoint, showToast]);\r\n // Selection helpers \r\n const toggleSelect = useCallback((url: string) => {\r\n setSelectedUrls(prev => {\r\n const n = new Set(prev);\r\n n.has(url) ? n.delete(url) : n.add(url);\r\n return n;\r\n });\r\n }, []);\r\n const toggleSelectAll = useCallback(() => {\r\n setSelectedUrls(prev =>\r\n prev.size === endpoints.length && endpoints.length > 0\r\n ? new Set()\r\n : new Set(endpoints)\r\n );\r\n }, [endpoints]);\r\n const allSelected = endpoints.length > 0 && selectedUrls.size === endpoints.length;\r\n const isEmpty = endpoints.length === 0;\r\n // Render \r\n return (\r\n <div className=\"flex flex-col gap-2 h-full pt-10\">\r\n {/* Header row */}\r\n <div className=\"flex justify-center items-center w-[97.5%] mx-auto px-2\">\r\n <div className=\"w-6\">\r\n <Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} />\r\n </div>\r\n <div className=\"flex-1\" />\r\n <button\r\n type=\"button\"\r\n onClick={() => setAdding(a => !a)}\r\n className={clsx(\r\n \"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs border transition-colors\",\r\n adding\r\n ? \"bg-accent/20 border-accent/50 text-foreground\"\r\n : \"border-[hsl(var(--chat-border))] hover:bg-accent/10 text-muted-foreground hover:text-foreground\"\r\n )}\r\n >\r\n <Plus className=\"w-3.5 h-3.5\" />\r\n Add\r\n </button>\r\n </div>\r\n {/* Add form */}\r\n {adding && (\r\n <AddEndpointForm\r\n onSave={handleSave}\r\n onCancel={() => setAdding(false)}\r\n saving={saving}\r\n existing={endpoints}\r\n />\r\n )}\r\n {/* Table */}\r\n <ScrollArea className=\"flex-1 -mx-6 w-[97.5%] mx-auto border-t border-b border-[hsl(var(--chat-border))]\">\r\n <Table>\r\n <TableBody>\r\n {isEmpty ? (\r\n <TableRow>\r\n <TableCell colSpan={5} className=\"h-24 text-center text-muted-foreground text-xs\">\r\n <div className=\"flex flex-col items-center justify-center gap-2\">\r\n <Link2 className=\"w-6 h-6 opacity-20\" />\r\n <span className=\"opacity-50\">No custom endpoints configured</span>\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n ) : (\r\n endpoints.map(url => (\r\n <EndpointRow\r\n key={url}\r\n url={url}\r\n isSelected={selectedUrls.has(url)}\r\n onToggle={toggleSelect}\r\n onDelete={handleDelete}\r\n />\r\n ))\r\n )}\r\n </TableBody>\r\n </Table>\r\n </ScrollArea>\r\n {/* Bulk action bar */}\r\n <div className={clsx(\r\n selectedUrls.size > 0 ? \"flex justify-center items-center\" : \"hidden\",\r\n \"pt-2 relative transform translate-y-[-6px] px-4\"\r\n )}>\r\n <span className=\"text-xs text-muted-foreground\">{selectedUrls.size} selected</span>\r\n <div className=\"flex-1 flex justify-end gap-2\">\r\n <button\r\n onClick={handleDeleteSelected}\r\n className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:border-destructive/50 hover:text-destructive transition-colors\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n </div>\r\n {/* Toast */}\r\n {toast && (\r\n <div className=\"px-4 pb-1\">\r\n <Toast message={toast.message} type={toast.type} />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}","import { useState, useEffect, useCallback, memo, useRef, Fragment } from \"react\";\nimport {\n Trash2, Plus, ChevronDown, CheckCircle2, AlertCircle,\n Search, X, Copy, Server, Globe, Terminal, Check,\n ChevronRight, Wifi, Unplug, Radio,\n RotateCcw, Upload\n} from \"lucide-react\";\nimport { Checkbox } from \"./ui/checkbox\";\nimport { ScrollArea } from \"./ui/scroll-area\";\nimport { Table, TableBody, TableCell, TableRow } from \"./ui/table\";\nimport { Spinner } from \"./ui/spinner\";\nimport clsx from \"clsx\";\nimport { useSettings } from \"./useSettings\";\nimport { usePython } from \"./usePython\";\nimport { Switch } from \"./ui/switch\";\n\ntype McpTransport = \"webrtc\" | \"sse\" | \"http\" | \"websocket\" | \"stdio\";\ninterface IceServer {\n urls: string;\n username?: string;\n credential?: string;\n}\ninterface McpServerConfig {\n id: string;\n name: string;\n type: McpTransport;\n // stdio\n command?: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n // sse / http / websocket\n url?: string;\n headers?: Record<string, string>;\n // webrtc\n signalingUrl?: string;\n channelLabel?: string;\n iceServers?: IceServer[];\n // misc\n timeout?: number;\n enabled: boolean;\n}\n \n\nconst TRANSPORT_META: Record<McpTransport, { label: string; icon: React.ReactNode; color: string }> = {\n stdio: { label: \"stdio\", icon: <Terminal className=\"w-3 h-3\" />, color: \"text-violet-700 dark:text-violet-400\" },\n sse: { label: \"SSE\", icon: <Wifi className=\"w-3 h-3\" />, color: \"text-sky-700 dark:text-sky-400\" },\n http: { label: \"HTTP\", icon: <Globe className=\"w-3 h-3\" />, color: \"text-emerald-900 dark:text-emerald-400\" },\n websocket: { label: \"WebSocket\", icon: <Unplug className=\"w-3 h-3\" />, color: \"text-amber-700 dark:text-amber-400\" },\n webrtc: { label: \"WebRTC\", icon: <Radio className=\"w-3 h-3\" />, color: \"text-rose-700 dark:text-rose-400\" },\n};\n \ninterface McpTemplate {\n label: string;\n description: string;\n preset: Partial<McpServerConfig>;\n}\n\nconst MCP_TEMPLATES: McpTemplate[] = [\n {\n label: \"Filesystem\",\n description: \"Local file access via npx\",\n preset: { type: \"stdio\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/home/user\"] },\n },\n {\n label: \"Git\",\n description: \"Git repository operations\",\n preset: { type: \"stdio\", command: \"uvx\", args: [\"mcp-server-git\", \"--repository\", \"/path/to/repo\"] },\n },\n {\n label: \"PostgreSQL\",\n description: \"Database via connection string\",\n preset: { type: \"stdio\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-postgres\"], env: { POSTGRES_CONNECTION_STRING: \"postgresql://user:pass@localhost:5432/db\" } },\n },\n {\n label: \"Brave Search\",\n description: \"Web search via Brave API\",\n preset: { type: \"stdio\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-brave-search\"], env: { BRAVE_API_KEY: \"\" } },\n },\n {\n label: \"Puppeteer\",\n description: \"Browser automation\",\n preset: { type: \"stdio\", command: \"npx\", args: [\"-y\", \"@modelcontextprotocol/server-puppeteer\"] },\n },\n {\n label: \"Remote SSE\",\n description: \"Remote server via SSE\",\n preset: { type: \"sse\", url: \"https://mcp.example.com/mcp/sse\", headers: { Authorization: \"Bearer \" } },\n },\n {\n label: \"Remote HTTP\",\n description: \"Remote server via Streamable HTTP\",\n preset: { type: \"http\", url: \"https://mcp.example.com/mcp\", headers: { Authorization: \"Bearer \" } },\n },\n {\n label: \"WebSocket\",\n description: \"WebSocket-based MCP server\",\n preset: { type: \"websocket\", url: \"ws://localhost:8765\" },\n },\n {\n label: \"WebRTC\",\n description: \"Peer-to-peer via WebRTC data channel\",\n preset: {\n type: \"webrtc\",\n signalingUrl: \"wss://signal.example.com/\",\n channelLabel: \"mcp\",\n iceServers: [{ urls: \"stun:stun.l.google.com:19302\" }],\n },\n },\n {\n label: \"Custom stdio\",\n description: \"Run any local binary\",\n preset: { type: \"stdio\", command: \"\", args: [] },\n },\n];\n\n\nfunction generateId() {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction serverSummary(s: McpServerConfig): string {\n if (s.type === \"stdio\") return [s.command, ...(s.args ?? [])].filter(Boolean).join(\" \") || \"\";\n if (s.type === \"webrtc\") return s.signalingUrl ?? \"\";\n return s.url ?? \"\";\n}\n\nfunction parseImportedJson(parsed: any): McpServerConfig[] {\n const results: McpServerConfig[] = [];\n const sanitizeConfig = (key: string, val: any): McpServerConfig | null => {\n if (!val || typeof val !== \"object\") return null;\n const type = val.type;\n const validTransports: McpTransport[] = [\"webrtc\", \"sse\", \"http\", \"websocket\", \"stdio\"];\n if (!validTransports.includes(type)) return null;\n const name = (val.name || key || \"imported\").trim();\n if (!name) return null;\n const config: McpServerConfig = {\n id: generateId(),\n name: name,\n type: type,\n enabled: typeof val.enabled === \"boolean\" ? val.enabled : true,\n };\n if (type === \"stdio\") {\n if (typeof val.command === \"string\") {\n config.command = val.command;\n }\n if (Array.isArray(val.args)) {\n config.args = val.args.map((a: any) => String(a));\n }\n if (typeof val.cwd === \"string\") {\n config.cwd = val.cwd;\n }\n if (val.env && typeof val.env === \"object\") {\n config.env = {};\n for (const [ek, ev] of Object.entries(val.env)) {\n config.env[ek] = String(ev);\n }\n }\n } else if (type === \"webrtc\") {\n if (typeof val.signalingUrl === \"string\") {\n config.signalingUrl = val.signalingUrl;\n }\n if (typeof val.channelLabel === \"string\") {\n config.channelLabel = val.channelLabel;\n }\n if (Array.isArray(val.iceServers)) {\n config.iceServers = val.iceServers.map((ice: any) => {\n const item: IceServer = { urls: String(ice.urls || \"\") };\n if (ice.username) item.username = String(ice.username);\n if (ice.credential) item.credential = String(ice.credential);\n return item;\n });\n }\n } else {\n if (typeof val.url === \"string\") {\n config.url = val.url;\n }\n if (val.headers && typeof val.headers === \"object\") {\n config.headers = {};\n for (const [hk, hv] of Object.entries(val.headers)) {\n config.headers[hk] = String(hv);\n }\n }\n }\n if (typeof val.timeout === \"number\") {\n config.timeout = val.timeout;\n }\n return config;\n };\n let parsedAsDict = false;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n for (const [key, val] of Object.entries(parsed)) {\n if (val && typeof val === \"object\" && \"type\" in (val as any)) {\n const config = sanitizeConfig(key, val);\n if (config) {\n results.push(config);\n parsedAsDict = true;\n }\n }\n }\n }\n if (!parsedAsDict && parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n if (\"type\" in parsed) {\n const config = sanitizeConfig(parsed.name || \"imported-server\", parsed);\n if (config) {\n results.push(config);\n }\n }\n }\n return results;\n}\n\nfunction KVEditor({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: Record<string, string>;\n onChange: (v: Record<string, string>) => void;\n}) {\n const entries = Object.entries(value);\n const [newKey, setNewKey] = useState(\"\");\n const [newVal, setNewVal] = useState(\"\");\n const addEntry = () => {\n if (!newKey.trim()) return;\n onChange({ ...value, [newKey.trim()]: newVal });\n setNewKey(\"\"); setNewVal(\"\");\n };\n const remove = (k: string) => {\n const next = { ...value };\n delete next[k];\n onChange(next);\n };\n const updateVal = (k: string, v: string) => onChange({ ...value, [k]: v });\n return (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">{label}</span>\n {entries.map(([k, v]) => (\n <div key={k} className=\"flex gap-1.5 items-center\">\n <input\n readOnly\n value={k}\n className=\"w-[38%] px-2 py-1 rounded-md text-[11px] font-mono bg-accent/10 border border-[hsl(var(--chat-border))] text-muted-foreground focus:outline-none\"\n />\n <input\n value={v}\n onChange={e => updateVal(k, e.target.value)}\n placeholder=\"value\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n <button type=\"button\" onClick={() => remove(k)} className=\"text-muted-foreground hover:text-destructive transition-colors shrink-0\">\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n <div className=\"flex gap-1.5 items-center\">\n <input\n value={newKey}\n onChange={e => setNewKey(e.target.value)}\n placeholder=\"KEY\"\n onKeyDown={e => e.key === \"Enter\" && addEntry()}\n className=\"w-[38%] px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n <input\n value={newVal}\n onChange={e => setNewVal(e.target.value)}\n placeholder=\"value\"\n onKeyDown={e => e.key === \"Enter\" && addEntry()}\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n <button type=\"button\" onClick={addEntry} className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\">\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n );\n}\n\nfunction IceServersEditor({\n value,\n onChange,\n}: {\n value: IceServer[];\n onChange: (v: IceServer[]) => void;\n}) {\n const [draftUrls, setDraftUrls] = useState(\"\");\n const [draftUser, setDraftUser] = useState(\"\");\n const [draftCred, setDraftCred] = useState(\"\");\n const add = () => {\n if (!draftUrls.trim()) return;\n onChange([...value, { urls: draftUrls.trim(), username: draftUser || undefined, credential: draftCred || undefined }]);\n setDraftUrls(\"\"); setDraftUser(\"\"); setDraftCred(\"\");\n };\n const remove = (i: number) => onChange(value.filter((_, j) => j !== i));\n const update = (i: number, patch: Partial<IceServer>) => {\n const next = [...value];\n next[i] = { ...next[i], ...patch };\n onChange(next);\n };\n return (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">ICE servers</span>\n {value.map((ice, i) => (\n <div key={i} className=\"flex flex-col gap-1 p-2 rounded-md border border-[hsl(var(--chat-border))] bg-accent/5\">\n <div className=\"flex gap-1.5 items-center\">\n <span className=\"text-[10px] font-mono text-muted-foreground/40 w-5 text-right shrink-0\">{i}</span>\n <input\n value={ice.urls}\n onChange={e => update(i, { urls: e.target.value })}\n placeholder=\"stun:stun.l.google.com:19302\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n <button type=\"button\" onClick={() => remove(i)} className=\"text-muted-foreground hover:text-destructive transition-colors shrink-0\">\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n <div className=\"flex gap-1.5 pl-7\">\n <input\n value={ice.username ?? \"\"}\n onChange={e => update(i, { username: e.target.value || undefined })}\n placeholder=\"username (optional)\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n <input\n value={ice.credential ?? \"\"}\n onChange={e => update(i, { credential: e.target.value || undefined })}\n placeholder=\"credential (optional)\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n </div>\n </div>\n ))}\n {/* Add row */}\n <div className=\"flex flex-col gap-1 p-2 rounded-md border border-dashed border-[hsl(var(--chat-border))]\">\n <div className=\"flex gap-1.5 items-center\">\n <span className=\"text-[10px] font-mono text-muted-foreground/40 w-5 text-right shrink-0\">{value.length}</span>\n <input\n value={draftUrls}\n onChange={e => setDraftUrls(e.target.value)}\n onKeyDown={e => e.key === \"Enter\" && add()}\n placeholder=\"stun:… or turn:…\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n <button type=\"button\" onClick={add} className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\">\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n <div className=\"flex gap-1.5 pl-7\">\n <input\n value={draftUser}\n onChange={e => setDraftUser(e.target.value)}\n placeholder=\"username (optional)\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n <input\n value={draftCred}\n onChange={e => setDraftCred(e.target.value)}\n placeholder=\"credential (optional)\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ArgsEditor({ value, onChange }: { value: string[]; onChange: (v: string[]) => void }) {\n const [draft, setDraft] = useState(\"\");\n const add = () => {\n if (!draft.trim()) return;\n onChange([...value, draft.trim()]);\n setDraft(\"\");\n };\n const remove = (i: number) => onChange(value.filter((_, j) => j !== i));\n const update = (i: number, v: string) => {\n const next = [...value];\n next[i] = v;\n onChange(next);\n };\n return (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">args</span>\n {value.map((arg, i) => (\n <div key={i} className=\"flex gap-1.5 items-center\">\n <span className=\"text-[10px] font-mono text-muted-foreground/40 w-5 text-right shrink-0\">{i}</span>\n <input\n value={arg}\n onChange={e => update(i, e.target.value)}\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n <button type=\"button\" onClick={() => remove(i)} className=\"text-muted-foreground hover:text-destructive transition-colors shrink-0\">\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n <div className=\"flex gap-1.5 items-center\">\n <span className=\"text-[10px] font-mono text-muted-foreground/40 w-5 text-right shrink-0\">{value.length}</span>\n <input\n value={draft}\n onChange={e => setDraft(e.target.value)}\n onKeyDown={e => e.key === \"Enter\" && add()}\n placeholder=\"add argument…\"\n className=\"flex-1 px-2 py-1 rounded-md text-[11px] font-mono bg-background border border-dashed border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50 placeholder:text-muted-foreground/40\"\n />\n <button type=\"button\" onClick={add} className=\"text-muted-foreground hover:text-foreground transition-colors shrink-0\">\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n );\n}\n \n\nfunction Field({\n label, value, onChange, placeholder, mono = true,\n}: {\n label: string; value: string; onChange: (v: string) => void;\n placeholder?: string; mono?: boolean;\n}) {\n return (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">{label}</span>\n <input\n value={value}\n onChange={e => onChange(e.target.value)}\n placeholder={placeholder}\n className={clsx(\n \"w-full px-2 py-1.5 rounded-md text-[11px] bg-background\",\n \"border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\",\n mono && \"font-mono\"\n )}\n />\n </div>\n );\n}\n\nfunction WebRtcFields({\n draft,\n upd,\n}: {\n draft: McpServerConfig;\n upd: (patch: Partial<McpServerConfig>) => void;\n}) {\n return (\n <>\n <Field\n label=\"WebSocket Signaling URL\"\n value={draft.signalingUrl ?? \"\"}\n onChange={v => upd({ signalingUrl: v })}\n placeholder=\"wss://server.com/\"\n />\n <Field\n label=\"data channel label\"\n value={draft.channelLabel ?? \"\"}\n onChange={v => upd({ channelLabel: v || undefined })}\n placeholder=\"mcp\"\n />\n <IceServersEditor\n value={draft.iceServers ?? []}\n onChange={v => upd({ iceServers: v })}\n />\n </>\n );\n}\n\nfunction EditPanel({\n server,\n onSave,\n onCancel,\n}: {\n server: McpServerConfig;\n onSave: (s: McpServerConfig) => void;\n onCancel: () => void;\n}) {\n const [draft, setDraft] = useState<McpServerConfig>({ ...server });\n const upd = (patch: Partial<McpServerConfig>) => setDraft(d => ({ ...d, ...patch }));\n const isRemote = draft.type !== \"stdio\";\n const isWebRtc = draft.type === \"webrtc\";\n return (\n <div className=\"flex flex-col gap-3 px-4 py-3 bg-accent/5 border-t border-[hsl(var(--chat-border))]\">\n {/* Name + Transport row */}\n <div className=\"grid grid-cols-2 gap-2\">\n <Field label=\"name\" value={draft.name} onChange={v => upd({ name: v })} placeholder=\"my-server\" />\n {/* Transport selector */}\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">transport</span>\n <div className=\"grid grid-cols-5 gap-1\">\n {(Object.keys(TRANSPORT_META) as McpTransport[]).map(t => {\n const m = TRANSPORT_META[t];\n return (\n <button\n key={t}\n type=\"button\"\n onClick={() => upd({ type: t })}\n className={clsx(\n \"flex items-center justify-center gap-1 py-1 rounded-md text-[10px] border transition-colors\",\n draft.type === t\n ? `border-accent/50 bg-accent/20 ${m.color}`\n : \"border-[hsl(var(--chat-border))] text-muted-foreground hover:bg-accent/10\"\n )}\n >\n {m.icon} {m.label}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n {/* stdio fields */}\n {!isRemote && (\n <>\n <Field label=\"command\" value={draft.command ?? \"\"} onChange={v => upd({ command: v })} placeholder=\"npx / uvx / python / node\" />\n <ArgsEditor value={draft.args ?? []} onChange={v => upd({ args: v })} />\n <Field label=\"cwd (optional)\" value={draft.cwd ?? \"\"} onChange={v => upd({ cwd: v || undefined })} placeholder=\"/path/to/working/dir\" />\n <KVEditor label=\"env\" value={draft.env ?? {}} onChange={v => upd({ env: v })} />\n </>\n )}\n {/* remote fields (sse / http / websocket) */}\n {isRemote && !isWebRtc && (\n <>\n <Field label=\"url\" value={draft.url ?? \"\"} onChange={v => upd({ url: v })} placeholder={draft.type === \"websocket\" ? \"ws://mcp.example.com/mcp/ws\" : draft.type === \"sse\" ? \"https://mcp.example.com/mcp/sse\" : \"https://mcp.example.com/mcp\"} />\n <KVEditor label=\"headers\" value={draft.headers ?? {}} onChange={v => upd({ headers: v })} />\n </>\n )}\n {/* webrtc fields */}\n {isWebRtc && <WebRtcFields draft={draft} upd={upd} />}\n {/* Timeout + disabled */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">timeout (ms)</span>\n <input\n type=\"number\"\n value={draft.timeout ?? \"\"}\n onChange={e => upd({ timeout: e.target.value ? Number(e.target.value) : undefined })}\n placeholder=\"30000\"\n className=\"w-full px-2 py-1.5 rounded-md text-[11px] font-mono bg-background border border-[hsl(var(--chat-border))] focus:outline-none focus:ring-1 focus:ring-accent/50\"\n />\n </div>\n </div>\n {/* Actions */}\n <div className=\"flex justify-end gap-2 pt-1 border-t border-[hsl(var(--chat-border))]\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-4 py-1.5 text-xs rounded-full border border-[hsl(var(--chat-border))] hover:bg-accent/10 transition-colors text-muted-foreground\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => onSave(draft)}\n className=\"px-4 py-1.5 text-xs rounded-full border border-accent/50 bg-accent/20 hover:bg-accent/30 transition-colors flex items-center gap-1.5\"\n >\n <Check className=\"w-3 h-3\" /> Save\n </button>\n </div>\n </div>\n );\n}\n \n\nconst ServerRow = memo(({\n enabled, server, isSelected, isExpanded, onToggle, onExpand, onDelete, onToggleEnabled, mcpStatus\n}: {\n server: McpServerConfig;\n enabled: boolean;\n isSelected: boolean;\n isExpanded: boolean;\n onToggle: (id: string) => void;\n onExpand: (id: string) => void;\n onDelete: (id: string) => void;\n onToggleEnabled: (id: string, enabled: boolean) => void;\n mcpStatus?: string | undefined;\n}) => {\n const { pyInvoke } = usePython()\n return (\n <TableRow\n className={clsx(\n \"border-accent/5 transition-colors h-12 group cursor-pointer\",\n isExpanded ? \"bg-accent/10 hover:bg-accent/10\" : \"hover:bg-accent/5\"\n )}\n onClick={() => onExpand(server.id)}\n >\n {/* Checkbox */}\n <TableCell className=\"w-10 cursor-default\" onClick={e => { e.stopPropagation(); onToggle(server.id); }}>\n <Checkbox checked={isSelected} onCheckedChange={() => onToggle(server.id)} />\n </TableCell>\n {/* Name */}\n <TableCell className=\"font-mono text-xs font-medium max-w-[120px] truncate\">\n <span>\n {server.name}\n </span>\n </TableCell>\n {/* Summary */}\n <TableCell className=\"font-mono text-[10px] text-muted-foreground max-w-[200px] truncate select-none\">\n {serverSummary(server)}\n </TableCell>\n <TableCell className=\"w-[150px] select-none\">\n <span className={clsx(\n \"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-medium font-mono tracking-wide border\",\n mcpStatus === \"connected\" && [\n \"bg-green-500/10 text-green-600 border-green-500/20\",\n \"dark:bg-green-500/15 dark:text-green-400 dark:border-green-500/25\"\n ],\n mcpStatus === \"connecting\" && [\n \"bg-yellow-500/10 text-yellow-600 border-yellow-500/20\",\n \"dark:bg-yellow-500/15 dark:text-yellow-400 dark:border-yellow-500/25\"\n ],\n mcpStatus === \"error\" && [\n \"bg-red-500/10 text-red-600 border-red-500/20\",\n \"dark:bg-red-500/15 dark:text-red-400 dark:border-red-500/25\"\n ],\n (mcpStatus === \"disconnected\" || mcpStatus === \"disconnecting\") && [\n \"bg-muted text-muted-foreground border-border\",\n ],\n )}>\n {/* Dot indicator */}\n <span className={clsx(\n \"size-1.5 rounded-full shrink-0\",\n mcpStatus === \"connected\" && \"bg-green-500\",\n mcpStatus === \"connecting\" && \"bg-yellow-500 animate-pulse\",\n mcpStatus === \"error\" && \"bg-red-500\",\n (mcpStatus === \"disconnected\" || mcpStatus === \"disconnecting\") && \"bg-muted-foreground/50\",\n )} />\n {mcpStatus ?? \"\"}\n </span>\n </TableCell>\n <TableCell className=\"w-[50px]\">\n <div className=\"\">\n <Switch\n checked={enabled}\n onCheckedChange={(checked) => {\n onToggleEnabled(server.id, checked);\n }}\n onClick={(e) => {\n e.stopPropagation()\n }} />\n </div>\n </TableCell>\n <TableCell className=\"font-mono text-[10px] w-[50px] text-muted-foreground truncate select-none\">\n {!isExpanded && <div className=\"hover:bg-[hsl(var(--hover))] w-fit p-1.5 rounded-full cursor-pointer translate-y-[-2px]\"\n onClick={e => {\n e.stopPropagation();\n (async () => {\n await pyInvoke(\"mcp/reload\", {\n \"server_name\": server.name\n })\n })()\n }}\n >\n <RotateCcw className=\"w-4 h-4\" />\n </div>}\n </TableCell>\n {/* Expand chevron + actions */}\n <TableCell className=\"w-24 text-right pr-3\">\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"opacity-0 group-hover:opacity-100 inline-flex items-center gap-2 transition-opacity\">\n <button\n className=\"hover:text-destructive text-muted-foreground transition-colors\"\n onClick={e => { e.stopPropagation(); onDelete(server.id); }}\n title=\"Delete\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </span>\n <ChevronRight className={clsx(\n \"w-3.5 h-3.5 text-muted-foreground/40 transition-transform\",\n isExpanded && \"rotate-90\"\n )} />\n </span>\n </TableCell>\n </TableRow>\n );\n});\n\nfunction AddServerForm({\n onAdd,\n onCancel,\n}: {\n onAdd: (s: McpServerConfig) => void;\n onCancel: () => void;\n}) {\n const [selected, setSelected] = useState<McpTemplate | null>(null);\n const [search, setSearch] = useState(\"\");\n const [open, setOpen] = useState(false);\n const [focusedIdx, setFocusedIdx] = useState(-1);\n const searchRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n const [draft, setDraft] = useState<McpServerConfig>({ id: generateId(), name: \"\", type: \"stdio\", enabled: true });\n const filtered = MCP_TEMPLATES.filter(t =>\n t.label.toLowerCase().includes(search.toLowerCase()) ||\n t.description.toLowerCase().includes(search.toLowerCase())\n );\n const handlePick = (t: McpTemplate) => {\n setSelected(t);\n setOpen(false);\n setSearch(\"\");\n setFocusedIdx(-1);\n setDraft(d => ({\n id: d.id,\n name: t.label.toLowerCase().replace(/\\s+/g, \"-\"),\n ...t.preset,\n } as McpServerConfig));\n };\n const handleOpen = () => {\n setOpen(o => {\n if (!o) { setSearch(\"\"); setFocusedIdx(-1); setTimeout(() => searchRef.current?.focus(), 10); }\n return !o;\n });\n };\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) { setOpen(false); }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, []);\n useEffect(() => {\n if (focusedIdx < 0 || !listRef.current) return;\n listRef.current.querySelectorAll<HTMLButtonElement>(\"[data-item]\")[focusedIdx]?.scrollIntoView({ block: \"nearest\" });\n }, [focusedIdx]);\n const upd = (patch: Partial<McpServerConfig>) => setDraft(d => ({ ...d, ...patch }));\n const isRemote = draft.type !== \"stdio\";\n const isWebRtc = draft.type === \"webrtc\";\n const isValid = draft.name.trim() && (\n isWebRtc\n ? !!draft.signalingUrl?.trim()\n : isRemote\n ? !!draft.url?.trim()\n : !!draft.command?.trim()\n );\n return (\n <div className=\"flex flex-col gap-3 p-4 border border-[hsl(var(--chat-border))] rounded-xl bg-accent/5 mx-auto w-[97.5%]\">\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide\">Add MCP Server</p>\n {/* Template picker */}\n <div ref={wrapRef} className=\"relative\">\n <button\n type=\"button\"\n onClick={handleOpen}\n className={clsx(\n \"w-full flex items-center justify-between px-3 py-2 rounded-lg text-sm\",\n \"border border-[hsl(var(--chat-border))] bg-background hover:bg-accent/10 transition-colors\",\n open && \"rounded-b-none border-b-0\"\n )}\n >\n <span className={selected ? \"text-foreground\" : \"text-muted-foreground\"}>\n {selected ? selected.label : \"Start from template…\"}\n </span>\n <ChevronDown className={clsx(\"w-4 h-4 text-muted-foreground transition-transform\", open && \"rotate-180\")} />\n </button>\n {open && (\n <div className=\"absolute z-50 w-full rounded-b-lg border border-t-0 border-[hsl(var(--chat-border))] bg-background shadow-lg\">\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-[hsl(var(--chat-border))]\">\n <Search className=\"w-3.5 h-3.5 text-muted-foreground shrink-0\" />\n <input\n ref={searchRef}\n type=\"text\"\n value={search}\n onChange={e => { setSearch(e.target.value); setFocusedIdx(-1); }}\n onKeyDown={e => {\n if (e.key === \"ArrowDown\") { e.preventDefault(); setFocusedIdx(i => Math.min(i + 1, filtered.length - 1)); }\n else if (e.key === \"ArrowUp\") { e.preventDefault(); setFocusedIdx(i => Math.max(i - 1, 0)); }\n else if (e.key === \"Enter\" && focusedIdx >= 0) { e.preventDefault(); handlePick(filtered[focusedIdx]); }\n else if (e.key === \"Escape\") setOpen(false);\n }}\n placeholder=\"Search templates…\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground/50\"\n />\n {search && (\n <button type=\"button\" onClick={() => { setSearch(\"\"); searchRef.current?.focus(); }} className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n <div ref={listRef} className=\"max-h-52 overflow-y-auto\">\n {filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">No templates found</div>\n ) : filtered.map((t, i) => {\n const meta = TRANSPORT_META[t.preset.type as McpTransport ?? \"stdio\"];\n return (\n <button\n key={t.label}\n data-item\n type=\"button\"\n onClick={() => handlePick(t)}\n onMouseEnter={() => setFocusedIdx(i)}\n className={clsx(\n \"w-full text-left px-3 py-2 text-sm transition-colors flex items-center justify-between gap-2\",\n (selected?.label === t.label || i === focusedIdx) && \"bg-accent/20\",\n selected?.label === t.label && \"font-medium\"\n )}\n >\n <span className=\"flex flex-col gap-0.5\">\n <span>{t.label}</span>\n <span className=\"text-[10px] text-muted-foreground/60\">{t.description}</span>\n </span>\n <span className={clsx(\"inline-flex items-center gap-1 text-[10px] font-mono shrink-0\", meta.color)}>\n {meta.icon} {meta.label}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n {/* Name + Transport */}\n <div className=\"grid grid-cols-2 gap-2\">\n <Field label=\"name\" value={draft.name} onChange={v => upd({ name: v })} placeholder=\"my-mcp-server\" />\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] font-mono text-muted-foreground uppercase tracking-wide\">transport</span>\n <div className=\"grid grid-cols-5 gap-1\">\n {(Object.keys(TRANSPORT_META) as McpTransport[]).map(t => {\n const m = TRANSPORT_META[t];\n return (\n <button key={t} type=\"button\" onClick={() => upd({ type: t })}\n className={clsx(\n \"flex items-center justify-center gap-1 py-1 rounded-md text-[10px] border transition-colors\",\n draft.type === t\n ? `border-accent/50 bg-accent/20 ${m.color}`\n : \"border-[hsl(var(--chat-border))] text-muted-foreground hover:bg-accent/10\"\n )}>\n {m.icon} {m.label}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n {/* stdio */}\n {!isRemote && (\n <>\n <Field label=\"command\" value={draft.command ?? \"\"} onChange={v => upd({ command: v })} placeholder=\"npx / uvx / python / node\" />\n <ArgsEditor value={draft.args ?? []} onChange={v => upd({ args: v })} />\n <Field label=\"cwd (optional)\" value={draft.cwd ?? \"\"} onChange={v => upd({ cwd: v || undefined })} placeholder=\"/working/directory\" />\n <KVEditor label=\"env\" value={draft.env ?? {}} onChange={v => upd({ env: v })} />\n </>\n )}\n {/* remote (sse / http / websocket) */}\n {isRemote && !isWebRtc && (\n <>\n <Field label=\"url\" value={draft.url ?? \"\"} onChange={v => upd({ url: v })} placeholder={draft.type === \"websocket\" ? \"ws://mcp.example.com/mcp/ws\" : draft.type === \"sse\" ? \"https://mcp.example.com/mcp/sse\" : \"https://mcp.example.com/mcp\"} />\n <KVEditor label=\"headers\" value={draft.headers ?? {}} onChange={v => upd({ headers: v })} />\n </>\n )}\n {/* webrtc */}\n {isWebRtc && <WebRtcFields draft={draft} upd={upd} />}\n {/* Actions */}\n <div className=\"flex justify-end gap-2 pt-1\">\n <button type=\"button\" onClick={onCancel}\n className=\"px-4 py-1.5 text-sm rounded-full border border-[hsl(var(--chat-border))] hover:bg-accent/10 transition-colors disabled:opacity-50\">\n Cancel\n </button>\n <button type=\"button\" onClick={() => {\n if (isValid) {\n onAdd(draft)\n }\n }} disabled={!isValid}\n className={clsx(\n \"px-4 py-1.5 text-sm rounded-full border transition-colors flex items-center gap-1.5\",\n isValid\n ? \"border-accent bg-accent/20 hover:bg-accent/30 text-foreground\"\n : \"border-[hsl(var(--chat-border))] opacity-40 cursor-not-allowed\"\n )}>\n <Plus className=\"w-3.5 h-3.5\" /> Add Server\n </button>\n </div>\n </div>\n );\n}\n\n\nfunction Toast({ message, type }: { message: string; type: \"success\" | \"error\" }) {\n return (\n <div className={clsx(\n \"flex items-center gap-2 px-3 py-2 rounded-lg text-xs animate-in fade-in slide-in-from-bottom-2 duration-200\",\n type === \"success\" ? \"bg-green-500/10 text-green-600 border border-green-500/20\"\n : \"bg-destructive/10 text-destructive border border-destructive/20\"\n )}>\n {type === \"success\" ? <CheckCircle2 className=\"w-3.5 h-3.5\" /> : <AlertCircle className=\"w-3.5 h-3.5\" />}\n {message}\n </div>\n );\n}\n \n\nexport default function McpServers({ isOpen, mcpStatuses }: { isOpen: boolean, mcpStatuses: Record<string, \"connected\" | \"disconnected\" | \"disconnecting\" | \"connecting\" | \"error\"> }) {\n const { settings, updateSetting, loading } = useSettings();\n const { pyInvoke } = usePython();\n const [servers, setServers] = useState<McpServerConfig[]>([]);\n const [adding, setAdding] = useState(false);\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [toast, setToast] = useState<{ message: string; type: \"success\" | \"error\" } | null>(null);\n // Guard so we only parse settings into local state ONCE per panel open.\n // Without this, every optimistic write from saveServersToBackend triggers\n // the useEffect again, overwriting in-progress local edits.\n const initializedRef = useRef(false);\n const showToast = useCallback((message: string, type: \"success\" | \"error\" = \"success\") => {\n setToast({ message, type });\n setTimeout(() => setToast(null), 2500);\n }, []);\n // Load from settings \n // Runs when the panel opens. The initializedRef gate prevents re-runs from\n // the optimistic settings updates written by saveServersToBackend.\n useEffect(() => {\n if (!isOpen) {\n // Reset so the next open always gets a fresh read.\n initializedRef.current = false;\n return;\n }\n // Wait until the settings hook has finished its initial fetch.\n if (loading || initializedRef.current) return;\n const raw = settings[\"Others/app_settings/mcp.servers\"]?.value;\n const parsed: McpServerConfig[] = [];\n for (const [name, config] of Object.entries((raw as Record<string, any>) ?? {})) {\n parsed.push({\n id: name,\n name,\n type: \"stdio\" as McpTransport,\n ...(config as object),\n } as McpServerConfig);\n }\n setServers(parsed);\n initializedRef.current = true;\n }, [isOpen, loading, settings]);\n // Persist \n // Build the on-disk dict (keyed by server name, no React `id` field) and\n // push to the backend. Called OUTSIDE setState callbacks to avoid the\n // React anti-pattern of triggering side-effects from inside a state updater.\n const saveServersToBackend = useCallback(async (nextServers: McpServerConfig[]) => {\n const payload: Record<string, any> = {};\n for (const s of nextServers) {\n const { id: _id, name, ...rest } = s;\n payload[name] = rest;\n }\n const ok = await updateSetting(\"Others/app_settings/mcp.servers\", payload);\n if (!ok) showToast(\"Failed to save check backend logs\", \"error\");\n }, [updateSetting, showToast]);\n // CRUD \n const handleAdd = useCallback((s: McpServerConfig) => {\n const next = [...servers, { ...s, enabled: true }];\n setServers(next);\n saveServersToBackend(next);\n setAdding(false);\n setExpandedId(null);\n showToast(`Added \"${s.name}\"`);\n }, [servers, saveServersToBackend, showToast]);\n const handleUpdate = useCallback((updated: McpServerConfig) => {\n const next = servers.map(s => s.id === updated.id ? updated : s);\n setServers(next);\n saveServersToBackend(next);\n setExpandedId(null);\n showToast(`Saved \"${updated.name}\"`);\n }, [servers, saveServersToBackend, showToast]);\n const handleToggleEnabled = useCallback((id: string, enabled: boolean) => {\n const next = servers.map(s => s.id === id ? { ...s, enabled } : s);\n setServers(next);\n saveServersToBackend(next);\n }, [servers, saveServersToBackend]);\n const handleDelete = useCallback((id: string) => {\n const target = servers.find(x => x.id === id);\n const next = servers.filter(x => x.id !== id);\n setServers(next);\n saveServersToBackend(next);\n setSelectedIds(prev => { const n = new Set(prev); n.delete(id); return n; });\n setExpandedId(p => p === id ? null : p);\n if (target) showToast(`Deleted \"${target.name}\"`);\n }, [servers, saveServersToBackend, showToast]);\n const handleDeleteSelected = useCallback(() => {\n const ids = Array.from(selectedIds);\n const next = servers.filter(s => !ids.includes(s.id));\n setServers(next);\n saveServersToBackend(next);\n setSelectedIds(new Set());\n showToast(`Deleted ${ids.length} server(s)`);\n }, [servers, selectedIds, saveServersToBackend, showToast]);\n const handleCopySelected = useCallback(() => {\n const selected = servers.filter(s => selectedIds.has(s.id));\n if (selected.length === 0) return;\n const payload: Record<string, any> = {};\n for (const s of selected) {\n const { id: _id, name, ...rest } = s;\n payload[name] = rest;\n }\n navigator.clipboard.writeText(JSON.stringify(payload, null, 2));\n showToast(`Copied ${selected.length} server(s)`);\n }, [servers, selectedIds, showToast]);\n const handleReloadSelected = useCallback(async () => {\n const selected = servers.filter(s => selectedIds.has(s.id));\n if (selected.length === 0) return;\n try {\n await Promise.all(\n selected.map(s =>\n pyInvoke(\"mcp/reload\", { \"server_name\": s.name })\n )\n );\n showToast(`Reloaded ${selected.length} server(s)`);\n } catch (err: any) {\n showToast(\"Failed to reload some servers\", \"error\");\n }\n }, [servers, selectedIds, pyInvoke, showToast]);\n const handleImportJSON = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = async (event) => {\n try {\n const text = event.target?.result;\n if (typeof text !== \"string\") return;\n let parsed: any;\n try {\n parsed = JSON.parse(text.trim());\n } catch (firstErr) {\n try {\n parsed = JSON.parse(`{ ${text.trim()} }`);\n } catch (secErr) {\n throw firstErr;\n }\n }\n const imported = parseImportedJson(parsed);\n if (imported.length === 0) {\n alert(\"No valid MCP server configurations found in the JSON.\");\n return;\n }\n setServers(prev => {\n const next = [...prev];\n for (const imp of imported) {\n const idx = next.findIndex(s => s.name === imp.name);\n if (idx >= 0) {\n next[idx] = imp;\n } else {\n next.push(imp);\n }\n }\n saveServersToBackend(next);\n return next;\n });\n showToast(`Successfully imported ${imported.length} server(s)`);\n } catch (err: any) {\n alert(\"Invalid JSON: \" + err.message);\n }\n };\n reader.readAsText(file);\n e.target.value = \"\";\n };\n // Selection \n const toggleSelect = useCallback((id: string) => {\n setSelectedIds(prev => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n; });\n }, []);\n const toggleSelectAll = useCallback(() => {\n setSelectedIds(prev =>\n prev.size === servers.length && servers.length > 0 ? new Set() : new Set(servers.map(s => s.id))\n );\n }, [servers]);\n const allSelected = servers.length > 0 && selectedIds.size === servers.length;\n const isEmpty = servers.length === 0;\n return (\n <div className=\"flex flex-col gap-2 h-full pt-10\">\n {/* Header */}\n <div className=\"flex justify-center items-center w-[97.5%] mx-auto px-2\">\n <div className=\"w-6\">\n <Checkbox checked={allSelected} onCheckedChange={toggleSelectAll} />\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={() => document.getElementById(\"import-mcp-file\")?.click()}\n className=\"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs border border-[hsl(var(--chat-border))] hover:bg-accent/10 text-muted-foreground hover:text-foreground transition-colors mr-2 animate-in fade-in\"\n >\n <Upload className=\"w-3.5 h-3.5\" /> Import JSON\n </button>\n <input\n type=\"file\"\n id=\"import-mcp-file\"\n accept=\".json\"\n className=\"hidden\"\n onChange={handleImportJSON}\n />\n <button\n type=\"button\"\n onClick={() => setAdding(a => !a)}\n className={clsx(\n \"flex items-center gap-1.5 px-3 py-1 rounded-full text-xs border transition-colors\",\n adding\n ? \"bg-accent/20 border-accent/50 text-foreground\"\n : \"border-[hsl(var(--chat-border))] hover:bg-accent/10 text-muted-foreground hover:text-foreground\"\n )}\n >\n <Plus className=\"w-3.5 h-3.5\" /> Add\n </button>\n </div>\n {/* Add form */}\n {adding && (\n <AddServerForm onAdd={handleAdd} onCancel={() => setAdding(false)} />\n )}\n {/* Table */}\n <ScrollArea className=\"flex-1 -mx-6 w-[97.5%] mx-auto border-t border-b border-[hsl(var(--chat-border))]\">\n <Table>\n <TableBody>\n {isEmpty ? (\n <TableRow>\n <TableCell colSpan={5} className=\"h-24 text-center text-muted-foreground text-xs\">\n <div className=\"flex flex-col items-center justify-center gap-2\">\n {loading\n ? <><Spinner /><span>Loading…</span></>\n : <>\n <Server className=\"w-6 h-6 opacity-20\" />\n <span className=\"opacity-50\">No MCP servers configured</span>\n </>}\n </div>\n </TableCell>\n </TableRow>\n ) : (\n servers.map(server => (\n <Fragment key={server.id}>\n <ServerRow\n enabled={server.enabled}\n server={server}\n isSelected={selectedIds.has(server.id)}\n isExpanded={expandedId === server.id}\n onToggle={toggleSelect}\n onExpand={id => setExpandedId(prev => prev === id ? null : id)}\n onDelete={handleDelete}\n onToggleEnabled={handleToggleEnabled}\n mcpStatus={mcpStatuses[server.name]}\n />\n {expandedId === server.id && (\n <TableRow key={`${server.id}-edit`} className=\"hover:bg-transparent\">\n <TableCell colSpan={7} className=\"p-0\">\n <EditPanel\n server={server}\n onSave={handleUpdate}\n onCancel={() => setExpandedId(null)}\n />\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n ))\n )}\n </TableBody>\n </Table>\n {loading && servers.length > 0 && (\n <div className=\"flex justify-center items-center gap-2 py-3 text-xs text-muted-foreground\">\n <Spinner /><span>Refreshing…</span>\n </div>\n )}\n </ScrollArea>\n {/* Bulk bar */}\n <div className={clsx(\n selectedIds.size > 0 ? \"flex justify-center items-center\" : \"hidden\",\n \"pt-2 relative transform translate-y-[-6px] px-4 animate-in slide-in-from-bottom-2 duration-200\"\n )}>\n <span className=\"text-xs text-muted-foreground\">{selectedIds.size} selected</span>\n <div className=\"flex-1 flex justify-end gap-2\">\n <div className=\"pr-2\">\n <button\n onClick={handleReloadSelected}\n className=\"p-2 bg-accent text-accent-foreground border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:bg-accent/75 transition-colors flex items-center justify-center gap-1\"\n >\n <RotateCcw className=\"w-3.5 h-3.5\" /> Reload\n </button>\n </div>\n <button\n onClick={handleCopySelected}\n className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:bg-accent/10 transition-colors flex items-center justify-center gap-1\"\n >\n <Copy className=\"w-3.5 h-3.5\" /> Copy\n </button>\n <button\n onClick={handleDeleteSelected}\n className=\"p-2 border border-[hsl(var(--chat-border))] rounded-full w-20 text-sm hover:border-destructive/50 hover:text-destructive transition-colors flex items-center justify-center gap-1\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" /> Delete\n </button>\n </div>\n </div>\n {/* Toast */}\n {toast && (\n <div className=\"px-4 pb-1\">\n <Toast message={toast.message} type={toast.type} />\n </div>\n )}\n </div>\n );\n}","\"use client\"\nimport clsx from \"clsx\"\nimport { Aspan } from \"./animated\"\nimport { motion, AnimatePresence } from \"motion/react\"\nimport { useRef, useState, useEffect, Fragment, useCallback } from \"react\"\nimport { ChevronDown, GitBranch, Plus, Settings, X, Pin, ChevronRight, ArrowLeftRight, Key, HardDrive, Globe } from \"lucide-react\"\nimport { Dialog as DialogUI, DialogContent, DialogHeader, DialogTitle } from \"./ui/dialog\"\nimport { Dropdown } from \"./dropdown\"\nimport { TabState, addTab, TabInfo, reorderTabsInGroup, deleteTabWithGroupSelection, setTabGroup, type ITab, Theme, } from '../utils/state'\nimport { useSnapshot } from 'valtio'\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\n\nimport { CSS } from '@dnd-kit/utilities';\nimport { restrictToVerticalAxis, restrictToParentElement } from '@dnd-kit/modifiers';\nimport { IconPopover } from \"./iconPopover\"\nimport { useDatabaseImpl } from \"./useDatabase\"\nimport { Search } from \"lucide-react\"\nimport { open } from '@tauri-apps/plugin-dialog';\nimport { useSettings, type SettingItem } from \"./useSettings\"\nimport { usePython, usePythonEvent } from \"./usePython\"\nimport SearchTab from \"./SearchTab\"\nimport SettingsMenu from \"./settings-menu\"\nimport Credentials from \"./credentials\"\nimport LocalModel from \"./localmodel\"\nimport CustomEndpoint from \"./customendpoint\"\nimport { openUrl } from '@tauri-apps/plugin-opener'\nimport McpServers from \"./mcp\"\n\n// Sortable Tab Item Component\ninterface SortableTabItemProps {\n defaultTitle: string;\n isPinned: boolean;\n id: string;\n icon: React.ReactNode;\n title: string | null;\n index: number;\n isCollapsible: boolean;\n isCollapsedSidebar: boolean;\n hoveredTabId: string | null;\n onMouseEnter: (id: string, e: React.MouseEvent<HTMLDivElement>) => void;\n onMouseLeave: () => void;\n onContextMenu: (id: string, e: React.MouseEvent<HTMLDivElement>) => void;\n onDelete: () => void;\n isActive: boolean;\n onClick: () => void;\n}\n\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\nasync function selectModel() {\n // Open a selection dialog for image files\n const file = await open({\n multiple: true,\n directory: false,\n filters: [{\n name: 'Model',\n extensions: ['gguf', 'mlx']\n }]\n });\n if (file === null) {\n // User cancelled the selection\n } else {\n // file is a string containing the path (or an array if multiple: true)\n return file\n }\n}\n\nfunction SortableTabItem({ defaultTitle, isPinned, id, icon, title, isCollapsedSidebar, hoveredTabId, isActive, onMouseEnter, onMouseLeave, onContextMenu, onDelete, onClick }: SortableTabItemProps) {\n const divRef = useRef<HTMLDivElement | null>(null);\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n const isHovered = hoveredTabId === id;\n // Combine refs\n const combinedRef = (node: HTMLDivElement | null) => {\n divRef.current = node;\n setNodeRef(node);\n };\n return (\n <div\n key={id}\n ref={combinedRef}\n style={style}\n onMouseEnter={(e) => onMouseEnter(id, e)}\n onMouseLeave={onMouseLeave}\n onContextMenu={(e) => onContextMenu(id, e)}\n onClick={onClick}\n className={clsx(\n \"w-full h-[36px] flex items-center gap-1 rounded-lg text-sm transition-colors relative group\",\n (isActive) ? \"bg-neutral-300 dark:bg-[hsl(var(--hover))]\" : isHovered ? \"bg-neutral-200 dark:bg-[hsl(var(--hover))]/50\" : \"\",\n )}\n data-tab-id={id}\n >\n {/* Drag Handle and Content */}\n <div\n {...attributes}\n {...listeners}\n className=\"flex items-center gap-3 flex-1 min-w-0 cursor-pointer active:cursor-grabbing\"\n >\n {icon}\n <Aspan isCollapsed={isCollapsedSidebar} className=\"truncate flex-1 min-w-0 block\">{title || defaultTitle}</Aspan>\n </div>\n {/* Delete Button - Expanded State */}\n {!isCollapsedSidebar && <>\n {\n isHovered ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className={clsx(\n \"p-1 rounded-md hover:bg-accent/20 transition-opacity mr-1\",\n \"opacity-100\"\n )}\n aria-label=\"Delete tab\"\n >\n <X className=\"h-4 w-4 text-accent\" />\n </button>\n ) : (\n <button\n className={clsx(\n \"p-1 rounded-md hover:bg-accent/20 mr-1\",\n isPinned ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n <Pin className=\"h-4 w-4 text-accent\" />\n </button>\n )\n }\n </>}\n {/* Delete Button - Collapsed State (Top Right Corner) */}\n {isCollapsedSidebar && isHovered && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className=\"absolute -top-1 -left-0 p-[2px] rounded-md bg-neutral-600 hover:bg-neutral-700 dark:bg-[hsl(var(--float))] dark:hover:bg-[hsl(var(--hoverfloat))] transition-colors\"\n aria-label=\"Delete tab\"\n >\n <X className=\"h-2.5 w-2.5 text-white\" />\n </button>\n )}\n </div>\n );\n}\n// Tab Group Component - Handles a group of tabs with its own DnD context\ninterface TabGroupProps {\n defaultTitle: string;\n pinned: boolean;\n group: string | null;\n tabs: Record<string, ITab>;\n isCollapsible: boolean;\n isCollapsedSidebar: boolean;\n hoveredTabId: string | null;\n activeTabId: string;\n onTabMouseEnter: (id: string, e: React.MouseEvent<HTMLDivElement>) => void;\n onTabMouseLeave: () => void;\n onTabContextMenu: (id: string, e: React.MouseEvent<HTMLDivElement>) => void;\n onTabDelete: (uuid: string) => void;\n onTabClick: (uuid: string) => void;\n sensors: ReturnType<typeof useSensors>;\n showGroupHeader?: boolean;\n defaultCollapsed?: boolean;\n}\n\nfunction TabGroup({\n defaultTitle,\n pinned,\n isCollapsible,\n group,\n tabs,\n isCollapsedSidebar,\n hoveredTabId,\n activeTabId,\n onTabMouseEnter,\n onTabMouseLeave,\n onTabContextMenu,\n onTabDelete,\n onTabClick,\n sensors,\n showGroupHeader = false,\n defaultCollapsed = false,\n}: TabGroupProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n const [lastActiveTabId, setLastActiveTabId] = useState(\"\");\n const tabIds = Object.keys(tabs);\n useEffect(() => {\n setTimeout(() => {\n setLastActiveTabId(activeTabId);\n }, 100);\n }, [activeTabId]);\n // Handle drag end for this group\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n const oldIndex = tabIds.indexOf(active.id as string);\n const newIndex = tabIds.indexOf(over.id as string);\n if (oldIndex !== -1 && newIndex !== -1) {\n reorderTabsInGroup(group, oldIndex, newIndex);\n }\n }\n };\n if (tabIds.length === 0) return null;\n const groupLabel = group === null ? \"Tabs\" : group.charAt(0).toUpperCase() + group.slice(1);\n const Chevron = isCollapsed ? ChevronRight : ChevronDown;\n return (<>\n <div className={clsx(\n \"flex flex-col\",\n isCollapsedSidebar ? \"gap-2\" : \"\",\n )}>\n {/* Group Header (only for named groups) */}\n {showGroupHeader && group !== null && isCollapsible && (\n <motion.button\n onClick={() => {\n setIsCollapsed(!isCollapsed);\n }}\n className={clsx(\n isCollapsed && \"opacity-[0.5]\",\n \"group w-full h-[36px] flex items-center gap-3 text-sm transition-colors\",\n )}>\n <Aspan className=\"flex-1 text-left\" isCollapsed={isCollapsedSidebar}>{groupLabel}</Aspan>\n {/* ChevronRight - visible on hover */}\n <Chevron className={clsx(\n \"absolute min-w-[20px] transition-all duration-250 opacity-0 group-hover:opacity-100 absolute\",\n isCollapsedSidebar ? \"left-[2px] bg-[hsl(var(--hover))] p-2 h-8 w-8 rounded-lg\" : \"h-4 w-4 right-5\",\n )} />\n {/* Other Icon - hidden on hover */}\n <Pin className={clsx(\n \"absolute min-w-[20px] transition-all duration-250 opacity-100 group-hover:opacity-0\",\n isCollapsedSidebar ? \"left-[2px] bg-[hsl(var(--hover))] p-2 h-8 w-8 rounded-lg\" : \"h-4 w-4 right-5\",\n )} />\n </motion.button>\n )}\n <AnimatePresence initial={false}>\n {isCollapsed && Object.keys(tabs).includes(lastActiveTabId) && isCollapsible &&\n <motion.button\n key=\"collapsed-active-tab\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"36px\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{\n duration: Object.keys(tabs).includes(lastActiveTabId) ? 0 : 0.5,\n }}\n className=\"w-full h-[36px] rounded-lg flex items-center gap-3 text-sm hover:opacity-[1.0] transition-colors bg-[hsl(var(--hover))]\">\n {tabs[lastActiveTabId].icon({ className: \"relative h-4 w-4 min-w-[20px] transition-all duration-250 left-[7px]\" })}\n <Aspan isCollapsed={isCollapsedSidebar}> {tabs[lastActiveTabId].title} </Aspan>\n </motion.button>\n }\n </AnimatePresence>\n {/* Tab List */}\n <AnimatePresence initial={false}>\n {(!isCollapsed || !isCollapsible) && (\n <motion.div\n key=\"tab-list\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: Object.keys(tabs).includes(activeTabId) ? 0 : 0.2 }}\n className=\"flex flex-col gap-1\"\n >\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToVerticalAxis, restrictToParentElement]}\n >\n <SortableContext\n key={\"sortable-context\"}\n items={tabIds}\n strategy={verticalListSortingStrategy}\n >\n {Object.entries(tabs).map(([uuid, { icon, title }], index) => (\n <SortableTabItem\n defaultTitle={defaultTitle}\n isPinned={pinned}\n key={uuid}\n id={uuid}\n icon={icon({ className: \"relative h-4 w-4 min-w-[20px] transition-all duration-250 left-[7px]\" })}\n title={title}\n index={index}\n isCollapsible={isCollapsible}\n isCollapsedSidebar={isCollapsedSidebar}\n hoveredTabId={hoveredTabId}\n onMouseEnter={onTabMouseEnter}\n onMouseLeave={onTabMouseLeave}\n onContextMenu={onTabContextMenu}\n onDelete={() => onTabDelete(uuid)}\n isActive={activeTabId === uuid}\n onClick={() => onTabClick(uuid)}\n />\n ))}\n </SortableContext>\n </DndContext>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n {showGroupHeader && group !== null && <div className={\n clsx(\n \"w-full bg-[hsl(var(--bg))] relative\",\n (isCollapsedSidebar) && \"py-2\"\n )\n }>\n <AnimatePresence initial>\n {\n isCollapsed && Object.keys(tabs).length > 1 && Object.keys(tabs).includes(lastActiveTabId) && <motion.span\n key=\"more-tabs-indicator\"\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={{ duration: Object.keys(tabs).includes(lastActiveTabId) ? 0 : 0.5 }}\n onClick={() => {\n setIsCollapsed(false);\n }}\n className={clsx(\n \"text-xs text-center w-full relative mx-auto bottom-0 block p-2 cursor-pointer\",\n isCollapsedSidebar ? \"bottom-2\" : \"\"\n )}>{Object.keys(tabs).length - 1}{isCollapsedSidebar ? \"+\" : \" more\"}</motion.span>\n }\n </AnimatePresence>\n {isCollapsedSidebar && <div className={clsx(\"w-full h-[1px]\", \"bg-[hsl(var(--border))]\")} />}\n </div>}\n </>\n );\n}\n\nfunction SearchDialogBody({ workspace, isOpen, setOpen }: { workspace: string | null, isOpen: boolean, setOpen: (open: boolean) => void }) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n return (\n <>\n <DialogHeader className=\"px-6\">\n <DialogTitle className=\"text-lg font-medium pt-10 text-foreground/90\">\n <div className=\"relative w-full border border-[hsl(var(--chat-border))] flex items-center gap-2 bg-[hsl(var(--float))] rounded-full px-4 shadow-sm focus-within:ring-1 focus-within:ring-accent/30 transition-all\">\n <Search className=\"w-4 h-4 text-muted-foreground\" />\n <input\n placeholder=\"Search your tab history...\"\n className=\"bg-transparent border-none p-2 w-full h-10 focus-visible:ring-0 text-sm\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n autoFocus\n />\n </div>\n </DialogTitle>\n </DialogHeader>\n <SearchTab workspace={workspace} isOpen={isOpen} setOpen={setOpen} query={searchQuery} />\n </>\n );\n}\n\nexport default function Sidebar({\n showMcpDialog,\n setShowMcpDialog,\n workspace,\n setIsSwitchWorkspace,\n showSearchDialog,\n setShowSearchDialog,\n showCredentialsDialog,\n setShowCredentialsDialog,\n showLocalModelDialog,\n setShowLocalModelDialog,\n showCustomEndpointDialog,\n setShowCustomEndpointDialog,\n showSettingsDialog,\n setShowSettingsDialog,\n layout,\n theme,\n settings,\n}: {\n showMcpDialog: boolean;\n setShowMcpDialog: (value: boolean) => void;\n workspace: string | null,\n setIsSwitchWorkspace: (value: boolean) => void,\n showSearchDialog: boolean;\n setShowSearchDialog: (value: boolean) => void;\n showCredentialsDialog: boolean;\n setShowCredentialsDialog: (value: boolean) => void;\n showLocalModelDialog: boolean;\n setShowLocalModelDialog: (value: boolean) => void;\n showCustomEndpointDialog: boolean;\n setShowCustomEndpointDialog: (value: boolean) => void;\n showSettingsDialog: boolean;\n setShowSettingsDialog: (value: boolean) => void;\n layout: string;\n theme: string;\n settings: Record<string, SettingItem>;\n}) {\n const allTabs = useSnapshot(TabState);\n // Record<string, { title: string; layout: string; group: string | null; childrenProps: Record<string, { title: string; path: string; icon: string; }> }>>\n // const [savedTabs, setSavedTabs, { query: savedTabsQuery }] = useDatabase<string[]>(\"tabs\");\n const [savedTabs, setSavedTabs, { query: savedTabsQuery }] = useDatabaseImpl<Record<string,\n {\n title: string | null;\n layout: string;\n group: string | null;\n size: number[];\n childrenProps: Record<string, {\n title: string | null;\n appname: string;\n icon: string;\n data: any;\n }\n >\n }>>(\"tabs\");\n const tabs = Object.fromEntries(Object.entries(allTabs).filter(([_, tab]) => tab.group === null));\n const pinnedTabs = Object.fromEntries(Object.entries(allTabs).filter(([_, tab]) => tab.group === \"pinned\"));\n const s = useSettings();\n const [isCollapsedSidebar, setIsCollapsedSidebar] = useState(true);\n const [showPopup, setShowPopup] = useState(false);\n const [popupTop, setPopupTop] = useState(0);\n const [hoveredTabId, setHoveredTabId] = useState<string | null>(null);\n const [editingTitleTabId, setEditingTitleTabId] = useState<string | null>(null);\n const [tempTitle, setTempTitle] = useState(\"\");\n const hoverTimeoutRef = useRef<any | null>(null);\n const hideTimeoutRef = useRef<any | null>(null);\n useEffect(() => {\n if (!showPopup) {\n setEditingTitleTabId(null);\n }\n }, [showPopup]);\n const sidebarRef = useRef<HTMLDivElement>(null);\n const isAllowCollapseRef = useRef<boolean>(true);\n const tabContainerRef = useRef<HTMLDivElement>(null);\n const mousePositionRef = useRef<{ x: number; y: number } | null>(null);\n const { active, SetActive } = useSnapshot(TabInfo);\n // DnD sensors\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n const [mounted, setMounted] = useState(false);\n const [loaded, setLoaded] = useState(false);\n const { pyInvoke } = usePython();\n useEffect(() => {\n if (mounted) {\n if (Object.keys(allTabs).length === 0) {\n (async () => {\n const t = await savedTabsQuery(`SELECT * FROM tabs`);\n setLoaded(true);\n let needAdd = true;\n if (Array.isArray(t)) {\n t.forEach(tab => {\n if (!tab.title) {\n needAdd = false;\n }\n addTab({\n uuid: tab.id,\n title: tab.title,\n layout: tab.layout,\n iconOverride: tab.iconOverride,\n group: tab.group,\n childrenProps: tab.childrenProps,\n size: tab.size\n });\n })\n }\n if (needAdd) addTab();\n })()\n }\n }\n }, [mounted]);\n useEffect(() => {\n setMounted(true);\n }, [])\n useEffect(() => {\n const timer = setTimeout(() => {\n (async () => {\n const tabsToSave = Object.fromEntries(\n Object.entries(TabState).map(([id, tab]) => [\n id,\n {\n title: tab.title,\n layout: tab.layout,\n iconOverride: tab.iconOverride,\n group: tab.group,\n childrenProps: tab.childrenProps,\n size: tab.size\n },\n ]),\n );\n if (mounted) {\n if (loaded) setSavedTabs(tabsToSave);\n const entriesToSave = Object.entries(TabState).filter(([_, tab]) => tab.title);\n if (entriesToSave.length > 0) {\n const db = workspace ?? \"global\";\n const placeholders = entriesToSave.map(() => \"(?, ?)\").join(\", \");\n const sql = `INSERT OR REPLACE INTO tab_metadata (id, metadata) VALUES ${placeholders}`;\n const params = entriesToSave.flatMap(([id, tab]) => [\n id,\n JSON.stringify({\n title: tab.title,\n layout: tab.layout,\n iconOverride: tab.iconOverride,\n size: tab.size,\n childrenProps: tab.childrenProps,\n timestamp: Date.now(),\n })\n ]);\n await pyInvoke(\"sqlite\", {\n db,\n command: \"execute\",\n sql: `CREATE TABLE IF NOT EXISTS tab_metadata (\n id TEXT PRIMARY KEY,\n metadata TEXT\n )`,\n params: []\n });\n await pyInvoke(\"sqlite\", {\n db,\n command: \"execute\",\n sql,\n params\n });\n }\n }\n })()\n }, 250);\n return () => clearTimeout(timer);\n }, [allTabs, mounted, loaded, workspace])\n // Track mouse position\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n mousePositionRef.current = { x: e.clientX, y: e.clientY };\n };\n document.addEventListener('mousemove', handleMouseMove);\n return () => document.removeEventListener('mousemove', handleMouseMove);\n }, []);\n useEffect(() => {\n console.log(savedTabs);\n }, [savedTabs]);\n // Check if hovered tab still exists and close popup if not\n useEffect(() => {\n if (hoveredTabId) {\n const exists = Object.keys(allTabs).includes(hoveredTabId);\n if (!exists) {\n setShowPopup(false);\n setHoveredTabId(null);\n }\n }\n }, [allTabs, hoveredTabId]);\n // Check hover state after tabs change (e.g., after deletion)\n useEffect(() => {\n if (editingTitleTabId) return;\n if (!mousePositionRef.current || !tabContainerRef.current) return;\n const { x, y } = mousePositionRef.current;\n const elements = document.elementsFromPoint(x, y);\n // Find if any tab is under the cursor\n const tabElement = elements.find(el => el.hasAttribute('data-tab-id'));\n if (tabElement) {\n const tabId = tabElement.getAttribute('data-tab-id');\n if (tabId !== hoveredTabId) {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n setShowPopup(false);\n setHoveredTabId(tabId);\n if (sidebarRef.current) {\n const sidebarRect = sidebarRef.current.getBoundingClientRect();\n const tabRect = tabElement.getBoundingClientRect();\n setPopupTop(tabRect.top - sidebarRect.top);\n }\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n hoverTimeoutRef.current = setTimeout(() => {\n setShowPopup(true);\n }, 800);\n }\n } else {\n setHoveredTabId(null);\n }\n }, [Object.keys(allTabs).length, editingTitleTabId]); // Trigger when tab count changes\n // Handle tab deletion with group-aware auto-selection\n const handleDeleteTab = (uuid: string) => {\n // Use the group-aware deletion that auto-selects next tab in same group\n deleteTabWithGroupSelection(uuid);\n // The useEffect above will handle updating hover state\n };\n const handleTabMouseEnter = (id: string, e: React.MouseEvent<HTMLDivElement>) => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n if (editingTitleTabId) return;\n setHoveredTabId(id);\n if (sidebarRef.current) {\n const sidebarRect = sidebarRef.current.getBoundingClientRect();\n const tabRect = e.currentTarget.getBoundingClientRect();\n setPopupTop(tabRect.top - sidebarRect.top);\n }\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n };\n const handleTabMouseLeave = () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n if (editingTitleTabId) return;\n if (!showPopup) setHoveredTabId(null);\n hideTimeoutRef.current = setTimeout(() => {\n setShowPopup(false);\n setHoveredTabId(null);\n }, 300);\n };\n const handleTabContextMenu = (id: string, e: React.MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (editingTitleTabId) return;\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setHoveredTabId(id);\n if (sidebarRef.current) {\n const sidebarRect = sidebarRef.current.getBoundingClientRect();\n const tabRect = e.currentTarget.getBoundingClientRect();\n setPopupTop(tabRect.top - sidebarRect.top);\n }\n setShowPopup(true);\n };\n const addLocalModel = useCallback(async (paths: string[]): Promise<void> => {\n let modelsArr: string[] = Array.isArray(s.settings[\"openchad/LocalModelProvider/local.model\"]) ? s.settings[\"openchad/LocalModelProvider/local.model\"] : [];\n await s.updateSetting(\"openchad/LocalModelProvider/local.model\", [...new Set([...modelsArr, ...paths])])\n }, [s]);\n const deleteLocalModel = useCallback(async (path: string): Promise<void> => {\n let modelsArr: string[] = Array.isArray(s.settings[\"openchad/LocalModelProvider/local.model\"]) ? s.settings[\"openchad/LocalModelProvider/local.model\"] : [];\n await s.updateSetting(\"openchad/LocalModelProvider/local.model\", modelsArr.filter((model) => model !== path))\n }, [s]);\n const addEndpoint = useCallback(async (endpoint: string): Promise<void> => {\n let modelsArr: string[] = Array.isArray(s.settings[\"openchad/ProxyModelProvider/custom.endpoints\"]) ? s.settings[\"openchad/ProxyModelProvider/custom.endpoints\"] : [];\n await s.updateSetting(\"openchad/ProxyModelProvider/custom.endpoints\", [...new Set([...modelsArr, endpoint])])\n }, [s]);\n const deleteEndpoint = useCallback(async (endpoint: string): Promise<void> => {\n let modelsArr: string[] = Array.isArray(s.settings[\"openchad/ProxyModelProvider/custom.endpoints\"]) ? s.settings[\"openchad/ProxyModelProvider/custom.endpoints\"] : [];\n await s.updateSetting(\"openchad/ProxyModelProvider/custom.endpoints\", modelsArr.filter((model) => model !== endpoint))\n }, [s]);\n const [mcpStatuses, setMcpStatuses] = useState<Record<string, \"connected\" | \"disconnected\" | \"disconnecting\" | \"connecting\" | \"error\">>({});\n usePythonEvent('mcp_statuses', (data: any) => {\n setMcpStatuses(data);\n })\n useEffect(() => {\n (async () => {\n const res = await pyInvoke(\"mcp_tool/statuses\")\n if (res.statuses) {\n setMcpStatuses(res.statuses)\n }\n })()\n }, [])\n return (\n <div\n ref={sidebarRef}\n style={{\n width: isCollapsedSidebar ? \"50px\" : \"320px\",\n willChange: \"width\",\n contain: \"layout style\",\n }}\n className={clsx(\n \"h-full flex flex-col pb-1 px-2 relative gap-1 z-50\",\n \"transition-[width] duration-200 ease-out group\",\n )}>\n <div data-tauri-drag-region className=\"w-full absolute left-0 h-[50px] bg-transparent\" />\n <div className=\"flex items-center gap-2 pt-3\">\n <div\n className={clsx(\n \"relative left-1 h-8 w-8 rounded-md flex items-center justify-center text-zinc-800 dark:text-zinc-100 font-bold pointer-events-auto\",\n isCollapsedSidebar && \"group-hover:opacity-0\",\n )}>\n <svg\n className=\"w-5 h-5 stroke-[15px] stroke-accent\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 657 657\"\n >\n <path fill=\"currentColor\" d=\"M173 84h6a167 167 0 0 1 80 34l3 2a428 428 0 0 0 21 15l4 4 2 1a462 462 0 0 0 17 14c8 8 17 15 24 24l14 15 6 6 2 2c3 3 3 3 3 6l-8 7-3 3-2 1-8 6-4 1c-4-1-5-3-8-6a2267 2267 0 0 0-4-5l-9-9-10-11-21-21c-3-1-5-4-7-6-17-14-17-14-36-26-3 0-5 2-7 4l-2 2-2 2-2 2a968 968 0 0 0-17 19l-2 2a4081 4081 0 0 0-25 34l8 6 3 2a257 257 0 0 1 27 22 208 208 0 0 1 31 31 296 296 0 0 1 32 39 359 359 0 0 1 26 40 393 393 0 0 1 64 185c3 31-3 67-23 92a71 71 0 0 1-51 24 153 153 0 0 1-50-8l-6-2-1-3a1041 1041 0 0 1 9 1l8 1a65 65 0 0 0 51-13l4-1 1-2c1-4 3-6 6-9 5-6 8-13 10-21l2-5c20-49-4-118-23-164a332 332 0 0 0-16-32c-5-11-12-22-18-32l-2-2a356 356 0 0 0-50-67l-2 2-7 7c-12 11-12 11-22 23l-8 10-18 21 6 8 11 13 2 3a1365 1365 0 0 1 7 10c35 49 64 114 55 175-2 16-9 31-22 40l-5 3-2 2c-14 7-31 4-45 0a156 156 0 0 1-54-33 215 215 0 0 1-30-29 291 291 0 0 1-51-79c-14-29-25-61-26-93v-4c-1-22 2-44 17-60 10-10 21-14 35-14 29 0 54 16 75 34l5 4 7 6a82 82 0 0 0 14-18l2-2c10-15 21-29 33-41l4-8-24-20-2-2-19-13-3-2-19-10-2-1c-24-11-49-16-74-8-16 6-27 18-34 34l-8 24-2-1a121 121 0 0 1 26-69c4-6 8-10 15-13l2-2c7-4 13-6 20-7l3-1a105 105 0 0 1 67 13l3 1h7l3-4 2-3 2-2 3-3 10-14c10-14 21-26 33-38-11-11-36-16-52-18l-2-1c-9-1-18-1-27 1h-4c-13 2-22 8-33 15l-6 2 7-11 3-4 2-1 3-4a78 78 0 0 1 72-22ZM31 339c-8 11-12 23-12 37v3c-1 51 23 100 52 139l2 3c15 20 33 37 53 51l3 2c15 10 34 16 53 13 10-2 17-7 23-16 6-10 9-20 9-32v-3c1-58-29-114-66-156l-2-3-28-26-2-2c-22-17-62-36-85-10Z\" />\n <path fill=\"currentColor\" d=\"m344 57 7 5a199 199 0 0 1 35 27l12 10a134 134 0 0 1 24 22l6 7 18 20 13-5c14-7 28-13 43-17l3-2 16-2 4 5a2136 2136 0 0 0 38 54l8 14a267 267 0 0 1 22 42c21 43 35 90 37 138v20a124 124 0 0 1-9 43c-3 12-9 23-15 34l-2-1 4-13a116 116 0 0 0 7-37 373 373 0 0 0-59-212l-2-3a476970923 476970923 0 0 0-12-21l-24-33c-8 2-15 5-22 9l-3 1-26 13 10 14 17 25 11 19a362 362 0 0 1 29 55l1 2c25 54 44 114 42 174v4c-1 18-3 34-9 51v3c-3 9-7 17-14 24l-6 9c-7 9-17 16-27 22 0-4 0-5 3-8l2-3 2-2c18-24 23-50 24-79v-24c-1-22-5-43-10-65v-3l-15-45-1 1a378 378 0 0 1-58 34l-3 2-5 3 2 4c11 30 19 63 22 95v2c3 36 3 83-21 113l-5 5-4 6c-4 5-9 9-15 12l-2 1c-12 8-25 12-39 12v-3l5-3c12-7 22-14 30-26l2-4c5-7 8-14 10-21l1-2c3-10 5-19 6-30l1-7a356 356 0 0 0-54-210 248 248 0 0 0-27-45l-3-5-2-4-2-2-1-7 4-3 2-1 3-2 5-3 3-2 8-5c4 2 5 4 8 8l2 3a236496 236496 0 0 1 16 27l1 2 4 7a136 136 0 0 1 12 22l1 4a1318 1318 0 0 0 11 21l2 4 1 3 1 4a8549 8549 0 0 0 60-35l2-2 2-1 4-1a272 272 0 0 0-15-33l-1-3a404 404 0 0 0-31-53c-7-12-15-24-24-35l-9-13a335 335 0 0 0-43-49 242 242 0 0 0-37-34c-6-5-12-11-19-15l-2-1a981 981 0 0 0-53-30h-2c-9-4-18-7-28-8l-9-2c-16-3-31 0-46 3l-1-3c12-7 24-12 37-14l3-1c37-6 77 9 108 29ZM88 421c23 16 39 41 45 68 2 10 3 21-2 31-3 5-7 7-13 8-12 1-21-4-30-12l-2-2c-19-15-33-41-36-65-1-9-1-17 4-25l2-3c9-8 22-5 32 0Z\" />\n <path fill=\"currentColor\" d=\"m459 47 10 4 2 1 5 4 2 1a703 703 0 0 1 58 40l19 19 4 5c8 8 15 17 21 26l2 2c20 29 36 61 46 95l1 3c9 31 9 64 11 95h-3v-3a344 344 0 0 0-54-161l-2-3a2024 2024 0 0 0-7-12l-21-29-5-5a210 210 0 0 0-25-29 146 146 0 0 0-24-23c-9-8-18-14-28-20l-12-8v-2Z\" />\n <path fill=\"currentColor\" d=\"M329 16a182 182 0 0 1 119 38c6 3 11 8 16 13l11 9 12 10-1 3c-15 5-15 5-21 2-4-2-7-6-10-9l-9-8-8-7c-9-8-20-14-30-20l-6-4c-7-5-15-8-23-12h-2c-14-6-28-9-43-11l-6-1 1-3Z\" />\n </svg>\n </div>\n <Aspan isCollapsed={isCollapsedSidebar} className=\"text-lg opacity-0 text-zinc-900 dark:text-gray-200 font-funnel\">OpenChad</Aspan>\n <div className=\"ml-auto pointer-events-none\">\n <button\n onClick={() => {\n setIsCollapsedSidebar(!isCollapsedSidebar);\n isAllowCollapseRef.current = false;\n setTimeout(() => {\n isAllowCollapseRef.current = true;\n }, 250);\n }}\n className={clsx(\n \"absolute z-20 top-2.5 right-2.5 h-8 w-8 inline-flex items-center justify-center rounded-xl hover:bg-[hsl(var(--hover))] transition-colors pointer-events-auto\",\n isCollapsedSidebar && \"group-hover:opacity-100 opacity-0\",\n )}\n aria-label=\"Sidebar\"\n >\n <svg\n className=\"h-4 w-4 text-zinc-600 dark:text-zinc-300\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"hsl(var(--accent))\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n </svg>\n </button>\n </div>\n </div>\n <div\n ref={tabContainerRef}\n className={clsx(\n \"pt-4 flex-shrink flex flex-col overflow-y-auto overflow-x-visible relative transform -translate-y-2 w-[calc(100%+10px)] pr-[10px]\",\n (isCollapsedSidebar || Object.keys(pinnedTabs).length > 0) ? \"pt-2\" : \"pt-1\"\n )}>\n <div\n onClick={() => setShowSearchDialog(true)}\n className={clsx(\n \"px-2 border border-[hsl(var(--chat-border))] hover:bg-neutral-200 dark:hover:bg-[hsl(var(--hover))]/50 relative cursor-pointer rounded-full\",\n isCollapsedSidebar && \"mb-1\"\n )}>\n <div\n className={clsx(\n \"w-full h-[36px] flex items-center gap-1 rounded-full text-sm transition-colors relative group\",\n )}\n >\n {/* Drag Handle and Content */}\n <div\n className=\"flex items-center gap-3 flex-1 min-w-0\"\n >\n <div className=\"w-4 h-4\">\n <Search className={clsx(\n \"h-4 w-4 absolute\",\n isCollapsedSidebar && \"absolute left-0\"\n )} />\n </div>\n <Aspan isCollapsed={isCollapsedSidebar}>Search</Aspan>\n </div>\n </div>\n </div>\n {/* Pinned Tabs Group */}\n <TabGroup\n defaultTitle={\"Untitled\"}\n pinned={true}\n isCollapsible={false}\n group=\"pinned\"\n tabs={pinnedTabs as Record<string, ITab>}\n isCollapsedSidebar={isCollapsedSidebar}\n hoveredTabId={hoveredTabId}\n activeTabId={active}\n onTabMouseEnter={handleTabMouseEnter}\n onTabMouseLeave={handleTabMouseLeave}\n onTabContextMenu={handleTabContextMenu}\n onTabDelete={handleDeleteTab}\n onTabClick={SetActive}\n sensors={sensors}\n showGroupHeader={true}\n defaultCollapsed={false}\n />\n {!isCollapsedSidebar && <div className=\"h-1\" />}\n {/* Ungrouped Tabs */}\n <TabGroup\n defaultTitle={settings[\"Others/app_settings/string.title\"]?.value || \"Untitled\"}\n pinned={false}\n isCollapsible={false}\n group={null}\n tabs={tabs as Record<string, ITab>}\n isCollapsedSidebar={isCollapsedSidebar}\n hoveredTabId={hoveredTabId}\n activeTabId={active}\n onTabMouseEnter={handleTabMouseEnter}\n onTabMouseLeave={handleTabMouseLeave}\n onTabContextMenu={handleTabContextMenu}\n onTabDelete={handleDeleteTab}\n onTabClick={(uuid) => {\n SetActive(uuid)\n }}\n sensors={sensors}\n showGroupHeader={false}\n />\n </div>\n <div className={clsx(\n \"w-full relative z-10\",\n Object.keys(tabs).length > 0 ? \"-translate-y-2\" : \"-translate-y-3\"\n )}>\n <motion.button\n onClick={() => addTab()}\n className={clsx(\n \"w-full h-[36px] flex items-center gap-3 rounded-lg text-sm hover:bg-[hsl(var(--hover))] transition-colors\",\n )}>\n <Plus className=\"relative h-4 w-4 min-w-[20px] transition-all duration-250 left-[7px]\" />\n <Aspan isCollapsed={isCollapsedSidebar}>New Tab</Aspan>\n </motion.button>\n </div>\n <div className=\"flex-1\">\n </div>\n <div className={clsx(\"overflow-hidden w-full flex items-center transition-colors rounded-lg\"\n , isCollapsedSidebar ? \"py-1\" : \"py-2 bg-[hsl(var(--hover))]/40 hover:bg-[hsl(var(--hover))] border-[1px] border-accent/10 dark:border-accent/5\"\n )}>\n <Dropdown\n content={[\n {\n content: <div> Switch Workspace </div>,\n shortcut: <ArrowLeftRight size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setIsSwitchWorkspace(true);\n }\n },\n ...(typeof window !== 'undefined' && !!(window as any).__TAURI__) ? [{\n content: <div> Local Models </div>,\n shortcut: <HardDrive size={16} />,\n children: null,\n separator: false,\n trigger: async () => {\n setShowLocalModelDialog(true);\n }\n }] : [],\n {\n content: <div> Credentials </div>,\n shortcut: <Key size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setShowCredentialsDialog(true);\n }\n },\n {\n content: <div> Custom Endpoints </div>,\n shortcut: <Globe size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setShowCustomEndpointDialog(true);\n }\n },\n {\n content: <div> MCP Servers </div>,\n shortcut: <svg fill=\"currentColor\" fillRule=\"evenodd\" height=\"1.25em\" viewBox=\"0 0 24 24\" width=\"1.25em\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>ModelContextProtocol</title>\n <path d=\"M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z\" />\n <path d=\"M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z\" /></svg>,\n children: null,\n separator: false,\n trigger: () => {\n setShowMcpDialog(true);\n }\n },\n {\n content: <div> Dark Theme </div>,\n shortcut: theme === \"dark\" ? <div>On</div> : <div>Off</div>,\n children: null,\n separator: false,\n trigger: () => {\n Theme.theme = theme === \"dark\" ? \"light\" : \"dark\";\n }\n },\n {\n content: <div> Layout </div>,\n shortcut: layout === \"leftToRight\" ? <div>Left To Right</div> : <div>Right To Left</div>,\n children: null,\n separator: false,\n trigger: () => {\n Theme.layout = layout === \"leftToRight\" ? \"rightToLeft\" : \"leftToRight\";\n }\n },\n {\n content: <div> View Repository </div>,\n shortcut: <GitBranch size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n if (isTauri) {\n openUrl('https://github.com/openchad/openchad')\n } else {\n window.open('https://github.com/openchad/openchad', '_blank')\n }\n }\n },\n {\n content: <div> Join Our Discord </div>,\n shortcut: <svg className=\"cursor-pointer rounded-full w-4 h-4 flex items-center overflow-hidden relative\" width=\"64px\" height=\"64px\" viewBox=\"0 -28.5 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMidYMid\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" />\n <g id=\"SVGRepo_tracerCarrier\" />\n <g id=\"SVGRepo_iconCarrier\"> <g>\n <path d=\"M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z\" fill=\"currentColor\" fillRule=\"nonzero\"> </path> </g> </g>\n </svg>,\n children: null,\n separator: false,\n trigger: () => {\n if (isTauri) {\n openUrl('https://discord.gg/JWeqhecqBD')\n } else {\n window.open('https://discord.gg/JWeqhecqBD', '_blank')\n }\n }\n },\n ]}>\n <motion.button\n onClick={() => {\n }}\n className={clsx(\n \"focus:outline-none flex items-center gap-5 flex-1\",\n )}>\n <div className={clsx(\n \"w-8 h-8 relative flex items-center justify-center rounded-full\",\n isCollapsedSidebar ? \"left-[0px]\" : \"left-[10px]\",\n isCollapsedSidebar ? \"bg-white/10\" : \"bg-transparent\",\n )}>\n <Settings className={clsx(\n \"h-5 w-5 min-w-[20px] transition-all duration-250\",\n )} />\n </div>\n <div className=\"flex flex-1 flex-col text-left\">\n <Aspan className={clsx(\"text-md relative flex items-center gap-1\")} isCollapsed={isCollapsedSidebar}>\n Settings\n </Aspan>\n <Aspan className=\"text-xs\" isCollapsed={isCollapsedSidebar}><span className=\"opacity-[0.5]\">\n v0.1.0\n </span></Aspan>\n </div>\n </motion.button>\n </Dropdown>\n <svg style={{\n display: isCollapsedSidebar ? \"none\" : \"block\"\n }} className=\"cursor-pointer mr-2 rounded-full opacity-50 hover:opacity-100 w-6 h-6 flex items-center overflow-hidden relative\" width=\"64px\" height=\"64px\" viewBox=\"0 -28.5 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMidYMid\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" />\n <g id=\"SVGRepo_tracerCarrier\" />\n <g id=\"SVGRepo_iconCarrier\"> <g> <path d=\"M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z\" fill=\"#ffffff\" fillRule=\"nonzero\"> </path> </g> </g>\n </svg>\n <div style={{\n display: isCollapsedSidebar ? \"none\" : \"block\"\n }} className=\"mr-2 rounded-full bg-accent opacity-50 hover:opacity-100 w-6 h-6 flex items-center overflow-hidden relative\">\n <GitBranch className=\"p-[1px] cursor-pointer fill-[hsl(var(--card))] stroke-[hsl(var(--card))] relative top-[3px]\" />\n </div>\n </div>\n <AnimatePresence>\n {showPopup && hoveredTabId && Object.keys(allTabs).includes(hoveredTabId) && (\n <motion.div\n key={hoveredTabId}\n initial={{ opacity: 0, x: -10, scale: 0.95 }}\n animate={{ opacity: 1, x: 0, scale: 1 }}\n exit={{ opacity: 0, x: -10, scale: 0.95 }}\n transition={{ duration: 0.2 }}\n style={{ zIndex: 50, top: popupTop }}\n className={clsx(\"absolute pl-4\", layout === \"rightToLeft\" ? \"right-full\" : \"left-full\")}\n onMouseEnter={() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }}\n onMouseLeave={handleTabMouseLeave}\n >\n <div className=\"w-fit min-w-64 max-w-72 p-2 rounded-xl border bg-card text-card-foreground shadow-lg bg-opacity-95 \">\n <div className=\"flex gap-2 items-center\">\n {allTabs[hoveredTabId].icon && <Fragment key=\"icon-section\">\n {\n allTabs[hoveredTabId].iconOverride ? <Fragment key=\"icon-override\">\n <div\n onClick={() => {\n TabState[hoveredTabId].iconOverride = null;\n }}\n className={clsx(\n \"p-2 relative rounded-lg overflow-hidden cursor-pointer transition-colors border-r border-r-[hsl(var(--chat-border))] hover:bg-[hsl(var(--hover))]\",\n )}>\n <div className=\"absolute flex items-center justify-center top-0 right-0 w-full h-full bg-[hsl(var(--hover))] opacity-0 hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n </div>\n {TabState[hoveredTabId].IconOverrideComponent({ className: \"h-4 w-4\" })}\n </div>\n </Fragment> :\n <IconPopover onSelect={(icon) => {\n TabState[hoveredTabId].iconOverride = icon;\n setShowPopup(false);\n setHoveredTabId(null);\n }}>\n <div className={clsx(\n \"p-2 rounded-lg cursor-pointer transition-colors border-r border-r-[hsl(var(--chat-border))] hover:bg-[hsl(var(--hover))]\",\n )}>\n {allTabs[hoveredTabId].icon({ className: \"h-4 w-4\" })}\n </div>\n </IconPopover>\n }\n </Fragment>}\n <Fragment key=\"title\">\n {editingTitleTabId === hoveredTabId ? (\n <input\n type=\"text\"\n value={tempTitle}\n onChange={(e) => setTempTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n const tab = TabState[hoveredTabId];\n if (tab) {\n TabState[hoveredTabId].title = tempTitle;\n }\n setEditingTitleTabId(null);\n } else if (e.key === \"Escape\") {\n setEditingTitleTabId(null);\n }\n }}\n onBlur={() => {\n const tab = TabState[hoveredTabId];\n if (tab && tab.hasChildren) {\n const firstChildKey = Object.keys(tab.childrenProps)[0];\n if (firstChildKey && tab.childrenProps[firstChildKey]) {\n tab.childrenProps[firstChildKey].title = tempTitle;\n }\n }\n setEditingTitleTabId(null);\n }}\n className=\"bg-transparent border-b border-primary text-foreground focus:outline-none font-semibold text-lg w-full flex-1 min-w-0\"\n autoFocus\n />\n ) : (\n <h1\n className=\"cursor-pointer hover:underline font-semibold text-sm flex-1 min-w-0 truncate\"\n onClick={() => {\n setEditingTitleTabId(hoveredTabId);\n setTempTitle(allTabs[hoveredTabId].title || \"\");\n }}\n >\n {allTabs[hoveredTabId].title || \"Untitled\"}\n </h1>\n )}\n </Fragment>\n {/* Pin/Unpin Toggle Button */}\n <div\n key=\"pin-toggle\"\n onClick={(e) => {\n e.stopPropagation();\n if (hoveredTabId) {\n const currentGroup = allTabs[hoveredTabId]?.group;\n const newGroup = currentGroup === \"pinned\" ? null : \"pinned\";\n setTabGroup(hoveredTabId, newGroup);\n setShowPopup(false);\n setHoveredTabId(null);\n }\n }}\n className={clsx(\n \"cursor-pointer ml-auto p-1 rounded-md transition-colors\",\n allTabs[hoveredTabId]?.group === \"pinned\"\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary hover:bg-primary hover:text-primary-foreground\"\n )}\n >\n <Pin className=\"h-4 w-4\" />\n </div>\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n <DialogUI open={showSettingsDialog} onOpenChange={setShowSettingsDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 text-xl font-funnel\">\n <Settings className=\"w-5 h-5 text-accent\" />\n Settings\n </DialogTitle>\n </DialogHeader>\n <SettingsMenu />\n </DialogContent>\n </DialogUI>\n <DialogUI open={showSearchDialog} onOpenChange={setShowSearchDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card p-0 overflow-hidden shadow-2xl\">\n <SearchDialogBody workspace={workspace} isOpen={showSearchDialog} setOpen={setShowSearchDialog} />\n </DialogContent>\n </DialogUI>\n <DialogUI open={showCredentialsDialog} onOpenChange={setShowCredentialsDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card p-0 overflow-hidden shadow-2xl\">\n <DialogHeader>\n <DialogTitle className=\"hidden\">\n Credentials\n </DialogTitle>\n </DialogHeader>\n <Credentials isOpen={showCredentialsDialog} />\n </DialogContent>\n </DialogUI>\n <DialogUI open={showLocalModelDialog} onOpenChange={setShowLocalModelDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card p-0 overflow-hidden shadow-2xl\">\n <DialogHeader>\n <DialogTitle className=\"hidden\">\n Local Models\n </DialogTitle>\n </DialogHeader>\n <LocalModel\n selectModel={selectModel}\n isOpen={showLocalModelDialog}\n addLocalModel={addLocalModel}\n deleteLocalModel={deleteLocalModel}\n />\n </DialogContent>\n </DialogUI>\n <DialogUI open={showMcpDialog} onOpenChange={setShowMcpDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card p-0 overflow-hidden shadow-2xl\">\n <DialogHeader>\n <DialogTitle className=\"hidden\">\n MCP Servers\n </DialogTitle>\n </DialogHeader>\n <McpServers\n isOpen={showMcpDialog}\n mcpStatuses={mcpStatuses}\n />\n </DialogContent>\n </DialogUI>\n <DialogUI open={showCustomEndpointDialog} onOpenChange={setShowCustomEndpointDialog}>\n <DialogContent className=\"max-w-4xl h-[80vh] flex flex-col border-accent/20 bg-card p-0 overflow-hidden shadow-2xl\">\n <DialogHeader>\n <DialogTitle className=\"hidden\">\n Custom Endpoints\n </DialogTitle>\n </DialogHeader>\n <CustomEndpoint\n endpoints={s.settings[\"openchad/ProxyModelProvider/custom.endpoints\"]?.value}\n addEndpoint={addEndpoint}\n deleteEndpoint={deleteEndpoint}\n />\n </DialogContent>\n </DialogUI>\n </div>\n )\n}","\"use client\"\r\nimport clsx from \"clsx\"\r\n\r\nexport default function Topbar({ Elements, reverse = false }: { Elements?: React.ReactNode[], reverse?: boolean }) {\r\n return (\r\n <div className={clsx(\"relative h-[40px] flex items-start z-10 pointer-events-none select-none\", \"justify-end\")}>\r\n <div className=\"w-full pointer-events-none\" style={{ top: '2px' }}>\r\n <div className={clsx(\"absolute z-10 -mb-8 origin-top pointer-events-none\", reverse ? \"-left-7\" : \"right-0\")} >\r\n <svg className={clsx(\"h-9 overflow-visible pointer-events-none\", reverse ? \"origin-center scale-x-[-1] skew-x-[32.5deg]\" : \"origin-top-left skew-x-[32.5deg]\")} viewBox={\"0 0 \" + ((Elements?.length || 2) * 45) + \" 32\"} xmlns=\"http://www.w3.org/2000/svg\">\r\n <line x1=\"1\" y1=\"0\" x2={((Elements?.length || 2) * 45)} y2=\"0\" strokeWidth=\"2\" strokeLinecap=\"round\" stroke=\"hsl(var(--bg))\" />\r\n <path\r\n className='pointer-events-none'\r\n fill=\"hsl(var(--bg))\"\r\n stroke=\"hsl(var(--chat-border))\"\r\n strokeWidth=\"1\"\r\n strokeLinecap=\"round\"\r\n d={\"M0,0c5.9,0,10.7,4.8,10.7,10.7v10.7c0,5.9,4.8,10.7,10.7,10.7H\" + ((Elements?.length || 2) * (reverse ? 40: 45)) + \"V0\"}\r\n />\r\n </svg>\r\n {/* Floating glass tab with actions (interactive) */}\r\n {Elements && Elements.length > 0 && <div className={clsx(\"w-full absolute top-1/2 transform -translate-y-1/2 flex justify-between pointer-events-none\", reverse ? \"pl-8 pr-7 flex-row-reverse\" : \"pl-8 pr-3\")}>\r\n {Elements?.map((element, index) => (\r\n <div className={clsx(\r\n \"pointer-events-none\",\r\n )} key={index}>{element}</div>\r\n ))}\r\n </div>}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { proxy, useSnapshot } from \"valtio\";\r\nimport { type SetStateAction, type Dispatch, useEffect, useRef } from \"react\";\r\nimport { usePython } from \"../usePython\";\r\nimport { sanitizeTauriEvent } from \"../../utils/utils\";\r\n\r\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n/**\r\n * The setter function type - identical to React's useState setter\r\n */\r\ntype FileSetter = Dispatch<SetStateAction<string>>;\r\n/**\r\n * File utilities returned as the third element\r\n */\r\ninterface FileUtils {\r\n /** Force refresh the file content from disk */\r\n refresh: () => Promise<void>;\r\n /** Get file modification time */\r\n getMtime: () => Promise<number>;\r\n}\r\n/**\r\n * Result from file subscription\r\n */\r\ninterface FileSubscriptionResult {\r\n path?: string;\r\n}\r\n/**\r\n * The return type of useFile - a tuple like useState\r\n * [content, setContent, exists, { refresh, getMtime }]\r\n */\r\ntype UseFileReturn = readonly [string, FileSetter, boolean, FileUtils];\r\n// ============================================================================\r\n// Internal Implementation\r\n// ============================================================================\r\ninterface IFile {\r\n content: string;\r\n exists: boolean;\r\n mime_type: string;\r\n setContent: (content: SetStateAction<string>) => void;\r\n refresh: () => Promise<void>;\r\n getMtime: () => Promise<number>;\r\n // Track last modification timestamp\r\n _lastModified: number;\r\n // Track subscription count\r\n _subscriptionCount: number;\r\n // Track if content has been loaded\r\n _isLoaded: boolean;\r\n // Track the resolved file path from Python\r\n _filePath: string;\r\n}\r\n\r\nconst files = proxy<Record<string, IFile>>({});\r\n// ============================================================================\r\n// Public API - useState-like Hook\r\n// ============================================================================\r\n/**\r\n * A file-backed state hook with a useState-like API.\r\n * Watches the file for changes and auto-syncs using watchfiles.\r\n * Auto-creates the file if it doesn't exist.\r\n * \r\n * @example\r\n * // Simple text file\r\n * const [content, setContent, exists] = useFile(\"config.txt\");\r\n * setContent(\"new content\");\r\n * \r\n * @example\r\n * // With initial content\r\n * const [content, setContent, exists] = useFile(\"settings.json\", \"{}\");\r\n * \r\n * @example\r\n * // With custom base directory\r\n * const [content, setContent, exists] = useFile(\"data.txt\", \"\", { baseDir: \"./data\" });\r\n * \r\n * @example\r\n * // With utilities\r\n * const [content, setContent, exists, { refresh }] = useFile(\"notes.txt\");\r\n * if (!exists) console.log(\"File doesn't exist yet\");\r\n * await refresh(); // Force reload from disk\r\n * \r\n * @param filename - The filename relative to base directory\r\n * @param initialValue - Optional initial content if file doesn't exist\r\n * @param options - Optional configuration { baseDir: string }\r\n * @returns A tuple [content, setContent, exists, { refresh, getMtime }] similar to useState\r\n */\r\n\r\nexport function useFileImpl(\r\n filename: string,\r\n options: {\r\n initialValue?: string,\r\n baseDir?: string,\r\n width?: number,\r\n height?: number,\r\n quality?: number,\r\n bitrate?: string,\r\n resolution?: string,\r\n fps?: number,\r\n thumbnail?: boolean,\r\n thumb_time?: string,\r\n format?: string,\r\n download?: boolean,\r\n } = {}\r\n): UseFileReturn {\r\n const { baseDir = \".\" } = options;\r\n const { pyInvoke, isStreamReady } = usePython();\r\n const fileKey = `${baseDir}:${filename}`;\r\n const filePathRef = useRef<string>(\"\");\r\n const mounted = useRef(true);\r\n useEffect(() => {\r\n mounted.current = true;\r\n return () => {\r\n mounted.current = false;\r\n };\r\n }, []);\r\n function FileURL(src: string): string {\r\n const params = new URLSearchParams();\r\n // Add timestamp for cache busting\r\n params.append('t', Date.now().toString());\r\n // Add image options\r\n if (options.width) params.append('width', options.width.toString());\r\n if (options.height) params.append('height', options.height.toString());\r\n if (options.quality) params.append('quality', options.quality.toString());\r\n // Add audio options\r\n if (options.bitrate) params.append('bitrate', options.bitrate);\r\n // Add video options\r\n if (options.resolution) params.append('resolution', options.resolution);\r\n if (options.fps) params.append('fps', options.fps.toString());\r\n if (options.thumbnail !== undefined) params.append('thumbnail', options.thumbnail.toString());\r\n if (options.thumb_time) params.append('thumb_time', options.thumb_time);\r\n // Add general options\r\n if (options.format) params.append('format', options.format);\r\n if (options.download !== undefined) params.append('download', options.download.toString());\r\n return `/file/${encodeURIComponent(src)}?${params.toString()}`;\r\n }\r\n async function request(body: Record<string, unknown>): Promise<Record<string, unknown> | null> {\r\n try {\r\n const res = await pyInvoke<{ data?: Record<string, unknown>; error?: string }>('file', body);\r\n if (res && typeof res === 'object' && 'data' in res) {\r\n return res.data as Record<string, unknown>;\r\n }\r\n return null;\r\n } catch (e) {\r\n console.error(\"File request failed\", e);\r\n return null;\r\n }\r\n }\r\n async function refreshFile(filename: string, baseDir: string) {\r\n const result = await request({\r\n command: 'read',\r\n filename,\r\n base_dir: baseDir,\r\n initial_content: options.initialValue ?? \"\"\r\n });\r\n if (result) {\r\n const file = files[fileKey];\r\n if (file) {\r\n file.content = result.mime_type !== \"text/plain\" ? FileURL(result.content as string) : (result.content as string) || \"\";\r\n file.mime_type = (result.mime_type as string) || \"text/plain\";\r\n file._lastModified = (result.mtime as number) || Date.now();\r\n file.exists = result.exists === true;\r\n file._isLoaded = true;\r\n }\r\n }\r\n }\r\n function setContent(newContent: SetStateAction<string>) {\r\n const file = files[fileKey];\r\n if (!file) return;\r\n let content: string;\r\n if (typeof newContent === \"function\") {\r\n content = newContent(file.content);\r\n } else {\r\n content = newContent;\r\n }\r\n // Update local state immediately\r\n file.content = content;\r\n // Write to file asynchronously\r\n request({\r\n command: 'write',\r\n filename,\r\n base_dir: baseDir,\r\n content\r\n }).then(result => {\r\n if (result && result.mtime) {\r\n file._lastModified = result.mtime as number;\r\n file.mime_type = \"text/plain\";\r\n file.exists = true;\r\n }\r\n }).catch(e => console.error(\"File write failed\", e));\r\n }\r\n function createFile(filename: string, baseDir: string): void {\r\n files[fileKey] = {\r\n content: options.initialValue ?? \"\",\r\n mime_type: \"text/plain\",\r\n exists: false,\r\n _lastModified: Date.now(),\r\n _subscriptionCount: 0,\r\n _isLoaded: false,\r\n _filePath: \"\",\r\n setContent,\r\n refresh: async () => {\r\n await refreshFile(filename, baseDir);\r\n },\r\n getMtime: async () => {\r\n const result = await request({\r\n command: 'mtime',\r\n filename,\r\n base_dir: baseDir\r\n });\r\n return (result?.mtime as number) || 0;\r\n },\r\n };\r\n // Fetch existing content from file (or create if not exists)\r\n (async () => {\r\n await refreshFile(filename, baseDir);\r\n })();\r\n }\r\n if (!files[fileKey]) {\r\n createFile(filename, baseDir);\r\n }\r\n // Subscribe to file change events works in both WebSocket and Tauri modes\r\n useEffect(() => {\r\n const file = files[fileKey];\r\n if (!file || !isStreamReady) return;\r\n let eventName = \"\";\r\n // Tauri: store the unlisten function\r\n let tauriUnlisten: (() => void) | undefined;\r\n // WebSocket mode: event arrives as window CustomEvent with {detail: {response: {timestamp, exists}}}\r\n const handleFileChangeWS = (event: Event) => {\r\n const customEvent = event as CustomEvent<{ response: { timestamp: number; exists: boolean } }>;\r\n const { timestamp, exists: fileExists } = customEvent.detail.response;\r\n const currentFile = files[fileKey];\r\n if (currentFile && timestamp > currentFile._lastModified) {\r\n currentFile._lastModified = timestamp;\r\n currentFile.exists = fileExists;\r\n refreshFile(filename, baseDir);\r\n }\r\n };\r\n // Tauri mode: event payload arrives directly as {timestamp, exists}\r\n const handleFileChangeTauri = (data: { timestamp: number; exists: boolean }) => {\r\n const { timestamp, exists: fileExists } = data;\r\n const currentFile = files[fileKey];\r\n if (currentFile && timestamp > currentFile._lastModified) {\r\n currentFile._lastModified = timestamp;\r\n currentFile.exists = fileExists;\r\n refreshFile(filename, baseDir);\r\n }\r\n };\r\n // Attach listener in the correct mode\r\n const addListener = async (evtName: string) => {\r\n if (isTauri) {\r\n const { listen } = await import(\"@tauri-apps/api/event\");\r\n tauriUnlisten = await listen<{ timestamp: number; exists: boolean }>(\r\n sanitizeTauriEvent(evtName),\r\n (e) => handleFileChangeTauri(e.payload)\r\n );\r\n } else {\r\n window.addEventListener(evtName, handleFileChangeWS);\r\n }\r\n };\r\n const setupSubscription = async () => {\r\n try {\r\n const result = await pyInvoke<FileSubscriptionResult>('file_subscribe', { filename, base_dir: baseDir }) as FileSubscriptionResult;\r\n if (!mounted.current) return;\r\n if (result && result.path) {\r\n file._filePath = result.path;\r\n filePathRef.current = result.path;\r\n eventName = `file_changed:${result.path}`;\r\n if (mounted.current) {\r\n await addListener(eventName);\r\n }\r\n }\r\n } catch {\r\n // Silently fail - server might not support subscriptions yet\r\n }\r\n };\r\n // Increment subscription count and subscribe on first subscriber\r\n file._subscriptionCount++;\r\n if (file._subscriptionCount === 1) {\r\n setupSubscription();\r\n } else if (file._filePath) {\r\n // Already have the path, set up listener immediately\r\n eventName = `file_changed:${file._filePath}`;\r\n addListener(eventName);\r\n }\r\n return () => {\r\n if (isStreamReady) {\r\n // Tauri: call the unlisten function; WebSocket: remove window listener\r\n if (isTauri) {\r\n tauriUnlisten?.();\r\n } else if (eventName) {\r\n window.removeEventListener(eventName, handleFileChangeWS);\r\n }\r\n const currentFile = files[fileKey];\r\n if (currentFile) {\r\n currentFile._subscriptionCount--;\r\n if (currentFile._subscriptionCount === 0) {\r\n pyInvoke('file_unsubscribe', { filename, base_dir: baseDir }).catch(() => {});\r\n }\r\n }\r\n }\r\n };\r\n }, [filename, baseDir, fileKey, isStreamReady]);\r\n const snap = useSnapshot(files[fileKey]);\r\n return [\r\n snap.content,\r\n snap.setContent as FileSetter,\r\n snap.exists,\r\n {\r\n refresh: snap.refresh,\r\n getMtime: snap.getMtime,\r\n }\r\n ] as const;\r\n}\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n FileSetter,\r\n FileUtils,\r\n UseFileReturn\r\n};","import { useState, useEffect, useLayoutEffect, useRef } from \"react\";\r\n\r\nfunction classifyAspectRatio(width: number, height: number) {\r\n const targetRatios = {\r\n \"16:9\": 16 / 9,\r\n \"9:16\": 9 / 16,\r\n \"1:1\": 1 / 1,\r\n \"4:3\": 4 / 3,\r\n \"21:9\": 21 / 9\r\n };\r\n // Calculate actual ratio\r\n const actualRatio = width / height;\r\n // Find closest match\r\n let closestRatio = null;\r\n let smallestDifference = Infinity;\r\n for (const [name, value] of Object.entries(targetRatios)) {\r\n const difference = Math.abs(actualRatio - value);\r\n if (difference < smallestDifference) {\r\n smallestDifference = difference;\r\n closestRatio = name;\r\n }\r\n }\r\n return closestRatio;\r\n}\r\n// Examples\r\nconsole.log(classifyAspectRatio(1920, 1080)); // \"16:9\"\r\nconsole.log(classifyAspectRatio(1080, 1920)); // \"9:16\"\r\nconsole.log(classifyAspectRatio(1000, 1000)); // \"1:1\"\r\nconsole.log(classifyAspectRatio(1024, 768)); // \"4:3\"\r\nconsole.log(classifyAspectRatio(2560, 1080)); // \"21:9\"\r\nconsole.log(classifyAspectRatio(1400, 1000)); // \"4:3\" (1.4 is closest to 1.333...)\r\n\r\nexport default function useElementSize<T extends HTMLElement>() {\r\n const ref = useRef<T | null>(null);\r\n const [state, setState] = useState({\r\n width: 0,\r\n height: 0,\r\n overflowX: false,\r\n overflowY: false,\r\n aspectRatio: \"16:9\",\r\n });\r\n useEffect(() => {\r\n if (!ref.current) return;\r\n const element = ref.current;\r\n const observer = new ResizeObserver((entries) => {\r\n if (!Array.isArray(entries) || !entries.length) return;\r\n const entry = entries[0];\r\n let width: number;\r\n let height: number;\r\n if (entry.borderBoxSize && entry.borderBoxSize.length > 0) {\r\n width = entry.borderBoxSize[0].inlineSize;\r\n height = entry.borderBoxSize[0].blockSize;\r\n } else {\r\n width = entry.contentRect.width;\r\n height = entry.contentRect.height;\r\n }\r\n const isHidden = width === 0 && height === 0;\r\n if (!isHidden) {\r\n setState((prev) => {\r\n if (prev.width === width && prev.height === height) {\r\n return prev;\r\n }\r\n return { ...prev, width, height, aspectRatio: classifyAspectRatio(width, height) || \"16:9\" };\r\n });\r\n }\r\n });\r\n observer.observe(element, { box: \"border-box\" });\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, []);\r\n // Check overflow after layout updates (when content changes)\r\n useLayoutEffect(() => {\r\n if (!ref.current) return;\r\n const element = ref.current;\r\n const overflowX = element.scrollWidth > element.clientWidth;\r\n const overflowY = element.scrollHeight > element.clientHeight;\r\n setState((prev) => {\r\n if (prev.overflowX === overflowX && prev.overflowY === overflowY) {\r\n return prev;\r\n }\r\n return { ...prev, overflowX, overflowY };\r\n });\r\n }, [state.width, state.height]);\r\n return [ref, state] as const;\r\n}","import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from \"./ui/resizable\";\r\nimport React, { useRef, useEffect, useLayoutEffect, useState, useCallback } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { useSnapshot } from \"valtio\";\r\nimport { DragState, KeyState, reorderChildren, TabInfo, TabState, Viewport } from \"../utils/state\";\r\nimport { cn } from \"../lib/utils\";\r\nimport type { ImperativePanelHandle } from \"react-resizable-panels\";\r\n\r\nexport type LayoutType =\r\n | \"horizontal\" // Side by side (1x2)\r\n | \"vertical\" // Top and bottom (2x1)\r\n | \"grid2x2\" // 2x2 grid (4 views) \r\n | \"triple\" // 3 views: 3 horizontal stacked\r\n | \"triple-left\" // 3 views: 1 left, 2 right stacked\r\n | \"triple-right\" // 3 views: 2 left stacked, 1 right\r\n | \"triple-top\" // 3 views: 1 top, 2 bottom side by side\r\n | \"triple-bottom\" // 3 views: 2 top side by side, 1 bottom\r\n | \"single\"; // Single view (no split)\r\ninterface MultiViewProps {\r\n actives: number[] | readonly number[];\r\n layout?: LayoutType;\r\n children: React.ReactNode[] | React.ReactNode;\r\n defaultSizes?: number[];\r\n className?: string;\r\n}\r\n\r\nconst ViewSlot = ({ node, id }: { node: HTMLElement | undefined, id: string }) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const { record } = useSnapshot(DragState);\r\n const tabInfo = useSnapshot(TabInfo);\r\n const { ctrl, shift } = useSnapshot(KeyState);\r\n const active = ctrl && shift && tabInfo.switchMode;\r\n // Replace all drag state with pointer state\r\n const isDragging = useRef(false);\r\n const startPos = useRef({ x: 0, y: 0 });\r\n const DRAG_THRESHOLD = 6; // px before drag is \"committed\"\r\n useLayoutEffect(() => {\r\n if (node && ref.current) {\r\n ref.current.appendChild(node);\r\n }\r\n }, [node]);\r\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\r\n if (!active) return;\r\n e.currentTarget.setPointerCapture(e.pointerId);\r\n startPos.current = { x: e.clientX, y: e.clientY };\r\n isDragging.current = false;\r\n DragState.set(\"id\", id);\r\n DragState.set(\"over\", id);\r\n }, [active, id]);\r\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\r\n if (!active || !DragState.record[\"id\"]) return;\r\n const dx = Math.abs(e.clientX - startPos.current.x);\r\n const dy = Math.abs(e.clientY - startPos.current.y);\r\n if (dx > DRAG_THRESHOLD || dy > DRAG_THRESHOLD) {\r\n isDragging.current = true;\r\n }\r\n if (!isDragging.current) return;\r\n // Hit-test which slot the pointer is over\r\n e.currentTarget.releasePointerCapture(e.pointerId); // allow hit-testing other elements\r\n const el = document.elementFromPoint(e.clientX, e.clientY);\r\n const slot = el?.closest(\"[data-slot-id]\");\r\n const overId = slot?.getAttribute(\"data-slot-id\");\r\n if (overId) DragState.set(\"over\", overId);\r\n }, [active]);\r\n const handlePointerUp = useCallback(() => {\r\n if (!active) return;\r\n const fromId = DragState.record[\"id\"]?.replace(\".$\", \"\");\r\n const toId = DragState.record[\"over\"]?.replace(\".$\", \"\");\r\n if (isDragging.current && fromId && toId && fromId !== toId) {\r\n const fromIndex = TabInfo.children.findIndex(c => c === fromId);\r\n const toIndex = TabInfo.children.findIndex(c => c === toId);\r\n if (fromIndex !== -1 && toIndex !== -1) {\r\n TabInfo.children = reorderChildren(tabInfo.active, fromIndex, toIndex);\r\n TabInfo.switchMode = false;\r\n }\r\n } else if (!isDragging.current) {\r\n // It was a click, not a drag\r\n TabInfo.switchMode = false;\r\n }\r\n DragState.set(\"id\", null);\r\n DragState.set(\"over\", null);\r\n isDragging.current = false;\r\n }, [active, tabInfo.active]);\r\n return (\r\n <div\r\n data-slot-id={id} // ← used by hit-test in pointerMove\r\n onPointerDown={handlePointerDown}\r\n onPointerMove={handlePointerMove}\r\n onPointerUp={handlePointerUp}\r\n onContextMenu={() => { TabInfo.switchMode = false; }}\r\n style={{ touchAction: \"none\" }} // required for pointer capture on touch/stylus\r\n className={cn(\r\n (active && record[\"id\"] === id) ? \"opacity-[0.25] bg-transparent\"\r\n : record[\"over\"] === id ? \"bg-blue-500/25 cursor-grabbing\"\r\n : \"\",\r\n \"w-full h-full absolute flex items-center justify-center\"\r\n )}\r\n >\r\n <div className={cn(\r\n \"w-full h-full absolute transform\",\r\n active && \"scale-[0.85] shadow-md transition-all duration-100 hover:ring-2 hover:ring-blue-500\",\r\n active && id === record[\"id\"] && \"cursor-grab\"\r\n )}>\r\n <div className={cn(\r\n \"w-full h-full relative bg-card overflow-hidden\",\r\n active && \"pointer-events-none select-none\"\r\n )} ref={ref} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nconst getVisibleSlots = (layout: LayoutType): number => {\r\n switch (layout) {\r\n case \"single\": return 1;\r\n case \"horizontal\":\r\n case \"vertical\": return 2;\r\n case \"triple-left\":\r\n case \"triple-right\":\r\n case \"triple-top\":\r\n case \"triple\":\r\n case \"triple-bottom\": return 3;\r\n case \"grid2x2\": return 4;\r\n default: return 1;\r\n }\r\n};\r\n\r\nexport default function MultiView({\r\n actives = [0],\r\n layout = \"horizontal\",\r\n children,\r\n defaultSizes,\r\n className = \"\"\r\n}: MultiViewProps) {\r\n const [mounted, setMounted] = useState(false);\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n const childArray = React.Children.toArray(children);\r\n const nodesRef = useRef<Map<string, HTMLDivElement>>(new Map());\r\n const hiddenRef = useRef<HTMLDivElement>(null);\r\n // Initialize nodes for new children\r\n childArray.forEach(child => {\r\n const key = (child as any).key;\r\n if (typeof document !== 'undefined' && !nodesRef.current.has(key)) {\r\n const node = document.createElement('div');\r\n node.style.width = '100%';\r\n node.style.height = '100%';\r\n node.style.position = 'absolute';\r\n nodesRef.current.set(key, node);\r\n }\r\n });\r\n // Cleanup unused nodes\r\n useEffect(() => {\r\n const currentKeys = new Set(childArray.map(c => (c as any).key));\r\n for (const [key, node] of nodesRef.current) {\r\n if (!currentKeys.has(key)) {\r\n node.remove();\r\n nodesRef.current.delete(key);\r\n }\r\n }\r\n }, [childArray]);\r\n // Helper to save scroll positions of all scrollable elements within a node\r\n // const saveScrollPositions = useCallback((node: HTMLElement): Map<Element, { top: number; left: number }> => {\r\n // const scrollMap = new Map<Element, { top: number; left: number }>();\r\n // // Save the node's own scroll position if it's scrollable\r\n // if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\r\n // scrollMap.set(node, { top: node.scrollTop, left: node.scrollLeft });\r\n // }\r\n // // Find all scrollable descendants\r\n // const scrollableElements = node.querySelectorAll('*');\r\n // scrollableElements.forEach((el) => {\r\n // if (el.scrollTop !== 0 || el.scrollLeft !== 0) {\r\n // scrollMap.set(el, { top: el.scrollTop, left: el.scrollLeft });\r\n // }\r\n // });\r\n // return scrollMap;\r\n // }, []);\r\n // // Helper to restore scroll positions\r\n // const restoreScrollPositions = useCallback((scrollMap: Map<Element, { top: number; left: number }>) => {\r\n // // Use requestAnimationFrame to ensure DOM has settled\r\n // requestAnimationFrame(() => {\r\n // scrollMap.forEach((pos, el) => {\r\n // if (el && el.isConnected) {\r\n // el.scrollTop = pos.top;\r\n // el.scrollLeft = pos.left;\r\n // }\r\n // });\r\n // });\r\n // }, []);\r\n // Move inactive nodes to hidden area and manage scroll positions\r\n useLayoutEffect(() => {\r\n const visibleSlots = getVisibleSlots(layout);\r\n const activeKeys = new Set<string>();\r\n for (let i = 0; i < visibleSlots; i++) {\r\n const childIndex = actives[i] ?? i;\r\n const child = childArray[childIndex];\r\n if (child) {\r\n activeKeys.add((child as any).key);\r\n }\r\n }\r\n if (hiddenRef.current) {\r\n // Collect all scroll positions before moving any nodes\r\n // const allScrollPositions = new Map<Element, { top: number; left: number }>();\r\n // nodesRef.current.forEach((node) => {\r\n // const scrollPositions = saveScrollPositions(node);\r\n // scrollPositions.forEach((pos, el) => allScrollPositions.set(el, pos));\r\n // });\r\n // Move inactive nodes to hidden area\r\n nodesRef.current.forEach((node, key) => {\r\n if (!activeKeys.has(key)) {\r\n hiddenRef.current!.appendChild(node);\r\n }\r\n });\r\n // Restore all scroll positions after DOM moves\r\n // restoreScrollPositions(allScrollPositions);\r\n }\r\n }, [actives, layout, childArray]);\r\n const getSlot = (slotIndex: number) => {\r\n const childIndex = actives[slotIndex] ?? slotIndex;\r\n const child = childArray[childIndex];\r\n const key = child ? (child as any).key : null;\r\n const node = key ? nodesRef.current.get(key) : undefined;\r\n return <ViewSlot key={key || `slot-${slotIndex}`} node={node} id={key} />;\r\n };\r\n const { size } = useSnapshot(TabInfo);\r\n const { aspectRatio } = useSnapshot(Viewport);\r\n const renderLayout = useCallback(() => {\r\n const { ctrl, shift } = useSnapshot(KeyState);\r\n const tabInfo = useSnapshot(TabInfo);\r\n const active = tabInfo.switchMode;\r\n const dragEvent = {\r\n className: ctrl && shift && active ? \"bg-accent/50 dark:bg-accent/25\" : \"bg-[hsl(var(--chat-border))]/50 dark:bg-[hsl(var(--chat-border))]\",\r\n }\r\n function handleResize(e: number, index: number) {\r\n if (TabInfo.active !== \"\" && TabInfo.size[index]) TabInfo.size[index] = e;\r\n if (TabState[TabInfo.active] && TabState[TabInfo.active].size[index]) TabState[TabInfo.active].size[index] = e;\r\n }\r\n const refs = [\r\n useRef<ImperativePanelHandle>(null),\r\n useRef<ImperativePanelHandle>(null),\r\n useRef<ImperativePanelHandle>(null),\r\n useRef<ImperativePanelHandle>(null),\r\n useRef<ImperativePanelHandle>(null),\r\n ];\r\n useLayoutEffect(() => {\r\n refs.forEach((ref, i) => {\r\n if (ref.current) {\r\n const defaultSize = layout === \"triple\" ? 33.33 : 50;\r\n ref.current.resize(TabInfo.size[i] ?? defaultSize); // 👈 use saved size\r\n }\r\n });\r\n }, [layout]);\r\n const currentLayout = layout === \"single\" ? \"single\" : aspectRatio === \"9:16\" ? 'vertical' : layout;\r\n // Horizontal split (1x2 or grid1x2) - 2 views side by side\r\n if ((currentLayout === \"horizontal\")) {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-horizontal\"\r\n direction=\"horizontal\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} className={className} defaultSize={size?.[0] || 50} minSize={20}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} className={className} defaultSize={size?.[1] || 50} minSize={20}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Vertical split (2x1 or grid2x1) - 2 views top and bottom\r\n if ((currentLayout === \"vertical\")) {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-vertical\"\r\n direction=\"vertical\"\r\n >\r\n <ResizablePanel ref={refs[0]} className={className} onResize={(e) => handleResize(e, 0)} defaultSize={size?.[0] || 50} minSize={30}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[1]} className={className} onResize={(e) => handleResize(e, 1)} defaultSize={size?.[1] || 50} minSize={30}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Grid 2x2 - 4 views in a grid\r\n if (currentLayout === \"grid2x2\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-grid2x2\"\r\n direction=\"vertical\"\r\n >\r\n {/* Top row */}\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} defaultSize={size?.[0] || 50} minSize={30}>\r\n <ResizablePanelGroup direction=\"horizontal\">\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} className={className} defaultSize={size?.[1] || 50} minSize={20}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={size?.[2] || 50} minSize={20}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n {/* Bottom row */}\r\n <ResizablePanel ref={refs[3]} onResize={(e) => handleResize(e, 3)} defaultSize={size?.[3] || 50} minSize={30}>\r\n <ResizablePanelGroup direction=\"horizontal\">\r\n <ResizablePanel ref={refs[4]} onResize={(e) => handleResize(e, 4)} className={className} defaultSize={size?.[4] || 50} minSize={20}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[5]} onResize={(e) => handleResize(e, 5)} className={className} defaultSize={size?.[5] || 50} minSize={20}>\r\n {getSlot(3)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Triple: 3 horizontal stacked\r\n if (currentLayout === \"triple\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-triple\"\r\n direction=\"horizontal\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} className={className} defaultSize={size?.[0] || 50} minSize={20}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} className={className} defaultSize={size?.[1] || 50} minSize={20}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={size?.[2] || 50} minSize={20}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Triple-left: 1 left panel, 2 right panels stacked\r\n if (currentLayout === \"triple-left\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-triple-left\"\r\n direction=\"horizontal\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} className={className} defaultSize={size?.[0] || 50} minSize={30}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} defaultSize={size?.[1] || 50} minSize={20}>\r\n <ResizablePanelGroup direction=\"vertical\">\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={defaultSizes?.[2] || 50} minSize={30}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[3]} onResize={(e) => handleResize(e, 3)} className={className} defaultSize={size?.[3] || 50} minSize={30}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Triple-right: 2 left panels stacked, 1 right panel\r\n if (currentLayout === \"triple-right\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-triple-right\"\r\n direction=\"horizontal\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} defaultSize={size?.[0] || 50} minSize={20}>\r\n <ResizablePanelGroup direction=\"vertical\">\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} className={className} defaultSize={size?.[1] || 50} minSize={30}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={size?.[2] || 50} minSize={30}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[3]} onResize={(e) => handleResize(e, 3)} className={className} defaultSize={size?.[3] || 50} minSize={30}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Triple-top: 1 top panel, 2 bottom panels side by side\r\n if (currentLayout === \"triple-top\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-triple-top\"\r\n direction=\"vertical\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} className={className} defaultSize={size?.[0] || 50} minSize={30}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} defaultSize={size?.[1] || 50} minSize={30}>\r\n <ResizablePanelGroup direction=\"horizontal\">\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={size?.[2] || 50} minSize={20}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[3]} onResize={(e) => handleResize(e, 3)} className={className} defaultSize={size?.[3] || 50} minSize={20}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Triple-bottom: 2 top panels side by side, 1 bottom panel\r\n if (currentLayout === \"triple-bottom\") {\r\n return (\r\n <ResizablePanelGroup\r\n key=\"layout-triple-bottom\"\r\n direction=\"vertical\"\r\n >\r\n <ResizablePanel ref={refs[0]} onResize={(e) => handleResize(e, 0)} defaultSize={size?.[0] || 50} minSize={30}>\r\n <ResizablePanelGroup direction=\"horizontal\">\r\n <ResizablePanel ref={refs[1]} onResize={(e) => handleResize(e, 1)} className={className} defaultSize={size?.[1] || 50} minSize={20}>\r\n {getSlot(0)}\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[2]} onResize={(e) => handleResize(e, 2)} className={className} defaultSize={size?.[2] || 50} minSize={20}>\r\n {getSlot(1)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n </ResizablePanel>\r\n <ResizableHandle {...dragEvent} />\r\n <ResizablePanel ref={refs[3]} onResize={(e) => handleResize(e, 3)} className={className} defaultSize={size?.[3] || 50} minSize={30}>\r\n {getSlot(2)}\r\n </ResizablePanel>\r\n </ResizablePanelGroup>\r\n );\r\n }\r\n // Single view\r\n return <div key=\"layout-single\" className={'absolute top-0 left-0 w-full h-full'}>{getSlot(0)}</div>;\r\n }, [layout, size, actives, aspectRatio])\r\n return (\r\n <>\r\n {renderLayout()}\r\n <div ref={hiddenRef} style={{ display: 'none' }} />\r\n {mounted && childArray.map((child) => {\r\n const key = (child as any).key;\r\n const node = nodesRef.current.get(key);\r\n if (node) {\r\n return createPortal(child, node, key);\r\n }\r\n return null;\r\n })}\r\n </>\r\n );\r\n}\r\n","import React, { useState, useRef, useCallback } from 'react';\r\nimport { writeFile } from '@tauri-apps/plugin-fs';\r\nimport uuidv4 from '../utils/uuid';\r\ninterface RecordProps {\r\n workspace: string;\r\n onRecordingComplete?: (audioBlob: Blob, normalizedSamples: Float32Array) => void;\r\n onFileSaved?: (path: string) => void;\r\n onRecordingStart?: () => void;\r\n onRecordingStop?: () => void;\r\n onError?: (error: string) => void;\r\n // Optional controls\r\n preferManualWav?: boolean; // force manual worklet path even if MediaRecorder supports WAV\r\n targetSampleRate?: number; // desired output sample rate (default 16000)\r\n downsample?: boolean; // controls whether to resample to targetSampleRate (default true)\r\n children: ((props: {\r\n isRecording: boolean;\r\n startRecording: () => Promise<void>;\r\n stopRecording: () => void;\r\n }) => React.ReactNode);\r\n}\r\ninterface RecordComponentRef {\r\n startRecording: () => Promise<void>;\r\n stopRecording: () => void;\r\n isRecording: boolean;\r\n}\r\n\r\nconst Record = React.forwardRef<RecordComponentRef, RecordProps>(({\r\n workspace,\r\n onRecordingComplete,\r\n onFileSaved,\r\n onRecordingStart,\r\n onRecordingStop,\r\n onError,\r\n preferManualWav = false,\r\n targetSampleRate = 16000,\r\n downsample = true,\r\n children\r\n}, ref) => {\r\n const [isRecording, setIsRecording] = useState(false);\r\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\r\n const audioContextRef = useRef<AudioContext | null>(null);\r\n const sourceNodeRef = useRef<MediaStreamAudioSourceNode | null>(null);\r\n const processorNodeRef = useRef<any>(null); // Fallback only\r\n const workletNodeRef = useRef<AudioWorkletNode | null>(null);\r\n const workletUrlRef = useRef<string | null>(null);\r\n const recordedFloat32Ref = useRef<Float32Array[]>([]);\r\n const streamRef = useRef<MediaStream | null>(null);\r\n const chunksRef = useRef<Blob[]>([]);\r\n const highPassFilterRef = useRef<BiquadFilterNode | null>(null);\r\n const lowPassFilterRef = useRef<BiquadFilterNode | null>(null);\r\n // Audio normalization function\r\n const normalizeAudio = useCallback((samples: Float32Array): Float32Array => {\r\n let max = 0;\r\n for (let i = 0; i < samples.length; i++) {\r\n if (Math.abs(samples[i]) > max) max = Math.abs(samples[i]);\r\n }\r\n if (max < 1e-6) return samples;\r\n const scale = 1.0 / max;\r\n const normalized = new Float32Array(samples.length);\r\n for (let i = 0; i < samples.length; i++) {\r\n normalized[i] = samples[i] * scale;\r\n }\r\n return normalized;\r\n }, []);\r\n // Convert audio blob to normalized samples\r\n const processAudioBlob = useCallback(async (blob: Blob): Promise<Float32Array> => {\r\n try {\r\n const arrayBuffer = await blob.arrayBuffer();\r\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\r\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\r\n // Get mono channel data (mix down if stereo)\r\n let samples: Float32Array;\r\n if (audioBuffer.numberOfChannels === 1) {\r\n samples = audioBuffer.getChannelData(0);\r\n } else {\r\n // Mix down to mono\r\n const left = audioBuffer.getChannelData(0);\r\n const right = audioBuffer.getChannelData(1);\r\n samples = new Float32Array(left.length);\r\n for (let i = 0; i < left.length; i++) {\r\n samples[i] = (left[i] + right[i]) / 2;\r\n }\r\n }\r\n return normalizeAudio(samples);\r\n } catch (error) {\r\n console.error('Error processing audio blob:', error);\r\n throw error;\r\n }\r\n }, [normalizeAudio]);\r\n const startRecording = useCallback(async (): Promise<void> => {\r\n try {\r\n // Request microphone access with specific constraints for targetSampleRate mono\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n sampleRate: targetSampleRate,\r\n channelCount: 1,\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n autoGainControl: true\r\n }\r\n });\r\n streamRef.current = stream;\r\n // Strengthen WebRTC audio processing if available\r\n try {\r\n const [track] = stream.getAudioTracks();\r\n await track.applyConstraints({\r\n echoCancellation: { ideal: true },\r\n noiseSuppression: { ideal: true },\r\n autoGainControl: { ideal: true }\r\n } as MediaTrackConstraints);\r\n } catch (e) {\r\n console.warn('applyConstraints for NS/EC/AGC not supported or failed:', e);\r\n }\r\n chunksRef.current = [];\r\n const supportsWav = MediaRecorder.isTypeSupported('audio/wav') && !preferManualWav;\r\n if (supportsWav) {\r\n // Use MediaRecorder directly when WAV is supported\r\n const options: MediaRecorderOptions = { mimeType: 'audio/wav' };\r\n const mediaRecorder = new MediaRecorder(stream, options);\r\n mediaRecorderRef.current = mediaRecorder;\r\n mediaRecorder.ondataavailable = (event) => {\r\n if (event.data.size > 0) {\r\n chunksRef.current.push(event.data);\r\n }\r\n };\r\n mediaRecorder.onstop = async () => {\r\n try {\r\n const audioBlob = new Blob(chunksRef.current, { type: 'audio/wav' });\r\n const normalizedSamples = await processAudioBlob(audioBlob);\r\n // Write to PROJECT_ROOT/record.wav via Tauri\r\n try {\r\n const recordPath = (window as any).PROJECT_ROOT + \"/Workspaces/\" + workspace + \"/record-\" + uuidv4() + \".wav\";\r\n const arrayBuffer = await audioBlob.arrayBuffer();\r\n await writeFile(recordPath, new Uint8Array(arrayBuffer));\r\n onFileSaved?.(recordPath);\r\n } catch (e) {\r\n console.error('Failed to write recording to disk:', e);\r\n }\r\n onRecordingComplete?.(audioBlob, normalizedSamples);\r\n } catch (error) {\r\n onError?.(`Error processing recording: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n };\r\n mediaRecorder.start(100); // Collect data every 100ms\r\n } else {\r\n // Manual PCM capture and WAV encoding path (prefer AudioWorklet)\r\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)({ sampleRate: 48000 });\r\n audioContextRef.current = audioContext;\r\n const source = audioContext.createMediaStreamSource(stream);\r\n sourceNodeRef.current = source;\r\n highPassFilterRef.current = audioContext.createBiquadFilter();\r\n highPassFilterRef.current.type = 'highpass';\r\n highPassFilterRef.current.frequency.value = 100; // cut <100 Hz\r\n lowPassFilterRef.current = audioContext.createBiquadFilter();\r\n lowPassFilterRef.current.type = 'lowpass';\r\n lowPassFilterRef.current.frequency.value = 7000; // cut >7 kHz\r\n source.connect(highPassFilterRef.current);\r\n highPassFilterRef.current.connect(lowPassFilterRef.current);\r\n recordedFloat32Ref.current = [];\r\n let workletReady = false;\r\n try {\r\n if (audioContext.audioWorklet) {\r\n const workletCode = `class PCMCollectorProcessor extends AudioWorkletProcessor {\\n process(inputs) {\\n const input = inputs[0];\\n if (input && input[0]) {\\n // Copy the current 128-sample block\\n const buffer = new Float32Array(input[0].length);\\n buffer.set(input[0]);\\n this.port.postMessage(buffer, [buffer.buffer]);\\n }\\n return true;\\n }\\n}\\nregisterProcessor('pcm-collector', PCMCollectorProcessor);`;\r\n const blob = new Blob([workletCode], { type: 'application/javascript' });\r\n const url = URL.createObjectURL(blob);\r\n workletUrlRef.current = url;\r\n await audioContext.audioWorklet.addModule(url);\r\n const node = new AudioWorkletNode(audioContext, 'pcm-collector', { numberOfInputs: 1, numberOfOutputs: 0, channelCount: 1 });\r\n workletNodeRef.current = node;\r\n node.port.onmessage = (event: MessageEvent) => {\r\n const chunk = event.data as Float32Array;\r\n // event.data is transferred; clone it before storing if needed\r\n recordedFloat32Ref.current.push(new Float32Array(chunk));\r\n };\r\n lowPassFilterRef.current.connect(node);\r\n // no need to connect to destination since we have no outputs\r\n workletReady = true;\r\n }\r\n } catch (e) {\r\n console.warn('AudioWorklet path unavailable, falling back to ScriptProcessor.', e);\r\n workletReady = false;\r\n }\r\n if (!workletReady) {\r\n // Fallback: ScriptProcessorNode (deprecated)\r\n const bufferSize = 4096;\r\n const processor = audioContext.createScriptProcessor(bufferSize, 1, 1);\r\n processorNodeRef.current = processor;\r\n processor.onaudioprocess = (e) => {\r\n const input = e.inputBuffer.getChannelData(0);\r\n recordedFloat32Ref.current.push(new Float32Array(input));\r\n };\r\n lowPassFilterRef.current.connect(processor);\r\n processor.connect(audioContext.destination); // Required in some browsers\r\n }\r\n }\r\n setIsRecording(true);\r\n onRecordingStart?.();\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\r\n onError?.(`Failed to start recording: ${errorMessage}`);\r\n }\r\n }, [onRecordingComplete, onFileSaved, onRecordingStart, onError, processAudioBlob, preferManualWav, targetSampleRate]);\r\n const stopRecording = useCallback(() => {\r\n if (!isRecording) return;\r\n (async () => {\r\n // If using MediaRecorder path\r\n if (mediaRecorderRef.current) {\r\n mediaRecorderRef.current.stop();\r\n }\r\n // If using manual PCM capture path\r\n if (processorNodeRef.current || workletNodeRef.current) {\r\n try {\r\n // Disconnect nodes\r\n if (processorNodeRef.current) {\r\n processorNodeRef.current.disconnect();\r\n }\r\n if (workletNodeRef.current) {\r\n workletNodeRef.current.port.onmessage = null as any;\r\n workletNodeRef.current.disconnect();\r\n }\r\n if (sourceNodeRef.current) sourceNodeRef.current.disconnect();\r\n if (highPassFilterRef.current) highPassFilterRef.current.disconnect();\r\n if (lowPassFilterRef.current) lowPassFilterRef.current.disconnect();\r\n const audioContext = audioContextRef.current;\r\n const inputSampleRate = audioContext?.sampleRate || 48000;\r\n const outSampleRate = downsample ? targetSampleRate : inputSampleRate;\r\n // Concatenate all recorded Float32 buffers\r\n const buffers = recordedFloat32Ref.current;\r\n const totalLength = buffers.reduce((sum, b) => sum + b.length, 0);\r\n const merged = new Float32Array(totalLength);\r\n let offset = 0;\r\n for (const b of buffers) {\r\n merged.set(b, offset);\r\n offset += b.length;\r\n }\r\n // Optionally resample to target sample rate with simple low-pass + linear interpolation\r\n const downsampled = (() => {\r\n const src = merged;\r\n if (!downsample || inputSampleRate === outSampleRate) return src;\r\n // One-pole low-pass filter (~7kHz cutoff) to reduce aliasing\r\n const cutoff = 7000;\r\n const rc = 1 / (2 * Math.PI * cutoff);\r\n const dt = 1 / inputSampleRate;\r\n const alpha = dt / (rc + dt);\r\n const filtered = new Float32Array(src.length);\r\n let prev = 0;\r\n for (let i = 0; i < src.length; i++) {\r\n prev = prev + alpha * (src[i] - prev);\r\n filtered[i] = prev;\r\n }\r\n // Linear interpolation resampling\r\n const ratio = inputSampleRate / outSampleRate;\r\n const newLength = Math.floor(src.length / ratio);\r\n const result = new Float32Array(newLength);\r\n let t = 0;\r\n for (let i = 0; i < newLength; i++) {\r\n const idx = Math.floor(t);\r\n const frac = t - idx;\r\n const s0 = filtered[idx] ?? 0;\r\n const s1 = filtered[idx + 1] ?? s0;\r\n result[i] = s0 + (s1 - s0) * frac;\r\n t += ratio;\r\n }\r\n return result;\r\n })();\r\n // Encode to 16-bit PCM WAV\r\n const wavBuffer = (() => {\r\n const numChannels = 1;\r\n const sampleRate = outSampleRate;\r\n const bytesPerSample = 2;\r\n const dataLength = downsampled.length * bytesPerSample;\r\n const buffer = new ArrayBuffer(44 + dataLength);\r\n const view = new DataView(buffer);\r\n // RIFF header\r\n const writeString = (offset: number, str: string) => {\r\n for (let i = 0; i < str.length; i++) {\r\n view.setUint8(offset + i, str.charCodeAt(i));\r\n }\r\n };\r\n writeString(0, 'RIFF');\r\n view.setUint32(4, 36 + dataLength, true);\r\n writeString(8, 'WAVE');\r\n writeString(12, 'fmt ');\r\n view.setUint32(16, 16, true); // Subchunk1Size (PCM)\r\n view.setUint16(20, 1, true); // AudioFormat (PCM)\r\n view.setUint16(22, numChannels, true);\r\n view.setUint32(24, sampleRate, true);\r\n view.setUint32(28, sampleRate * numChannels * bytesPerSample, true); // ByteRate\r\n view.setUint16(32, numChannels * bytesPerSample, true); // BlockAlign\r\n view.setUint16(34, 8 * bytesPerSample, true); // BitsPerSample\r\n writeString(36, 'data');\r\n view.setUint32(40, dataLength, true);\r\n // PCM samples\r\n let offsetBytes = 44;\r\n for (let i = 0; i < downsampled.length; i++, offsetBytes += 2) {\r\n const s = Math.max(-1, Math.min(1, downsampled[i]));\r\n view.setInt16(offsetBytes, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\r\n }\r\n return buffer;\r\n })();\r\n const wavBlob = new Blob([wavBuffer], { type: 'audio/wav' });\r\n // Write to PROJECT_ROOT/record.wav via Tauri\r\n try {\r\n const recordPath = (window as any).PROJECT_ROOT + \"/Workspaces/\" + workspace + \"/record-\" + uuidv4() + \".wav\";\r\n await writeFile(recordPath, new Uint8Array(wavBuffer));\r\n onFileSaved?.(recordPath);\r\n } catch (e) {\r\n console.error('Failed to write recording to disk:', e);\r\n }\r\n // Process normalized samples from the WAV blob (keeps existing pipeline)\r\n try {\r\n const normalizedSamples = await processAudioBlob(wavBlob);\r\n onRecordingComplete?.(wavBlob, normalizedSamples);\r\n } catch (e) {\r\n onError?.(`Error processing recording: ${e instanceof Error ? e.message : 'Unknown error'}`);\r\n }\r\n } finally {\r\n // Cleanup AudioContext and refs\r\n if (audioContextRef.current) {\r\n try { await audioContextRef.current.close(); } catch { }\r\n audioContextRef.current = null;\r\n }\r\n processorNodeRef.current = null;\r\n if (workletNodeRef.current) {\r\n workletNodeRef.current = null;\r\n }\r\n sourceNodeRef.current = null;\r\n recordedFloat32Ref.current = [];\r\n if (workletUrlRef.current) {\r\n try { URL.revokeObjectURL(workletUrlRef.current); } catch { }\r\n workletUrlRef.current = null;\r\n }\r\n highPassFilterRef.current = null;\r\n lowPassFilterRef.current = null;\r\n }\r\n }\r\n setIsRecording(false);\r\n onRecordingStop?.();\r\n // Clean up stream\r\n if (streamRef.current) {\r\n streamRef.current.getTracks().forEach(track => track.stop());\r\n streamRef.current = null;\r\n }\r\n })();\r\n }, [isRecording, onFileSaved, onRecordingStop, processAudioBlob, downsample, targetSampleRate]);\r\n // Expose methods through ref\r\n React.useImperativeHandle(ref, () => ({\r\n startRecording,\r\n stopRecording,\r\n isRecording\r\n }), [startRecording, stopRecording, isRecording]);\r\n // Render children with recording state\r\n return (\r\n <>\r\n {children({ isRecording, startRecording, stopRecording })}\r\n </>\r\n );\r\n});\r\nRecord.displayName = 'Record';\r\n\r\nexport default Record;\r\n\r\nexport type { RecordProps, RecordComponentRef };","import { ArrowUp, Plus, Mic, Square, FileCode, Video, Volume2, FileText, File as FileIcon } from 'lucide-react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { useState, useRef, useEffect, useCallback, useMemo, type CSSProperties } from 'react'\nimport clsx from 'clsx'\nimport Record from './record'\nimport { open } from '@tauri-apps/plugin-dialog'\n\n\nexport interface ContentBlock {\n type: 'text' | 'image' | 'file'\n value?: string\n url?: string\n name?: string\n fileType?: string\n}\n\nexport const MIME_MAP: Record<string, string> = {\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',\n webp: 'image/webp', svg: 'image/svg+xml', ico: 'image/x-icon',\n mp4: 'video/mp4', mkv: 'video/x-matroska', avi: 'video/x-msvideo',\n mov: 'video/quicktime', webm: 'video/webm',\n mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n pdf: 'application/pdf', csv: 'text/csv',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n js: 'text/javascript', jsx: 'text/javascript', ts: 'text/typescript',\n tsx: 'text/typescript', py: 'text/x-python', java: 'text/x-java',\n c: 'text/x-c', cpp: 'text/x-c++', h: 'text/x-c', css: 'text/css',\n html: 'text/html', json: 'application/json', xml: 'text/xml',\n yaml: 'text/yaml', yml: 'text/yaml', go: 'text/x-go', rs: 'text/x-rust',\n php: 'text/x-php', rb: 'text/x-ruby', txt: 'text/plain', md: 'text/markdown',\n}\n\nconst CODE_EXTS = new Set(['js', 'jsx', 'ts', 'tsx', 'py', 'java', 'c', 'cpp', 'h', 'css', 'html', 'json', 'xml', 'yaml', 'yml', 'go', 'rs', 'php', 'rb'])\n\nconst DOC_EXTS = new Set(['pdf', 'csv', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'])\n\nconst VIDEO_EXTS = new Set(['mp4', 'mkv', 'avi', 'mov', 'webm'])\n\nconst AUDIO_EXTS = new Set(['mp3', 'wav', 'ogg', 'flac'])\n\nfunction getMimeType(ext: string): string {\n return MIME_MAP[ext] ?? 'application/octet-stream'\n}\n\nexport const FILE_REF_RE = /\\[file:([^\\]]+)\\]/g\n\nexport function blocksToPlain(blocks: ContentBlock[]): string {\n return blocks.map(b => {\n if (b.type === 'text') return b.value ?? ''\n const filepath = (b.url ?? '').replace('/file/', '')\n return `[file:${filepath}]`\n }).join('')\n}\n\nexport function plainToBlocks(text: string): ContentBlock[] {\n const blocks: ContentBlock[] = []\n let last = 0\n FILE_REF_RE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = FILE_REF_RE.exec(text)) !== null) {\n if (match.index > last)\n blocks.push({ type: 'text', value: text.slice(last, match.index) })\n const filepath = match[1]\n const name = filepath.split(/[\\\\/]/).pop() ?? filepath\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n const fileType = getMimeType(ext)\n const url = `/file/${filepath}`\n blocks.push(fileType.startsWith('image/')\n ? { type: 'image', url, name, fileType }\n : { type: 'file', url, name, fileType }\n )\n last = match.index + match[0].length\n }\n if (last < text.length)\n blocks.push({ type: 'text', value: text.slice(last) })\n return blocks\n}\n\nconst ZW_RE = /\\u200B/g\n\nconst stripZW = (s: string) => s.replace(ZW_RE, '')\n\nexport function ensureTextAfter(chip: HTMLElement): Text {\n const n = chip.nextSibling\n if (n?.nodeType === Node.TEXT_NODE) return n as Text\n const t = document.createTextNode('')\n chip.after(t)\n return t\n}\n\nexport function ensureTextBefore(chip: HTMLElement): Text {\n const n = chip.previousSibling\n if (n?.nodeType === Node.TEXT_NODE) return n as Text\n const t = document.createTextNode('')\n chip.before(t)\n return t\n}\n\nexport function placeCaret(node: Text, offset: number) {\n const sel = window.getSelection()\n const r = document.createRange()\n r.setStart(node, Math.min(offset, node.length))\n r.collapse(true)\n sel?.removeAllRanges()\n sel?.addRange(r)\n}\n\nfunction serializeNode(root: Node): ContentBlock[] {\n const blocks: ContentBlock[] = []\n const walk = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const v = stripZW(node.textContent ?? '')\n if (v) blocks.push({ type: 'text', value: v })\n } else if (node instanceof HTMLElement) {\n if (node.dataset.img) {\n const fileType = node.dataset.filetype\n const isFile = !!fileType && !fileType.startsWith('image/')\n blocks.push(isFile\n ? { type: 'file', url: node.dataset.url!, name: node.dataset.name!, fileType }\n : { type: 'image', url: node.dataset.url!, name: node.dataset.name! }\n )\n } else if (node.tagName === 'BR') {\n // Only treat as newline if it's not a browser-ghost br (i.e. has siblings)\n if (node.previousSibling || node.nextSibling) {\n blocks.push({ type: 'text', value: '\\n' })\n }\n } else if (node.tagName === 'DIV' || node.tagName === 'P') {\n if (blocks.length > 0) blocks.push({ type: 'text', value: '\\n' })\n node.childNodes.forEach(walk)\n } else {\n node.childNodes.forEach(walk)\n }\n }\n }\n root.childNodes.forEach(walk)\n return blocks\n}\n\nfunction buildChipHTML(url: string, name: string, fileType?: string): string {\n const safeName = name.replace(/\"/g, '"')\n const isImage = !fileType || fileType.startsWith('image/')\n let previewHTML: string\n if (isImage) {\n previewHTML = `<img src=\"${url}\" alt=\"${safeName}\" draggable=\"false\" class=\"h-4 w-4 object-cover rounded-sm border border-black/10 dark:border-white/10 block shrink-0\">`\n } else {\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n let IconComponent = FileIcon\n let strokeColor = '#6b7280'\n if (fileType!.startsWith('video/') || VIDEO_EXTS.has(ext)) {\n IconComponent = Video; strokeColor = '#a855f7'\n } else if (fileType!.startsWith('audio/') || AUDIO_EXTS.has(ext)) {\n IconComponent = Volume2; strokeColor = '#22c55e'\n } else if (DOC_EXTS.has(ext) || fileType === 'application/pdf' || fileType!.includes('csv')) {\n IconComponent = FileText; strokeColor = '#f97316'\n } else if (CODE_EXTS.has(ext)) {\n IconComponent = FileCode; strokeColor = '#3b82f6'\n }\n const iconSVG = renderToStaticMarkup(<IconComponent color={strokeColor} width=\"14\" height=\"14\" />)\n const dataURI = `data:image/svg+xml,${encodeURIComponent(iconSVG)}`\n previewHTML = `<img src=\"${dataURI}\" alt=\"${safeName}\" draggable=\"false\" class=\"h-4 w-4 object-contain shrink-0\" title=\"${safeName}\">`\n }\n const textHTML = `<span class=\"text-xs font-medium text-black/70 dark:text-white/70 truncate select-none max-w-[120px]\">${safeName}</span>`\n return (\n `<span contenteditable=\"false\" data-img=\"true\" data-url=\"${url}\" data-name=\"${safeName}\" ${fileType ? `data-filetype=\"${fileType}\"` : ''} class=\"inline-flex align-baseline relative top-0.5 group/chip mx-[2px] items-center gap-1 bg-black/5 dark:bg-white/5 border border-black/10 dark:border-white/10 rounded-[5px] p-[2px] pr-1.5\">` +\n previewHTML + textHTML +\n `<button type=\"button\" class=\"absolute right-1 top-1/2 transform -translate-y-1/2 h-[14px] w-[14px] rounded-full bg-black/80 dark:bg-white/90 text-white dark:text-black flex items-center justify-center opacity-0 group-hover/chip:opacity-100 transition-opacity z-10 shadow-sm\" data-rm-chip=\"true\">` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>` +\n `</button></span>`\n )\n}\n\n\nexport default function Composer({\n workspace,\n onSubmit,\n className,\n style,\n ref,\n width,\n height,\n isStreaming,\n}: {\n workspace: string\n onSubmit: (text: string, blocks?: ContentBlock[]) => void\n className: string\n style: CSSProperties\n ref: React.RefObject<HTMLElement | null>\n width: number\n height: number\n isStreaming: boolean\n}) {\n const [isEmpty, setIsEmpty] = useState(true)\n const [isExpanded, setIsExpanded] = useState(false)\n const editorRef = useRef<HTMLDivElement>(null)\n const savedRange = useRef<Range | null>(null)\n const escaping = useRef(false)\n const maxCharsRef = useRef(5)\n const small = width < 500 || height < 350\n useEffect(() => {\n if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = editorRef.current\n }, [ref])\n useEffect(() => {\n const w = width || 0\n maxCharsRef.current = w > 800 ? w / 28 : w / 14\n }, [width, height])\n const syncState = useCallback(() => {\n const div = editorRef.current\n if (!div) return\n const text = stripZW(div.textContent ?? '')\n const chips = div.querySelectorAll<HTMLElement>('[data-img]')\n const hasImg = chips.length > 0\n const empty = text.length === 0 && !hasImg\n const expanded = hasImg || text.includes('\\n') || text.length > maxCharsRef.current\n setIsEmpty(prev => prev === empty ? prev : empty)\n setIsExpanded(prev => prev === expanded ? prev : expanded)\n // Cursor-guard: only needed when chips exist\n chips.forEach(chip => {\n ensureTextBefore(chip)\n ensureTextAfter(chip)\n })\n }, [])\n //\n // Browsers insert these automatically when:\n // - All text is deleted (ghost <br> to keep the div from collapsing)\n // - Enter is pressed without us intercepting (wraps content in <div>)\n //\n // We watch only direct children of the editor so we never touch chip\n // internals (chips are <span contenteditable=false>, so they won't\n // receive childList mutations anyway, but childList:true + subtree:false\n // makes this explicit).\n useEffect(() => {\n const div = editorRef.current\n if (!div) return\n const observer = new MutationObserver(() => {\n // Snapshot so removals don't confuse iteration\n const children = Array.from(div.childNodes)\n let dirty = false\n for (const node of children) {\n if (node.nodeName === 'BR') {\n div.removeChild(node)\n dirty = true\n continue\n }\n if (node.nodeName === 'DIV') {\n const el = node as HTMLElement\n // skip chip wrappers (they're <span>, but be defensive)\n if (el.dataset.img) continue\n if (el.innerHTML === '<br>' || el.innerHTML === '' || el.innerHTML === ' ') {\n // Pure ghost div drop it entirely\n div.removeChild(el)\n } else {\n // Div with real content unwrap it in-place with a leading \\n\n const frag = document.createDocumentFragment()\n // Only prepend the newline if something precedes this div\n if (el.previousSibling) {\n frag.appendChild(document.createTextNode('\\n'))\n }\n while (el.firstChild) frag.appendChild(el.firstChild)\n div.replaceChild(frag, el)\n }\n dirty = true\n }\n }\n if (dirty) syncState()\n })\n // childList only, no subtree we only care about direct children\n observer.observe(div, { childList: true })\n return () => observer.disconnect()\n }, [syncState])\n useEffect(() => {\n const onSelectionChange = () => {\n if (escaping.current) return\n const div = editorRef.current\n if (!div) return\n if (!div.querySelector('[data-img]')) return\n const sel = window.getSelection()\n if (!sel?.rangeCount || !sel.isCollapsed) return\n const { focusNode } = sel\n if (!focusNode || (!div.contains(focusNode) && focusNode !== div)) return\n const { startContainer, startOffset } = sel.getRangeAt(0)\n let target: Text | null = null\n let offset = 0\n let chip: HTMLElement | null = null\n if (startContainer instanceof HTMLElement && startContainer.dataset.img) {\n chip = startContainer\n } else if (startContainer.nodeType === Node.TEXT_NODE && startContainer.parentElement?.closest('[data-img=\"true\"]')) {\n chip = startContainer.parentElement.closest('[data-img=\"true\"]') as HTMLElement\n } else if (startContainer instanceof HTMLElement && startContainer.closest('[data-img=\"true\"]')) {\n chip = startContainer.closest('[data-img=\"true\"]') as HTMLElement\n }\n if (chip) {\n if (startOffset === 0) { target = ensureTextBefore(chip); offset = target.length }\n else { target = ensureTextAfter(chip); offset = 0 }\n } else if (startContainer === div) {\n if (startOffset < div.childNodes.length) {\n const child = div.childNodes[startOffset]\n if (child instanceof HTMLElement && child.dataset.img) {\n target = ensureTextBefore(child); offset = target.length\n }\n }\n if (!target && startOffset > 0) {\n const prev = div.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n target = ensureTextAfter(prev); offset = 0\n }\n }\n }\n if (target) {\n escaping.current = true\n placeCaret(target, offset)\n requestAnimationFrame(() => { escaping.current = false })\n }\n }\n document.addEventListener('selectionchange', onSelectionChange)\n return () => document.removeEventListener('selectionchange', onSelectionChange)\n }, [])\n const insertBlocks = useCallback((blocks: ContentBlock[]) => {\n const div = editorRef.current\n if (!div) return\n div.focus()\n const sel = window.getSelection()\n if (sel?.rangeCount && !sel.isCollapsed) {\n document.execCommand('delete', false)\n }\n for (const block of blocks) {\n if (block.type === 'text' && block.value) {\n document.execCommand('insertText', false, block.value)\n } else if ((block.type === 'image' || block.type === 'file') && block.url) {\n document.execCommand('insertHTML', false, buildChipHTML(block.url, block.name ?? '', block.fileType))\n const chips = div.querySelectorAll('[data-img]')\n if (chips.length > 0) {\n const lastChip = chips[chips.length - 1] as HTMLElement\n placeCaret(ensureTextAfter(lastChip), 0)\n }\n }\n }\n syncState()\n }, [syncState])\n\n const getInsertRange = useCallback((): Range => {\n const div = editorRef.current!\n if (savedRange.current) {\n const anc = savedRange.current.commonAncestorContainer\n if (div === anc || div.contains(anc)) return savedRange.current\n }\n const r = document.createRange()\n r.selectNodeContents(div)\n r.collapse(false)\n return r\n }, [])\n\n const insertChipAtCursor = useCallback((url: string, name: string, fileType: string) => {\n const div = editorRef.current\n if (!div) return\n div.focus()\n const sel = window.getSelection()\n const range = getInsertRange()\n sel?.removeAllRanges()\n sel?.addRange(range)\n if (!range.collapsed) document.execCommand('delete', false)\n document.execCommand('insertHTML', false, buildChipHTML(url, name, fileType) + ' ')\n savedRange.current = null\n syncState()\n }, [getInsertRange, syncState])\n\n const handlePlusClick = useCallback(async () => {\n const div = editorRef.current\n const sel = window.getSelection()\n if (sel?.rangeCount) {\n const r = sel.getRangeAt(0)\n const anc = r.commonAncestorContainer\n savedRange.current = (div && (div === anc || div.contains(anc))) ? r.cloneRange() : null\n } else {\n savedRange.current = null\n }\n const result = await open({ multiple: true })\n if (!result) return\n const paths = Array.isArray(result) ? result : [result]\n for (const filePath of paths) {\n const name = filePath.split(/[\\\\/]/).pop() ?? filePath\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n insertChipAtCursor(`/file/${filePath}`, name, getMimeType(ext))\n }\n }, [insertChipAtCursor])\n\n const handleCopy = useCallback((e: React.ClipboardEvent) => {\n const sel = window.getSelection()\n if (!sel || sel.isCollapsed || !sel.rangeCount) return\n const blocks = serializeNode(sel.getRangeAt(0).cloneContents())\n if (!blocks.length) return\n e.preventDefault()\n navigator.clipboard.writeText(blocksToPlain(blocks)).catch(() => { })\n }, [])\n\n const handleCut = useCallback((e: React.ClipboardEvent) => {\n const sel = window.getSelection()\n if (!sel || sel.isCollapsed || !sel.rangeCount) return\n handleCopy(e)\n document.execCommand('delete', false)\n syncState()\n }, [handleCopy, syncState])\n\n const handlePaste = useCallback(async (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (e.clipboardData?.files?.length) {\n Array.from(e.clipboardData.files).forEach(file => {\n insertChipAtCursor(`/file/${file.name}`, file.name, file.type)\n })\n return\n }\n let plain = ''\n try {\n plain = await navigator.clipboard.readText()\n } catch {\n plain = e.clipboardData?.getData('text/plain') ?? ''\n }\n if (!plain) return\n const blocks = plainToBlocks(plain)\n if (blocks.some(b => b.type !== 'text')) {\n insertBlocks(blocks)\n } else {\n document.execCommand('insertText', false, plain)\n }\n }, [insertBlocks, insertChipAtCursor])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (isStreaming) {\n e.preventDefault()\n return\n }\n if (e.key === 'Enter') {\n if (!e.shiftKey) {\n // Plain Enter → submit\n e.preventDefault()\n handleSubmit()\n return\n }\n e.preventDefault()\n {\n const div = editorRef.current!\n const sel2 = window.getSelection()\n if (!sel2?.rangeCount) { syncState(); return }\n const range2 = sel2.getRangeAt(0)\n // Delete any active selection first\n if (!range2.collapsed) range2.deleteContents()\n // Detect end-of-editor: compare caret position to the last possible position\n const endRange = document.createRange()\n endRange.selectNodeContents(div)\n endRange.collapse(false)\n // We are at the end if the caret is at the very end, or if only ZWSPs follow\n let atEnd = range2.compareBoundaryPoints(Range.END_TO_END, endRange) === 0\n if (!atEnd) {\n const r = range2.cloneRange()\n r.setEnd(endRange.endContainer, endRange.endOffset)\n // toString() on a range includes text from all nodes; we strip ZWSPs to see if anything \"real\" remains\n atEnd = r.toString().replace(/\\u200B/g, '').length === 0\n }\n // Insert newline node; trailing \\u200B only when needed at the end\n const nlNode = document.createTextNode(atEnd ? '\\n\\u200B' : '\\n')\n range2.insertNode(nlNode)\n // offset 1 → after '\\n', before optional '\\u200B' → caret on new line\n placeCaret(nlNode, 1)\n }\n syncState()\n return\n }\n const sel = window.getSelection()\n if (!sel?.rangeCount) return\n const range = sel.getRangeAt(0)\n if (!range.collapsed) {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n document.execCommand('delete', false)\n syncState()\n }\n return\n }\n const { startContainer, startOffset } = range\n if (e.key === 'Backspace') {\n if (startContainer.nodeType === Node.TEXT_NODE) {\n if (startOffset === 0 || (e.ctrlKey && (startContainer.textContent?.slice(0, startOffset) ?? '').trim() === '')) {\n const prev = startContainer.previousSibling\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const dr = document.createRange()\n dr.setStartBefore(prev)\n dr.setEnd(startContainer, startOffset)\n sel.removeAllRanges(); sel.addRange(dr)\n document.execCommand('delete', false)\n syncState(); return\n }\n }\n }\n if (startContainer === editorRef.current && startOffset > 0) {\n const prev = editorRef.current.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const dr = document.createRange()\n dr.selectNode(prev)\n sel.removeAllRanges(); sel.addRange(dr)\n document.execCommand('delete', false)\n syncState(); return\n }\n }\n }\n if (e.key === 'ArrowRight') {\n if (startContainer.nodeType === Node.TEXT_NODE && startOffset === (startContainer as Text).length) {\n const next = startContainer.nextSibling\n if (next instanceof HTMLElement && next.dataset.img) {\n e.preventDefault()\n const afterText = ensureTextAfter(next)\n e.shiftKey\n ? sel.setBaseAndExtent(range.startContainer, range.startOffset, afterText, 0)\n : placeCaret(afterText, 0)\n return\n }\n }\n const editor = editorRef.current\n if (startContainer === editor && startOffset < editor.childNodes.length) {\n const next = editor.childNodes[startOffset]\n if (next instanceof HTMLElement && next.dataset.img) {\n e.preventDefault()\n const afterText = ensureTextAfter(next)\n e.shiftKey\n ? sel.setBaseAndExtent(range.startContainer, range.startOffset, afterText, 0)\n : placeCaret(afterText, 0)\n return\n }\n }\n }\n if (e.key === 'ArrowLeft') {\n if (startContainer.nodeType === Node.TEXT_NODE && startOffset === 0) {\n const prev = startContainer.previousSibling\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const beforeText = ensureTextBefore(prev)\n e.shiftKey\n ? sel.setBaseAndExtent(range.endContainer, range.endOffset, beforeText, beforeText.length)\n : placeCaret(beforeText, beforeText.length)\n return\n }\n }\n const editor = editorRef.current\n if (startContainer === editor && startOffset > 0) {\n const prev = editor.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const beforeText = ensureTextBefore(prev)\n e.shiftKey\n ? sel.setBaseAndExtent(range.endContainer, range.endOffset, beforeText, beforeText.length)\n : placeCaret(beforeText, beforeText.length)\n return\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isEmpty, isStreaming, syncState])\n\n const handleSubmit = useCallback(() => {\n const blocks = serializeNode(editorRef.current!)\n onSubmit(blocksToPlain(blocks), blocks)\n if (editorRef.current) editorRef.current.innerHTML = ''\n setIsEmpty(true)\n setIsExpanded(false)\n }, [isEmpty, onSubmit])\n\n const handlePointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement\n if (!target.closest('[data-rm-chip=\"true\"]')) return\n e.preventDefault()\n e.stopPropagation()\n const chip = target.closest('[data-img=\"true\"]')\n if (!chip) return\n editorRef.current?.focus()\n const sel = window.getSelection()\n const range = document.createRange()\n range.selectNode(chip)\n sel?.removeAllRanges()\n sel?.addRange(range)\n document.execCommand('delete', false)\n syncState()\n }, [syncState])\n\n const padH = '35px'\n const bottomExpanded = small ? 'bottom-[10px]' : 'bottom-[20px]'\n const bottomSend = small ? 'bottom-[2px]' : 'bottom-[12.5px]'\n const centerY = 'top-1/2 -translate-y-1/2'\n\n const wrapperCls = useMemo(() => clsx(\n 'relative border border-[hsl(var(--border))] bg-[hsl(var(--chat-bubble))] px-1 shadow-lg',\n small\n ? 'py-3 text-xs rounded-[20px]'\n : isExpanded ? 'py-4.5 rounded-[30px]' : 'py-3.5 rounded-[30px]',\n ), [small, isExpanded])\n const editorCls = useMemo(() => clsx(\n 'relative w-[92.5%] bg-transparent focus:outline-none',\n 'max-h-[200px] overflow-y-auto',\n 'leading-normal break-all whitespace-pre-wrap',\n 'transition-[margin-left,margin-right,margin-bottom] duration-100 ease-out',\n isExpanded ? 'mb-[35px]' : 'mb-0',\n isStreaming && 'cursor-not-allowed opacity-0 select-none',\n ), [isExpanded, isStreaming])\n const editorStyle = useMemo(() => ({\n marginLeft: isExpanded ? '10px' : padH,\n marginRight: isExpanded ? '10px' : padH,\n wordBreak: 'normal' as const,\n overflowWrap: 'anywhere' as const,\n }), [isExpanded])\n const plusCls = useMemo(() => clsx(\n isExpanded ? bottomExpanded : centerY,\n 'focus:outline-none h-5 w-5 absolute flex items-center justify-center opacity-70 hover:opacity-100 transition-opacity',\n small ? 'scale-[0.75] left-2' : 'left-3',\n ), [isExpanded, bottomExpanded, centerY, small])\n const sendCls = useMemo(() => clsx(\n isExpanded ? bottomSend : centerY,\n isEmpty ? 'opacity-25 dark:opacity-50' : 'opacity-100',\n 'absolute h-9 w-9 bg-accent text-accent-foreground rounded-full flex items-center justify-center',\n small ? 'scale-[0.75] origin-right right-2' : 'right-3',\n ), [isExpanded, bottomSend, centerY, isEmpty, small])\n const stopCls = useMemo(() => clsx(\n isExpanded ? bottomSend : centerY,\n 'absolute h-9 w-9 bg-black/10 dark:bg-[hsl(var(--float))] text-accent rounded-full flex items-center justify-center',\n small ? 'scale-[0.75] origin-right right-2' : 'right-3',\n ), [isExpanded, bottomSend, centerY, small])\n const micCls = useMemo(() => (isRecording: boolean) => clsx(\n isExpanded ? bottomExpanded : centerY,\n 'h-5 w-5 absolute flex items-center justify-center',\n small ? 'scale-[0.75] right-10' : 'right-14',\n isRecording ? 'text-red-500' : 'text-accent',\n ), [isExpanded, bottomExpanded, centerY, small])\n return (\n <div style={style} className={className}>\n <div className={wrapperCls}>\n {isEmpty && (\n <span\n className=\"absolute pointer-events-none select-none text-zinc-500\"\n style={{ left: isExpanded ? '10px' : '40px', top: '50%', transform: 'translateY(-50%)' }}\n >\n Ask anything\n </span>\n )}\n <div\n ref={editorRef}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n onInput={syncState}\n onKeyDown={handleKeyDown}\n onCopy={handleCopy}\n onCut={handleCut}\n onPaste={handlePaste}\n onPointerDown={handlePointerDown}\n className={editorCls}\n style={editorStyle}\n />\n <button onClick={handlePlusClick} className={plusCls}>\n <Plus />\n </button>\n <Record\n workspace={workspace}\n onFileSaved={(filePath) => {\n const ext = filePath.split('.').pop()?.toLowerCase() ?? ''\n const fileName = filePath.split(/[\\\\/]+/).pop() ?? filePath\n insertChipAtCursor(`/file/${filePath}`, fileName, getMimeType(ext))\n }}\n >\n {({ isRecording, startRecording, stopRecording }) => (\n <button\n onClick={isRecording ? stopRecording : startRecording}\n className={micCls(isRecording)}\n >\n <Mic />\n </button>\n )}\n </Record>\n {isStreaming ? (\n <button onClick={handleSubmit} className={stopCls}>\n <Square fill=\"currentColor\" className=\"w-4 h-4\" />\n </button>\n ) : (\n <button onClick={handleSubmit} className={sendCls}>\n <ArrowUp className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </div>\n )\n}","\nexport class MessageParser {\n static process(text: string): string {\n let processed = text;\n const { text: textWithoutComments, placeholders: commentPlaceholders } =\n this.protectHtmlComments(processed);\n processed = textWithoutComments;\n const { text: textWithoutComponents, placeholders: componentPlaceholders } =\n this.protectCustomComponents(processed);\n processed = textWithoutComponents;\n const { text: textWithoutTables, placeholders: tablePlaceholders } =\n this.protectMdxTables(processed);\n processed = textWithoutTables;\n const { protectedText, placeholders: codePlaceholders } =\n this.protectCodeBlocks(processed);\n processed = protectedText;\n processed = processed.replace(/<([a-zA-Z0-9]*)$/, '<$1');\n processed = this.processThinkTags(processed);\n processed = this.escapeStrayAngleBrackets(processed);\n processed = this.autoCloseHtmlTags(processed);\n processed = this.escapeStrayBraces(processed);\n processed = this.restorePlaceholders(processed, codePlaceholders, '__CODE_BLOCK_');\n processed = this.restorePlaceholders(processed, tablePlaceholders, '__MDX_TABLE_');\n processed = this.restorePlaceholders(processed, componentPlaceholders, '__COMPONENT_');\n processed = this.restorePlaceholders(processed, commentPlaceholders, '__HTML_COMMENT_');\n processed = this.escapeThinkComponentBraces(processed);\n return processed;\n }\n static aggressiveEscape(text: string): string {\n let processed = text;\n const { protectedText: withCode, placeholders: codePlaceholders } =\n this.protectCodeBlocks(processed);\n const { text: withTables, placeholders: tablePlaceholders } =\n this.protectMdxTables(withCode);\n processed = withTables;\n processed = processed\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\\{/g, '{')\n .replace(/\\}/g, '}');\n processed = this.restorePlaceholders(processed, tablePlaceholders, '__MDX_TABLE_');\n processed = this.restorePlaceholders(processed, codePlaceholders, '__CODE_BLOCK_');\n processed = this.escapeThinkComponentBraces(processed);\n return processed;\n }\n private static protectHtmlComments(text: string): { text: string; placeholders: string[] } {\n const placeholders: string[] = [];\n const protectedText = text.replace(/<!--[\\s\\S]*?-->/g, (match) => {\n placeholders.push(match);\n return `__HTML_COMMENT_${placeholders.length - 1}__`;\n });\n return { text: protectedText, placeholders };\n }\n private static protectCustomComponents(text: string): { text: string; placeholders: string[] } {\n const placeholders: string[] = [];\n const result: string[] = [];\n let i = 0;\n const len = text.length;\n while (i < len) {\n const openMatch = /^<([A-Z][a-zA-Z0-9]*)(\\s[\\s\\S]*?)?>/\n .exec(text.slice(i));\n if (!openMatch) {\n const nextOpen = text.indexOf('<', i + 1);\n if (nextOpen === -1) {\n result.push(text.slice(i));\n break;\n }\n result.push(text.slice(i, nextOpen));\n i = nextOpen;\n continue;\n }\n if (text[i] !== '<') {\n result.push(text[i]);\n i++;\n continue;\n }\n const tagName = openMatch[1];\n const fullOpenTag = openMatch[0];\n if (fullOpenTag.endsWith('/>') || /\\/>$/.test(fullOpenTag)) {\n placeholders.push(fullOpenTag);\n result.push(`__COMPONENT_${placeholders.length - 1}__`);\n i += fullOpenTag.length;\n continue;\n }\n let depth = 1;\n let j = i + fullOpenTag.length;\n const scanRe = new RegExp(\n `<${tagName}(\\\\s[\\\\s\\\\S]*?)?>|<\\\\/${tagName}>`,\n 'g'\n );\n scanRe.lastIndex = j;\n let found = false;\n let scanMatch: RegExpExecArray | null;\n while ((scanMatch = scanRe.exec(text)) !== null) {\n if (scanMatch[0].startsWith('</')) {\n depth--;\n if (depth === 0) {\n const end = scanMatch.index + scanMatch[0].length;\n const fullComponent = text.slice(i, end);\n placeholders.push(fullComponent);\n result.push(`__COMPONENT_${placeholders.length - 1}__`);\n i = end;\n found = true;\n break;\n }\n } else {\n depth++;\n }\n }\n if (!found) {\n result.push(text[i]);\n i++;\n }\n }\n return { text: result.join(''), placeholders };\n }\n private static protectMdxTables(text: string): { text: string; placeholders: string[] } {\n const placeholders: string[] = [];\n const tableRegex = /((^|\\n)\\|[^\\n]*\\|[^\\n]*)+/g;\n const protectedText = text.replace(tableRegex, (match) => {\n placeholders.push(match);\n return `__MDX_TABLE_${placeholders.length - 1}__`;\n });\n return { text: protectedText, placeholders };\n }\n private static protectCodeBlocks(text: string): { protectedText: string; placeholders: string[] } {\n const placeholders: string[] = [];\n let protectedText = text.replace(\n /(^|\\n)(`{3,})([\\s\\S]*?)\\n\\2(\\n|$)/g,\n (match, pre, _fence, _body, post) => {\n placeholders.push(match.slice(pre.length, match.length - post.length));\n return `${pre}__CODE_BLOCK_${placeholders.length - 1}__${post}`;\n }\n );\n protectedText = protectedText.replace(\n /(`+)([^`\\n]+)\\1/g,\n (match) => {\n placeholders.push(match);\n return `__CODE_BLOCK_${placeholders.length - 1}__`;\n }\n );\n return { protectedText, placeholders };\n }\n private static restorePlaceholders(text: string, placeholders: string[], prefix: string): string {\n const escaped = prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`${escaped}(\\\\d+)__`, 'g');\n return text.replace(regex, (_match, index) => placeholders[parseInt(index, 10)] ?? _match);\n }\n private static processThinkTags(text: string): string {\n const result: string[] = [];\n let lastIndex = 0;\n const stack: { index: number; tag: string }[] = [];\n const tagRegex = /<think(\\s+[^>]*?)?>|<\\/think>/gi;\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(text)) !== null) {\n const fullTag = match[0];\n const isClosing = fullTag.toLowerCase().startsWith('</');\n if (!isClosing) {\n stack.push({ index: match.index, tag: fullTag });\n } else if (stack.length > 0) {\n const start = stack.pop()!;\n if (stack.length === 0) {\n result.push(text.substring(lastIndex, start.index));\n const content = text.substring(start.index + start.tag.length, match.index);\n const attr = start.tag.match(/<think(\\s+[^>]*?)?>/i)?.[1] ?? '';\n result.push(`<Think${attr}>\\n${this.escapeForThink(content)}\\n</Think>`);\n lastIndex = match.index + fullTag.length;\n }\n }\n }\n if (stack.length > 0) {\n const start = stack[0];\n result.push(text.substring(lastIndex, start.index));\n const content = text.substring(start.index + start.tag.length);\n const attr = start.tag.match(/<think(\\s+[^>]*?)?>/i)?.[1] ?? '';\n result.push(`<Think${attr}>\\n${this.escapeForThink(content)}\\n</Think>`);\n } else {\n result.push(text.substring(lastIndex));\n }\n return result.join('');\n }\n private static escapeForThink(content: string): string {\n return content\n // 1. Base XML/HTML Characters (Must escape '&' first)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n\n // 2. JSX/MDX Expressions\n .replace(/\\{/g, '{')\n .replace(/\\}/g, '}')\n\n // 3. Markdown & Code Protections\n .replace(/`/g, '`') // Prevents unclosed inline code/code blocks from consuming text\n .replace(/\\$/g, '$') // Prevents math (KaTeX/MathJax) plugins or template literal crashes\n .replace(/\\\\/g, '\') // Prevents backslashes from inadvertently escaping the next character\n .replace(/\\[/g, '[') // Prevents accidental link/reference rendering \n .replace(/\\]/g, ']') // (Strict MDX parsers can crash on unresolvable reference links)\n\n // 4. (Optional) Prevent runaway emphasis rendering\n .replace(/\\*/g, '*')\n .replace(/_/g, '_');\n }\n private static escapeThinkComponentBraces(text: string): string {\n return text.replace(\n /<Think(\\s[^>]*)?>([\\s\\S]*?)<\\/Think>/g,\n (_match, attrs = '', content) => {\n const escaped = content\n // 1. Base XML/HTML Characters (Must escape '&' first)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n\n // 2. JSX/MDX Expressions\n .replace(/\\{/g, '{')\n .replace(/\\}/g, '}')\n\n // 3. Markdown & Code Protections\n .replace(/`/g, '`') // Prevents unclosed inline code/code blocks from consuming text\n .replace(/\\$/g, '$') // Prevents math (KaTeX/MathJax) plugins or template literal crashes\n .replace(/\\\\/g, '\') // Prevents backslashes from inadvertently escaping the next character\n .replace(/\\[/g, '[') // Prevents accidental link/reference rendering \n .replace(/\\]/g, ']') // (Strict MDX parsers can crash on unresolvable reference links)\n\n // 4. (Optional) Prevent runaway emphasis rendering\n .replace(/\\*/g, '*')\n .replace(/_/g, '_');\n return `<Think${attrs}>${escaped}</Think>`;\n }\n );\n }\n private static escapeStrayAngleBrackets(text: string): string {\n let result = text.replace(/<(?=[\\s0-9!@#$%^&*()_+=|\\\\{}[\\]:;,.?~`])/g, '<');\n result = result.replace(/(?<=[\\s0-9!@#$%^&*()_+=|\\\\{}[\\]:;,.?~`])>/g, '>');\n result = result.replace(/(?<=[a-zA-Z0-9])>(?=[a-zA-Z0-9])/g, '>');\n return result;\n }\n private static escapeStrayBraces(text: string): string {\n const placeholders: string[] = [];\n let protected_ = text.replace(/=(\\{(?:[^{}]|\\{[^{}]*\\})*\\})/g, (match) => {\n placeholders.push(match);\n return `__BRACE_${placeholders.length - 1}__`;\n });\n protected_ = protected_\n .replace(/\\{/g, '{')\n .replace(/\\}/g, '}');\n const escaped = new RegExp('__BRACE_(\\\\d+)__', 'g');\n return protected_.replace(escaped, (_m, i) => placeholders[parseInt(i, 10)]);\n }\n private static autoCloseHtmlTags(text: string): string {\n const stack: string[] = [];\n const tagRegex = /<(\\/?[a-zA-Z0-9]+)(\\s+[^>]*?)?(\\/?)>/g;\n const voidElements = new Set([\n 'br', 'hr', 'img', 'input', 'link', 'meta',\n 'area', 'base', 'col', 'embed', 'param', 'source', 'track', 'wbr',\n ]);\n const protectedTags = new Set([\n 'Think', 'ThinkProvider', 'ToolCall',\n ]);\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(text)) !== null) {\n const tagName = match[1];\n const isSelfClosing = match[3] === '/';\n const isClosing = tagName.startsWith('/');\n const name = isClosing ? tagName.substring(1) : tagName;\n const nameLower = name.toLowerCase();\n if (protectedTags.has(name) || voidElements.has(nameLower) || isSelfClosing) {\n continue;\n }\n if (isClosing) {\n if (stack.length > 0 && stack[stack.length - 1] === nameLower) {\n stack.pop();\n }\n } else {\n stack.push(nameLower);\n }\n }\n let result = text;\n while (stack.length > 0) {\n result += `</${stack.pop()}>`;\n }\n return result;\n }\n}","import { proxy, useSnapshot } from \"valtio\";\nimport type { SetStateAction, Dispatch } from \"react\";\n// ============================================================================\n// Type Utilities for useState-like experience\n// ============================================================================\n/**\n * Supported primitive types that can be stored globally\n */\ntype Primitive = string | number | boolean | null | undefined;\n/**\n * Supported data types for useGlobal\n */\ntype GlobalValue =\n | Primitive\n | Primitive[]\n | Record<string, unknown>\n | unknown[];\n/**\n * The setter function type - identical to React's useState setter\n */\ntype GlobalSetter<T> = Dispatch<SetStateAction<T>>;\n/**\n * The return type of useGlobal - a tuple like useState\n * [data, setData]\n */\ntype UseGlobalReturn<T> = readonly [T, GlobalSetter<T>];\n// ============================================================================\n// Internal Wrapper for Primitives\n// ============================================================================\n\nconst PRIMITIVE_KEY = \"__value__\";\ninterface PrimitiveWrapper<T> {\n [PRIMITIVE_KEY]: T;\n}\n/**\n * Check if a value is a primitive (not object/array)\n */\n\nfunction isPrimitive(value: unknown): value is Primitive {\n return value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean';\n}\n/**\n * Check if stored data is our primitive wrapper\n */\n\nfunction isWrappedPrimitive<T>(data: unknown): data is PrimitiveWrapper<T> {\n return typeof data === 'object' &&\n data !== null &&\n PRIMITIVE_KEY in data &&\n Object.keys(data).length === 1;\n}\n/**\n * Wrap a primitive value for storage\n */\n\nfunction wrapPrimitive<T>(value: T): PrimitiveWrapper<T> {\n return { [PRIMITIVE_KEY]: value } as PrimitiveWrapper<T>;\n}\n/**\n * Unwrap a primitive value from storage\n */\n\nfunction unwrapPrimitive<T>(data: PrimitiveWrapper<T>): T {\n return data[PRIMITIVE_KEY];\n}\n// ============================================================================\n// Internal Implementation\n// ============================================================================\ninterface IGlobal {\n data: unknown;\n setData: (data: SetStateAction<unknown>) => void;\n // Track if this global stores a primitive value\n _isPrimitive: boolean;\n}\n\nconst globalStore = proxy<Record<string, IGlobal>>({});\n\nfunction createGlobal<T>(key: string, initialValue?: T): void {\n // Determine if this is a primitive type based on initial value\n const primitiveMode = initialValue !== undefined && isPrimitive(initialValue);\n // For primitives, wrap the initial value\n // For objects/arrays, use as-is\n let internalData: unknown;\n if (primitiveMode) {\n internalData = wrapPrimitive(initialValue);\n } else if (initialValue !== undefined) {\n internalData = initialValue;\n } else {\n internalData = {};\n }\n globalStore[key] = {\n data: internalData,\n _isPrimitive: primitiveMode,\n setData: (data: SetStateAction<unknown>) => {\n const store = globalStore[key];\n let newUserData: unknown;\n // Get the current user-facing value (unwrapped if primitive)\n const currentUserData = store._isPrimitive && isWrappedPrimitive(store.data)\n ? unwrapPrimitive(store.data)\n : store.data;\n if (typeof data === \"function\") {\n newUserData = (data as (prevState: unknown) => unknown)(currentUserData);\n } else {\n newUserData = data;\n }\n // Determine new internal data\n let newInternalData: unknown;\n // Check if the new value is primitive\n if (isPrimitive(newUserData)) {\n // Mark as primitive mode and wrap\n store._isPrimitive = true;\n newInternalData = wrapPrimitive(newUserData);\n } else {\n // Not primitive - store directly\n store._isPrimitive = false;\n newInternalData = newUserData;\n }\n // Update state\n store.data = newInternalData;\n },\n };\n}\n// ============================================================================\n// Public API - useState-like Hook\n// ============================================================================\n/**\n * A global state hook with a useState-like API.\n * Uses valtio for reactive state management across components.\n * \n * @example\n * // String value (requires initial value)\n * const [name, setName] = useGlobal(\"username\", \"\");\n * setName(\"John\");\n * \n * @example\n * // Boolean flag\n * const [enabled, setEnabled] = useGlobal(\"settings.enabled\", false);\n * setEnabled(true);\n * \n * @example\n * // Number counter\n * const [count, setCount] = useGlobal(\"counter\", 0);\n * setCount(prev => prev + 1);\n * \n * @example\n * // Simple string array\n * const [tags, setTags] = useGlobal<string[]>(\"tags\", []);\n * setTags(prev => [...prev, \"new-tag\"]);\n * \n * @example\n * // Record/Object with typed values\n * interface User { name: string; age: number; }\n * const [users, setUsers] = useGlobal<Record<string, User>>(\"users\", {});\n * setUsers(prev => ({ ...prev, user1: { name: \"John\", age: 30 } }));\n * \n * @param key - The unique key for this global state\n * @param initialValue - Optional initial value (required for primitives to enable type inference)\n * @returns A tuple [data, setData] similar to useState\n */\n\nexport function useGlobal<T = Record<string, unknown>>(key: string): UseGlobalReturn<T>;\n/**\n * Overload with initial value for type inference (required for primitives)\n */\n\nexport function useGlobal<T>(key: string, initialValue: T): UseGlobalReturn<T>;\n\nexport function useGlobal<T = Record<string, unknown>>(\n key: string,\n initialValue?: T\n): UseGlobalReturn<T> {\n if (!globalStore[key]) {\n createGlobal<T>(key, initialValue);\n }\n const snap = useSnapshot(globalStore[key]);\n // Bridge: unwrap primitive values for seamless user experience\n const userData = snap._isPrimitive && isWrappedPrimitive<T>(snap.data)\n ? unwrapPrimitive<T>(snap.data)\n : snap.data as T;\n // Bridge: the setter already handles wrapping internally\n const setUserData = snap.setData as GlobalSetter<T>;\n return [userData, setUserData] as const;\n}\n// ============================================================================\n// Type Exports for Advanced Usage\n// ============================================================================\n\nexport type {\n GlobalValue,\n GlobalSetter,\n UseGlobalReturn,\n Primitive\n};\n","import { type ReactNode, type FC, type HTMLAttributes, useState, useEffect, useMemo, memo, createContext, useContext } from \"react\";\r\nimport { evaluate } from '@mdx-js/mdx'\r\nimport remarkGfm from 'remark-gfm'\r\nimport * as runtime from 'react/jsx-runtime'\r\nimport { MessageParser } from \"../utils/message-parser\";\r\nimport { ChevronRight, Lightbulb, Plug } from \"lucide-react\";\r\nimport clsx from \"clsx\";\r\nimport { useGlobal } from \"./useGlobal/useGlobal\";\r\n// ============================================\r\n// Component Props Types\r\n// ============================================\r\ninterface AlertProps extends HTMLAttributes<HTMLDivElement> {\r\n type?: 'info' | 'warning' | 'error'\r\n children: ReactNode\r\n}\r\ninterface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\r\n variant?: 'primary' | 'success' | 'danger'\r\n children: ReactNode\r\n}\r\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {\r\n title?: string\r\n children: ReactNode\r\n}\r\ninterface ButtonProps extends HTMLAttributes<HTMLButtonElement> {\r\n variant?: 'primary' | 'success' | 'danger'\r\n onClick?: () => void\r\n children: ReactNode\r\n}\r\ninterface ToolCallProps {\r\n name: string;\r\n id: string;\r\n parameters?: string;\r\n}\r\ninterface ThinkProps {\r\n children: ReactNode;\r\n}\r\n// ============================================\r\n// Custom JSX Components\r\n// ============================================\r\n\r\nconst AlertBox: FC<AlertProps> = ({ type = 'info', children, ...props }) => {\r\n const backgrounds: Record<NonNullable<AlertProps['type']>, string> = {\r\n info: '#e3f2fd',\r\n warning: '#fff3cd',\r\n error: '#f8d7da'\r\n }\r\n const borders: Record<NonNullable<AlertProps['type']>, string> = {\r\n info: '#2196F3',\r\n warning: '#ffc107',\r\n error: '#dc3545'\r\n }\r\n return (\r\n <div\r\n style={{\r\n background: backgrounds[type],\r\n borderLeft: `4px solid ${borders[type]}`,\r\n padding: '12px',\r\n borderRadius: '4px',\r\n marginBottom: '12px'\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nconst BadgeTag: FC<BadgeProps> = ({ variant = 'primary', children, ...props }) => {\r\n const colors: Record<NonNullable<BadgeProps['variant']>, string> = {\r\n primary: '#007bff',\r\n success: '#28a745',\r\n danger: '#dc3545'\r\n }\r\n return (\r\n <span\r\n style={{\r\n background: colors[variant],\r\n color: 'white',\r\n padding: '4px 8px',\r\n borderRadius: '12px',\r\n fontSize: '12px',\r\n fontWeight: 'bold',\r\n marginRight: '4px'\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </span>\r\n )\r\n}\r\n\r\nconst CardBox: FC<CardProps> = ({ title, children, ...props }) => (\r\n <div\r\n style={{\r\n border: '1px solid #ddd',\r\n borderRadius: '8px',\r\n padding: '16px',\r\n marginBottom: '12px',\r\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)'\r\n }}\r\n {...props}\r\n >\r\n {title && <h3 style={{ marginTop: 0 }}>{title}</h3>}\r\n {children}\r\n </div>\r\n)\r\n\r\nconst ActionButton: FC<ButtonProps> = ({ variant = 'primary', children, onClick, ...props }) => {\r\n const colors: Record<NonNullable<ButtonProps['variant']>, string> = {\r\n primary: '#007bff',\r\n success: '#28a745',\r\n danger: '#dc3545'\r\n }\r\n return (\r\n <button\r\n onClick={onClick}\r\n style={{\r\n background: colors[variant],\r\n color: 'white',\r\n border: 'none',\r\n padding: '8px 8px',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n fontSize: '14px'\r\n }}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n )\r\n}\r\n\r\nconst User: FC<ThinkProps> = ({ children }) => {\r\n return (\r\n <div\r\n style={{\r\n whiteSpace: 'pre-wrap',\r\n wordWrap: 'break-word',\r\n }}\r\n className=\"flex items-end mb-5\">\r\n <span className=\"ml-auto p-2 px-4 bg-accent/5 rounded-3xl max-w-[70%]\">\r\n {children}\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\nconst ToolCall: FC<ToolCallProps> = memo(({ name, id }) => {\r\n return (\r\n <div id={`tool-call-${id}`} className={clsx(\r\n \"tc-container overflow-hidden inline-flex flex-col\",\r\n )}>\r\n {/* Clickable header toggles state */}\r\n <button\r\n className=\"text-xs font-bold opacity-50 flex items-center gap-1\"\r\n >\r\n <Plug size={12} />\r\n <span className=\"thought-container\">{name}</span>\r\n </button>\r\n </div>\r\n );\r\n});\r\ninterface CodeBlockProps {\r\n children: ReactNode;\r\n id?: string;\r\n}\r\n\r\nconst CodeBlock: FC<CodeBlockProps> = memo(({ children, id }) => {\r\n return (\r\n <div id={id} className=\"\">\r\n {children}\r\n </div>\r\n );\r\n});\r\n// ============================================\r\n// Contexts for Message-wide state (split for performance)\r\n// ============================================\r\n// Separate contexts to prevent cascading re-renders\r\n// - Components that only WRITE (Think) subscribe to DispatchContext\r\n// - Components needing the message ID subscribe to IdContext\r\n\r\nconst MessageIdContext = createContext<string>('');\r\n\r\nconst ActiveMessageIdContext = createContext<string | null>(null);\r\n// Think only needs to WRITE - subscribe only to dispatch context\r\n\r\nconst Think: FC<ThinkProps> = ({ children }) => {\r\n const id = useContext(MessageIdContext);\r\n const [open, setOpen] = useGlobal(\"think\" + id, false)\r\n return (\r\n <div id={`think-${id}`} className={clsx(\r\n \"thinkel overflow-hidden flex flex-col\",\r\n open ? \"pb-4\" : \"pb-1\"\r\n )}>\r\n {/* Clickable header toggles state */}\r\n <button\r\n onPointerDown={(e) => { e.preventDefault(); e.stopPropagation(); setOpen(prev=>!prev) }}\r\n className=\"text-xs font-bold opacity-50 flex items-center gap-1\"\r\n >\r\n <Lightbulb size={12} />\r\n <span className=\"thought-container\">THOUGHT</span>\r\n <ChevronRight\r\n size={12}\r\n className={`transition-transform ${open ? \"rotate-90\" : \"\"}`}\r\n />\r\n </button>\r\n {/* Body shown/hidden based on context */}\r\n <div className={`border-l border-[hsl(var(--border))] text-xs ml-1.5 pl-2 opacity-50 italic transition-all ${open ? \"h-auto\" : \"h-0 hidden\"}`}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n};\r\n// ============================================\r\n// Message Component\r\n// ============================================\r\ninterface MessageProps {\r\n response: string,\r\n id: string,\r\n activeId: string | null,\r\n}\r\n\r\nexport default function Message({ response, id, activeId }: MessageProps) {\r\n const [MDXContent, setMDXContent] = useState<any>(null);\r\n const [LastValidMDXContent, setLastValidMDXContent] = useState<any>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n // ============================================\r\n // Components Registry\r\n // ============================================\r\n const components = useMemo(() => ({\r\n // Support both PascalCase and lowercase\r\n Alert: AlertBox,\r\n alert: AlertBox,\r\n Button: ActionButton,\r\n button: ActionButton,\r\n Badge: BadgeTag,\r\n badge: BadgeTag,\r\n Card: CardBox,\r\n card: CardBox,\r\n User: User,\r\n user: User,\r\n Think: Think,\r\n think: Think,\r\n ToolCall: ToolCall,\r\n toolcall: ToolCall,\r\n CodeBlock: CodeBlock,\r\n // Also keep the original names for backward compatibility\r\n AlertBox,\r\n alertbox: AlertBox,\r\n ActionButton,\r\n actionbutton: ActionButton,\r\n BadgeTag,\r\n badgetag: BadgeTag,\r\n CardBox,\r\n cardbox: CardBox,\r\n }), [id]); // Stable components registry\r\n useEffect(() => {\r\n let mounted = true;\r\n const processContent = async () => {\r\n try {\r\n // Use MessageParser to handle cleanup, custom tags like <think>, and tool calls\r\n const processedFile = MessageParser.process(response);\r\n // evaluate compiles and executes the MDX\r\n const { default: Content } = await evaluate(processedFile, {\r\n ...runtime,\r\n remarkPlugins: [remarkGfm],\r\n } as any)\r\n if (mounted) {\r\n setMDXContent(() => Content)\r\n setLastValidMDXContent(() => Content)\r\n setError(null)\r\n }\r\n } catch (firstErr: any) {\r\n // Second pass: aggressive fallback escape ALL HTML and braces, keep only markdown\r\n try {\r\n const aggressiveFallback = MessageParser.aggressiveEscape(response);\r\n const { default: FallbackContent } = await evaluate(aggressiveFallback, {\r\n ...runtime,\r\n remarkPlugins: [remarkGfm],\r\n } as any)\r\n if (mounted) {\r\n setMDXContent(() => FallbackContent)\r\n setLastValidMDXContent(() => FallbackContent)\r\n setError(null)\r\n }\r\n } catch (secondErr: any) {\r\n console.error('MDX fallback also failed:', secondErr.message)\r\n if (mounted) {\r\n setError(secondErr.message)\r\n }\r\n }\r\n }\r\n }\r\n processContent()\r\n return () => {\r\n mounted = false\r\n }\r\n }, [response, id])\r\n const MemoizedMDX = useMemo(() => {\r\n if (!MDXContent) return null;\r\n return <MDXContent components={components} />;\r\n }, [MDXContent, id, components]);\r\n // Update your component to always have the ID on the container\r\n if (error) {\r\n // If we're actively streaming and have a last valid render, show that\r\n if ((activeId === id) && LastValidMDXContent) {\r\n return (\r\n <ActiveMessageIdContext.Provider value={activeId}>\r\n <MessageIdContext.Provider value={id}>\r\n <div id={id} className=\"llm-response markdown-body pt-4 px-2\">\r\n {MemoizedMDX}\r\n </div>\r\n </MessageIdContext.Provider>\r\n </ActiveMessageIdContext.Provider>\r\n )\r\n }\r\n // Graceful plaintext fallback render content as-is instead of ugly error\r\n return (\r\n <div id={id} className=\"llm-response markdown-body pt-12\">\r\n <div style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>\r\n {response}\r\n </div>\r\n </div>\r\n )\r\n }\r\n if (!MDXContent) {\r\n return <>\r\n </>\r\n }\r\n return (\r\n <ActiveMessageIdContext.Provider value={activeId}>\r\n <MessageIdContext.Provider value={id}>\r\n <div id={id} className=\"llm-response markdown-body pt-4 px-2\">\r\n {MemoizedMDX}\r\n </div>\r\n </MessageIdContext.Provider>\r\n </ActiveMessageIdContext.Provider>\r\n )\r\n}","import { useRef, useState, useEffect, useCallback } from \"react\";\nimport type React from \"react\";\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { UseDatabaseReturn } from \"./useDatabase/useDatabase\";\nimport { sha256 } from \"js-sha256\";\nimport { Check, ChevronLeft, ChevronRight, Copy, Info, Pencil, RefreshCcw, FileCode, Video, Volume2, FileText, File as FileIcon, Plus, Mic, ChevronsDownUp, ChevronUp } from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { Button } from \"./ui/button\";\nimport Message from \"./message\";\nimport { TooltipProvider } from \"@radix-ui/react-tooltip\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./ui/tooltip\"\nimport { open } from '@tauri-apps/plugin-dialog'\nimport Record from './record'\nimport { ensureTextAfter, ensureTextBefore, placeCaret, plainToBlocks, type ContentBlock } from \"./composer\";\n\nconst _MIME_MAP: Record<string, string> = {\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',\n webp: 'image/webp', svg: 'image/svg+xml',\n mp4: 'video/mp4', mkv: 'video/x-matroska', avi: 'video/x-msvideo',\n mov: 'video/quicktime', webm: 'video/webm',\n mp3: 'audio/mpeg', wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n pdf: 'application/pdf', csv: 'text/csv',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n js: 'text/javascript', jsx: 'text/javascript', ts: 'text/typescript',\n tsx: 'text/typescript', py: 'text/x-python', java: 'text/x-java',\n c: 'text/x-c', cpp: 'text/x-c++', css: 'text/css',\n html: 'text/html', json: 'application/json', xml: 'text/xml',\n go: 'text/x-go', rs: 'text/x-rust', php: 'text/x-php', rb: 'text/x-ruby',\n txt: 'text/plain', md: 'text/markdown',\n}\n\nconst _CODE_EXTS = new Set(['js', 'jsx', 'ts', 'tsx', 'py', 'java', 'c', 'cpp', 'css', 'html', 'json', 'xml', 'go', 'rs', 'php', 'rb'])\n\nconst _DOC_EXTS = new Set(['pdf', 'csv', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'])\n\nconst _VIDEO_EXTS = new Set(['mp4', 'mkv', 'avi', 'mov', 'webm'])\n\nconst _AUDIO_EXTS = new Set(['mp3', 'wav', 'ogg', 'flac'])\n\nfunction _getMimeType(ext: string) { return _MIME_MAP[ext] ?? 'application/octet-stream' }\ninterface QueryBlock {\n type: 'text' | 'image' | 'file'\n value?: string\n url?: string\n name?: string\n fileType?: string\n}\n\nconst _FILE_REF_RE = /\\[file:([^\\]]+)\\]/g\n\nfunction parseQueryBlocks(text: string): QueryBlock[] {\n const blocks: QueryBlock[] = []\n let last = 0\n _FILE_REF_RE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = _FILE_REF_RE.exec(text)) !== null) {\n if (match.index > last)\n blocks.push({ type: 'text', value: text.slice(last, match.index) })\n const filepath = match[1]\n const name = filepath.split(/[\\\\/]/).pop() ?? filepath\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n const fileType = _getMimeType(ext)\n const url = `/file/${filepath}`\n blocks.push(fileType.startsWith('image/')\n ? { type: 'image', url, name, fileType }\n : { type: 'file', url, name, fileType }\n )\n last = match.index + match[0].length\n }\n if (last < text.length)\n blocks.push({ type: 'text', value: text.slice(last) })\n return blocks\n}\n\nfunction blocksToPlain(blocks: QueryBlock[]): string {\n return blocks.map(b => {\n if (b.type === 'text') return b.value ?? ''\n const filepath = (b.url ?? '').replace('/file/', '')\n return `[file:${filepath}]`\n }).join('')\n}\n\nfunction serializeMsgNode(root: Node): QueryBlock[] {\n const blocks: QueryBlock[] = []\n const stripZW = (s: string) => s.replace(/\\u200B/g, '')\n const walk = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const v = stripZW(node.textContent ?? '')\n if (v) blocks.push({ type: 'text', value: v })\n } else if (node instanceof HTMLElement) {\n if (node.dataset.img) {\n const fileType = node.dataset.filetype\n const isFile = !!fileType && !fileType.startsWith('image/')\n blocks.push(isFile\n ? { type: 'file', url: node.dataset.url!, name: node.dataset.name!, fileType }\n : { type: 'image', url: node.dataset.url!, name: node.dataset.name! }\n )\n } else if (node.tagName === 'BR') {\n if (node.previousSibling || node.nextSibling) {\n blocks.push({ type: 'text', value: '\\n' })\n }\n } else if (node.tagName === 'DIV' || node.tagName === 'P') {\n if (blocks.length > 0) blocks.push({ type: 'text', value: '\\n' })\n node.childNodes.forEach(walk)\n } else {\n node.childNodes.forEach(walk)\n }\n }\n }\n root.childNodes.forEach(walk)\n return blocks\n}\n\nfunction buildChipHTML_msg(url: string, name: string, fileType?: string): string {\n const safeName = name.replace(/\"/g, '"')\n const isImage = !fileType || fileType.startsWith('image/')\n let previewHTML: string\n if (isImage) {\n previewHTML = `<img src=\"${url}\" alt=\"${safeName}\" draggable=\"false\" class=\"h-4 w-4 object-cover rounded-sm border border-black/10 dark:border-white/10 block shrink-0\">`\n } else {\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n let IconComponent: React.ElementType = FileIcon\n let strokeColor = '#6b7280'\n if (fileType!.startsWith('video/') || _VIDEO_EXTS.has(ext)) { IconComponent = Video; strokeColor = '#a855f7' }\n else if (fileType!.startsWith('audio/') || _AUDIO_EXTS.has(ext)) { IconComponent = Volume2; strokeColor = '#22c55e' }\n else if (_DOC_EXTS.has(ext) || fileType === 'application/pdf' || fileType!.includes('csv')) { IconComponent = FileText; strokeColor = '#f97316' }\n else if (_CODE_EXTS.has(ext)) { IconComponent = FileCode; strokeColor = '#3b82f6' }\n const iconSVG = renderToStaticMarkup(<IconComponent color={strokeColor} width=\"14\" height=\"14\" />)\n const dataURI = `data:image/svg+xml,${encodeURIComponent(iconSVG)}`\n previewHTML = `<img src=\"${dataURI}\" alt=\"${safeName}\" draggable=\"false\" class=\"h-4 w-4 object-contain shrink-0\">`\n }\n const textHTML = `<span class=\"text-xs font-medium text-black/70 dark:text-white/70 truncate select-none hidden md:block max-w-[120px]\">${safeName}</span>`\n return (\n `<span contenteditable=\"false\" data-img=\"true\" data-url=\"${url}\" data-name=\"${safeName}\" ${fileType ? `data-filetype=\"${fileType}\"` : ''} class=\"inline-flex align-baseline relative top-0.5 group/chip mx-[2px] items-center gap-1 bg-black/5 dark:bg-white/5 border border-black/10 dark:border-white/10 rounded-[5px] p-[2px] pr-1.5\">` +\n previewHTML + textHTML +\n `<button type=\"button\" class=\"absolute right-1 top-1/2 transform -translate-y-1/2 h-[14px] w-[14px] rounded-full bg-black/80 dark:bg-white/90 text-white dark:text-black flex items-center justify-center opacity-0 group-hover/chip:opacity-100 transition-opacity z-10 shadow-sm\" data-rm-chip=\"true\">` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>` +\n `</button></span>`\n )\n}\n\nfunction buildQueryHTML(query: string): string {\n const blocks = parseQueryBlocks(query)\n return blocks.map(block => {\n if (block.type === 'text') {\n return (block.value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n }\n return buildChipHTML_msg(block.url!, block.name!, block.fileType)\n }).join('')\n}\n\nfunction QueryContent({ query }: { query: string }) {\n const blocks = parseQueryBlocks(query)\n return (\n <>\n {blocks.map((block, i) => {\n if (block.type === 'text') return <span key={i}>{block.value}</span>\n const name = block.name ?? ''\n const url = block.url ?? ''\n const fileType = block.fileType ?? ''\n const isImage = !fileType || fileType.startsWith('image/')\n let preview: React.ReactNode\n if (isImage) {\n preview = <img src={url} alt={name} draggable={false} className=\"h-4 w-4 object-cover rounded-sm border border-black/10 dark:border-white/10 block shrink-0\" />\n } else {\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n let IconComp: React.ElementType = FileIcon\n let strokeColor = '#6b7280'\n if (fileType.startsWith('video/') || _VIDEO_EXTS.has(ext)) { IconComp = Video; strokeColor = '#a855f7' }\n else if (fileType.startsWith('audio/') || _AUDIO_EXTS.has(ext)) { IconComp = Volume2; strokeColor = '#22c55e' }\n else if (_DOC_EXTS.has(ext) || fileType === 'application/pdf' || fileType.includes('csv')) { IconComp = FileText; strokeColor = '#f97316' }\n else if (_CODE_EXTS.has(ext)) { IconComp = FileCode; strokeColor = '#3b82f6' }\n preview = <IconComp color={strokeColor} width={14} height={14} />\n }\n return (\n <span key={i} className=\"inline-flex align-baseline relative top-0.5 mx-[2px] items-center gap-1 bg-black/5 dark:bg-white/5 border border-black/10 dark:border-white/10 rounded-[5px] p-[2px] pr-1.5\">\n {preview}\n <span className=\"text-xs font-medium text-black/70 dark:text-white/70 truncate select-none max-w-[120px] hidden md:block\">{name}</span>\n </span>\n )\n })}\n </>\n )\n}\ninterface CostTrack {\n type: \"input\" | \"output\";\n description: string;\n cost: number;\n}\ninterface ModelOutput {\n isStreaming: boolean;\n content: string;\n token_per_second?: number | null;\n costs?: CostTrack[];\n model?: string;\n date?: number;\n}\n\nfunction getResponseContent(response: ModelOutput | string | undefined | null): string {\n if (!response) return \"\";\n if (typeof response === \"string\") return response;\n if (typeof response === \"object\" && \"content\" in response) return response.content ?? \"\";\n return \"\";\n}\n\nfunction getIsStreaming(response: ModelOutput | string | undefined | null): boolean {\n if (!response) return false;\n if (typeof response === \"string\") return false;\n if (typeof response === \"object\" && \"isStreaming\" in response) return response.isStreaming ?? false;\n return false;\n}\n\nexport default function MessageContainer({ request, tabId, activeId, branch, index, useDatabase, isStreaming, workspace }: {\n request: (payload: any, tb: string, branchId: string, index: number | string, response_branch: number) => Promise<any>,\n tabId: string, activeId: string | null, branch: string, index: number,\n useDatabase: <T>(\n tb: string,\n options?: { initialValue?: T }\n ) => UseDatabaseReturn<T>,\n isStreaming: boolean,\n workspace: string,\n}) {\n const tb = \"msg_\" + branch + \"_\" + index;\n const [message, setMessage] = useDatabase<{\n branch: number, content: Record<string, {\n query: string,\n responses: (ModelOutput | string)[],\n response_branch: number\n }>\n }>(\n tb,\n {\n initialValue: {\n branch: 0,\n content: {}\n }\n });\n const b = sha256(message.branch > 0 ? message.branch.toString() + branch : branch).slice(0, 32)\n const [isCopied, setIsCopied] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const queryRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const escaping = useRef(false);\n const savedRange = useRef<Range | null>(null)\n\n const syncState = useCallback(() => {\n const div = queryRef.current\n if (!div) return\n const chips = div.querySelectorAll<HTMLElement>('[data-img]')\n chips.forEach(chip => {\n ensureTextBefore(chip)\n ensureTextAfter(chip)\n })\n }, [])\n\n // Hook to observe container changes and identify if scroll height clips container dimensions\n useEffect(() => {\n const checkOverflow = () => {\n if (containerRef.current) {\n const { scrollHeight, clientHeight } = containerRef.current;\n setIsOverflowing(scrollHeight > clientHeight || isExpanded);\n }\n };\n\n checkOverflow();\n\n if (!containerRef.current) return;\n const observer = new ResizeObserver(checkOverflow);\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [message.content, b, isExpanded, isEditing]);\n\n useEffect(() => {\n const div = queryRef.current\n if (!div) return\n const observer = new MutationObserver(() => {\n const children = Array.from(div.childNodes)\n let dirty = false\n for (const node of children) {\n if (node.nodeName === 'BR') {\n div.removeChild(node); dirty = true; continue\n }\n if (node.nodeName === 'DIV') {\n const el = node as HTMLElement\n if (el.dataset.img) continue\n if (el.innerHTML === '<br>' || el.innerHTML === '' || el.innerHTML === ' ') {\n div.removeChild(el)\n } else {\n const frag = document.createDocumentFragment()\n if (el.previousSibling) frag.appendChild(document.createTextNode('\\n'))\n while (el.firstChild) frag.appendChild(el.firstChild)\n div.replaceChild(frag, el)\n }\n dirty = true\n }\n }\n if (dirty) syncState()\n })\n observer.observe(div, { childList: true })\n return () => observer.disconnect()\n }, [syncState, isEditing])\n useEffect(() => {\n const onSelectionChange = () => {\n if (escaping.current) return\n const div = queryRef.current\n if (!div || !isEditing) return\n if (!div.querySelector('[data-img]')) return\n const sel = window.getSelection()\n if (!sel?.rangeCount || !sel.isCollapsed) return\n const { focusNode } = sel\n if (!focusNode || (!div.contains(focusNode) && focusNode !== div)) return\n const { startContainer, startOffset } = sel.getRangeAt(0)\n let target: Text | null = null\n let offset = 0\n let chip: HTMLElement | null = null\n if (startContainer instanceof HTMLElement && startContainer.dataset.img) {\n chip = startContainer\n } else if (startContainer.nodeType === Node.TEXT_NODE && startContainer.parentElement?.closest('[data-img=\"true\"]')) {\n chip = startContainer.parentElement.closest('[data-img=\"true\"]') as HTMLElement\n } else if (startContainer instanceof HTMLElement && startContainer.closest('[data-img=\"true\"]')) {\n chip = startContainer.closest('[data-img=\"true\"]') as HTMLElement\n }\n if (chip) {\n if (startOffset === 0) { target = ensureTextBefore(chip); offset = target.length }\n else { target = ensureTextAfter(chip); offset = 0 }\n } else if (startContainer === div) {\n if (startOffset < div.childNodes.length) {\n const child = div.childNodes[startOffset]\n if (child instanceof HTMLElement && child.dataset.img) {\n target = ensureTextBefore(child); offset = target.length\n }\n }\n if (!target && startOffset > 0) {\n const prev = div.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n target = ensureTextAfter(prev); offset = 0\n }\n }\n }\n if (target) {\n escaping.current = true\n placeCaret(target, offset)\n requestAnimationFrame(() => { escaping.current = false })\n }\n }\n document.addEventListener('selectionchange', onSelectionChange)\n return () => document.removeEventListener('selectionchange', onSelectionChange)\n }, [isEditing])\n const insertChipAtCursor = useCallback((url: string, name: string, fileType: string) => {\n const el = queryRef.current\n if (!el) return\n el.focus()\n const sel = window.getSelection()\n // Restore saved range if available and still inside the editor\n if (savedRange.current) {\n const anc = savedRange.current.commonAncestorContainer\n if (el === anc || el.contains(anc)) {\n sel?.removeAllRanges()\n sel?.addRange(savedRange.current)\n }\n }\n if (sel?.rangeCount && !sel.isCollapsed) {\n document.execCommand('delete', false)\n }\n document.execCommand('insertHTML', false, buildChipHTML_msg(url, name, fileType) + ' ')\n // Move caret after the inserted chip\n const chips = el.querySelectorAll('[data-img]')\n if (chips.length > 0) {\n const lastChip = chips[chips.length - 1] as HTMLElement\n placeCaret(ensureTextAfter(lastChip), 0)\n }\n savedRange.current = null\n syncState()\n }, [syncState])\n const handlePlusClick = useCallback(async () => {\n const el = queryRef.current\n if (!el) return\n // Save current caret position before dialog steals focus\n const sel = window.getSelection()\n if (sel?.rangeCount) {\n const r = sel.getRangeAt(0)\n const anc = r.commonAncestorContainer\n savedRange.current = (el === anc || el.contains(anc)) ? r.cloneRange() : null\n } else {\n savedRange.current = null\n }\n const result = await open({ multiple: true })\n if (!result) return\n const paths = Array.isArray(result) ? result : [result]\n for (const filePath of paths) {\n const name = filePath.split(/[\\\\/]/).pop() ?? filePath\n const ext = name.split('.').pop()?.toLowerCase() ?? ''\n insertChipAtCursor(`/file/${filePath}`, name, _getMimeType(ext))\n }\n }, [insertChipAtCursor])\n // Chip removal via pointer \n const handleEditorPointerDown = useCallback((e: React.PointerEvent<HTMLSpanElement>) => {\n const target = e.target as HTMLElement\n if (!target.closest('[data-rm-chip=\"true\"]')) return\n e.preventDefault()\n e.stopPropagation()\n const chip = target.closest('[data-img=\"true\"]')\n if (!chip) return\n queryRef.current?.focus()\n const sel = window.getSelection()\n const range = document.createRange()\n range.selectNode(chip)\n sel?.removeAllRanges()\n sel?.addRange(range)\n document.execCommand('delete', false)\n }, [])\n // Copy \n const handleCopy = useCallback((e: React.ClipboardEvent) => {\n const sel = window.getSelection()\n if (!sel || sel.isCollapsed || !sel.rangeCount) return\n const blocks = serializeMsgNode(sel.getRangeAt(0).cloneContents())\n if (!blocks.length) return\n e.preventDefault()\n navigator.clipboard.writeText(blocksToPlain(blocks)).catch(() => { })\n }, [])\n // Cut \n const handleCut = useCallback((e: React.ClipboardEvent) => {\n const sel = window.getSelection()\n if (!sel || sel.isCollapsed || !sel.rangeCount) return\n handleCopy(e)\n document.execCommand('delete', false)\n }, [handleCopy])\n const insertBlocks = useCallback((blocks: ContentBlock[]) => {\n const div = queryRef.current\n if (!div) return\n div.focus()\n const sel = window.getSelection()\n if (sel?.rangeCount && !sel.isCollapsed) {\n document.execCommand('delete', false)\n }\n for (const block of blocks) {\n if (block.type === 'text' && block.value) {\n document.execCommand('insertText', false, block.value)\n } else if ((block.type === 'image' || block.type === 'file') && block.url) {\n document.execCommand('insertHTML', false, buildChipHTML_msg(block.url, block.name ?? '', block.fileType))\n const chips = div.querySelectorAll('[data-img]')\n if (chips.length > 0) {\n const lastChip = chips[chips.length - 1] as HTMLElement\n placeCaret(ensureTextAfter(lastChip), 0)\n }\n }\n }\n syncState()\n }, [syncState])\n // Paste \n const handlePaste = useCallback(async (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (e.clipboardData?.files?.length) {\n Array.from(e.clipboardData.files).forEach(file => {\n insertChipAtCursor(URL.createObjectURL(file), file.name, file.type)\n })\n return\n }\n let plain = ''\n try {\n plain = await navigator.clipboard.readText()\n } catch {\n plain = e.clipboardData?.getData('text/plain') ?? ''\n }\n if (!plain) return\n const blocks = plainToBlocks(plain)\n if (blocks.some(b => b.type !== 'text')) {\n insertBlocks(blocks)\n } else {\n document.execCommand('insertText', false, plain)\n }\n }, [insertBlocks, insertChipAtCursor])\n const handleEditorKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter') {\n if (!e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n return\n }\n e.preventDefault()\n {\n const div = queryRef.current!\n const sel2 = window.getSelection()\n if (!sel2?.rangeCount) { syncState(); return }\n const range2 = sel2.getRangeAt(0)\n if (!range2.collapsed) range2.deleteContents()\n const endRange = document.createRange()\n endRange.selectNodeContents(div)\n endRange.collapse(false)\n let atEnd = range2.compareBoundaryPoints(Range.END_TO_END, endRange) === 0\n if (!atEnd) {\n const r = range2.cloneRange()\n r.setEnd(endRange.endContainer, endRange.endOffset)\n atEnd = r.toString().replace(/\\u200B/g, '').length === 0\n }\n const nlNode = document.createTextNode(atEnd ? '\\n\\u200B' : '\\n')\n range2.insertNode(nlNode)\n placeCaret(nlNode, 1)\n }\n syncState()\n return\n }\n const sel = window.getSelection()\n if (!sel?.rangeCount) return\n const range = sel.getRangeAt(0)\n if (!range.collapsed) {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n document.execCommand('delete', false)\n syncState()\n }\n return\n }\n const { startContainer, startOffset } = range\n if (e.key === 'Backspace') {\n if (startContainer.nodeType === Node.TEXT_NODE) {\n if (startOffset === 0 || (e.ctrlKey && (startContainer.textContent?.slice(0, startOffset) ?? '').trim() === '')) {\n const prev = startContainer.previousSibling\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const dr = document.createRange()\n dr.setStartBefore(prev)\n dr.setEnd(startContainer, startOffset)\n sel.removeAllRanges(); sel.addRange(dr)\n document.execCommand('delete', false)\n syncState(); return\n }\n }\n }\n if (startContainer === queryRef.current && startOffset > 0) {\n const prev = queryRef.current.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const dr = document.createRange()\n dr.selectNode(prev)\n sel.removeAllRanges(); sel.addRange(dr)\n document.execCommand('delete', false)\n syncState(); return\n }\n }\n }\n if (e.key === 'ArrowRight') {\n if (startContainer.nodeType === Node.TEXT_NODE && startOffset === (startContainer as Text).length) {\n const next = startContainer.nextSibling\n if (next instanceof HTMLElement && next.dataset.img) {\n e.preventDefault()\n const afterText = ensureTextAfter(next)\n e.shiftKey\n ? sel.setBaseAndExtent(range.startContainer, range.startOffset, afterText, 0)\n : placeCaret(afterText, 0)\n return\n }\n }\n const editor = queryRef.current\n if (editor && startContainer === editor && startOffset < editor.childNodes.length) {\n const next = editor.childNodes[startOffset]\n if (next instanceof HTMLElement && next.dataset.img) {\n e.preventDefault()\n const afterText = ensureTextAfter(next)\n e.shiftKey\n ? sel.setBaseAndExtent(range.startContainer, range.startOffset, afterText, 0)\n : placeCaret(afterText, 0)\n return\n }\n }\n }\n if (e.key === 'ArrowLeft') {\n if (startContainer.nodeType === Node.TEXT_NODE && startOffset === 0) {\n const prev = startContainer.previousSibling\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const beforeText = ensureTextBefore(prev)\n e.shiftKey\n ? sel.setBaseAndExtent(range.endContainer, range.endOffset, beforeText, beforeText.length)\n : placeCaret(beforeText, beforeText.length)\n return\n }\n }\n const editor = queryRef.current\n if (editor && startContainer === editor && startOffset > 0) {\n const prev = editor.childNodes[startOffset - 1]\n if (prev instanceof HTMLElement && prev.dataset.img) {\n e.preventDefault()\n const beforeText = ensureTextBefore(prev)\n e.shiftKey\n ? sel.setBaseAndExtent(range.endContainer, range.endOffset, beforeText, beforeText.length)\n : placeCaret(beforeText, beforeText.length)\n return\n }\n }\n }\n }, [syncState, handleSubmit])\n // Submit \n async function handleSubmit() {\n setIsEditing(false);\n const query = queryRef.current ? blocksToPlain(serializeMsgNode(queryRef.current)) : \"\";\n const newBranch = sha256((message.branch + 1).toString() + branch).slice(0, 32);\n await request(query, tb, newBranch, message.branch + 1, 0);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n }\n // Populate contentEditable with chip HTML when editing starts\n useEffect(() => {\n if (!isEditing || !queryRef.current) return\n const el = queryRef.current\n el.innerHTML = buildQueryHTML(message.content[b]?.query ?? '')\n el.focus()\n const range = document.createRange()\n range.selectNodeContents(el)\n range.collapse(false)\n const sel = window.getSelection()\n sel?.removeAllRanges()\n sel?.addRange(range)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isEditing])\n useEffect(() => {\n if (!isEditing) return;\n function handleClickOutside(event: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsEditing(false);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isEditing]);\n // Editing toolbar (shared between both render paths) \n const EditingToolbar = (\n <div className=\"absolute bottom-3 left-0 right-0 px-3 flex items-center justify-between\">\n {/* Left: file picker + record */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={handlePlusClick}\n className=\"h-7 w-7 flex items-center justify-center rounded-full opacity-60 hover:opacity-100 hover:bg-black/5 dark:hover:bg-white/5 transition-all\"\n title=\"Attach file\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n <Record\n workspace={workspace}\n onFileSaved={(filePath) => {\n const ext = filePath.split('.').pop()?.toLowerCase() ?? ''\n const fileName = filePath.split(/[\\\\/]+/).pop() ?? filePath\n insertChipAtCursor(`/file/${filePath}`, fileName, _getMimeType(ext))\n }}\n >\n {({ isRecording, startRecording, stopRecording }: { isRecording: boolean; startRecording: () => void; stopRecording: () => void }) => (\n <button\n type=\"button\"\n onClick={isRecording ? stopRecording : startRecording}\n className={clsx(\n \"h-7 w-7 flex items-center justify-center rounded-full transition-all\",\n isRecording\n ? \"text-red-500 opacity-100 bg-red-500/10\"\n : \"opacity-60 hover:opacity-100 hover:bg-black/5 dark:hover:bg-white/5\"\n )}\n title={isRecording ? \"Stop recording\" : \"Record audio\"}\n >\n <Mic className=\"w-4 h-4\" />\n </button>\n )}\n </Record>\n </div>\n {/* Right: Cancel + Send */}\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={() => {\n const sel = window.getSelection();\n sel?.removeAllRanges();\n setIsEditing(false);\n }}\n className=\"rounded-3xl border border-[hsl(var(--chat-border))] dark:border-transparent\"\n variant=\"secondary\"\n >\n Cancel\n </Button>\n <Button onClick={handleSubmit} className=\"rounded-3xl\">Send</Button>\n </div>\n </div>\n )\n // Shared editing container classes \n const editingContainerCls = clsx(\n isEditing\n ? \"w-full rounded-lg min-h-[80px] bg-[hsl(var(--float))] pb-14 pt-4 shadow-lg border border-[hsl(var(--chat-border))] dark:border-transparent\"\n : \"py-2 rounded-xl ml-auto bg-accent/5 max-w-[70%] overflow-hidden\",\n \"px-4 relative\",\n isEditing ? \"\" : isExpanded ? \"pb-5\" : \"max-h-50\",\n )\n return (\n <>\n {/* <div>\n {JSON.stringify(message)}\n </div> */}\n {(message.content?.[b]?.query &&\n ((message.content?.[b]?.response_branch ?? 0) === 0) &&\n (getResponseContent(message.content?.[b]?.responses?.[message.content?.[b]?.response_branch]) === \"<div></div>\" || getResponseContent(message.content?.[b]?.responses?.[message.content?.[b]?.response_branch]).length === 0)) ?\n <div id={\"container_\" + index} className=\"pt-4\">\n <div className=\"w-full\">\n <div\n style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}\n className=\"flex flex-col gap-2 group\">\n <div ref={containerRef} className={editingContainerCls}>\n <span>\n <QueryContent key=\"display\" query={message.content[b].query} />\n </span>\n {!isEditing && isOverflowing && (\n <div\n onClick={(e) => {\n e.preventDefault()\n setIsExpanded(!isExpanded)\n }}\n className={clsx(\n \"w-full h-5 bottom-0 absolute left-0 cursor-pointer flex items-center justify-center\",\n isExpanded ? \"bg-accent/5 border-t border-accent/5\" : \"bg-gradient-to-b from-transparent to-neutral-800\"\n )}\n >\n {isExpanded && <ChevronUp size={12} />}\n </div>\n )}\n </div>\n </div>\n </div>\n {\n isStreaming\n && activeId === tabId + \"_response_\" + b + \"_\" + (message.content?.[b]?.response_branch ?? 0) + \"_\" + message.branch\n && (\n <div className=\"w-4 h-4 rounded-full bg-card flex items-center justify-center\">\n <div className=\"w-2 h-2 rounded-full bg-accent relative animate-scale\" />\n </div>\n )\n }\n <>\n <div id={tabId + \"_empty_message_container\"} data-branch-id={b} data-branch-index={message.branch} data-last-valid-index={index - 1} data-tb={tb} />\n </>\n </div> :\n message.content?.[b]?.query &&\n getResponseContent(message.content?.[b]?.responses?.[message.content?.[b]?.response_branch]) ? <>\n <div id={\"container_\" + index} className=\"pt-4\">\n <div className=\"w-full\">\n <div\n style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}\n className=\"flex flex-col gap-2 group\">\n <div ref={containerRef} className={editingContainerCls}>\n {(isEditing && !isStreaming) ? (\n <div\n key=\"editing\"\n ref={queryRef}\n className=\"w-full min-h-[80px]\"\n spellCheck={false}\n contentEditable\n suppressContentEditableWarning\n onPointerDown={handleEditorPointerDown}\n onCopy={handleCopy}\n onCut={handleCut}\n onPaste={handlePaste}\n onKeyDown={handleEditorKeyDown}\n />\n ) : (\n <span key=\"display\">\n <QueryContent query={message.content[b].query} />\n </span>\n )}\n {isEditing && EditingToolbar}\n {!isEditing && isOverflowing && (\n <div\n onClick={(e) => {\n e.preventDefault()\n setIsExpanded(!isExpanded)\n }}\n className={clsx(\n \"w-full h-5 bottom-0 absolute left-0 cursor-pointer flex items-center justify-center\",\n isExpanded ? \"bg-accent/5 border-t border-accent/5\" : \"bg-gradient-to-b from-transparent to-neutral-800\"\n )}\n >\n {isExpanded && <ChevronUp size={12} />}\n </div>\n )}\n </div>\n <div className=\"ml-auto flex gap-2 items-center pr-2 opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n {!isEditing && !isStreaming &&\n <>\n {!isCopied ? <Copy className=\"w-4 h-4 transform translate-y-[2px] cursor-pointer\" onClick={() => {\n navigator.clipboard.writeText(message.content[b].query);\n setIsCopied(true);\n setTimeout(() => { setIsCopied(false); }, 500);\n }} /> : <Check className=\"w-4 h-4 transform translate-y-[2px]\" />}\n <Pencil className=\"w-4 h-4 transform translate-y-[2px] cursor-pointer\" onClick={() => { setIsEditing(true); }} />\n {Object.keys(message.content).length > 1 && <>\n <ChevronLeft className={clsx(\n message.branch === 0 ? \"opacity-50\" : \"opacity-100 cursor-pointer\",\n \"w-4 h-4 transform translate-y-[2px]\"\n )} onClick={() => {\n setMessage(prev => ({ ...prev, branch: Math.max(0, prev.branch - 1) }))\n }} />\n <span>{message.branch + 1} / {Object.keys(message.content).length}</span>\n <ChevronRight className={clsx(\n message.branch === Object.keys(message.content).length - 1 ? \"opacity-50\" : \"opacity-100 cursor-pointer\",\n \"w-4 h-4 transform translate-y-[2px]\"\n )} onClick={() => {\n setMessage(prev => ({ ...prev, branch: Math.min(Object.keys(prev.content).length - 1, prev.branch + 1) }))\n }} />\n </>}\n </>\n }\n </div>\n </div>\n </div>\n <div className=\"group relative\">\n <Message\n response={getResponseContent(message.content[b].responses[message.content[b].response_branch])}\n id={tabId + \"_response_\" + b + \"_\" + message.content[b].response_branch + \"_\" + index}\n activeId={activeId}\n />\n {!getIsStreaming(message.content[b].responses[message.content[b].response_branch]) && (\n <div className=\"flex items-center gap-2 py-3\">\n {!isEditing &&\n <>\n {Object.keys(message.content[b].responses).length > 1 && <>\n <ChevronLeft className={clsx(\n message.content[b].response_branch === 0 ? \"opacity-50\" : \"opacity-100 cursor-pointer\",\n \"w-4 h-4 transform translate-y-[2px]\"\n )} onClick={() => {\n setMessage(prev => ({\n ...prev,\n content: {\n ...prev.content,\n [b]: { ...prev.content[b], response_branch: Math.max(0, prev.content[b].response_branch - 1) }\n }\n }))\n }} />\n <span>{message.content[b].response_branch + 1} / {Object.keys(message.content[b].responses).length}</span>\n <ChevronRight className={clsx(\n message.content[b].response_branch === Object.keys(message.content[b].responses).length - 1 ? \"opacity-50\" : \"opacity-100 cursor-pointer\",\n \"w-4 h-4 transform translate-y-[2px]\"\n )} onClick={() => {\n setMessage(prev => ({\n ...prev,\n content: {\n ...prev.content,\n [b]: { ...prev.content[b], response_branch: Math.min(Object.keys(prev.content[b].responses).length - 1, prev.content[b].response_branch + 1) }\n }\n }))\n }} />\n </>}\n {!isCopied ? <Copy className=\"w-4 h-4 transform translate-y-[2px] cursor-pointer\" onClick={() => {\n navigator.clipboard.writeText(getResponseContent(message.content[b].responses[message.content[b].response_branch]));\n setIsCopied(true);\n setTimeout(() => { setIsCopied(false); }, 500);\n }} /> : <Check className=\"w-4 h-4 transform translate-y-[2px]\" />}\n <RefreshCcw\n className=\"w-4 h-4 transform translate-y-[2px] cursor-pointer\"\n onClick={async () => {\n const rb = message.content[b].responses.length;\n await request(message.content[b].query, tb, b, message.branch, rb);\n }}\n />\n <TooltipProvider>\n <Tooltip disableHoverableContent={true}>\n <TooltipTrigger>\n <Info className=\"w-4 h-4 transform translate-y-[3px]\" />\n </TooltipTrigger>\n <TooltipContent>\n {(() => {\n const currentResponse = message.content[b].responses[message.content[b].response_branch];\n const isModelOutput = typeof currentResponse === \"object\" && currentResponse !== null && \"content\" in currentResponse;\n if (!isModelOutput) return null;\n const mo = currentResponse as ModelOutput;\n const hasMetadata = mo.model || mo.token_per_second || (mo.costs && mo.costs.length > 0);\n if (!hasMetadata) return null;\n const totalCost = mo.costs?.reduce((sum, c) => sum + c.cost, 0) ?? 0;\n return (\n <div className=\"flex items-center gap-3\">\n {mo.model && <span className=\"font-mono\">{mo.model} - </span>}\n {mo.token_per_second != null && <span>{mo.token_per_second} tokens / s</span>}\n {totalCost > 0 && <span>${totalCost.toFixed(6)}</span>}\n </div>\n );\n })()}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </>\n }\n </div>\n )}\n </div>\n </div>\n {\n isStreaming\n && activeId === tabId + \"_response_\" + b + \"_\" + (message.content?.[b]?.response_branch ?? 0) + \"_\" + message.branch\n && (\n <div className=\"w-4 h-4 rounded-full bg-card flex items-center justify-center\">\n <div className=\"w-2 h-2 rounded-full bg-accent relative animate-scale\" />\n </div>\n )\n }\n <MessageContainer request={request} tabId={tabId} activeId={activeId} useDatabase={useDatabase} index={index + 1} branch={b} isStreaming={isStreaming} workspace={workspace} />\n </>\n :\n <>\n <div id={tabId + \"_empty_message_container\"} data-branch-id={b} data-branch-index={message.branch} data-last-valid-index={index - 1} data-tb={tb} />\n {\n isStreaming\n && activeId === tabId + \"_response_\" + b + \"_\" + (message.content?.[b]?.response_branch ?? 0) + \"_\" + message.branch\n && (\n <div className=\"w-4 h-4 rounded-full bg-card flex items-center justify-center\">\n <div className=\"w-2 h-2 rounded-full bg-accent relative animate-scale\" />\n </div>\n )\n }\n </>\n }\n </>\n )\n}","import {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./ui/tooltip\"\nimport { TooltipProvider } from \"@radix-ui/react-tooltip\"\nimport clsx from 'clsx'\nimport { ChevronDown, Unplug } from 'lucide-react'\nimport { usePython } from \"./usePython\";\nimport type { Model } from \"../utils/utils\";\nimport { Dropdown } from \"./dropdown\";\nimport type { DropdownMenuItemProps } from \"./dropdown\";\nimport { Spinner } from \"./ui\";\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n\nconst SLICE_LENGTH = 30;\n\nconst SEARCH_DEBOUNCE_MS = 150;\n\nfunction truncate(name: string | null | undefined): string {\n if (!name) return \"No Model Selected\";\n return name.length > SLICE_LENGTH ? `${name.slice(0, SLICE_LENGTH)}…` : name;\n}\n\nfunction isLLMorVLM(m: Model): boolean {\n return (\n (m.modelType?.includes(\"llm\") || m.modelType?.includes(\"vlm\")) === true &&\n m.backend != null\n );\n}\n\n// Returns a value that only updates after `delay` ms of no changes.\n// The input updates instantly; only the expensive consumers see the debounced value.\n\nfunction useDebounce<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState<T>(value);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setDebounced(value), delay);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [value, delay]);\n return debounced;\n}\n\ninterface ModelItemProps {\n model: Model;\n onUnload: (id: string) => void;\n}\n\nconst ModelItem = memo(function ModelItem({ model, onUnload }: ModelItemProps) {\n const backendLabel = model.backend?.split(\":\").pop();\n const handleUnload = useCallback(() => {\n if (model.id) onUnload(model.id);\n }, [model.id, onUnload]);\n return (\n <div className=\"selectmodel flex items-center w-full gap-2\">\n <Tooltip disableHoverableContent>\n <TooltipTrigger>\n <span className=\"flex items-center\">{truncate(model.name)}</span>\n </TooltipTrigger>\n <TooltipContent sideOffset={10}>\n <p>{model.name}</p>\n </TooltipContent>\n </Tooltip>\n <div className=\"flex-1\" />\n {backendLabel && (\n <Tooltip disableHoverableContent>\n <TooltipTrigger>\n <p className=\"px-1 text-[8pt] rounded-xl bg-accent/10\">{backendLabel}</p>\n </TooltipTrigger>\n <TooltipContent>\n <p>{backendLabel} will perform the inference.</p>\n </TooltipContent>\n </Tooltip>\n )}\n {model.isLoaded && (\n <Tooltip disableHoverableContent>\n <TooltipTrigger>\n <div className=\"w-2 h-2 rounded-full bg-green-500\" />\n </TooltipTrigger>\n <TooltipContent>\n <p>Model is loaded.</p>\n </TooltipContent>\n </Tooltip>\n )}\n {model.isLoaded && model.isLocal && (\n <Tooltip disableHoverableContent>\n <TooltipTrigger>\n <div\n onClick={handleUnload}\n className=\"flex items-center opacity-50 hover:opacity-100 cursor-pointer\"\n >\n <Unplug size={14} />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <p>Unload model.</p>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n );\n});\n\n\nfunction parseModelsFromConfig(raw: string): Model[] {\n const parsed = JSON.parse(raw);\n if (!parsed.available_models) return [];\n return (Object.entries(parsed.available_models) as [string, Record<string, unknown>][])\n .map(([id, m]) => ({\n id,\n name: (m.name as string) ?? \"Unknown\",\n backend: (m.backend as string) ?? null,\n modelType: (m.model_type as string[]) ?? null,\n modelPath: (m.model_path as string) ?? null,\n mmproj: (m.mmproj as string) ?? null,\n fileName: (m.filename as string) ?? null,\n apiBase: (m.api_base as string) ?? null,\n isLocal: (m.is_local as boolean) ?? false,\n isLoaded:\n parsed.models &&\n Object.prototype.hasOwnProperty.call(parsed.models, id) &&\n !(parsed.models as Record<string, { last_error?: unknown }>)[id].last_error,\n lastError:\n (parsed.models as Record<string, { last_error?: unknown }>)?.[id]?.last_error\n ? String((parsed.models as Record<string, { last_error?: unknown }>)[id].last_error)\n : null,\n } satisfies Model))\n .filter(isLLMorVLM);\n}\n\n\nexport default function ModelSelection({\n layout,\n model,\n setModel,\n}: {\n layout: string;\n model: Model;\n setModel: (model: Model) => void;\n}) {\n const { pyInvoke } = usePython();\n const [open, setOpen] = useState(false);\n const [availableModels, setAvailableModels] = useState<Model[]>([]);\n // searchQuery drives the input instantly (no lag while typing).\n // debouncedQuery drives the filter only updates 150 ms after typing stops.\n const [searchQuery, setSearchQuery] = useState(\"\");\n const debouncedQuery = useDebounce(searchQuery, SEARCH_DEBOUNCE_MS);\n const [isScanning, setIsScanning] = useState(false);\n // Fetch models only when opening \n useEffect(() => {\n if (!open) return;\n setIsScanning(true);\n setSearchQuery(\"\");\n let cancelled = false;\n (async () => {\n try {\n const res : any= await pyInvoke<{ data?: Record<string, unknown> }>('file', {\n command: \"read\",\n filename: \"config.json\",\n base_dir: \"python\",\n });\n if (cancelled) return;\n const config = res?.data?.content as string | undefined;\n if (!config) return;\n setAvailableModels(parseModelsFromConfig(config));\n setIsScanning(false);\n } catch (e) {\n if (!cancelled) console.error(\"Failed to load models:\", e);\n }\n })();\n return () => { cancelled = true; };\n }, [open, pyInvoke]);\n // Unload handler single stable reference shared by all ModelItems \n const unloadModel = useCallback(async (id: string) => {\n await pyInvoke(\"v1/models/unload\", { model_id: id });\n }, [pyInvoke]);\n // Filtered list reacts to debounced query, not raw keystrokes \n const filtered = useMemo(() => {\n const q = debouncedQuery.trim().toLowerCase();\n if (!q) return availableModels;\n return availableModels.filter((m) =>\n (m.name ?? \"\").toLowerCase().includes(q)\n );\n }, [availableModels, debouncedQuery]);\n // Dropdown content \n const dropdownContent: DropdownMenuItemProps[] = useMemo(() => {\n // While the debounced value hasn't caught up yet, show a loading state.\n const isFiltering = searchQuery !== debouncedQuery;\n if (isFiltering || (filtered.length === 0 && debouncedQuery.trim().length === 0)) {\n return [{\n content: (\n (isScanning || isFiltering) ? <div className=\"flex items-center justify-center gap-3\">\n <Spinner /><span>Searching…</span>\n </div> : <div className=\"flex items-center justify-center gap-3\">\n <span>No models found.</span>\n </div>\n ),\n }];\n }\n if (filtered.length === 0) {\n return [{\n content: (\n <div className=\"flex items-center justify-center gap-3\">\n <span>No models found.</span>\n </div>\n ),\n }];\n }\n return filtered.map((m) => ({\n content: (\n <ModelItem\n key={m.id}\n model={m}\n onUnload={unloadModel}\n />\n ),\n text: m.name ?? undefined,\n shortcut: null,\n children: null,\n separator: false,\n trigger: () => setModel(m),\n }));\n }, [filtered, searchQuery, debouncedQuery, unloadModel, setModel]);\n // Render \n return (\n <TooltipProvider>\n <div className={clsx(\n \"absolute top-2 z-10 flex items-center\",\n layout === \"leftToRight\" ? \"left-5\" : \"right-5\"\n )}>\n <Dropdown\n open={open}\n onOpenChange={setOpen}\n search={searchQuery}\n setSearch={setSearchQuery}\n className=\"max-w-none min-w-70 max-h-[345px] flex flex-col\"\n content={dropdownContent}\n >\n <div className=\"p-2 rounded-lg cursor-pointer flex items-center\">\n <div style={{ fontSize: \"1.125rem\" }}>\n {model?.name || \"No Model Selected\"}\n </div>\n <div className=\"pl-1\">\n <ChevronDown className=\"h-4 w-4 text-zinc-600 dark:text-zinc-300\" />\n </div>\n </div>\n </Dropdown>\n </div>\n </TooltipProvider>\n );\n}\n","import Composer from \"./composer\";\r\nimport { useRef, useLayoutEffect, useState, useEffect } from \"react\";\r\nimport useElementSize from \"./hooks/useElementSize\";\r\nimport clsx from \"clsx\";\r\nimport type { AppInfo } from \"../utils/utils\";\r\nimport { usePython } from \"./usePython\";\r\nimport MessageContainer from \"./message-container\";\r\nimport { sha256 } from \"js-sha256\";\r\nimport ModelSelection from \"./model-selection\";\r\nimport { ArrowDown } from \"lucide-react\";\r\nimport { generateIdFromString } from \"../index\";\r\n\r\nexport interface MessageState {\r\n title: string | null;\r\n activeId: string;\r\n errorMsg: string;\r\n isStreaming: boolean;\r\n initialized: boolean;\r\n context: string;\r\n}\r\n\r\n\r\nexport default function DefaultPage(AppInfo: AppInfo) {\r\n const { layout } = AppInfo.useTheme();\r\n const { workspace } = AppInfo.useWorkspace();\r\n const composerTextareaRef = useRef<HTMLTextAreaElement>(null);\r\n const msgBottomRef = useRef<HTMLDivElement>(null);\r\n const [scrollContainerRef] = useElementSize<HTMLDivElement>();\r\n const [model, setModel] = AppInfo.useModel();\r\n const tabId = AppInfo.tabId;\r\n const activeId = AppInfo.useActiveTabId();\r\n const [messageState, setMessageState] = AppInfo.useTabDatabase<MessageState>(\"message_state\", {\r\n initialValue: {\r\n title: null,\r\n activeId: \"\",\r\n errorMsg: \"\",\r\n initialized: false,\r\n isStreaming: false,\r\n context: \"\",\r\n },\r\n });\r\n const { pyInvoke } = usePython();\r\n const [containerRef, { width, height }] = useElementSize<HTMLDivElement>();\r\n const [mounted, setMounted] = useState(false);\r\n const scrollAreaRef = useRef<HTMLDivElement>(null);\r\n const [showScrollBottom, setShowScrollBottom] = useState(false);\r\n const isStreamingRef = useRef(messageState.isStreaming);\r\n const wasNearBottomRef = useRef(true);\r\n const [justOpen, setJustOpen] = useState(true);\r\n const title = AppInfo.useTitle();\r\n const currentTab = AppInfo.useTab()\r\n useEffect(() => {\r\n if (title) return;\r\n const _t = messageState.title;\r\n if (mounted && _t && typeof currentTab?.childrenProps !== \"undefined\") {\r\n AppInfo.setTitle(_t);\r\n }\r\n }, [messageState.title, title, mounted]);\r\n useEffect(() => {\r\n if (mounted) {\r\n (async () => {\r\n const check = await pyInvoke(\"v1/check\");\r\n if (check.result) {\r\n const tb = generateIdFromString(tabId + \"/\" + \"message_state\");\r\n await pyInvoke('sqlite', {\r\n command: 'query',\r\n db: workspace,\r\n table: tb,\r\n sql: `UPDATE ${tb} SET _v = 'false' WHERE id = 'isStreaming'`\r\n });\r\n }\r\n })();\r\n }\r\n }, [mounted]);\r\n useEffect(() => {\r\n if (activeId == tabId) {\r\n setTimeout(() => {\r\n scrollToBottom('instant');\r\n setJustOpen(false);\r\n }, 100);\r\n } else {\r\n setJustOpen(true);\r\n }\r\n }, [activeId]);\r\n useEffect(() => {\r\n isStreamingRef.current = messageState.isStreaming;\r\n }, [messageState.isStreaming]);\r\n const checkScrollBottom = () => {\r\n if (!scrollAreaRef.current) return;\r\n const { scrollTop, scrollHeight, clientHeight } = scrollAreaRef.current;\r\n const isScrollable = scrollHeight > clientHeight + 1;\r\n const isNearBottom = !isScrollable || scrollHeight - scrollTop - clientHeight < 150;\r\n setShowScrollBottom(!isNearBottom);\r\n wasNearBottomRef.current = isNearBottom;\r\n };\r\n const handleScroll = () => {\r\n checkScrollBottom();\r\n };\r\n const scrollToBottom = (behavior?: \"smooth\" | \"instant\" | \"auto\") => {\r\n if (!scrollAreaRef.current) return;\r\n scrollAreaRef.current.scrollTo({\r\n top: scrollAreaRef.current.scrollHeight,\r\n behavior: behavior || \"smooth\"\r\n });\r\n };\r\n useEffect(() => {\r\n if (messageState.isStreaming || messageState.initialized) {\r\n setTimeout(() => {\r\n if (scrollAreaRef.current) {\r\n scrollAreaRef.current.scrollTo({\r\n top: scrollAreaRef.current.scrollHeight,\r\n behavior: \"smooth\"\r\n });\r\n }\r\n }, 100);\r\n }\r\n }, [messageState.isStreaming, messageState.initialized]);\r\n async function request(query: string, targetTable: string, branchId: string, index: number | string, response_branch: number) {\r\n const activeId = AppInfo.tabId + \"_response_\" + branchId + \"_\" + response_branch + \"_\" + index;\r\n if (messageState.activeId === activeId) {\r\n return;\r\n }\r\n setMessageState(prev => ({\r\n ...prev,\r\n activeId: activeId,\r\n isStreaming: true,\r\n initialized: true\r\n }));\r\n try {\r\n const streamRes = await pyInvoke(\"v1/chat/completions\", {\r\n id: activeId,\r\n query: query,\r\n stream: true,\r\n model: model.id,\r\n tab_id: AppInfo.tabId,\r\n branch_id: branchId,\r\n index: index,\r\n response_branch: response_branch,\r\n tb: targetTable,\r\n workspace: workspace,\r\n app_name: AppInfo.appname,\r\n pipeline: AppInfo.settings[\"Others/app_settings/string.pipeline\"]?.value || \"openchad/chat\"\r\n });\r\n if (streamRes && typeof streamRes === 'object' && Symbol.asyncIterator in streamRes) {\r\n var iter = 0;\r\n for await (const _ of streamRes as any) {\r\n iter++;\r\n }\r\n }\r\n } catch (error) {\r\n setMessageState(prev => ({\r\n ...prev,\r\n isStreaming: false,\r\n errorMsg: (error as Error)?.message || \"Unknown error\"\r\n }));\r\n }\r\n }\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n useLayoutEffect(() => {\r\n if (!mounted) return;\r\n const updateHeight = () => {\r\n const emptyContainer = document.getElementById(AppInfo.tabId + \"_empty_message_container\");\r\n if (!emptyContainer || !msgBottomRef.current) return;\r\n const lastValidIndex = emptyContainer.getAttribute(\"data-last-valid-index\");\r\n if (!lastValidIndex) return;\r\n const messageElement = document.getElementById(\"container_\" + lastValidIndex);\r\n if (!messageElement) return;\r\n const messageHeight = messageElement.offsetHeight;\r\n if (messageHeight === 0) return;\r\n const extraSpace = 150;\r\n const finalHeight = messageHeight + (messageState.isStreaming ? 15 : 0);\r\n const spacer = Math.max(0, height - finalHeight - extraSpace);\r\n msgBottomRef.current.style.height = `${spacer}px`;\r\n };\r\n const handleResize = () => {\r\n const wasNearBottom = wasNearBottomRef.current;\r\n updateHeight();\r\n if (wasNearBottom && scrollAreaRef.current) {\r\n scrollAreaRef.current.scrollTop = scrollAreaRef.current.scrollHeight;\r\n }\r\n checkScrollBottom();\r\n };\r\n let resizeObserver: ResizeObserver | null = null;\r\n let mutationObserver: MutationObserver | null = null;\r\n let lastMessageObserver: ResizeObserver | null = null;\r\n let observedMessageId: string | null = null;\r\n let checkInterval: number | null = null;\r\n const observeLastMessage = () => {\r\n const emptyContainer = document.getElementById(AppInfo.tabId + \"_empty_message_container\");\r\n const idx = emptyContainer?.getAttribute(\"data-last-valid-index\");\r\n if (!idx || idx === observedMessageId) return;\r\n const el = document.getElementById(\"container_\" + idx);\r\n if (!el) return;\r\n lastMessageObserver?.disconnect();\r\n observedMessageId = idx;\r\n lastMessageObserver = new ResizeObserver(() => {\r\n handleResize();\r\n });\r\n lastMessageObserver.observe(el);\r\n };\r\n const setupObserver = () => {\r\n const containerEl = document.getElementById(\"messages-container\");\r\n if (!containerEl) {\r\n if (!checkInterval) {\r\n checkInterval = window.setInterval(() => {\r\n setupObserver();\r\n }, 50);\r\n }\r\n return;\r\n }\r\n if (checkInterval) {\r\n clearInterval(checkInterval);\r\n checkInterval = null;\r\n }\r\n mutationObserver = new MutationObserver(() => {\r\n observeLastMessage();\r\n });\r\n mutationObserver.observe(containerEl, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n attributeFilter: ['class', 'data-last-valid-index'],\r\n });\r\n resizeObserver = new ResizeObserver(() => {\r\n handleResize();\r\n });\r\n handleResize();\r\n resizeObserver.observe(containerEl);\r\n observeLastMessage();\r\n };\r\n setupObserver();\r\n return () => {\r\n if (checkInterval) clearInterval(checkInterval);\r\n if (resizeObserver) resizeObserver.disconnect();\r\n if (mutationObserver) mutationObserver.disconnect();\r\n lastMessageObserver?.disconnect();\r\n };\r\n }, [mounted, height, messageState.initialized, messageState.isStreaming]);\r\n async function waitForElement(elementId: string, timeout: number = 5000): Promise<HTMLElement | null> {\r\n const startTime = Date.now();\r\n return new Promise((resolve, reject) => {\r\n const checkElement = () => {\r\n const el = document.getElementById(elementId);\r\n if (el) {\r\n resolve(el);\r\n return;\r\n }\r\n if (Date.now() - startTime > timeout) {\r\n reject(new Error(`Element with id \"${elementId}\" not found within ${timeout}ms`));\r\n return;\r\n }\r\n requestAnimationFrame(checkElement);\r\n };\r\n checkElement();\r\n });\r\n }\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={clsx(\r\n \"w-full h-full flex flex-col items-center absolute transition-opacity duration-300\",\r\n ((width === 0 || height === 0) || justOpen) ? 'opacity-0' : 'opacity-100',\r\n )}\r\n >\r\n <ModelSelection\r\n model={model}\r\n setModel={setModel}\r\n layout={layout}\r\n />\r\n <div style={{\r\n height: width < 800 || height < 650 || messageState.initialized ? `${height}px` : `${height * 0.2}px`,\r\n }} className={clsx(\r\n \"overflow-visible flex flex-col items-center absolute top-1/2 transform -translate-y-1/2\",\r\n (width < 500 || height < 500) ? 'gap-1' : (width < 800 || height < 650 || messageState.initialized) ? 'gap-5' : 'gap-1',\r\n messageState.initialized && \"w-full h-full\",\r\n )}>\r\n <div\r\n ref={scrollAreaRef}\r\n onScroll={handleScroll}\r\n className={clsx(\r\n (width < 800 || height < 650 || messageState.initialized) ? messageState.initialized ? 'h-full' : 'flex-1 relative' : '',\r\n 'w-full overflow-y-auto flex pt-5',\r\n messageState.initialized ? \"items-start\" : \"text-center items-center justify-center\",\r\n )}\r\n >\r\n {\r\n messageState.initialized ?\r\n <div className=\"relative w-full flex justify-center overflow-y-auto pb-25\">\r\n <div id=\"messages-container\" className={clsx(\r\n \"flex flex-col relative overflow-x-hidden pt-5 w-full px-2\",\r\n width < 800 ? 'max-w-full small-content' : 'max-w-[40vw]',\r\n )}>\r\n <MessageContainer \r\n workspace={workspace} \r\n isStreaming={messageState.isStreaming} \r\n request={request} \r\n activeId={messageState.isStreaming ? messageState.activeId : null} \r\n tabId={AppInfo.tabId} \r\n useDatabase={(tb, options) => {\r\n return AppInfo.useTabDatabase(tb, options);\r\n }} \r\n index={0} \r\n branch={sha256(\"0\").slice(0, 32)} \r\n />\r\n {messageState.errorMsg.length > 0 && (\r\n <div className=\"bg-red-300 dark:bg-red-900 text-red-500 dark:text-red-300 p-2 rounded-md border border-red-500 mt-2 text-break break-all\">\r\n {messageState.errorMsg}\r\n </div>\r\n )}\r\n <div\r\n ref={msgBottomRef}\r\n className=\"w-full flex-shrink-0\"\r\n style={{ height: \"0px\" }}\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n <div className=\"fixed -top-1 w-[99%] h-17 bg-gradient-to-b from-card via-card via-70% to-transparent\" />\r\n <div className=\"fixed bottom-0 w-[99%] h-20 bg-gradient-to-t from-card via-card via-70% to-transparent\" />\r\n </div>\r\n :\r\n <h1 className={clsx(\"text-accent mb-4\", (width < 500 || height < 500) ? 'text-lg' : (width < 800 || height < 650) ? 'text-3xl' : 'text-3xl absolute bottom-full')}>Hi, How can I help you?</h1>\r\n }\r\n </div>\r\n {messageState.initialized && showScrollBottom && (\r\n <button\r\n onClick={() => { scrollToBottom(); }}\r\n className={clsx(\r\n \"fixed z-40 p-2.5 rounded-full bg-card/95 dark:bg-zinc-900/95 border border-[hsl(var(--chat-border))] dark:border-zinc-800 shadow-md text-foreground hover:bg-accent hover:text-accent-foreground transition-all duration-200 flex items-center justify-center cursor-pointer group\",\r\n width < 800 ? \"bottom-24 left-1/2\" : \"bottom-32 left-1/2\"\r\n )}\r\n style={{ transform: 'translateX(-50%)' }}\r\n >\r\n <ArrowDown className=\"w-4 h-4 group-hover:translate-y-0.5 transition-transform duration-200\" />\r\n </button>\r\n )}\r\n <Composer\r\n workspace={workspace}\r\n onSubmit={async (value: string) => {\r\n if (messageState.isStreaming) {\r\n await pyInvoke(\r\n \"v1/chat/stop\",\r\n { id: messageState.activeId }\r\n );\r\n setMessageState((prev) => ({\r\n ...prev,\r\n isStreaming: false,\r\n }));\r\n } else {\r\n if (model.id && value.trim().length > 0) {\r\n setMessageState((prev) => ({\r\n ...prev,\r\n errorMsg: \"\",\r\n isStreaming: true,\r\n initialized: true,\r\n }));\r\n const el = await waitForElement(AppInfo.tabId + \"_empty_message_container\");\r\n const branchId = el?.getAttribute(\"data-branch-id\");\r\n const targetTable = el?.getAttribute(\"data-tb\");\r\n const branchIndex = Number(el?.getAttribute(\"data-branch-index\") ?? 0);\r\n if (typeof branchId === \"string\" && typeof targetTable === \"string\" && !isNaN(branchIndex)) {\r\n await request(value, targetTable, branchId, branchIndex, 0);\r\n }\r\n }\r\n }\r\n }}\r\n width={width}\r\n height={height}\r\n isStreaming={messageState.isStreaming}\r\n style={{ maxWidth: `${width - 10}px` }}\r\n ref={composerTextareaRef}\r\n className={clsx(\r\n \"w-[768px] mx-auto z-30\",\r\n messageState.initialized ? 'absolute' : 'relative',\r\n messageState.initialized\r\n ? ((width < 500 || height < 500) ? \"overflow-visible bottom-2\" : (width < 800 || height < 650) ? 'bottom-2' : 'bottom-5')\r\n : ((width < 500 || height < 500) ? \"overflow-visible bottom-2\" : (width < 800 || height < 650) ? 'bottom-2' : ''),\r\n )}\r\n />\r\n <>\r\n <div\r\n ref={scrollContainerRef}\r\n className={clsx(\r\n `relative w-[768px] px-4 h-fit transition-opacity duration-200 `,\r\n 'flex items-center justify-center',\r\n (width < 800 || height < 650 || messageState.initialized) && 'hidden pointer-events-none',\r\n )}\r\n >\r\n </div>\r\n </>\r\n </div>\r\n </div>\r\n );\r\n}","import { useEffect } from \"react\";\r\nimport type { EffectCallback } from \"react\";\r\nimport { useSnapshot } from \"valtio\";\r\nimport { KeyState } from \"../../utils/state\";\r\n\r\nexport default function useKeyEffect(callback: EffectCallback, keys: string[]) {\r\n const { keys: KEYS } = useSnapshot(KeyState);\r\n useEffect(() => {\r\n // Check if all keys are active\r\n const active = keys.every(key => KEYS[key]);\r\n if (active) {\r\n // Call the callback and return its result (cleanup function)\r\n return callback();\r\n }\r\n // If not active, return undefined (no cleanup needed)\r\n }, [KEYS, callback, keys]); \r\n}","import { useState } from \"react\"\nimport {\n ArrowUpRightIcon,\n X,\n Plus,\n ArrowLeft,\n Check\n} from \"lucide-react\"\nimport { Button } from \"./ui\"\nimport { Input } from \"./ui\"\nimport { Card, CardContent } from \"./ui\"\nimport { Avatar } from \"./ui\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"./ui\"\nimport clsx from \"clsx\"\nimport useElementSize from \"./hooks/useElementSize\"\n\nconst WorkspaceLogo = ({ className }: { className?: string }) => (\n <svg\n className={clsx(\"stroke-[15px] stroke-accent\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 657 657\"\n >\n <path fill=\"currentColor\" d=\"M173 84h6a167 167 0 0 1 80 34l3 2a428 428 0 0 0 21 15l4 4 2 1a462 462 0 0 0 17 14c8 8 17 15 24 24l14 15 6 6 2 2c3 3 3 3 3 6l-8 7-3 3-2 1-8 6-4 1c-4-1-5-3-8-6a2267 2267 0 0 0-4-5l-9-9-10-11-21-21c-3-1-5-4-7-6-17-14-17-14-36-26-3 0-5 2-7 4l-2 2-2 2-2 2a968 968 0 0 0-17 19l-2 2a4081 4081 0 0 0-25 34l8 6 3 2a257 257 0 0 1 27 22 208 208 0 0 1 31 31 296 296 0 0 1 32 39 359 359 0 0 1 26 40 393 393 0 0 1 64 185c3 31-3 67-23 92a71 71 0 0 1-51 24 153 153 0 0 1-50-8l-6-2-1-3a1041 1041 0 0 1 9 1l8 1a65 65 0 0 0 51-13l4-1 1-2c1-4 3-6 6-9 5-6 8-13 10-21l2-5c20-49-4-118-23-164a332 332 0 0 0-16-32c-5-11-12-22-18-32l-2-2a356 356 0 0 0-50-67l-2 2-7 7c-12 11-12 11-22 23l-8 10-18 21 6 8 11 13 2 3a1365 1365 0 0 1 7 10c35 49 64 114 55 175-2 16-9 31-22 40l-5 3-2 2c-14 7-31 4-45 0a156 156 0 0 1-54-33 215 215 0 0 1-30-29 291 291 0 0 1-51-79c-14-29-25-61-26-93v-4c-1-22 2-44 17-60 10-10 21-14 35-14 29 0 54 16 75 34l5 4 7 6a82 82 0 0 0 14-18l2-2c10-15 21-29 33-41l4-8-24-20-2-2-19-13-3-2-19-10-2-1c-24-11-49-16-74-8-16 6-27 18-34 34l-8 24-2-1a121 121 0 0 1 26-69c4-6 8-10 15-13l2-2c7-4 13-6 20-7l3-1a105 105 0 0 1 67 13l3 1h7l3-4 2-3 2-2 3-3 10-14c10-14 21-26 33-38-11-11-36-16-52-18l-2-1c-9-1-18-1-27 1h-4c-13 2-22 8-33 15l-6 2 7-11 3-4 2-1 3-4a78 78 0 0 1 72-22ZM31 339c-8 11-12 23-12 37v3c-1 51 23 100 52 139l2 3c15 20 33 37 53 51l3 2c15 10 34 16 53 13 10-2 17-7 23-16 6-10 9-20 9-32v-3c1-58-29-114-66-156l-2-3-28-26-2-2c-22-17-62-36-85-10Z\" />\n <path fill=\"currentColor\" d=\"m344 57 7 5a199 199 0 0 1 35 27l12 10a134 134 0 0 1 24 22l6 7 18 20 13-5c14-7 28-13 43-17l3-2 16-2 4 5a2136 2136 0 0 0 38 54l8 14a267 267 0 0 1 22 42c21 43 35 90 37 138v20a124 124 0 0 1-9 43c-3 12-9 23-15 34l-2-1 4-13a116 116 0 0 0 7-37 373 373 0 0 0-59-212l-2-3a476970923 476970923 0 0 0-12-21l-24-33c-8 2-15 5-22 9l-3 1-26 13 10 14 17 25 11 19a362 362 0 0 1 29 55l1 2c25 54 44 114 42 174v4c-1 18-3 34-9 51v3c-3 9-7 17-14 24l-6 9c-7 9-17 16-27 22 0-4 0-5 3-8l2-3 2-2c18-24 23-50 24-79v-24c-1-22-5-43-10-65v-3l-15-45-1 1a378 378 0 0 1-58 34l-3 2-5 3 2 4c11 30 19 63 22 95v2c3 36 3 83-21 113l-5 5-4 6c-4 5-9 9-15 12l-2 1c-12 8-25 12-39 12v-3l5-3c12-7 22-14 30-26l2-4c5-7 8-14 10-21l1-2c3-10 5-19 6-30l1-7a356 356 0 0 0-54-210 248 248 0 0 0-27-45l-3-5-2-4-2-2-1-7 4-3 2-1 3-2 5-3 3-2 8-5c4 2 5 4 8 8l2 3a236496 236496 0 0 1 16 27l1 2 4 7a136 136 0 0 1 12 22l1 4a1318 1318 0 0 0 11 21l2 4 1 3 1 4a8549 8549 0 0 0 60-35l2-2 2-1 4-1a272 272 0 0 0-15-33l-1-3a404 404 0 0 0-31-53c-7-12-15-24-24-35l-9-13a335 335 0 0 0-43-49 242 242 0 0 0-37-34c-6-5-12-11-19-15l-2-1a981 981 0 0 0-53-30h-2c-9-4-18-7-28-8l-9-2c-16-3-31 0-46 3l-1-3c12-7 24-12 37-14l3-1c37-6 77 9 108 29ZM88 421c23 16 39 41 45 68 2 10 3 21-2 31-3 5-7 7-13 8-12 1-21-4-30-12l-2-2c-19-15-33-41-36-65-1-9-1-17 4-25l2-3c9-8 22-5 32 0Z\" />\n <path fill=\"currentColor\" d=\"m459 47 10 4 2 1 5 4 2 1a703 703 0 0 1 58 40l19 19 4 5c8 8 15 17 21 26l2 2c20 29 36 61 46 95l1 3c9 31 9 64 11 95h-3v-3a344 344 0 0 0-54-161l-2-3a2024 2024 0 0 0-7-12l-21-29-5-5a210 210 0 0 0-25-29 146 146 0 0 0-24-23c-9-8-18-14-28-20l-12-8v-2Z\" />\n <path fill=\"currentColor\" d=\"M329 16a182 182 0 0 1 119 38c6 3 11 8 16 13l11 9 12 10-1 3c-15 5-15 5-21 2-4-2-7-6-10-9l-9-8-8-7c-9-8-20-14-30-20l-6-4c-7-5-15-8-23-12h-2c-14-6-28-9-43-11l-6-1 1-3Z\" />\n </svg>\n)\n\nexport function SelectWorkspace({ workspaces, setWorkspace }: { workspaces: string[], setWorkspace: (workspace: string) => void }) {\n const [isCreating, setIsCreating] = useState(false)\n const [newWorkspaceName, setNewWorkspaceName] = useState(\"\")\n const [error, setError] = useState<string | null>(null)\n const [containerRef, { width, height }] = useElementSize<HTMLDivElement>()\n const isEmpty = workspaces.length === 0 && !isCreating\n const isSmallWidth = width < 480\n const isSmallHeight = height < 500\n // Compute dynamic number of grid columns when in wider viewport\n const colsCount = width < 720\n ? 2\n : width < 960\n ? Math.min(workspaces.length + 1, 3)\n : Math.min(workspaces.length + 1, 4)\n return (\n <div\n ref={containerRef}\n className={clsx(\n \"absolute w-full h-full flex flex-col items-center transition-all duration-300\",\n // Hide or fade-in while sizing hasn't initialized\n (width === 0 || height === 0) ? \"opacity-0\" : \"opacity-100\",\n // Adjust alignment and scrolling based on height\n isSmallHeight ? \"justify-start py-6 overflow-y-auto\" : \"justify-center overflow-hidden\"\n )}\n onContextMenu={(e) => { e.preventDefault(); e.stopPropagation() }}\n >\n {/* Common Window elements */}\n <div data-tauri-drag-region className='absolute top-0 w-full h-[4vh] left-0 bg-transparent' style={{ zIndex: 10 }} />\n <WindowControls />\n {/* Back button (Creation Mode) */}\n {isCreating && (\n <div className=\"absolute z-90 top-[-0.2px] -left-1 p-3 pl-5\" onContextMenu={(e) => { e.preventDefault(); e.stopPropagation() }}>\n <ArrowLeft className=\"cursor-pointer\" onClick={() => {\n setIsCreating(false);\n }} />\n </div>\n )}\n {/* 1. Handle Empty State */}\n {isEmpty && (\n <Empty className={clsx(\"animate-in fade-in duration-300\", isSmallHeight && \"gap-3 p-3\")}>\n <EmptyHeader>\n {!isSmallHeight && (\n <EmptyMedia variant=\"icon\">\n <WorkspaceLogo className=\"w-5 h-5\" />\n </EmptyMedia>\n )}\n <EmptyTitle className={clsx(isSmallHeight && \"text-base\")}>No Workspaces Yet</EmptyTitle>\n {!isSmallHeight && (\n <EmptyDescription>\n You haven't created any workspaces yet. Get started by creating\n your first workspace.\n </EmptyDescription>\n )}\n </EmptyHeader>\n <EmptyContent>\n <div className=\"flex gap-2\">\n <Button onClick={() => setIsCreating(true)} size={isSmallHeight ? \"sm\" : \"default\"}>Create Workspace</Button>\n <Button variant=\"outline\" size={isSmallHeight ? \"sm\" : \"default\"}>Import Workspace</Button>\n </div>\n </EmptyContent>\n <Button variant=\"link\" asChild className=\"text-muted-foreground\" size=\"sm\">\n <a href=\"#\">\n Learn More <ArrowUpRightIcon className=\"w-4 h-4 ml-1\" />\n </a>\n </Button>\n </Empty>\n )}\n {/* 2. Handle Creation Mode */}\n {isCreating && (\n <div className={clsx(\n \"max-w-md w-full px-8 animate-in fade-in zoom-in-95 duration-200\",\n isSmallHeight ? \"space-y-4 py-8\" : \"space-y-6\"\n )}>\n <div className={clsx(\"text-center\", isSmallHeight ? \"space-y-1\" : \"space-y-2\")}>\n {!isSmallHeight && (\n <div className=\"flex items-center justify-center w-full relative mb-2\">\n <WorkspaceLogo className=\"w-5 h-5\" />\n </div>\n )}\n <h2 className={clsx(\"font-medium tracking-tight\", isSmallHeight ? \"text-lg\" : \"text-2xl\")}>\n Set up your new workspace\n </h2>\n {!isSmallHeight && (\n <p className=\"text-muted-foreground text-sm\">\n Separate your work, side projects, and personal life. keep your focus where it belongs.\n </p>\n )}\n </div>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n if (!workspaces.includes(newWorkspaceName)) {\n setWorkspace(newWorkspaceName);\n setIsCreating(false);\n }\n }}\n className={clsx(\"w-full\", isSmallHeight ? \"space-y-3\" : \"space-y-4\")}\n >\n <div className=\"space-y-2\">\n <Input\n name=\"workspace-name\"\n id=\"workspace-name\"\n placeholder=\"e.g. Personal Project\"\n value={newWorkspaceName}\n onChange={(e) => {\n setNewWorkspaceName(e.target.value)\n if (workspaces.includes(e.target.value)) {\n setError(\"Workspace name already exists\")\n } else {\n setError(null)\n }\n }}\n className={clsx(\n \"bg-muted/50\",\n error ? \"border-red-500\" : \"border-zinc-700/50\"\n )}\n autoFocus\n />\n {error && <p className=\"text-red-500 text-sm\">{error}</p>}\n </div>\n <div className=\"flex gap-3 pt-2\">\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!newWorkspaceName}\n size={isSmallHeight ? \"sm\" : \"default\"}\n >\n <Check className=\"w-4 h-4 mr-2\" />\n Create\n </Button>\n </div>\n </form>\n </div>\n )}\n {/* 3. Handle Workspace Selection Mode */}\n {!isEmpty && !isCreating && (\n <>\n <div className={clsx(\n \"flex flex-col items-center space-y-1 animate-in slide-in-from-bottom-5 duration-500 fade-in\",\n isSmallHeight ? \"mb-4 mt-6\" : \"mb-12\"\n )}>\n {!isSmallHeight && (\n <div className=\"w-16 h-16 rounded-full bg-card flex items-center justify-center mb-6 shadow-xl\">\n <WorkspaceLogo className=\"w-5 h-5\" />\n </div>\n )}\n <h1 className={clsx(\"font-medium text-accent\", isSmallHeight ? \"text-lg\" : \"text-2xl\")}>\n Select Workspace\n </h1>\n {!isSmallHeight && (\n <p className=\"text-accent/50 text-sm\">Pick a workspace to start your session</p>\n )}\n </div>\n <div \n className={clsx(\n isSmallWidth \n ? \"flex flex-col gap-3 max-w-md px-6 w-full animate-in zoom-in-95 duration-500 delay-100 fade-in fill-mode-backwards\" \n : \"grid gap-6 max-w-4xl px-8 w-full animate-in zoom-in-95 duration-500 delay-100 fade-in fill-mode-backwards\"\n )}\n style={isSmallWidth ? undefined : {\n gridTemplateColumns: `repeat(${colsCount}, minmax(0, 1fr))`\n }}\n >\n {workspaces.map((workspace, i) => {\n if (isSmallWidth) {\n return (\n <Card\n key={i}\n className=\"group border-0 bg-transparent shadow-none bg-card dark:hover:bg-[hsl(var(--hover))] transition-all duration-200 cursor-pointer flex flex-row items-center p-3 rounded-xl ring-1 ring-transparent hover:ring-zinc-700/50 w-full\"\n onClick={() => setWorkspace(workspace)}\n >\n <CardContent className=\"p-0 flex flex-row items-center gap-4 w-full\">\n <Avatar className=\"flex items-center justify-center w-12 h-12 border border-zinc-800 group-hover:border-zinc-600 transition-colors shadow-md text-sm shrink-0\">\n {workspace.substring(0, 2).toUpperCase()}\n </Avatar>\n <div className=\"text-left space-y-0.5\">\n <h3 className=\"font-medium text-accent/70 group-hover:text-accent transition-colors\">\n {workspace}\n </h3>\n <p className=\"text-[11px] text-accent/30 group-hover:text-accent/40 transition-colors\">Workspace</p>\n </div>\n </CardContent>\n </Card>\n )\n }\n return (\n <Card\n key={i}\n className=\"group border-0 bg-transparent shadow-none bg-card dark:hover:bg-[hsl(var(--hover))] transition-all duration-200 cursor-pointer flex flex-col items-center p-4 rounded-xl ring-1 ring-transparent hover:ring-zinc-700/50\"\n onClick={() => setWorkspace(workspace)}\n >\n <CardContent className=\"p-0 flex flex-col items-center gap-4\">\n <Avatar className=\"flex items-center justify-center w-20 h-20 border-2 border-zinc-800 group-hover:border-zinc-600 transition-colors shadow-lg\">\n {workspace.substring(0, 2).toUpperCase()}\n </Avatar>\n <div className=\"text-center space-y-1\">\n <h3 className=\"font-medium text-accent/50 group-hover:text-accent transition-colors\">\n {workspace}\n </h3>\n </div>\n </CardContent>\n </Card>\n )\n })}\n {/* The \"Add\" Card */}\n {isSmallWidth ? (\n <Card\n className=\"group border border-dashed border-accent/25 bg-transparent shadow-none hover:border-accent dark:hover:bg-zinc-800/30 transition-all duration-200 cursor-pointer flex flex-row items-center p-3 rounded-xl w-full\"\n onClick={() => setIsCreating(true)}\n >\n <CardContent className=\"p-0 flex flex-row items-center gap-4 w-full\">\n <div className=\"w-12 h-12 rounded-full bg-transparent border border-dashed border-[hsl(var(--border))] flex items-center justify-center group-hover:scale-105 transition-all duration-300 shrink-0\">\n <Plus className=\"w-5 h-5 text-accent/50 group-hover:text-accent\" />\n </div>\n <span className=\"font-medium text-accent/50 group-hover:text-accent\">Add Workspace</span>\n </CardContent>\n </Card>\n ) : (\n <Card\n className=\"group border-2 border-dashed border-accent/25 bg-transparent shadow-none hover:border-accent dark:hover:bg-zinc-800/30 transition-all duration-200 cursor-pointer flex flex-col items-center justify-center p-4 rounded-xl min-h-[180px]\"\n onClick={() => setIsCreating(true)}\n >\n <CardContent className=\"p-0 flex flex-col items-center gap-4\">\n <div className=\"w-20 h-20 rounded-full bg-transparent border border-[hsl(var(--border))] flex items-center justify-center group-hover:scale-105 transition-all duration-300\">\n <Plus className=\"w-8 h-8 text-accent/50 group-hover:text-accent\" />\n </div>\n <span className=\"font-medium text-accent/50 group-hover:text-accent\">Add</span>\n </CardContent>\n </Card>\n )}\n </div>\n </>\n )}\n </div>\n )\n}\n// Extracted Window Controls to keep code clean and reusable across views\n\nfunction WindowControls() {\n return (\n <div className=\"absolute z-90 top-[-0.2px] -right-1 p-3 pr-5\" onContextMenu={(e) => { e.preventDefault(); e.stopPropagation() }}>\n <X className=\"cursor-pointer\" onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().close()\n }\n }} />\n </div>\n )\n}","import { Copy, Minus, X } from \"lucide-react\";\r\nimport Topbar from \"./topbar\";\r\nimport { Spinner } from \"./ui/spinner\";\r\nimport { motion } from \"motion/react\";\r\n\r\nexport interface StartupStatus {\r\n is_ready: boolean;\r\n current_task: string;\r\n progress: number;\r\n error?: string;\r\n}\r\n\r\nexport default function AppLoading({ status }: { status?: StartupStatus | null }) {\r\n return <div className=\"absolute w-full h-full flex flex-col items-center justify-center overflow-hidden bg-card\">\r\n <motion.div\r\n initial={{ opacity: 0, scale: 0.9 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n transition={{ duration: 0.5 }}\r\n className=\"flex flex-col items-center gap-6\"\r\n >\r\n <div className=\"relative\">\r\n <Spinner className=\"h-12 w-12 text-primary\" />\r\n {status && (\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n className=\"absolute inset-0 flex items-center justify-center text-[10px] font-medium text-muted-foreground\"\r\n >\r\n {Math.round(status.progress)}% {status.current_task}\r\n </motion.div>\r\n )}\r\n </div>\r\n {status?.error && (\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n className=\"text-xs text-destructive mt-4 font-mono\"\r\n >\r\n Error: {status.error}\r\n </motion.div>\r\n )}\r\n </motion.div>\r\n <div data-tauri-drag-region className='absolute top-0 w-full h-[4vh] left-0 bg-transparent' style={{ zIndex: 10 }} />\r\n <div className=\"absolute z-90 top-[-0.2px] -right-1 p-3 pr-5\" onContextMenu={(e) => { e.preventDefault(); e.stopPropagation() }}>\r\n <X className=\"cursor-pointer\" onClick={() => {\r\n if ((window as any).__TAURI__) {\r\n (window as any).__TAURI__.window.getCurrentWindow().close()\r\n }\r\n }} />\r\n </div>\r\n </div>\r\n}","import { proxy, useSnapshot } from \"valtio\";\r\nimport { useEffect, useRef } from \"react\";\r\nimport { usePython } from \"../usePython\";\r\nimport { sanitizeTauriEvent } from \"../../utils/utils\";\r\n\r\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n/**\r\n * Folder utilities returned as the third element\r\n */\r\ninterface FolderUtils {\r\n /** Create the folder if it doesn't exist */\r\n create: (folder: string) => Promise<void>;\r\n /** Check if a folder exists */\r\n isExists: (folder: string) => Promise<boolean>;\r\n /** Get only subfolders (items ending with '/') */\r\n folders: string[];\r\n /** Get only files (items not ending with '/') */\r\n files: string[];\r\n path: string;\r\n}\r\n/**\r\n * Result from folder subscription\r\n */\r\ninterface FolderSubscriptionResult {\r\n path?: string;\r\n contents?: string[];\r\n exists?: boolean;\r\n}\r\n/**\r\n * The return type of useFolder - a tuple\r\n * [contents, exists, { refresh, create }]\r\n */\r\ntype UseFolderReturn = readonly [string[], boolean, FolderUtils];\r\n// ============================================================================\r\n// Internal Implementation\r\n// ============================================================================\r\ninterface IFolder {\r\n /** Array of file and folder paths relative to the folder */\r\n contents: string[];\r\n /** Whether the folder exists */\r\n exists: boolean;\r\n /** Create the folder */\r\n create: (folder: string) => Promise<void>;\r\n isExists: (folder: string) => Promise<boolean>;\r\n // Track last modification timestamp\r\n _lastModified: number;\r\n // Track subscription count\r\n _subscriptionCount: number;\r\n // Track if contents have been loaded\r\n _isLoaded: boolean;\r\n // Track the resolved folder path from Python\r\n _folderPath: string;\r\n}\r\n\r\nconst folders = proxy<Record<string, IFolder>>({});\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n/**\r\n * A folder-watching hook that provides real-time folder contents.\r\n * Uses watchfiles for efficient change detection.\r\n * \r\n * @example\r\n * // Watch current directory\r\n * const [contents, exists] = useFolder(\".\");\r\n * \r\n * @example\r\n * // Watch absolute path\r\n * const [contents, exists] = useFolder(\"C:/Users/data\");\r\n * \r\n * @example\r\n * // Watch relative folder\r\n * const [contents, exists] = useFolder(\"subfolder\");\r\n * \r\n * @example\r\n * // With base directory\r\n * const [contents, exists, { refresh, create }] = useFolder(\"data\", { baseDir: \"./project\" });\r\n * \r\n * Contents format:\r\n * - Files: \"filename.txt\"\r\n * - Folders: \"foldername/\"\r\n * - Nested: \"folder/file.txt\", \"folder/subfolder/\"\r\n * \r\n * @param path - The folder path (absolute if starts with drive letter, relative otherwise)\r\n * @param options - Optional configuration { baseDir: string }\r\n * @returns A tuple [contents, exists, { refresh, create }]\r\n */\r\n\r\nexport function useFolderImplBase(\r\n path: string,\r\n options: { baseDir?: string } = {}\r\n): UseFolderReturn {\r\n const { baseDir = \".\" } = options;\r\n const { pyInvoke, isStreamReady } = usePython();\r\n // Determine if path is absolute (Windows style C:/ or Unix style /)\r\n const isAbsolute = /^[A-Za-z]:[\\\\/]/.test(path) || path.startsWith(\"/\");\r\n const folderKey = isAbsolute ? path : `${baseDir}:${path}`;\r\n const folderPathRef = useRef<string>(\"\");\r\n async function request(body: Record<string, unknown>): Promise<Record<string, unknown> | null> {\r\n try {\r\n const res = await pyInvoke<{ data?: Record<string, unknown>; error?: string }>('folder', body);\r\n if (res && typeof res === 'object' && 'data' in res) {\r\n return res.data as Record<string, unknown>;\r\n }\r\n return null;\r\n } catch (e) {\r\n console.error(\"Folder request failed\", e);\r\n return null;\r\n }\r\n }\r\n function createFolder(): void {\r\n folders[folderKey] = {\r\n contents: [],\r\n exists: false,\r\n _lastModified: Date.now(),\r\n _subscriptionCount: 0,\r\n _isLoaded: false,\r\n _folderPath: \"\",\r\n create: async (folder: string) => {\r\n if (folder === \"/\") {\r\n await request({\r\n command: 'create',\r\n path,\r\n base_dir: isAbsolute ? \".\" : baseDir\r\n });\r\n } else {\r\n await request({\r\n command: 'create',\r\n path: folder,\r\n base_dir: isAbsolute ? \".\" : baseDir\r\n });\r\n }\r\n },\r\n isExists: async (folder: string) => {\r\n const result = await request({\r\n command: 'exists',\r\n path: folder,\r\n base_dir: isAbsolute ? \".\" : baseDir\r\n });\r\n return result?.exists === true;\r\n }\r\n };\r\n // Fetch initial folder contents\r\n (async () => {\r\n const result = await request({\r\n command: 'list',\r\n path,\r\n base_dir: isAbsolute ? \".\" : baseDir,\r\n recursive: true\r\n });\r\n console.log(\"checking folder: \", result);\r\n if (result) {\r\n const folder = folders[folderKey];\r\n if (folder) {\r\n folder.contents = (result.contents as string[]) || [];\r\n folder.exists = !!result.exists;\r\n folder._lastModified = Date.now();\r\n folder._isLoaded = true;\r\n if (result.path) {\r\n folder._folderPath = result.path as string;\r\n }\r\n }\r\n }\r\n })();\r\n }\r\n if (!folders[folderKey]) {\r\n createFolder();\r\n }\r\n // Subscribe to folder change events works in both WebSocket and Tauri modes\r\n useEffect(() => {\r\n const folder = folders[folderKey];\r\n if (!folder || !isStreamReady) return;\r\n let eventName = \"\";\r\n // Tauri: store the unlisten function returned by listen()\r\n let tauriUnlisten: (() => void) | undefined;\r\n // WebSocket mode: event arrives as a window CustomEvent with {detail: {response: {...}}}\r\n const handleFolderChangeWS = (event: Event) => {\r\n const customEvent = event as CustomEvent<{ response: { timestamp: number; contents: string[]; exists: boolean } }>;\r\n const { timestamp, contents, exists: folderExists } = customEvent.detail.response;\r\n const currentFolder = folders[folderKey];\r\n if (currentFolder && timestamp > currentFolder._lastModified) {\r\n currentFolder._lastModified = timestamp;\r\n currentFolder.contents = contents;\r\n currentFolder.exists = folderExists;\r\n }\r\n };\r\n // Tauri mode: event payload arrives directly as {timestamp, contents, exists}\r\n const handleFolderChangeTauri = (data: { timestamp: number; contents: string[]; exists: boolean }) => {\r\n const { timestamp, contents, exists: folderExists } = data;\r\n const currentFolder = folders[folderKey];\r\n if (currentFolder && timestamp > currentFolder._lastModified) {\r\n currentFolder._lastModified = timestamp;\r\n currentFolder.contents = contents;\r\n currentFolder.exists = folderExists;\r\n }\r\n };\r\n // Attach listener in the correct mode\r\n const addListener = async (evtName: string) => {\r\n if (isTauri) {\r\n const { listen } = await import(\"@tauri-apps/api/event\");\r\n tauriUnlisten = await listen<{ timestamp: number; contents: string[]; exists: boolean }>(\r\n sanitizeTauriEvent(evtName),\r\n (e) => handleFolderChangeTauri(e.payload)\r\n );\r\n } else {\r\n window.addEventListener(evtName, handleFolderChangeWS);\r\n }\r\n };\r\n const setupSubscription = async () => {\r\n try {\r\n const result = await pyInvoke<FolderSubscriptionResult>('folder_subscribe', {\r\n path,\r\n base_dir: isAbsolute ? \".\" : baseDir\r\n }) as FolderSubscriptionResult;\r\n console.log(\"folder sub: \", result);\r\n if (result && result.path) {\r\n folder._folderPath = result.path;\r\n folderPathRef.current = result.path;\r\n eventName = `folder_changed:${result.path}`;\r\n if (result.contents) {\r\n folder.contents = result.contents;\r\n }\r\n if (typeof result.exists === 'boolean') {\r\n folder.exists = result.exists;\r\n }\r\n folder._isLoaded = true;\r\n await addListener(eventName);\r\n }\r\n } catch {\r\n // Silently fail - server might not support subscriptions yet\r\n }\r\n };\r\n // Increment subscription count and subscribe on first subscriber\r\n folder._subscriptionCount++;\r\n if (folder._subscriptionCount === 1) {\r\n setupSubscription();\r\n } else if (folder._folderPath) {\r\n // Already have the path, set up listener immediately\r\n eventName = `folder_changed:${folder._folderPath}`;\r\n addListener(eventName);\r\n }\r\n return () => {\r\n if (isStreamReady) {\r\n // Tauri: call the unlisten function; WebSocket: remove window listener\r\n if (isTauri) {\r\n tauriUnlisten?.();\r\n } else if (eventName) {\r\n window.removeEventListener(eventName, handleFolderChangeWS);\r\n }\r\n const currentFolder = folders[folderKey];\r\n if (currentFolder) {\r\n currentFolder._subscriptionCount--;\r\n if (currentFolder._subscriptionCount === 0) {\r\n pyInvoke('folder_unsubscribe', { path, base_dir: isAbsolute ? \".\" : baseDir }).catch(() => {});\r\n }\r\n }\r\n }\r\n };\r\n }, [path, baseDir, folderKey, isAbsolute, isStreamReady]);\r\n const snap = useSnapshot(folders[folderKey]);\r\n const contents = snap.contents as string[];\r\n return [\r\n contents,\r\n snap.exists,\r\n {\r\n create: snap.create,\r\n isExists: snap.isExists,\r\n folders: contents.filter(item => item.endsWith('/')),\r\n files: contents.filter(item => !item.endsWith('/')),\r\n path: baseDir + path\r\n }\r\n ] as const;\r\n}\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n FolderUtils,\r\n UseFolderReturn\r\n};","import { useFolderImplBase } from \"./useFolder\";\r\nimport type { UseFolderReturn, FolderUtils } from \"./useFolder\";\r\n\r\nexport function useFolderImpl(\r\n path: string,\r\n { baseDir }: { baseDir?: string } = {}\r\n): UseFolderReturn {\r\n return useFolderImplBase(path, { baseDir });\r\n}\r\n\r\nexport type { UseFolderReturn, FolderUtils };\r\n","import { useGlobal as useGlobalImpl } from \"./useGlobal\";\r\nimport type { UseGlobalReturn } from \"./useGlobal\";\r\n\r\nexport function useGlobal<T = Record<string, unknown>>(\r\n tb: string,\r\n options?: { initialValue?: T }\r\n): UseGlobalReturn<T> {\r\n return typeof options?.initialValue === 'undefined' ? useGlobalImpl<T>(tb) : useGlobalImpl<T>(tb, options.initialValue);\r\n}\r\n\r\nexport type { UseGlobalReturn };","// src/runtime.ts\nvar vpss = window.__VPSS__ || {};\nasync function hideSplashScreen() {\n if (vpss.hidden)\n return;\n const element = vpss.getElement?.();\n const styles = vpss.getStyles?.();\n if (!element || !styles) {\n console.error(\n \"Splash screen not found. Did you forget to add the `vite-plugin-splash-screen` plugin?\"\n );\n return;\n }\n await vpss.hide?.();\n}\nexport {\n hideSplashScreen\n};\n","import { Suspense, useEffect, useRef, useState } from 'react'\nimport Sidebar from './components/sidebar'\nimport Topbar from './components/topbar'\nimport clsx from 'clsx'\nimport { motion } from \"motion/react\"\nimport { useFileImpl } from './components/useFile'\nimport { ArrowLeftRight, Copy, GitBranch, Globe, HardDrive, Key, Minus, Plus, Search, Settings, X, type LucideIcon } from 'lucide-react'\nimport useElementSize from './components/hooks/useElementSize'\nimport { Button } from './components/ui/button'\nimport uuidv4 from './utils/uuid'\nimport { openUrl } from '@tauri-apps/plugin-opener'\nimport { KeyState, TabInfo, TabState, Viewport, Workspace, Theme, addTab, closeTab, detachTab, type ITab, deleteTab, deleteTabWithGroupSelection } from './utils/state'\nimport { proxy, useSnapshot } from 'valtio'\nimport MultiView, { type LayoutType } from './components/multiview'\nimport { Spinner } from './components/ui/spinner'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport DefaultPage from './components/default-page'\nimport { usePython } from './components/usePython'\nimport { useDatabaseImpl } from './components/useDatabase'\nimport useKeyEffect from './components/useKeyEffect'\nimport { SelectWorkspace } from './components/select-workspace'\nimport AppLoading from './components/app-loading'\nimport { useFolderImpl } from './components/useFolder'\nimport type { AppInfo, Model } from './utils/utils'\nimport { sha256 } from 'js-sha256';\nimport { useGlobal } from './components/useGlobal'\nimport { useSettings } from './components/useSettings'\nimport { Dropdown } from './components/dropdown'\n\nconst isTauri = typeof window !== \"undefined\" && !!(window as any).__TAURI__;\n// Enable iframe mirror debugging in development\nif (typeof window !== 'undefined') {\n (window as any).React = React;\n (window as any).ReactDOM = ReactDOM;\n const isDev = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';\n if (isDev) {\n import('./utils/iframe-mirror-debug').then(({ enableIframeMirrorDebugMode }) => {\n enableIframeMirrorDebugMode();\n }).catch(() => {\n // Silently fail if debug utils not available\n });\n }\n}\n// Component that uses the promise\n\nconst TabItem = React.memo(({ children, isOpened }: { children: React.ReactNode, isOpened: boolean }) => {\n const [loaded, setLoaded] = useState(false);\n useEffect(() => {\n if (isOpened && !loaded) {\n setLoaded(true);\n }\n }, [isOpened])\n return <div className=\"w-full h-full\">\n {\n loaded ?\n children\n :\n <div className=\"absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\"><Spinner /></div>\n }\n </div>;\n});\n\nexport interface Tab {\n appname: string;\n data: any;\n App: React.ComponentType<AppInfo>\n}\n\nexport interface DefaultTab {\n layout: LayoutType;\n icon: string;\n tabs: Tab[];\n}\n\nexport interface AppsProps {\n defaultTab: DefaultTab;\n appRegistry?: Record<string, React.ComponentType<AppInfo>>;\n iconRegistry?: Record<string, LucideIcon>;\n size?: number[];\n}\nimport { hideSplashScreen } from \"vite-plugin-splash-screen/runtime\";\nimport { generateIdFromString } from './index'\n\nexport default function Container({ Apps }: { Apps: AppsProps }) {\n if (Apps.defaultTab.tabs.length === 0) {\n throw new Error(\"Apps.defaultTab.tabs is empty\");\n }\n (window as any).defaultLayout = Apps.defaultTab.layout;\n (window as any).defaultIcon = Apps.defaultTab.icon;\n (window as any).defaultTabs = Apps.defaultTab.tabs;\n (window as any).defaultIconRegistry = Apps.iconRegistry;\n (window as any).defaultSize = Apps.size || [50, 50, 50, 50, 50];\n const { pyInvoke, isStreamReady } = usePython();\n const { settings } = useSettings();\n const [startupStatus] = useState<any>(null);\n const [, , { folders }] = useFolderImpl('Workspaces');\n const { workspace, setWorkspace } = useSnapshot(Workspace);\n const [isSwitchWorkspace, setIsSwitchWorkspace] = useState(false);\n const appRegistry = proxy<Record<string, React.ComponentType<AppInfo>>>({\n ...(Apps.appRegistry || {}),\n ...Apps.defaultTab.tabs.reduce((acc: Record<string, React.ComponentType<AppInfo>>, t: any) => {\n acc[t.appname] = t.App;\n return acc;\n }, {})\n });\n const [mounted, setMounted] = useState(false);\n const [showSearchDialog, setShowSearchDialog] = useState(false);\n const [showMcpDialog, setShowMcpDialog] = useState(false);\n const [showCredentialsDialog, setShowCredentialsDialog] = useState(false);\n const [showLocalModelDialog, setShowLocalModelDialog] = useState(false);\n const [showCustomEndpointDialog, setShowCustomEndpointDialog] = useState(false);\n const [showSettingsDialog, setShowSettingsDialog] = useState(false);\n const [setupModel, setSetupModel] = useState(false);\n const snaptheme = useSnapshot(Theme);\n const currentLayout = snaptheme.layout;\n const [intialzeTheme, setInitialzeTheme] = useState(false);\n const isFirstSave = useRef(true);\n useEffect(() => {\n (async () => {\n const res = await pyInvoke<{ os: string }>('os', {});\n if (res && 'os' in res && res.os) {\n const defaultLayout = res.os === \"darwin\" ? 'rightToLeft' : 'leftToRight';\n // 1. Ensure table exists first\n await pyInvoke(\"sqlite\", {\n db: \"global\",\n table: \"themes\",\n command: \"execute\",\n sql: `CREATE TABLE IF NOT EXISTS themes (\n id TEXT PRIMARY KEY,\n theme TEXT,\n layout TEXT\n )`,\n params: []\n });\n // 2. Query after table is guaranteed to exist\n const savedTheme = (await pyInvoke(\"sqlite\", {\n db: \"global\",\n table: \"themes\",\n command: \"query\",\n sql: \"SELECT * FROM themes\"\n })).data as any[];\n // 3. Seed defaults if empty\n if (savedTheme.length === 0) {\n await pyInvoke(\"sqlite\", {\n db: \"global\",\n table: \"themes\",\n command: \"execute\",\n sql: `INSERT OR REPLACE INTO themes (id, theme, layout) VALUES (?, ?, ?)`,\n params: [1, 'dark', defaultLayout]\n });\n }\n console.warn(\"Initial Theme :\", savedTheme[0]?.theme, savedTheme[0]?.layout);\n // 4. Apply theme\n Theme.theme = savedTheme[0]?.theme ?? 'dark';\n Theme.layout = savedTheme[0]?.layout ?? defaultLayout;\n }\n setInitialzeTheme(true);\n })();\n }, []);\n useEffect(() => {\n if (!intialzeTheme) return;\n // Skip the first run caused by intialzeTheme flipping to true,\n // because snaptheme hasn't caught up with the newly set Theme values yet.\n if (isFirstSave.current) {\n isFirstSave.current = false;\n return;\n }\n (async () => {\n await pyInvoke(\"sqlite\", {\n db: \"global\",\n table: \"themes\",\n command: \"execute\",\n sql: `INSERT OR REPLACE INTO themes (id, theme, layout) VALUES (?, ?, ?)`,\n params: [1, snaptheme.theme, snaptheme.layout]\n });\n const savedTheme = await pyInvoke<{ theme?: string, layout?: string }>(\"sqlite\", {\n db: \"global\",\n table: \"themes\",\n command: \"query\",\n sql: \"SELECT * FROM themes\"\n }) as { theme?: string, layout?: string };\n console.warn(\"Theme :\", savedTheme);\n })();\n }, [snaptheme, intialzeTheme]);\n const checkModel = async () => {\n const res: any = await pyInvoke<{ data?: Record<string, unknown> }>('file', {\n command: \"read\",\n filename: \"config.json\",\n base_dir: \"python\",\n });\n const config = res?.data?.content as string | undefined;\n if (!config) {\n setSetupModel(true);\n return;\n }\n const parsed = JSON.parse(config);\n if (!parsed.available_models) {\n setSetupModel(true);\n return;\n }\n if (Object.keys(parsed.available_models).length === 0) {\n setSetupModel(true);\n return;\n }\n setSetupModel(false);\n }\n useEffect(() => {\n (async () => await checkModel())()\n hideSplashScreen();\n },\n [])\n useEffect(() => {\n let __timeout: any;\n if (setupModel && (!showCredentialsDialog && !showCustomEndpointDialog && !showLocalModelDialog)) {\n __timeout = setTimeout(() => checkModel(), 100);\n }\n return () => {\n clearTimeout(__timeout);\n }\n },\n [setupModel, showCredentialsDialog, showCustomEndpointDialog, showLocalModelDialog])\n useEffect(() => {\n (async () => {\n const res = await fetch(\"/api/get_plugin_dirs\");\n const data = await res.json();\n (window as any).PROJECT_ROOT = data.PROJECT_ROOT;\n (window as any).PYTHON_ROOT = data.PYTHON_ROOT;\n (window as any).BACKENDS_DIR = data.BACKENDS_DIR;\n (window as any).PIPELINES_DIR = data.PIPELINES_DIR;\n (window as any).TOOLS_DIR = data.TOOLS_DIR;\n (window as any).MODEL_PROVIDERS_DIR = data.MODEL_PROVIDERS_DIR;\n (window as any).SETTINGS_DIR = data.SETTINGS_DIR;\n // Attach to the window or a specific element\n })();\n }, []);\n const workspaces = folders\n .filter(f => !f.slice(0, -1).includes('/')) // exclude nested folders \n .map(f => f.replace(/\\/$/, ''))\n .filter(f => f !== 'Private' && f !== 'global'); // remove trailing slash\n useEffect(() => {\n if (workspaces.length === 1) {\n setWorkspace(workspaces[0]);\n }\n }, [workspaces.length])\n const [isSearchChatOpen, setIsSearchChatOpen] = useState(false);\n const searchRef = useRef<any>(null);\n const snaptabs = useSnapshot(TabState);\n const [tabs, setTabs] = useState<Record<string, React.ReactNode>>({});\n const { children, layout, active, SetActive } = useSnapshot(TabInfo);\n const actives = (() => {\n const keys = Object.keys(tabs);\n const defaults = [\"default0\", \"default1\", \"default2\", \"default3\"];\n if (!children || children.length === 0) {\n return [...defaults.map(d => keys.indexOf(d))];\n }\n const childIndices = children.map(child => keys.indexOf(child));\n const remaining = 4 - children.length;\n const defaultIndices = defaults\n .slice(-remaining)\n .map(d => keys.indexOf(d));\n return [...childIndices, ...defaultIndices]\n })();\n function AppInfoProps(appname: string, tabId: string, appId: string) {\n return {\n appname,\n useWorkspace: () => {\n const { workspace, setWorkspace } = useSnapshot(Workspace);\n return { workspace: workspace ?? \"global\", setWorkspace };\n },\n tabId,\n appId,\n settings: settings,\n useActiveTabId: () => {\n const { active } = useSnapshot(TabInfo);\n return active;\n },\n useTitle: () => {\n const _tabs = useSnapshot(TabState);\n return typeof _tabs[tabId]?.title === \"string\" ? _tabs[tabId]?.title : null;\n },\n setTitle: (title: string) => {\n if (TabState[tabId] && typeof TabState[tabId].childrenProps !== \"undefined\") TabState[tabId] = { ...TabState[tabId], title };\n },\n useNotchVisible: () => {\n const slotIndex = children.indexOf(tabId);\n if (slotIndex === -1) return false;\n const { layout: _layout } = useSnapshot(Theme)\n const isRightToLeft = _layout === \"rightToLeft\";\n if (isRightToLeft) {\n // Top-Left corner\n switch (layout) {\n case \"single\": return slotIndex === 0;\n case \"horizontal\": return slotIndex === 0;\n case \"vertical\": return slotIndex === 0;\n case \"grid2x2\": return slotIndex === 0;\n case \"triple\": return slotIndex === 0;\n case \"triple-left\": return slotIndex === 0;\n case \"triple-right\": return slotIndex === 0;\n case \"triple-top\": return slotIndex === 0;\n case \"triple-bottom\": return slotIndex === 0;\n default: return false;\n }\n } else {\n // Top-Right corner\n switch (layout) {\n case \"single\": return slotIndex === 0;\n case \"horizontal\": return slotIndex === 1;\n case \"vertical\": return slotIndex === 0;\n case \"grid2x2\": return slotIndex === 1;\n case \"triple\": return slotIndex === 2;\n case \"triple-left\": return slotIndex === 1;\n case \"triple-right\": return slotIndex === 2;\n case \"triple-top\": return slotIndex === 0;\n case \"triple-bottom\": return slotIndex === 1;\n default: return false;\n }\n }\n },\n useTheme: () => {\n return useSnapshot(Theme);\n },\n useTab: () => {\n const _tabs = useSnapshot(TabState);\n return _tabs[tabId] as ITab;\n },\n addTab: (tabs: { app: string; data?: Record<string, any> }[] | { app: string; data?: Record<string, any> }, layout?: string) => {\n const childrenProps: Record<string, any> = {};\n const IDs = [];\n if (Array.isArray(tabs)) {\n tabs.forEach((tab) => {\n const id = uuidv4();\n IDs.push(id);\n childrenProps[id] = {\n title: null,\n appname: tab.app,\n icon: \"default\",\n data: tab.data || null\n };\n });\n } else {\n const id = uuidv4();\n const tab = tabs as { app: string; data?: Record<string, any> };\n IDs.push(id);\n childrenProps[id] = {\n title: null,\n appname: tab.app,\n icon: \"default\",\n data: tab.data || null\n };\n }\n const dummyKeys = [\"default1\", \"default2\", \"default3\"];\n let dummyIdx = 0;\n while (Object.keys(childrenProps).length < 4) {\n const dKey = dummyKeys[dummyIdx] || `default${dummyIdx + 1}`;\n childrenProps[dKey] = {\n icon: \"default\",\n title: null,\n appname: \"select-tab\",\n data: null,\n };\n dummyIdx++;\n }\n addTab({\n layout: layout ?? \"single\",\n childrenProps\n });\n return IDs;\n },\n closeTab: () => {\n closeTab(tabId);\n },\n detachTab: () => {\n detachTab(tabId);\n },\n useTabDatabase: <T,>(tb: string, options?: { initialValue?: T }) => {\n const hashed = generateIdFromString(tabId + \"/\" + tb);\n return useDatabaseImpl<T>(hashed, options);\n },\n useModel: () => {\n return useDatabaseImpl<Model>(\"model\", { initialValue: { name: null, id: null } });\n },\n getAvailableModels: async () => {\n try {\n const res = await pyInvoke<{ data?: Record<string, unknown>; error?: string }>('file', {\n command: \"read\",\n filename: \"config.json\",\n base_dir: \"python\"\n });\n if (res && typeof res === 'object' && 'data' in res) {\n const config = res.data?.content as string;\n if (config) {\n try {\n const parsed = JSON.parse(config);\n if (parsed.available_models) {\n return parsed.available_models;\n }\n } catch (e) {\n console.error(\"File request failed\", e);\n }\n }\n }\n } catch (e) {\n console.error(\"File request failed\", e);\n }\n return {};\n },\n useTool: () => {\n const { workspace } = useSnapshot(Workspace);\n return async (tool: string, parameters: Record<string, any>) => {\n return await pyInvoke(\"tools/execute\", { tool, workspace, tabId, ...parameters });\n }\n },\n useGlobal: <T,>(name: string, options?: { initialValue?: T }) => {\n return useGlobal(tabId + \"_\" + name, options);\n },\n useFile: (\n filename: string,\n options?: {\n initialValue?: string;\n baseDir?: string;\n width?: number;\n height?: number;\n quality?: number;\n bitrate?: string;\n resolution?: string;\n fps?: number;\n thumbnail?: boolean;\n thumb_time?: string;\n format?: string;\n download?: boolean;\n }\n ) => {\n return useFileImpl(filename, {\n ...options,\n baseDir: (options && options.baseDir) ? options.baseDir : \"Storage/\" + workspace + \"/\" + tabId + \"/\"\n });\n },\n useFolder: (\n path: string,\n { baseDir }: { baseDir?: string } = {}\n ) => {\n return useFolderImpl(path, { baseDir: baseDir ?? \"Storage/\" + workspace + \"/\" + tabId + \"/\" });\n },\n pyInvoke: <T,>(\n label: string,\n data?: Record<string, unknown> | ArrayBufferLike | Blob | ArrayBufferView,\n timeout?: number\n ) => {\n return pyInvoke<T>(label, data, timeout);\n }\n };\n }\n useEffect(() => {\n (async () => {\n if (typeof window !== 'undefined' && !!(window as any).__TAURI__) {\n try {\n const res = await pyInvoke<{ data?: Record<string, unknown>; error?: string }>('check_tauri', {});\n if (res && typeof res === 'object' && 'data' in res) {\n console.warn(res.data);\n }\n } catch (e) {\n console.error(e);\n window.location.reload();\n }\n }\n })()\n }, [])\n useEffect(() => {\n setTabs((prevTabs: any) => {\n const nextTabs = { ...prevTabs };\n let hasChanges = false;\n // Add new tabs\n Object.entries(snaptabs).forEach(([parentKey, parentValue]) => {\n if (parentValue.childrenProps) {\n Object.entries(parentValue.childrenProps).forEach(([key, value]) => {\n if (!nextTabs[key]) {\n const props: AppInfo = AppInfoProps(value.appname, parentKey, key);\n const AppComp = appRegistry[value.appname];\n const Component = AppComp || DefaultPage;\n const AppComponent = Component as React.ComponentType<AppInfo>;\n nextTabs[key] = (\n <Suspense fallback={<div className=\"absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2\"><Spinner /></div>}>\n <AppComponent key={key} {...props} />\n </Suspense>\n );\n hasChanges = true;\n }\n })\n }\n });\n return hasChanges ? nextTabs : prevTabs;\n });\n }, [snaptabs]);\n \n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n (async ()=> {\n await pyInvoke('set_active', {\n workspace: workspace || \"global\",\n tab_id: active.length > 0 ? active : \"global\",\n })\n })()\n }, [workspace, active])\n\n useKeyEffect(() => {\n const activeElement = document.activeElement;\n const isInputFocused =\n activeElement instanceof HTMLInputElement ||\n activeElement instanceof HTMLTextAreaElement ||\n (activeElement instanceof HTMLElement && activeElement.isContentEditable);\n if (TabInfo.layout !== \"single\" && !isInputFocused) {\n TabInfo.switchMode = true;\n } else {\n TabInfo.switchMode = false;\n }\n }, [\"control\", \"shift\"]);\n\n\n const deleteTimerRef = useRef<any>(null);\n\n useKeyEffect(() => {\n const activeElement = document.activeElement;\n const isInputFocused =\n activeElement instanceof HTMLInputElement ||\n activeElement instanceof HTMLTextAreaElement ||\n (activeElement instanceof HTMLElement && activeElement.isContentEditable);\n if (isInputFocused) {\n return;\n }\n\n if (deleteTimerRef.current) {\n clearTimeout(deleteTimerRef.current);\n }\n\n deleteTimerRef.current = setTimeout(() => {\n deleteTabWithGroupSelection(active)\n deleteTimerRef.current = null;\n }, 80); // delay in ms\n\n }, [\"control\", \"w\"]);\n\n useEffect(() => {\n if (mounted) {\n if (snaptheme.theme === \"dark\") {\n document.documentElement.className = \"dark\"\n } else if (snaptheme.theme === \"light\") {\n document.documentElement.className = \"\";\n }\n }\n }, [mounted, snaptheme.theme])\n useEffect(() => {\n if (!mounted) return;\n // Input\n function onKeyDown(event: KeyboardEvent) {\n KeyState.setKey(event.key.toLowerCase(), true);\n KeyState.setCtrl(event.ctrlKey);\n KeyState.setShift(event.shiftKey);\n KeyState.setAlt(event.altKey);\n }\n function onKeyUp(event: KeyboardEvent) {\n KeyState.setKey(event.key.toLowerCase(), false);\n KeyState.setCtrl(event.ctrlKey);\n KeyState.setShift(event.shiftKey);\n KeyState.setAlt(event.altKey);\n }\n function onBlur() {\n KeyState.clearKeys();\n }\n document.addEventListener(\"keydown\", onKeyDown);\n document.addEventListener(\"keyup\", onKeyUp);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"keyup\", onKeyUp);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, [mounted]);\n // Mobile bottom bar search\n const [isMobileSearching, setIsMobileSearching] = useState(false);\n const [mobileSearchText, setMobileSearchText] = useState('');\n const [selectedMobileTab, setSelectedMobileTab] = useState({ name: 'Blank', icon: TabInfo.icon });\n const mobileSearchInputRef = useRef<HTMLInputElement>(null);\n const mobileTabItems = [\n { name: 'Blank', icon: TabInfo.icon },\n { name: 'Blank 1', icon: TabInfo.icon },\n { name: 'Modern Page', icon: TabInfo.icon },\n { name: 'Outlaw', icon: TabInfo.icon },\n ];\n const filteredMobileItems = mobileTabItems.filter(item =>\n item.name.toLowerCase().includes(mobileSearchText.toLowerCase())\n );\n const handleMobileSelectItem = (item: typeof mobileTabItems[0]) => {\n setSelectedMobileTab(item);\n setIsMobileSearching(false);\n setMobileSearchText('');\n };\n const handleMobileSearchKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && filteredMobileItems.length > 0) handleMobileSelectItem(filteredMobileItems[0]);\n if (e.key === 'Escape') { setIsMobileSearching(false); setMobileSearchText(''); }\n };\n const [vieweportRef, { width: viewportWidth, height: viewportHeight, overflowX: viewportOverflowX, overflowY: viewportOverflowY, aspectRatio: viewportAspectRatio }] = useElementSize<HTMLDivElement>();\n useEffect(() => {\n Viewport.width = viewportWidth;\n Viewport.height = viewportHeight;\n Viewport.overflowX = viewportOverflowX;\n Viewport.overflowY = viewportOverflowY;\n Viewport.aspectRatio = viewportAspectRatio;\n }, [viewportWidth, viewportHeight, viewportOverflowX, viewportOverflowY, viewportAspectRatio])\n const [warmup, setWarmup] = useState(true);\n useEffect(() => {\n if (isStreamReady && intialzeTheme) {\n setTimeout(() => {\n setWarmup(false);\n }, 100)\n }\n },\n [isStreamReady, intialzeTheme]);\n if (!intialzeTheme) {\n return <AppLoading status={startupStatus} />\n }\n if (workspace === null || isSwitchWorkspace) {\n return <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.5, delay: isSwitchWorkspace ? 0 : 1 }}\n >\n <SelectWorkspace workspaces={workspaces} setWorkspace={(name: string) => {\n setWorkspace(name);\n setIsSwitchWorkspace(false);\n }} />\n </motion.div>\n }\n return (\n <div>\n {isTauri && <div data-tauri-drag-region className='absolute top-0 w-full h-[2.5vh] left-0 bg-transparent' style={{ zIndex: 10 }} />}\n <div\n contentEditable\n style={{\n zIndex: -99999,\n }}\n className='opacity-0 absolute select-none pointer-events-none'\n />\n <motion.div\n animate={{\n opacity: isSearchChatOpen ? 1 : 0,\n scale: isSearchChatOpen ? 1 : 0.9,\n translateX: \"-50%\",\n translateY: \"-50%\",\n }}\n initial={{\n opacity: 0,\n scale: 0.9,\n translateX: \"-50%\",\n translateY: \"-50%\",\n }}\n transition={{\n duration: 0.2,\n ease: \"easeOut\"\n }}\n ref={searchRef} className={\n clsx(\n \"shadow-xl fixed w-[750px] bg-[hsl(var(--chat-bubble))] top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 origin-center z-10 border-[1px] rounded-xl border-solid border-[hsl(var(--border))]\",\n isSearchChatOpen ? 'pointer-events-auto' : 'pointer-events-none',\n )\n }>\n <button\n onClick={() => {\n setIsSearchChatOpen(false);\n }}\n className='w-[40px] h-[40px] absolute top-[10px] right-[10px] rounded-full flex justify-center items-center p-2'>\n <X />\n </button>\n <input className='w-full p-5 bg-[transparent] border-[0px] border-b-[1px] border-[hsl(var(--border))] focus:outline-none' type=\"text\" placeholder=\"Search chats...\" />\n <div className='w-full h-[400px] overflow-y-auto'>\n <div className='w-full h-[800px]'></div>\n </div>\n </motion.div>\n <div ref={vieweportRef} id=\"app\"\n className={clsx(\n \"flex bg-[hsl(var(--bg))] h-screen overflow-hidden\",\n currentLayout === \"rightToLeft\" && 'flex-row-reverse',\n )}\n >\n <aside className=\"items-start x hidden md:flex bg-[hsl(var(--bg))] relative z-10\">\n {/* <VerticalTab menus={menus} /> */}\n <Sidebar\n workspace={workspace}\n setIsSwitchWorkspace={setIsSwitchWorkspace}\n showSearchDialog={showSearchDialog}\n setShowSearchDialog={setShowSearchDialog}\n showMcpDialog={showMcpDialog}\n setShowMcpDialog={setShowMcpDialog}\n showCredentialsDialog={showCredentialsDialog}\n setShowCredentialsDialog={setShowCredentialsDialog}\n showLocalModelDialog={showLocalModelDialog}\n setShowLocalModelDialog={setShowLocalModelDialog}\n showCustomEndpointDialog={showCustomEndpointDialog}\n setShowCustomEndpointDialog={setShowCustomEndpointDialog}\n showSettingsDialog={showSettingsDialog}\n setShowSettingsDialog={setShowSettingsDialog}\n layout={snaptheme.layout}\n theme={snaptheme.theme}\n settings={settings}\n />\n </aside>\n <div\n className=\"flex w-full relative h-full\" style={\n {\n boxShadow: \"var(--kotakshadow)\",\n }\n }>\n {/* */}\n <div className={clsx(\n \"w-full overflow-hidden\",\n isTauri && \"pt-1.5\",\n \"h-[calc(100%-50px)] md:h-full\"\n )}>\n <div\n id=\"app\"\n className={\n clsx(\n \"flex\",\n \"bg-card relative w-full h-full border-[0px] border-solid border-[hsl(var(--chat-border))] border-t-[1px]\",\n currentLayout === \"rightToLeft\" ? 'border-r-[1px]' : 'border-l-[1px]',\n )\n }>\n {\n Object.keys(snaptabs).length == 0 && (\n <div className=\"w-full h-full flex items-center justify-center\">\n {warmup ? <div>\n <Spinner />\n </div> : <Button onClick={() => {\n addTab();\n }}>\n <Plus />\n New Tab\n </Button>}\n </div>\n )\n }\n <div className={clsx(\n \"relative overflow-hidden\",\n \"flex-1\",\n )}>\n {Object.keys(snaptabs).length > 0 && <MultiView actives={actives} className='relative top-0 left-0 bg-neutral-300 dark:bg-[hsl(var(--float))]' layout={layout as LayoutType}>\n {Object.keys(tabs).map((key, index) => (\n <TabItem key={key} isOpened={actives.includes(index)}>\n {tabs[key]}\n </TabItem>\n ))\n }\n </MultiView>}\n </div>\n {isTauri && <div className={clsx(\"absolute z-10 top-[-0.2px]\", currentLayout === \"rightToLeft\" ? 'left-0' : \"right-0\")}>\n <Topbar reverse={currentLayout === \"rightToLeft\"} Elements={[\n currentLayout === \"rightToLeft\" ?\n <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().minimize()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg transition-colors relative bottom-1\" aria-label=\"Settings\">\n <div className='w-[13px] h-[13px] rounded-full bg-green-500'>\n </div>\n </button>\n : <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().minimize()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg hover:bg-[hsl(var(--hover))] transition-colors relative bottom-1\" aria-label=\"Settings\">\n <Minus className=\"h-3 w-3 text-zinc-600 dark:text-zinc-300\" />\n </button>,\n currentLayout === \"rightToLeft\" ?\n <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().toggleMaximize()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg transition-colors relative bottom-1\" aria-label=\"Settings\">\n <div className='w-[13px] h-[13px] rounded-full bg-yellow-500'>\n </div>\n </button>\n : <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().toggleMaximize()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg hover:bg-[hsl(var(--hover))] transition-colors relative bottom-1\" aria-label=\"Settings\">\n <Copy className=\"h-3 w-3 text-zinc-600 dark:text-zinc-300 transform scale-x-[-1]\" />\n </button>,\n currentLayout === \"rightToLeft\" ?\n <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().close()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg transition-colors relative bottom-1\" aria-label=\"Settings\">\n <div className='w-[13px] h-[13px] rounded-full bg-red-500'>\n </div>\n </button>\n : <button\n onClick={() => {\n if ((window as any).__TAURI__) {\n (window as any).__TAURI__.window.getCurrentWindow().close()\n }\n }}\n className=\"pointer-events-auto w-[30px] h-[30px] flex items-center justify-center rounded-lg hover:bg-[hsl(var(--hover))] transition-colors relative bottom-1\" aria-label=\"Settings\">\n <X className=\"h-4 w-4 text-zinc-600 dark:text-zinc-300\" />\n </button>\n ]} />\n </div>}\n </div>\n </div>\n <div className='w-full flex md:hidden h-[50px] bg-[hsl(var(--bg))] absolute bottom-[0px] z-10 gap-2 items-center justify-center border-t border-[hsl(var(--chat-border))] px-3'>\n {isMobileSearching && (\n <div\n className='fixed inset-0 z-0'\n onClick={() => { setIsMobileSearching(false); setMobileSearchText(''); }}\n />\n )}\n <div className='relative flex-1 z-10'>\n {isMobileSearching && (\n <>\n {Object.keys(snaptabs).length > 0 ? (\n <div className='fixed w-[98vw] mx-1 bottom-[50px] left-0 right-0 bg-[hsl(var(--bg))] border border-[hsl(var(--chat-border))] rounded-xl overflow-hidden z-20'>\n {Object.entries(snaptabs).filter(([, item]) => (item.title || \"Untitled\").toLowerCase().includes(mobileSearchText.toLowerCase())).map(([key, item], i) => (\n <div\n onClick={() => {\n SetActive(key)\n }}\n key={i}\n className='flex items-center gap-2 px-3 py-2 hover:bg-[hsl(var(--hover))] cursor-pointer'\n onMouseDown={e => { e.preventDefault(); }}\n >\n <div className='p-1 bg-white/10 rounded-lg'>\n {item.icon({ className: 'w-4 h-4' })}\n </div>\n <span className='text-sm'>{item.title || \"Untitled\"}</span>\n </div>\n ))}\n </div>\n ) : <div className=\"fixed w-[98vw] mx-1 p-2 text-center text-gray-500 bottom-[50px] left-0 right-0 bg-[hsl(var(--bg))] border border-[hsl(var(--chat-border))] rounded-xl overflow-hidden z-20\">\n No results found\n </div>}\n </>\n )}\n <div\n className='flex items-center h-[35px] bg-card hover:bg-[hsl(var(--hover))] transition-colors rounded-xl border border-[hsl(var(--chat-border))] cursor-text'\n onClick={() => {\n if (!isMobileSearching) {\n setIsMobileSearching(true);\n setTimeout(() => mobileSearchInputRef.current?.focus(), 0);\n }\n }}\n >\n <div className='px-2 flex-shrink-0'>\n <div className='p-1 bg-white/10 rounded-lg'>\n {isMobileSearching\n ? <Search className='w-4 h-4' />\n : TabInfo.icon({ className: \"w-4 h-4\" })\n }\n </div>\n </div>\n {isMobileSearching ? (\n <input\n ref={mobileSearchInputRef}\n className='flex-1 bg-transparent outline-none text-sm min-w-0 pr-2'\n value={mobileSearchText}\n onChange={e => setMobileSearchText(e.target.value)}\n onKeyDown={handleMobileSearchKeyDown}\n placeholder={selectedMobileTab.name}\n />\n ) : (\n <span className='flex-1 text-sm'>{selectedMobileTab.name}</span>\n )}\n </div>\n </div>\n <div\n onClick={() => {\n setShowSearchDialog(true)\n }}\n className=' hover:bg-[hsl(var(--hover))] border border-transparent hover:border-[hsl(var(--chat-border))] p-1 rounded-lg z-10'>\n <Copy className='w-5 h-5 scale-x-[-1]' />\n </div>\n <div\n onClick={() => {\n addTab()\n }}\n className='hover:bg-[hsl(var(--hover))] border border-transparent hover:border-[hsl(var(--chat-border))] p-1 rounded-lg z-10'>\n <Plus className='w-5 h-5' />\n </div>\n <Dropdown\n content={[\n {\n content: <div> Switch Workspace </div>,\n shortcut: <ArrowLeftRight size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setIsSwitchWorkspace(true);\n }\n },\n ...(typeof window !== 'undefined' && !!(window as any).__TAURI__) ? [{\n content: <div> Local Models </div>,\n shortcut: <HardDrive size={16} />,\n children: null,\n separator: false,\n trigger: async () => {\n setShowLocalModelDialog(true);\n }\n }] : [],\n {\n content: <div> Credentials </div>,\n shortcut: <Key size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setShowCredentialsDialog(true);\n }\n },\n {\n content: <div> Custom Endpoints </div>,\n shortcut: <Globe size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n setShowCustomEndpointDialog(true);\n }\n },\n {\n content: <div> MCP Servers </div>,\n shortcut: <svg fill=\"currentColor\" fillRule=\"evenodd\" height=\"1.25em\" viewBox=\"0 0 24 24\" width=\"1.25em\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>ModelContextProtocol</title>\n <path d=\"M15.688 2.343a2.588 2.588 0 00-3.61 0l-9.626 9.44a.863.863 0 01-1.203 0 .823.823 0 010-1.18l9.626-9.44a4.313 4.313 0 016.016 0 4.116 4.116 0 011.204 3.54 4.3 4.3 0 013.609 1.18l.05.05a4.115 4.115 0 010 5.9l-8.706 8.537a.274.274 0 000 .393l1.788 1.754a.823.823 0 010 1.18.863.863 0 01-1.203 0l-1.788-1.753a1.92 1.92 0 010-2.754l8.706-8.538a2.47 2.47 0 000-3.54l-.05-.049a2.588 2.588 0 00-3.607-.003l-7.172 7.034-.002.002-.098.097a.863.863 0 01-1.204 0 .823.823 0 010-1.18l7.273-7.133a2.47 2.47 0 00-.003-3.537z\" />\n <path d=\"M14.485 4.703a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a4.115 4.115 0 000 5.9 4.314 4.314 0 006.016 0l7.12-6.982a.823.823 0 000-1.18.863.863 0 00-1.204 0l-7.119 6.982a2.588 2.588 0 01-3.61 0 2.47 2.47 0 010-3.54l7.12-6.982z\" /></svg>,\n children: null,\n separator: false,\n trigger: () => {\n setShowMcpDialog(true);\n }\n },\n {\n content: <div> Dark Theme </div>,\n shortcut: snaptheme.theme === \"dark\" ? <div>On</div> : <div>Off</div>,\n children: null,\n separator: false,\n trigger: () => {\n Theme.theme = snaptheme.theme === \"dark\" ? \"light\" : \"dark\";\n }\n },\n {\n content: <div> Layout </div>,\n shortcut: snaptheme.layout === \"leftToRight\" ? <div>Left To Right</div> : <div>Right To Left</div>,\n children: null,\n separator: false,\n trigger: () => {\n Theme.layout = snaptheme.layout === \"leftToRight\" ? \"rightToLeft\" : \"leftToRight\";\n }\n },\n {\n content: <div> View Repository </div>,\n shortcut: <GitBranch size={16} />,\n children: null,\n separator: false,\n trigger: () => {\n if (isTauri) {\n openUrl('https://github.com/openchad/openchad')\n } else {\n window.open('https://github.com/openchad/openchad', '_blank')\n }\n }\n },\n {\n content: <div> Join Our Discord </div>,\n shortcut: <svg className=\"cursor-pointer rounded-full w-4 h-4 flex items-center overflow-hidden relative\" width=\"64px\" height=\"64px\" viewBox=\"0 -28.5 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMidYMid\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" />\n <g id=\"SVGRepo_tracerCarrier\" />\n <g id=\"SVGRepo_iconCarrier\"> <g>\n <path d=\"M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z\" fill=\"currentColor\" fillRule=\"nonzero\"> </path> </g> </g>\n </svg>,\n children: null,\n separator: false,\n trigger: () => {\n if (isTauri) {\n openUrl('https://discord.gg/JWeqhecqBD')\n } else {\n window.open('https://discord.gg/JWeqhecqBD', '_blank')\n }\n }\n },\n ]}>\n <div className='hover:bg-[hsl(var(--hover))] border border-transparent hover:border-[hsl(var(--chat-border))] p-1 rounded-lg z-10'>\n <Settings className='w-5 h-5' />\n </div>\n </Dropdown>\n </div>\n </div>\n </div>\n {setupModel && <>\n <div className='fixed w-[100vw] h-[100vh] left-0 top-0 z-50 bg-black/50 flex items-center justify-center'>\n <div className='w-[520px] bg-card border border-[hsl(var(--chat-border))] rounded-lg shadow-2xl flex flex-col overflow-hidden'>\n {/* Header */}\n <div className='px-6 pt-6 pb-4 border-b border-[hsl(var(--chat-border))]'>\n <h1 className='text-lg font-semibold font-funnel tracking-tight'>Setup Model</h1>\n <p className='text-sm text-muted-foreground mt-0.5'>\n Choose how you want to run your AI model\n </p>\n </div>\n {/* Options */}\n <div className='flex flex-col gap-3 p-6'>\n {/* Local Model */}\n <button\n onClick={() => setShowLocalModelDialog(true)}\n className='group w-full text-left p-4 border border-[hsl(var(--chat-border))] rounded-lg hover:border-primary/50 hover:bg-primary/5 transition-all duration-200'>\n <div className='flex items-start gap-4'>\n <div className='mt-0.5 p-2 rounded-md bg-muted group-hover:bg-primary/10 transition-colors'>\n {/* CPU / local icon */}\n <svg className='w-5 h-5 text-muted-foreground group-hover:text-primary transition-colors' fill='none' viewBox='0 0 24 24' stroke='currentColor' strokeWidth={1.5}>\n <path strokeLinecap='round' strokeLinejoin='round' d='M8.25 3v1.5M4.5 8.25H3m18 0h-1.5M4.5 12H3m18 0h-1.5m-15 3.75H3m18 0h-1.5M8.25 19.5V21M12 3v1.5m0 15V21m3.75-18v1.5m0 15V21m-9-1.5h10.5a2.25 2.25 0 0 0 2.25-2.25V6.75a2.25 2.25 0 0 0-2.25-2.25H6.75A2.25 2.25 0 0 0 4.5 6.75v10.5a2.25 2.25 0 0 0 2.25 2.25Zm.75-12h9v9h-9v-9Z' />\n </svg>\n </div>\n <div className='flex-1'>\n <div className='flex items-center justify-between'>\n <span className='text-sm font-medium'>Import Local Model</span>\n <span className='text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded-full'>Offline</span>\n </div>\n <p className='text-xs text-muted-foreground mt-1 leading-relaxed'>\n Run models entirely on your device, no internet required. Supports <span className='text-foreground/70 font-medium'>.gguf</span> (llama.cpp) and <span className='text-foreground/70 font-medium'>.mlx</span> (Apple Silicon) formats.\n </p>\n </div>\n </div>\n </button>\n {/* API Credentials */}\n <button\n onClick={() => setShowCredentialsDialog(true)}\n className='group w-full text-left p-4 border border-[hsl(var(--chat-border))] rounded-lg hover:border-primary/50 hover:bg-primary/5 transition-all duration-200'>\n <div className='flex items-start gap-4'>\n <div className='mt-0.5 p-2 rounded-md bg-muted group-hover:bg-primary/10 transition-colors'>\n {/* Key icon */}\n <svg className='w-5 h-5 text-muted-foreground group-hover:text-primary transition-colors' fill='none' viewBox='0 0 24 24' stroke='currentColor' strokeWidth={1.5}>\n <path strokeLinecap='round' strokeLinejoin='round' d='M15.75 5.25a3 3 0 0 1 3 3m3 0a6 6 0 0 1-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 0 1 21.75 8.25Z' />\n </svg>\n </div>\n <div className='flex-1'>\n <div className='flex items-center justify-between'>\n <span className='text-sm font-medium'>Setup API Credentials</span>\n <span className='text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded-full'>Cloud</span>\n </div>\n <p className='text-xs text-muted-foreground mt-1 leading-relaxed'>\n Connect to hosted model providers using your API key.\n </p>\n <div className='flex items-center gap-1.5 mt-2.5 flex-wrap'>\n {['OpenAI', 'Anthropic', 'OpenRouter', 'Gemini'].map((p) => (\n <span key={p} className='text-[11px] text-muted-foreground border border-[hsl(var(--chat-border))] px-2 py-0.5 rounded-full'>\n {p}\n </span>\n ))}\n <span className='text-[11px] text-muted-foreground px-1'>+more</span>\n </div>\n </div>\n </div>\n </button>\n <button\n onClick={() => setShowCustomEndpointDialog(true)}\n className='group w-full text-left p-4 border border-[hsl(var(--chat-border))] rounded-lg hover:border-primary/50 hover:bg-primary/5 transition-all duration-200'>\n <div className='flex items-start gap-4'>\n <div className='mt-0.5 p-2 rounded-md bg-muted group-hover:bg-primary/10 transition-colors'>\n {/* Network/proxy icon */}\n <svg className='w-5 h-5 text-muted-foreground group-hover:text-primary transition-colors' fill='none' viewBox='0 0 24 24' stroke='currentColor' strokeWidth={1.5}>\n <path strokeLinecap='round' strokeLinejoin='round' d='M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253M3.284 14.253A8.959 8.959 0 0 1 3 12c0-1.064.184-2.084.52-3.036' />\n </svg>\n </div>\n <div className='flex-1'>\n <div className='flex items-center justify-between'>\n <span className='text-sm font-medium'>Proxy / Custom Endpoint</span>\n <span className='text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded-full'>Self-hosted</span>\n </div>\n <p className='text-xs text-muted-foreground mt-1 leading-relaxed'>\n Point to any OpenAI-compatible base URL ideal for self-hosted inference servers or corporate proxies.\n </p>\n <div className='flex items-center gap-1.5 mt-2.5 flex-wrap'>\n {['Ollama', 'LM Studio', 'vLLM', 'koboldcpp'].map((p) => (\n <span key={p} className='text-[11px] text-muted-foreground border border-[hsl(var(--chat-border))] px-2 py-0.5 rounded-full'>\n {p}\n </span>\n ))}\n <span className='text-[11px] text-muted-foreground px-1'>+more</span>\n </div>\n </div>\n </div>\n </button>\n </div>\n {/* Footer */}\n <div className='px-6 pb-5 flex items-center justify-between'>\n <p className='text-xs text-muted-foreground'>You can change this later in settings</p>\n <button\n onClick={() => {\n setSetupModel(false);\n }}\n className='text-xs text-muted-foreground hover:text-foreground transition-colors'>\n Skip for now →\n </button>\n </div>\n </div>\n </div>\n <div data-tauri-drag-region className='fixed w-[100vw] h-[5vh] left-0 top-0 z-50 bg-transparent' />\n </>\n }\n </div>\n )\n}\n","import Container, { type AppsProps } from \"./Container\"\r\nimport type { AppInfo } from \"./utils/utils\"\r\nimport { usePython } from \"./components/usePython\"\r\nimport { sha256 } from 'js-sha256';\r\nimport { useDatabaseImplBase } from \"./components/useDatabase/useDatabase\"\r\nimport { useFileImpl } from \"./components/useFile\";\r\nimport { useFolderImpl } from \"./components/useFolder\";\r\nimport useElementSize from \"./components/hooks/useElementSize\";\r\nimport { useGlobal as useGlobalImpl } from \"./components/useGlobal\";\r\nimport { MessageState } from \"./components/default-page\";\r\n\r\nfunction generateIdFromString(input: string): string {\r\n /**\r\n * Generate consistent 32-character hex ID from string.\r\n * Uses SHA-256 hash truncated to 128 bits (32 hex chars).\r\n */\r\n return \"tb\" + \"_\" + sha256(input).slice(0, 32);\r\n}\r\n\r\nconst useTool = <T,>() => {\r\n const { pyInvoke } = usePython()\r\n const workspace = \"global\";\r\n const tabId = \"global\";\r\n return (tool: string, parameters: Record<string, any>) => {\r\n return pyInvoke<T>(\"tools/execute\", { tool, workspace, tabId, ...parameters });\r\n }\r\n}\r\n\r\nconst useDatabase = <T,>(tb: string, options?: { initialValue?: T }) => {\r\n const hashed = generateIdFromString(\"global/\" + tb);\r\n return (options?.initialValue !== undefined)\r\n ? useDatabaseImplBase<T>(\"global\", hashed, options.initialValue)\r\n : useDatabaseImplBase<T>(\"global\", hashed);\r\n}\r\n\r\nconst useFile = (filename: string, options?: {\r\n initialValue?: string;\r\n baseDir?: string;\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n bitrate?: string;\r\n resolution?: string;\r\n fps?: number;\r\n thumbnail?: boolean;\r\n thumb_time?: string;\r\n format?: string;\r\n download?: boolean;\r\n}) => {\r\n return useFileImpl(filename, options);\r\n}\r\n\r\nconst useFolder = (path: string, options?: { baseDir?: string }) => {\r\n return useFolderImpl(path, options);\r\n}\r\n\r\nconst useGlobal = <T = Record<string, unknown>>(\r\n tb: string,\r\n options?: { initialValue?: T }\r\n) => {\r\n return useGlobalImpl<T>(tb, options);\r\n};\r\n\r\nexport {\r\n Container,\r\n useDatabase,\r\n useTool,\r\n useFile,\r\n useFolder,\r\n useElementSize,\r\n useGlobal,\r\n generateIdFromString,\r\n usePython,\r\n type AppInfo,\r\n type AppsProps,\r\n type MessageState\r\n} "]}
|