@agent-native/core 0.20.8 → 0.20.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/cli/connect.d.ts +13 -4
  2. package/dist/cli/connect.d.ts.map +1 -1
  3. package/dist/cli/connect.js +86 -6
  4. package/dist/cli/connect.js.map +1 -1
  5. package/dist/cli/templates-meta.d.ts.map +1 -1
  6. package/dist/cli/templates-meta.js +1 -0
  7. package/dist/cli/templates-meta.js.map +1 -1
  8. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  9. package/dist/client/agent-chat-adapter.js +25 -4
  10. package/dist/client/agent-chat-adapter.js.map +1 -1
  11. package/dist/client/composer/TiptapComposer.js +1 -1
  12. package/dist/client/composer/TiptapComposer.js.map +1 -1
  13. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  14. package/dist/client/extensions/EmbeddedExtension.js +2 -1
  15. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  16. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  17. package/dist/client/extensions/ExtensionEditor.js +6 -3
  18. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  19. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  20. package/dist/client/extensions/ExtensionViewer.js +66 -2
  21. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  22. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  23. package/dist/client/extensions/ExtensionsListPage.js +2 -1
  24. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  25. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  26. package/dist/client/extensions/ExtensionsSidebarSection.js +5 -7
  27. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  28. package/dist/client/extensions/index.d.ts +1 -0
  29. package/dist/client/extensions/index.d.ts.map +1 -1
  30. package/dist/client/extensions/index.js +1 -0
  31. package/dist/client/extensions/index.js.map +1 -1
  32. package/dist/db/client.d.ts +19 -0
  33. package/dist/db/client.d.ts.map +1 -1
  34. package/dist/db/client.js +136 -5
  35. package/dist/db/client.js.map +1 -1
  36. package/dist/extensions/actions.d.ts.map +1 -1
  37. package/dist/extensions/actions.js +6 -2
  38. package/dist/extensions/actions.js.map +1 -1
  39. package/dist/extensions/path.d.ts +6 -0
  40. package/dist/extensions/path.d.ts.map +1 -0
  41. package/dist/extensions/path.js +38 -0
  42. package/dist/extensions/path.js.map +1 -0
  43. package/dist/mcp/connect-store.d.ts +1 -1
  44. package/dist/mcp/connect-store.d.ts.map +1 -1
  45. package/dist/mcp/connect-store.js +1 -1
  46. package/dist/mcp/connect-store.js.map +1 -1
  47. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  48. package/dist/server/agent-chat-plugin.js +8 -1
  49. package/dist/server/agent-chat-plugin.js.map +1 -1
  50. package/dist/server/auth.d.ts +2 -0
  51. package/dist/server/auth.d.ts.map +1 -1
  52. package/dist/server/auth.js +2 -2
  53. package/dist/server/auth.js.map +1 -1
  54. package/dist/server/framework-request-handler.d.ts +4 -2
  55. package/dist/server/framework-request-handler.d.ts.map +1 -1
  56. package/dist/server/framework-request-handler.js +25 -11
  57. package/dist/server/framework-request-handler.js.map +1 -1
  58. package/dist/server/index.d.ts +1 -1
  59. package/dist/server/index.d.ts.map +1 -1
  60. package/dist/server/index.js +1 -1
  61. package/dist/server/index.js.map +1 -1
  62. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionsSidebarSection.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsSidebarSection.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useLocation, useNavigate } from \"react-router\";\nimport {\n IconChevronDown,\n IconPlus,\n IconSettings,\n IconStar,\n IconStarFilled,\n IconTrash,\n IconDots,\n IconPencil,\n IconGripVertical,\n IconTool,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../components/ui/hover-card.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n applyToolsOrder,\n getToolsOrder,\n setToolsOrder,\n} from \"./extension-order.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport {\n extensionPopularityOf,\n useExtensionPopularity,\n} from \"./extension-popularity.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n}\n\nconst FAVORITES_KEY = \"extensions-favorites\";\nconst COLLAPSED_EXTENSION_COUNT = 3;\nconst EXTENSIONS_OPEN_KEY = \"extensions-sidebar-open\";\nconst EXTENSIONS_SORT_MODE_KEY = \"extensions-sort-mode\";\n\ntype ExtensionSortMode = \"most-used\" | \"alphabetical\" | \"manual\";\n\nfunction getFavorites(): Set<string> {\n try {\n const raw = localStorage.getItem(FAVORITES_KEY);\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return new Set(Array.isArray(parsed) ? parsed : []);\n } catch {\n return new Set();\n }\n}\n\nfunction saveFavorites(ids: Set<string>) {\n try {\n localStorage.setItem(FAVORITES_KEY, JSON.stringify(Array.from(ids)));\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction getStoredBoolean(key: string, fallback: boolean): boolean {\n if (typeof window === \"undefined\") return fallback;\n const raw = window.localStorage.getItem(key);\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n return fallback;\n}\n\nfunction setStoredBoolean(key: string, value: boolean): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, String(value));\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction getSortMode(): ExtensionSortMode {\n if (typeof window === \"undefined\") return \"most-used\";\n const raw = window.localStorage.getItem(EXTENSIONS_SORT_MODE_KEY);\n if (raw === \"alphabetical\" || raw === \"manual\" || raw === \"most-used\") {\n return raw;\n }\n return \"most-used\";\n}\n\nfunction setSortMode(mode: ExtensionSortMode): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(EXTENSIONS_SORT_MODE_KEY, mode);\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction sortByName<T extends { id: string; name: string }>(items: T[]): T[] {\n return [...items].sort((a, b) => {\n const name = a.name.localeCompare(b.name);\n return name !== 0 ? name : a.id.localeCompare(b.id);\n });\n}\n\nfunction ExtensionSortMenu({\n value,\n onChange,\n}: {\n value: ExtensionSortMode;\n onChange: (value: ExtensionSortMode) => void;\n}) {\n return (\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/45 opacity-0 transition-all hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover/extensions-section:opacity-100\"\n aria-label=\"Extensions sort options\"\n >\n <IconSettings className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>Extensions sort</TooltipContent>\n </Tooltip>\n <DropdownMenuContent side=\"right\" align=\"start\" className=\"w-44\">\n <DropdownMenuLabel>Sort by</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={value}\n onValueChange={(next) => {\n if (\n next === \"most-used\" ||\n next === \"alphabetical\" ||\n next === \"manual\"\n ) {\n onChange(next);\n }\n }}\n >\n <DropdownMenuRadioItem value=\"most-used\">\n Most used\n </DropdownMenuRadioItem>\n <DropdownMenuRadioItem value=\"alphabetical\">\n Alphabetical\n </DropdownMenuRadioItem>\n <DropdownMenuSeparator />\n <DropdownMenuRadioItem value=\"manual\">\n Manual order\n </DropdownMenuRadioItem>\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nexport function ExtensionsSidebarSection() {\n const location = useLocation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const popularity = useExtensionPopularity();\n const [favoriteIds, setFavoriteIds] = useState<Set<string>>(() =>\n typeof window !== \"undefined\" ? getFavorites() : new Set(),\n );\n const [extensionsOpen, setExtensionsOpen] = useState(() =>\n getStoredBoolean(EXTENSIONS_OPEN_KEY, true),\n );\n const [sortModeState, setSortModeState] =\n useState<ExtensionSortMode>(getSortMode);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n const [renamingId, setRenamingId] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n const [showCreate, setShowCreate] = useState(false);\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dragOverId, setDragOverId] = useState<string | null>(null);\n const [showAllExtensions, setShowAllExtensions] = useState(false);\n\n const { data: extensions, isLoading } = useQuery<Extension[]>({\n queryKey: [\"extensions\"],\n queryFn: async () => {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"));\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n const toggleFavorite = useCallback((id: string) => {\n setFavoriteIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n saveFavorites(next);\n return next;\n });\n }, []);\n\n const setExtensionSortMode = useCallback((mode: ExtensionSortMode) => {\n setSortMode(mode);\n setSortModeState(mode);\n }, []);\n\n const toggleExtensionsOpen = useCallback(() => {\n setExtensionsOpen((current) => {\n const next = !current;\n setStoredBoolean(EXTENSIONS_OPEN_KEY, next);\n return next;\n });\n }, []);\n\n const handleDelete = useCallback(\n async (extension: Extension) => {\n const extensionId = extension.id;\n setMenuOpenId(null);\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((t) => t.id !== extensionId),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extensionId);\n setFavoriteIds((prev) => {\n const next = new Set(prev);\n next.delete(extensionId);\n saveFavorites(next);\n return next;\n });\n setToolOrderState((prev) => {\n const next = prev.filter((id) => id !== extensionId);\n if (next.length !== prev.length) setToolsOrder(next);\n return next;\n });\n if (\n location.pathname === `/extensions/${extensionId}` ||\n location.pathname === `/extensions/${extensionId}/edit`\n ) {\n navigate(\"/extensions\");\n }\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n }\n },\n [location.pathname, navigate, queryClient],\n );\n\n const startRename = useCallback((extension: Extension) => {\n setMenuOpenId(null);\n setRenameValue(extension.name);\n setRenamingId(extension.id);\n }, []);\n\n const submitRename = useCallback(\n async (extensionId: string) => {\n const trimmed = renameValue.trim();\n setRenamingId(null);\n if (!trimmed) return;\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n const existing = prev?.find((t) => t.id === extensionId);\n if (!existing || trimmed === existing.name) return;\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n },\n );\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n },\n [renameValue, queryClient],\n );\n\n const sortedTools = useMemo(() => {\n if (!extensions) return [];\n if (sortModeState === \"alphabetical\") {\n return sortByName(extensions);\n }\n const mostUsed = [...extensions].sort((a, b) => {\n const aPop = extensionPopularityOf(popularity, a.id);\n const bPop = extensionPopularityOf(popularity, b.id);\n if (aPop !== bPop) return bPop - aPop;\n const aFav = favoriteIds.has(a.id) ? 0 : 1;\n const bFav = favoriteIds.has(b.id) ? 0 : 1;\n if (aFav !== bFav) return aFav - bFav;\n return a.name.localeCompare(b.name);\n });\n return sortModeState === \"manual\" && toolOrderState.length > 0\n ? applyToolsOrder(mostUsed, toolOrderState)\n : mostUsed;\n }, [extensions, favoriteIds, popularity, sortModeState, toolOrderState]);\n\n const activeExtensionId = useMemo(\n () =>\n sortedTools.find(\n (extension) =>\n location.pathname === `/extensions/${extension.id}` ||\n location.pathname === `/extensions/${extension.id}/edit`,\n )?.id ?? null,\n [location.pathname, sortedTools],\n );\n\n const visibleTools = useMemo(() => {\n if (showAllExtensions || sortedTools.length <= COLLAPSED_EXTENSION_COUNT) {\n return sortedTools;\n }\n\n const defaultVisible = sortedTools.slice(0, COLLAPSED_EXTENSION_COUNT);\n if (!activeExtensionId) return defaultVisible;\n\n const activeTool = sortedTools.find(\n (extension) => extension.id === activeExtensionId,\n );\n if (!activeTool || defaultVisible.some((tool) => tool.id === activeTool.id))\n return defaultVisible;\n\n return [\n ...defaultVisible.slice(0, COLLAPSED_EXTENSION_COUNT - 1),\n activeTool,\n ];\n }, [activeExtensionId, showAllExtensions, sortedTools]);\n\n const hasMoreExtensions = sortedTools.length > COLLAPSED_EXTENSION_COUNT;\n\n const reorderTool = useCallback(\n (activeId: string, overId: string) => {\n if (activeId === overId) return;\n const ids = sortedTools.map((extension) => extension.id);\n const oldIndex = ids.indexOf(activeId);\n const newIndex = ids.indexOf(overId);\n if (oldIndex === -1 || newIndex === -1) return;\n const next = [...ids];\n const [moved] = next.splice(oldIndex, 1);\n if (!moved) return;\n next.splice(newIndex, 0, moved);\n setToolsOrder(next);\n setToolOrderState(next);\n setExtensionSortMode(\"manual\");\n },\n [setExtensionSortMode, sortedTools],\n );\n\n const handleCreate = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setShowCreate(false);\n };\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"relative min-w-0 py-1\">\n <div\n className={cn(\n \"group/extensions-section relative flex w-full min-w-0 items-center rounded-md text-sm font-medium transition-all hover:text-primary\",\n location.pathname.startsWith(\"/extensions\")\n ? \"text-sidebar-accent-foreground\"\n : \"text-muted-foreground hover:bg-sidebar-accent/50\",\n extensionsOpen && sortedTools.length > 0 && \"mb-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={toggleExtensionsOpen}\n className=\"absolute inset-0 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={\n extensionsOpen ? \"Collapse extensions\" : \"Expand extensions\"\n }\n aria-expanded={extensionsOpen}\n />\n <div className=\"pointer-events-none relative z-10 flex min-w-0 flex-1 items-center gap-2 px-3 py-1.5 pr-20\">\n <IconTool className=\"h-4 w-4 shrink-0\" />\n <HoverCard openDelay={1200} closeDelay={200}>\n <HoverCardTrigger asChild>\n <span\n className=\"pointer-events-auto min-w-0 select-none truncate\"\n onClick={toggleExtensionsOpen}\n >\n Extensions\n </span>\n </HoverCardTrigger>\n <HoverCardContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className=\"w-72 space-y-3 p-3\"\n >\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n Extensions\n </p>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n Build small sandboxed apps that can read app data, call\n actions, and save their own state.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/extensions\"\n className=\"inline-flex h-8 items-center rounded-md border px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent\"\n >\n Open extensions\n </Link>\n <a\n href=\"https://agent-native.com/docs/extensions\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex h-8 items-center rounded-md px-2.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n Learn more\n </a>\n </div>\n </HoverCardContent>\n </HoverCard>\n </div>\n <div className=\"absolute right-1 top-1/2 z-20 flex -translate-y-1/2 items-center\">\n <ExtensionSortMenu\n value={sortModeState}\n onChange={setExtensionSortMode}\n />\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent hover:text-accent-foreground\"\n aria-label=\"New extension\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n New extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build...\"\n draftScope=\"extensions:sidebar-create\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <button\n type=\"button\"\n onClick={toggleExtensionsOpen}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-foreground\"\n aria-label={\n extensionsOpen ? \"Collapse extensions\" : \"Expand extensions\"\n }\n aria-expanded={extensionsOpen}\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 shrink-0 transition-transform\",\n !extensionsOpen && \"-rotate-90\",\n )}\n />\n </button>\n </div>\n </div>\n\n {extensionsOpen &&\n (isLoading ? (\n <div className=\"min-w-0 space-y-0.5 px-0.5\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"flex items-center rounded-md px-2 py-1.5\"\n >\n <div\n className=\"h-3 rounded bg-muted animate-pulse\"\n style={{ width: `${60 + i * 20}px` }}\n />\n </div>\n ))}\n </div>\n ) : sortedTools.length === 0 ? null : (\n <div className=\"min-w-0 space-y-0.5 px-0.5\">\n {visibleTools.map((extension) => {\n const isActive =\n location.pathname === `/extensions/${extension.id}` ||\n location.pathname === `/extensions/${extension.id}/edit`;\n const isFav = favoriteIds.has(extension.id);\n const isRenamingThis = renamingId === extension.id;\n const actionsVisible =\n menuOpenId === extension.id || isRenamingThis;\n\n return (\n <div\n key={extension.id}\n onDragOver={(e) => {\n if (!draggingId || draggingId === extension.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOverId(extension.id);\n }}\n onDragLeave={() => {\n setDragOverId((current) =>\n current === extension.id ? null : current,\n );\n }}\n onDrop={(e) => {\n e.preventDefault();\n const activeId =\n draggingId || e.dataTransfer.getData(\"text/plain\");\n setDraggingId(null);\n setDragOverId(null);\n if (activeId) reorderTool(activeId, extension.id);\n }}\n className={cn(\n \"group/extension relative flex items-center min-w-0 rounded-md\",\n draggingId === extension.id && \"opacity-50\",\n dragOverId === extension.id &&\n draggingId !== extension.id &&\n \"bg-accent/60\",\n )}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n draggable\n onDragStart={(e) => {\n setDraggingId(extension.id);\n setDragOverId(null);\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", extension.id);\n }}\n onDragEnd={() => {\n setDraggingId(null);\n setDragOverId(null);\n }}\n className=\"-ml-2 cursor-grab rounded p-0.5 text-muted-foreground/30 opacity-0 transition-colors hover:text-muted-foreground/70 active:cursor-grabbing group-hover/extension:opacity-100 group-focus-within/extension:opacity-100\"\n aria-label={`Reorder ${extension.name}`}\n >\n <IconGripVertical className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder</TooltipContent>\n </Tooltip>\n <Link\n to={`/extensions/${extension.id}`}\n className={cn(\n \"flex min-w-0 flex-1 items-center rounded-md px-2 py-1.5 pr-12 text-xs transition-[padding,color,background-color] md:pr-2 md:group-hover/extension:pr-12 md:group-focus-within/extension:pr-12\",\n actionsVisible && \"md:pr-12\",\n isActive\n ? \"bg-accent text-accent-foreground font-medium\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-accent-foreground\",\n )}\n >\n {isRenamingThis ? (\n <input\n autoFocus\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={() => submitRename(extension.id)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename(extension.id);\n if (e.key === \"Escape\") setRenamingId(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n className=\"min-w-0 flex-1 truncate border-b border-primary bg-transparent px-0 py-0 text-xs outline-none\"\n />\n ) : (\n <span className=\"block truncate\">{extension.name}</span>\n )}\n </Link>\n\n <div\n className={cn(\n \"pointer-events-none absolute right-1 top-1/2 flex -translate-y-1/2 items-center gap-0.5 opacity-100 transition-opacity md:opacity-0 md:group-hover/extension:opacity-100 md:group-focus-within/extension:opacity-100\",\n actionsVisible && \"md:opacity-100\",\n )}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleFavorite(extension.id);\n }}\n className={cn(\n \"pointer-events-auto cursor-pointer rounded p-0.5 transition-colors\",\n isFav\n ? \"text-yellow-500\"\n : \"text-muted-foreground/40 hover:text-yellow-500\",\n )}\n aria-label={isFav ? \"Unfavorite\" : \"Favorite\"}\n >\n {isFav ? (\n <IconStarFilled className=\"h-3 w-3\" />\n ) : (\n <IconStar className=\"h-3 w-3\" />\n )}\n </button>\n\n <DropdownMenu\n open={menuOpenId === extension.id}\n onOpenChange={(open) =>\n setMenuOpenId(open ? extension.id : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"pointer-events-auto cursor-pointer rounded p-0.5 text-muted-foreground/40 transition-colors hover:text-foreground\"\n aria-label=\"Extension actions\"\n >\n <IconDots className=\"h-3 w-3\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"min-w-[140px]\"\n >\n <DropdownMenuItem\n onSelect={() => startRename(extension)}\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => handleDelete(extension)}\n className=\"text-destructive focus:text-destructive\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {extension.canDelete === false\n ? \"Remove from my list\"\n : \"Delete\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n })}\n {hasMoreExtensions && (\n <button\n type=\"button\"\n aria-expanded={showAllExtensions}\n onClick={() => setShowAllExtensions((current) => !current)}\n className=\"ml-5 mt-1 inline-flex h-5 items-center rounded px-1.5 text-[11px] font-medium text-muted-foreground/60 transition-colors hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\"\n >\n {showAllExtensions ? \"show less\" : \"show more\"}\n </button>\n )}\n </div>\n ))}\n </div>\n </TooltipProvider>\n );\n}\n"]}
1
+ {"version":3,"file":"ExtensionsSidebarSection.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsSidebarSection.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,SAAS,EACT,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAU9E,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAC7C,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AACtD,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAIxD,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB;IACrC,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAAiB;IACtD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,KAAc;IACnD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAClE,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACtE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,IAAuB;IAC1C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAyC,KAAU;IACpE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,CACL,MAAC,YAAY,eACX,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0QAA0Q,gBACzQ,yBAAyB,YAEpC,KAAC,YAAY,IAAC,SAAS,EAAC,aAAa,GAAG,GACjC,GACW,GACP,EACjB,KAAC,cAAc,kCAAiC,IACxC,EACV,MAAC,mBAAmB,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,SAAS,EAAC,MAAM,aAC9D,KAAC,iBAAiB,0BAA4B,EAC9C,MAAC,sBAAsB,IACrB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;4BACtB,IACE,IAAI,KAAK,WAAW;gCACpB,IAAI,KAAK,cAAc;gCACvB,IAAI,KAAK,QAAQ,EACjB,CAAC;gCACD,QAAQ,CAAC,IAAI,CAAC,CAAC;4BACjB,CAAC;wBACH,CAAC,aAED,KAAC,qBAAqB,IAAC,KAAK,EAAC,WAAW,0BAEhB,EACxB,KAAC,qBAAqB,IAAC,KAAK,EAAC,cAAc,6BAEnB,EACxB,KAAC,qBAAqB,KAAG,EACzB,KAAC,qBAAqB,IAAC,KAAK,EAAC,QAAQ,6BAEb,IACD,IACL,IACT,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE,CAC/D,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAC3D,CAAC;IACF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CACxD,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAC5C,CAAC;IACF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GACrC,QAAQ,CAAoB,WAAW,CAAC,CAAC;IAC3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAClE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CACrD,CAAC;IACF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAc;QAC5D,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QAChD,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;YACD,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,IAAuB,EAAE,EAAE;QACnE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC;YACtB,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,SAAoB,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAc,CAAC,YAAY,CAAC,CAAC,CAAC;QACnE,WAAW,CAAC,YAAY,CAAc,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAC5D,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAChD,CAAC;QACF,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;YACvC,0BAA0B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrD,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACzB,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;gBACrD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;oBAAE,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI;gBAAE,WAAW,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAC3C,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,SAAoB,EAAE,EAAE;QACvD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,WAAmB,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAc,CAAC,YAAY,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI;YAAE,OAAO;QACnD,WAAW,CAAC,YAAY,CAAc,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAC5D,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpB,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CACnD,CACF,CAAC;QACF,WAAW,CAAC,YAAY,CAAY,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CACtE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CACtC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,KAAK,CACT,eAAe,CAAC,6BAA6B,WAAW,EAAE,CAAC,EAC3D;gBACE,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aACxC,CACF,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5D,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI;gBAAE,WAAW,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,WAAW,CAAC,CAC3B,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7C,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,GAAG,IAAI,CAAC;YACtC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,GAAG,IAAI,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,OAAO,aAAa,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;YAC5D,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,cAAc,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC;IACf,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;IAEzE,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CACH,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAC7B,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CACrD,EAAE,EAAE,IAAI,IAAI,EACf,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CACjC,CAAC;IAEF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,iBAAiB,IAAI,WAAW,CAAC,MAAM,IAAI,yBAAyB,EAAE,CAAC;YACzE,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QACvE,IAAI,CAAC,iBAAiB;YAAE,OAAO,cAAc,CAAC;QAE9C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,iBAAiB,CAClD,CAAC;QACF,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;YACzE,OAAO,cAAc,CAAC;QAExB,OAAO;YACL,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,GAAG,CAAC,CAAC;YACzD,UAAU;SACX,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;IAExD,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,GAAG,yBAAyB,CAAC;IAEzE,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,QAAgB,EAAE,MAAc,EAAE,EAAE;QACnC,IAAI,QAAQ,KAAK,MAAM;YAAE,OAAO;QAChC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,OAAO;QAC/C,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAChC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,oBAAoB,EAAE,WAAW,CAAC,CACpC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,eAAe,CAAC;YACd,OAAO,EAAE,wBAAwB,OAAO,EAAE;YAC1C,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,eAAK,SAAS,EAAC,uBAAuB,aACpC,eACE,SAAS,EAAE,EAAE,CACX,qIAAqI,EACrI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;wBACzC,CAAC,CAAC,gCAAgC;wBAClC,CAAC,CAAC,kDAAkD,EACtD,cAAc,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CACnD,aAED,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAC,qGAAqG,gBAE7G,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,mBAE/C,cAAc,GAC7B,EACF,eAAK,SAAS,EAAC,4FAA4F,aACzG,KAAC,QAAQ,IAAC,SAAS,EAAC,kBAAkB,GAAG,EACzC,MAAC,SAAS,IAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,aACzC,KAAC,gBAAgB,IAAC,OAAO,kBACvB,eACE,SAAS,EAAC,kDAAkD,EAC5D,OAAO,EAAE,oBAAoB,2BAGxB,GACU,EACnB,MAAC,gBAAgB,IACf,IAAI,EAAC,KAAK,EACV,KAAK,EAAC,OAAO,EACb,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,oBAAoB,aAE9B,0BACE,YAAG,SAAS,EAAC,uCAAuC,2BAEhD,EACJ,YAAG,SAAS,EAAC,oDAAoD,2GAG7D,IACA,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,IAAI,IACH,EAAE,EAAC,aAAa,EAChB,SAAS,EAAC,6HAA6H,gCAGlI,EACP,YACE,IAAI,EAAC,0CAA0C,EAC/C,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,kJAAkJ,2BAG1J,IACA,IACW,IACT,IACR,EACN,eAAK,SAAS,EAAC,kEAAkE,aAC/E,KAAC,iBAAiB,IAChB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,oBAAoB,GAC9B,EACF,MAAC,OAAO,IAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,aACpD,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4KAA4K,gBAC3K,eAAe,YAE1B,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,GAC7B,GACM,EACjB,MAAC,cAAc,IACb,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,eAAe,aAEzB,YAAG,SAAS,EAAC,iDAAiD,8BAE1D,EACJ,KAAC,cAAc,IACb,SAAS,QACT,WAAW,EAAC,sCAAsC,EAClD,UAAU,EAAC,2BAA2B,EACtC,QAAQ,EAAE,YAAY,GACtB,IACa,IACT,EACV,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAC,6HAA6H,gBAErI,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,mBAE/C,cAAc,YAE7B,KAAC,eAAe,IACd,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,CAAC,cAAc,IAAI,YAAY,CAChC,GACD,GACK,IACL,IACF,EAEL,cAAc;oBACb,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,4BAA4B,YACxC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACpB,cAEE,SAAS,EAAC,0CAA0C,YAEpD,cACE,SAAS,EAAC,oCAAoC,EAC9C,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GACpC,IANG,CAAC,CAOF,CACP,CAAC,GACE,CACP,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACpC,eAAK,SAAS,EAAC,4BAA4B,aACxC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gCAC9B,MAAM,QAAQ,GAAG,mBAAmB,CAClC,QAAQ,CAAC,QAAQ,EACjB,SAAS,CAAC,EAAE,CACb,CAAC;gCACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gCAC5C,MAAM,cAAc,GAAG,UAAU,KAAK,SAAS,CAAC,EAAE,CAAC;gCACnD,MAAM,cAAc,GAClB,UAAU,KAAK,SAAS,CAAC,EAAE,IAAI,cAAc,CAAC;gCAEhD,OAAO,CACL,eAEE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;wCAChB,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,SAAS,CAAC,EAAE;4CAAE,OAAO;wCACvD,CAAC,CAAC,cAAc,EAAE,CAAC;wCACnB,CAAC,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;wCACnC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oCAC9B,CAAC,EACD,WAAW,EAAE,GAAG,EAAE;wCAChB,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE,CACxB,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAC1C,CAAC;oCACJ,CAAC,EACD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;wCACZ,CAAC,CAAC,cAAc,EAAE,CAAC;wCACnB,MAAM,QAAQ,GACZ,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;wCACrD,aAAa,CAAC,IAAI,CAAC,CAAC;wCACpB,aAAa,CAAC,IAAI,CAAC,CAAC;wCACpB,IAAI,QAAQ;4CAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;oCACpD,CAAC,EACD,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,UAAU,KAAK,SAAS,CAAC,EAAE,IAAI,YAAY,EAC3C,UAAU,KAAK,SAAS,CAAC,EAAE;wCACzB,UAAU,KAAK,SAAS,CAAC,EAAE;wCAC3B,cAAc,CACjB,aAED,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,QACT,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;4DACjB,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;4DAC5B,aAAa,CAAC,IAAI,CAAC,CAAC;4DACpB,CAAC,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;4DACtC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;wDACrD,CAAC,EACD,SAAS,EAAE,GAAG,EAAE;4DACd,aAAa,CAAC,IAAI,CAAC,CAAC;4DACpB,aAAa,CAAC,IAAI,CAAC,CAAC;wDACtB,CAAC,EACD,SAAS,EAAC,uNAAuN,gBACrN,WAAW,SAAS,CAAC,IAAI,EAAE,YAEvC,KAAC,gBAAgB,IAAC,SAAS,EAAC,SAAS,GAAG,GACjC,GACM,EACjB,KAAC,cAAc,kCAAiC,IACxC,EACV,KAAC,IAAI,IACH,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,EAC/C,SAAS,EAAE,EAAE,CACX,gMAAgM,EAChM,cAAc,IAAI,UAAU,EAC5B,QAAQ;gDACN,CAAC,CAAC,8CAA8C;gDAChD,CAAC,CAAC,uEAAuE,CAC5E,YAEA,cAAc,CAAC,CAAC,CAAC,CAChB,gBACE,SAAS,QACT,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,EACxC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oDACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wDAAE,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oDAClD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;wDAAE,aAAa,CAAC,IAAI,CAAC,CAAC;gDAC9C,CAAC,EACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oDACb,CAAC,CAAC,cAAc,EAAE,CAAC;oDACnB,CAAC,CAAC,eAAe,EAAE,CAAC;gDACtB,CAAC,EACD,SAAS,EAAC,+FAA+F,GACzG,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,gBAAgB,YAAE,SAAS,CAAC,IAAI,GAAQ,CACzD,GACI,EAEP,eACE,SAAS,EAAE,EAAE,CACX,sNAAsN,EACtN,cAAc,IAAI,gBAAgB,CACnC,aAED,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;wDACb,CAAC,CAAC,cAAc,EAAE,CAAC;wDACnB,CAAC,CAAC,eAAe,EAAE,CAAC;wDACpB,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oDAC/B,CAAC,EACD,SAAS,EAAE,EAAE,CACX,oEAAoE,EACpE,KAAK;wDACH,CAAC,CAAC,iBAAiB;wDACnB,CAAC,CAAC,gDAAgD,CACrD,gBACW,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,YAE5C,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,cAAc,IAAC,SAAS,EAAC,SAAS,GAAG,CACvC,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,CACjC,GACM,EAET,MAAC,YAAY,IACX,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,EAAE,EACjC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CACrB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAG3C,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mHAAmH,gBAClH,mBAAmB,YAE9B,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,GACzB,GACW,EACtB,MAAC,mBAAmB,IAClB,KAAK,EAAC,KAAK,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,eAAe,aAEzB,MAAC,gBAAgB,IACf,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,aAEtC,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,cAErB,EACnB,MAAC,gBAAgB,IACf,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EACvC,SAAS,EAAC,yCAAyC,aAEnD,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,EACpC,SAAS,CAAC,SAAS,KAAK,KAAK;4EAC5B,CAAC,CAAC,qBAAqB;4EACvB,CAAC,CAAC,QAAQ,IACK,IACC,IACT,IACX,KAnJD,SAAS,CAAC,EAAE,CAoJb,CACP,CAAC;4BACJ,CAAC,CAAC,EACD,iBAAiB,IAAI,CACpB,iBACE,IAAI,EAAC,QAAQ,mBACE,iBAAiB,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAC1D,SAAS,EAAC,0PAA0P,YAEnQ,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GACvC,CACV,IACG,CACP,CAAC,IACA,GACU,CACnB,CAAC;AACJ,CAAC","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useLocation, useNavigate } from \"react-router\";\nimport {\n IconChevronDown,\n IconPlus,\n IconSettings,\n IconStar,\n IconStarFilled,\n IconTrash,\n IconDots,\n IconPencil,\n IconGripVertical,\n IconTool,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from \"../components/ui/hover-card.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n applyToolsOrder,\n getToolsOrder,\n setToolsOrder,\n} from \"./extension-order.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport {\n extensionPopularityOf,\n useExtensionPopularity,\n} from \"./extension-popularity.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport { extensionPath, isExtensionPathname } from \"../../extensions/path.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n canDelete?: boolean;\n}\n\nconst FAVORITES_KEY = \"extensions-favorites\";\nconst COLLAPSED_EXTENSION_COUNT = 3;\nconst EXTENSIONS_OPEN_KEY = \"extensions-sidebar-open\";\nconst EXTENSIONS_SORT_MODE_KEY = \"extensions-sort-mode\";\n\ntype ExtensionSortMode = \"most-used\" | \"alphabetical\" | \"manual\";\n\nfunction getFavorites(): Set<string> {\n try {\n const raw = localStorage.getItem(FAVORITES_KEY);\n if (!raw) return new Set();\n const parsed = JSON.parse(raw);\n return new Set(Array.isArray(parsed) ? parsed : []);\n } catch {\n return new Set();\n }\n}\n\nfunction saveFavorites(ids: Set<string>) {\n try {\n localStorage.setItem(FAVORITES_KEY, JSON.stringify(Array.from(ids)));\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction getStoredBoolean(key: string, fallback: boolean): boolean {\n if (typeof window === \"undefined\") return fallback;\n const raw = window.localStorage.getItem(key);\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n return fallback;\n}\n\nfunction setStoredBoolean(key: string, value: boolean): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, String(value));\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction getSortMode(): ExtensionSortMode {\n if (typeof window === \"undefined\") return \"most-used\";\n const raw = window.localStorage.getItem(EXTENSIONS_SORT_MODE_KEY);\n if (raw === \"alphabetical\" || raw === \"manual\" || raw === \"most-used\") {\n return raw;\n }\n return \"most-used\";\n}\n\nfunction setSortMode(mode: ExtensionSortMode): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(EXTENSIONS_SORT_MODE_KEY, mode);\n } catch {\n // localStorage unavailable — ignore\n }\n}\n\nfunction sortByName<T extends { id: string; name: string }>(items: T[]): T[] {\n return [...items].sort((a, b) => {\n const name = a.name.localeCompare(b.name);\n return name !== 0 ? name : a.id.localeCompare(b.id);\n });\n}\n\nfunction ExtensionSortMenu({\n value,\n onChange,\n}: {\n value: ExtensionSortMode;\n onChange: (value: ExtensionSortMode) => void;\n}) {\n return (\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/45 opacity-0 transition-all hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover/extensions-section:opacity-100\"\n aria-label=\"Extensions sort options\"\n >\n <IconSettings className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>Extensions sort</TooltipContent>\n </Tooltip>\n <DropdownMenuContent side=\"right\" align=\"start\" className=\"w-44\">\n <DropdownMenuLabel>Sort by</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={value}\n onValueChange={(next) => {\n if (\n next === \"most-used\" ||\n next === \"alphabetical\" ||\n next === \"manual\"\n ) {\n onChange(next);\n }\n }}\n >\n <DropdownMenuRadioItem value=\"most-used\">\n Most used\n </DropdownMenuRadioItem>\n <DropdownMenuRadioItem value=\"alphabetical\">\n Alphabetical\n </DropdownMenuRadioItem>\n <DropdownMenuSeparator />\n <DropdownMenuRadioItem value=\"manual\">\n Manual order\n </DropdownMenuRadioItem>\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nexport function ExtensionsSidebarSection() {\n const location = useLocation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const popularity = useExtensionPopularity();\n const [favoriteIds, setFavoriteIds] = useState<Set<string>>(() =>\n typeof window !== \"undefined\" ? getFavorites() : new Set(),\n );\n const [extensionsOpen, setExtensionsOpen] = useState(() =>\n getStoredBoolean(EXTENSIONS_OPEN_KEY, true),\n );\n const [sortModeState, setSortModeState] =\n useState<ExtensionSortMode>(getSortMode);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n const [renamingId, setRenamingId] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n const [showCreate, setShowCreate] = useState(false);\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dragOverId, setDragOverId] = useState<string | null>(null);\n const [showAllExtensions, setShowAllExtensions] = useState(false);\n\n const { data: extensions, isLoading } = useQuery<Extension[]>({\n queryKey: [\"extensions\"],\n queryFn: async () => {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"));\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n const toggleFavorite = useCallback((id: string) => {\n setFavoriteIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n saveFavorites(next);\n return next;\n });\n }, []);\n\n const setExtensionSortMode = useCallback((mode: ExtensionSortMode) => {\n setSortMode(mode);\n setSortModeState(mode);\n }, []);\n\n const toggleExtensionsOpen = useCallback(() => {\n setExtensionsOpen((current) => {\n const next = !current;\n setStoredBoolean(EXTENSIONS_OPEN_KEY, next);\n return next;\n });\n }, []);\n\n const handleDelete = useCallback(\n async (extension: Extension) => {\n const extensionId = extension.id;\n setMenuOpenId(null);\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((t) => t.id !== extensionId),\n );\n try {\n await deleteOrHideExtension(extension);\n invalidateExtensionRemoval(queryClient, extensionId);\n setFavoriteIds((prev) => {\n const next = new Set(prev);\n next.delete(extensionId);\n saveFavorites(next);\n return next;\n });\n setToolOrderState((prev) => {\n const next = prev.filter((id) => id !== extensionId);\n if (next.length !== prev.length) setToolsOrder(next);\n return next;\n });\n if (isExtensionPathname(location.pathname, extensionId)) {\n navigate(\"/extensions\");\n }\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n }\n },\n [location.pathname, navigate, queryClient],\n );\n\n const startRename = useCallback((extension: Extension) => {\n setMenuOpenId(null);\n setRenameValue(extension.name);\n setRenamingId(extension.id);\n }, []);\n\n const submitRename = useCallback(\n async (extensionId: string) => {\n const trimmed = renameValue.trim();\n setRenamingId(null);\n if (!trimmed) return;\n const prev = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n const existing = prev?.find((t) => t.id === extensionId);\n if (!existing || trimmed === existing.name) return;\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n try {\n await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n },\n );\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n } catch {\n if (prev) queryClient.setQueryData([\"extensions\"], prev);\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n },\n [renameValue, queryClient],\n );\n\n const sortedTools = useMemo(() => {\n if (!extensions) return [];\n if (sortModeState === \"alphabetical\") {\n return sortByName(extensions);\n }\n const mostUsed = [...extensions].sort((a, b) => {\n const aPop = extensionPopularityOf(popularity, a.id);\n const bPop = extensionPopularityOf(popularity, b.id);\n if (aPop !== bPop) return bPop - aPop;\n const aFav = favoriteIds.has(a.id) ? 0 : 1;\n const bFav = favoriteIds.has(b.id) ? 0 : 1;\n if (aFav !== bFav) return aFav - bFav;\n return a.name.localeCompare(b.name);\n });\n return sortModeState === \"manual\" && toolOrderState.length > 0\n ? applyToolsOrder(mostUsed, toolOrderState)\n : mostUsed;\n }, [extensions, favoriteIds, popularity, sortModeState, toolOrderState]);\n\n const activeExtensionId = useMemo(\n () =>\n sortedTools.find((extension) =>\n isExtensionPathname(location.pathname, extension.id),\n )?.id ?? null,\n [location.pathname, sortedTools],\n );\n\n const visibleTools = useMemo(() => {\n if (showAllExtensions || sortedTools.length <= COLLAPSED_EXTENSION_COUNT) {\n return sortedTools;\n }\n\n const defaultVisible = sortedTools.slice(0, COLLAPSED_EXTENSION_COUNT);\n if (!activeExtensionId) return defaultVisible;\n\n const activeTool = sortedTools.find(\n (extension) => extension.id === activeExtensionId,\n );\n if (!activeTool || defaultVisible.some((tool) => tool.id === activeTool.id))\n return defaultVisible;\n\n return [\n ...defaultVisible.slice(0, COLLAPSED_EXTENSION_COUNT - 1),\n activeTool,\n ];\n }, [activeExtensionId, showAllExtensions, sortedTools]);\n\n const hasMoreExtensions = sortedTools.length > COLLAPSED_EXTENSION_COUNT;\n\n const reorderTool = useCallback(\n (activeId: string, overId: string) => {\n if (activeId === overId) return;\n const ids = sortedTools.map((extension) => extension.id);\n const oldIndex = ids.indexOf(activeId);\n const newIndex = ids.indexOf(overId);\n if (oldIndex === -1 || newIndex === -1) return;\n const next = [...ids];\n const [moved] = next.splice(oldIndex, 1);\n if (!moved) return;\n next.splice(newIndex, 0, moved);\n setToolsOrder(next);\n setToolOrderState(next);\n setExtensionSortMode(\"manual\");\n },\n [setExtensionSortMode, sortedTools],\n );\n\n const handleCreate = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setShowCreate(false);\n };\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"relative min-w-0 py-1\">\n <div\n className={cn(\n \"group/extensions-section relative flex w-full min-w-0 items-center rounded-md text-sm font-medium transition-all hover:text-primary\",\n location.pathname.startsWith(\"/extensions\")\n ? \"text-sidebar-accent-foreground\"\n : \"text-muted-foreground hover:bg-sidebar-accent/50\",\n extensionsOpen && sortedTools.length > 0 && \"mb-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={toggleExtensionsOpen}\n className=\"absolute inset-0 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={\n extensionsOpen ? \"Collapse extensions\" : \"Expand extensions\"\n }\n aria-expanded={extensionsOpen}\n />\n <div className=\"pointer-events-none relative z-10 flex min-w-0 flex-1 items-center gap-2 px-3 py-1.5 pr-20\">\n <IconTool className=\"h-4 w-4 shrink-0\" />\n <HoverCard openDelay={1200} closeDelay={200}>\n <HoverCardTrigger asChild>\n <span\n className=\"pointer-events-auto min-w-0 select-none truncate\"\n onClick={toggleExtensionsOpen}\n >\n Extensions\n </span>\n </HoverCardTrigger>\n <HoverCardContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className=\"w-72 space-y-3 p-3\"\n >\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n Extensions\n </p>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n Build small sandboxed apps that can read app data, call\n actions, and save their own state.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/extensions\"\n className=\"inline-flex h-8 items-center rounded-md border px-2.5 text-xs font-medium text-foreground transition-colors hover:bg-accent\"\n >\n Open extensions\n </Link>\n <a\n href=\"https://agent-native.com/docs/extensions\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex h-8 items-center rounded-md px-2.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n Learn more\n </a>\n </div>\n </HoverCardContent>\n </HoverCard>\n </div>\n <div className=\"absolute right-1 top-1/2 z-20 flex -translate-y-1/2 items-center\">\n <ExtensionSortMenu\n value={sortModeState}\n onChange={setExtensionSortMode}\n />\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent hover:text-accent-foreground\"\n aria-label=\"New extension\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n New extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build...\"\n draftScope=\"extensions:sidebar-create\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <button\n type=\"button\"\n onClick={toggleExtensionsOpen}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-accent hover:text-foreground\"\n aria-label={\n extensionsOpen ? \"Collapse extensions\" : \"Expand extensions\"\n }\n aria-expanded={extensionsOpen}\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 shrink-0 transition-transform\",\n !extensionsOpen && \"-rotate-90\",\n )}\n />\n </button>\n </div>\n </div>\n\n {extensionsOpen &&\n (isLoading ? (\n <div className=\"min-w-0 space-y-0.5 px-0.5\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"flex items-center rounded-md px-2 py-1.5\"\n >\n <div\n className=\"h-3 rounded bg-muted animate-pulse\"\n style={{ width: `${60 + i * 20}px` }}\n />\n </div>\n ))}\n </div>\n ) : sortedTools.length === 0 ? null : (\n <div className=\"min-w-0 space-y-0.5 px-0.5\">\n {visibleTools.map((extension) => {\n const isActive = isExtensionPathname(\n location.pathname,\n extension.id,\n );\n const isFav = favoriteIds.has(extension.id);\n const isRenamingThis = renamingId === extension.id;\n const actionsVisible =\n menuOpenId === extension.id || isRenamingThis;\n\n return (\n <div\n key={extension.id}\n onDragOver={(e) => {\n if (!draggingId || draggingId === extension.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDragOverId(extension.id);\n }}\n onDragLeave={() => {\n setDragOverId((current) =>\n current === extension.id ? null : current,\n );\n }}\n onDrop={(e) => {\n e.preventDefault();\n const activeId =\n draggingId || e.dataTransfer.getData(\"text/plain\");\n setDraggingId(null);\n setDragOverId(null);\n if (activeId) reorderTool(activeId, extension.id);\n }}\n className={cn(\n \"group/extension relative flex items-center min-w-0 rounded-md\",\n draggingId === extension.id && \"opacity-50\",\n dragOverId === extension.id &&\n draggingId !== extension.id &&\n \"bg-accent/60\",\n )}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n draggable\n onDragStart={(e) => {\n setDraggingId(extension.id);\n setDragOverId(null);\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", extension.id);\n }}\n onDragEnd={() => {\n setDraggingId(null);\n setDragOverId(null);\n }}\n className=\"-ml-2 cursor-grab rounded p-0.5 text-muted-foreground/30 opacity-0 transition-colors hover:text-muted-foreground/70 active:cursor-grabbing group-hover/extension:opacity-100 group-focus-within/extension:opacity-100\"\n aria-label={`Reorder ${extension.name}`}\n >\n <IconGripVertical className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Drag to reorder</TooltipContent>\n </Tooltip>\n <Link\n to={extensionPath(extension.id, extension.name)}\n className={cn(\n \"flex min-w-0 flex-1 items-center rounded-md px-2 py-1.5 pr-12 text-xs transition-[padding,color,background-color] md:pr-2 md:group-hover/extension:pr-12 md:group-focus-within/extension:pr-12\",\n actionsVisible && \"md:pr-12\",\n isActive\n ? \"bg-accent text-accent-foreground font-medium\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-accent-foreground\",\n )}\n >\n {isRenamingThis ? (\n <input\n autoFocus\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={() => submitRename(extension.id)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename(extension.id);\n if (e.key === \"Escape\") setRenamingId(null);\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n className=\"min-w-0 flex-1 truncate border-b border-primary bg-transparent px-0 py-0 text-xs outline-none\"\n />\n ) : (\n <span className=\"block truncate\">{extension.name}</span>\n )}\n </Link>\n\n <div\n className={cn(\n \"pointer-events-none absolute right-1 top-1/2 flex -translate-y-1/2 items-center gap-0.5 opacity-100 transition-opacity md:opacity-0 md:group-hover/extension:opacity-100 md:group-focus-within/extension:opacity-100\",\n actionsVisible && \"md:opacity-100\",\n )}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleFavorite(extension.id);\n }}\n className={cn(\n \"pointer-events-auto cursor-pointer rounded p-0.5 transition-colors\",\n isFav\n ? \"text-yellow-500\"\n : \"text-muted-foreground/40 hover:text-yellow-500\",\n )}\n aria-label={isFav ? \"Unfavorite\" : \"Favorite\"}\n >\n {isFav ? (\n <IconStarFilled className=\"h-3 w-3\" />\n ) : (\n <IconStar className=\"h-3 w-3\" />\n )}\n </button>\n\n <DropdownMenu\n open={menuOpenId === extension.id}\n onOpenChange={(open) =>\n setMenuOpenId(open ? extension.id : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"pointer-events-auto cursor-pointer rounded p-0.5 text-muted-foreground/40 transition-colors hover:text-foreground\"\n aria-label=\"Extension actions\"\n >\n <IconDots className=\"h-3 w-3\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"min-w-[140px]\"\n >\n <DropdownMenuItem\n onSelect={() => startRename(extension)}\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => handleDelete(extension)}\n className=\"text-destructive focus:text-destructive\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {extension.canDelete === false\n ? \"Remove from my list\"\n : \"Delete\"}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n })}\n {hasMoreExtensions && (\n <button\n type=\"button\"\n aria-expanded={showAllExtensions}\n onClick={() => setShowAllExtensions((current) => !current)}\n className=\"ml-5 mt-1 inline-flex h-5 items-center rounded px-1.5 text-[11px] font-medium text-muted-foreground/60 transition-colors hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\"\n >\n {showAllExtensions ? \"show less\" : \"show more\"}\n </button>\n )}\n </div>\n ))}\n </div>\n </TooltipProvider>\n );\n}\n"]}
@@ -5,6 +5,7 @@ export { ExtensionsListPage } from "./ExtensionsListPage.js";
5
5
  export { ExtensionViewerPage } from "./ExtensionViewerPage.js";
6
6
  export { EmbeddedExtension, type EmbeddedExtensionProps, } from "./EmbeddedExtension.js";
7
7
  export { ExtensionSlot, type ExtensionSlotProps } from "./ExtensionSlot.js";
8
+ export { EXTENSION_SLUG_MAX_LENGTH, extensionIdFromPathname, extensionNameToSlug, extensionPath, isExtensionPathname, } from "../../extensions/path.js";
8
9
  export { AgentNativeExtensionFrame, AgentNativeExtensionSlot, type AgentNativeExtensionFrameProps, type AgentNativeExtensionPermissionList, type AgentNativeExtensionSlotProps, type AgentNativeExtensionStorageScopeList, } from "./AgentNativeExtensionFrame.js";
9
10
  export { AGENT_NATIVE_EXTENSION_MESSAGE_TYPES, buildAgentNativeExtensionHtml, createHttpAgentNativeExtensionStorage, createLocalStorageAgentNativeExtensionStorage, getAgentNativeExtensionManifest, isAgentNativeExtensionAllowedInSlot, normalizeAgentNativeExtensionSandbox, type AgentNativeExtensionDefinition, type AgentNativeExtensionManifest, type AgentNativeExtensionMessageType, type AgentNativeExtensionStorage, type AgentNativeExtensionStorageContext, type AgentNativeExtensionStorageOptions, type AgentNativeExtensionStorageRow, type AgentNativeExtensionStorageScope, type BuildAgentNativeExtensionHtmlOptions, type CreateHttpAgentNativeExtensionStorageOptions, } from "./portable-extension.js";
10
11
  export { ExtensionsSidebarSection as ToolsSidebarSection } from "./ExtensionsSidebarSection.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,oCAAoC,GAC1C,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAC7B,qCAAqC,EACrC,6CAA6C,EAC7C,+BAA+B,EAC/B,mCAAmC,EACnC,oCAAoC,EACpC,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,4CAA4C,GAClD,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,eAAe,IAAI,UAAU,EAC7B,KAAK,oBAAoB,IAAI,eAAe,GAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,IAAI,UAAU,EAC7B,KAAK,oBAAoB,IAAI,eAAe,GAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EACL,iBAAiB,IAAI,YAAY,EACjC,KAAK,sBAAsB,IAAI,iBAAiB,GACjD,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,oCAAoC,GAC1C,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAC7B,qCAAqC,EACrC,6CAA6C,EAC7C,+BAA+B,EAC/B,mCAAmC,EACnC,oCAAoC,EACpC,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,4CAA4C,GAClD,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,eAAe,IAAI,UAAU,EAC7B,KAAK,oBAAoB,IAAI,eAAe,GAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,IAAI,UAAU,EAC7B,KAAK,oBAAoB,IAAI,eAAe,GAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EACL,iBAAiB,IAAI,YAAY,EACjC,KAAK,sBAAsB,IAAI,iBAAiB,GACjD,MAAM,wBAAwB,CAAC"}
@@ -5,6 +5,7 @@ export { ExtensionsListPage } from "./ExtensionsListPage.js";
5
5
  export { ExtensionViewerPage } from "./ExtensionViewerPage.js";
6
6
  export { EmbeddedExtension, } from "./EmbeddedExtension.js";
7
7
  export { ExtensionSlot } from "./ExtensionSlot.js";
8
+ export { EXTENSION_SLUG_MAX_LENGTH, extensionIdFromPathname, extensionNameToSlug, extensionPath, isExtensionPathname, } from "../../extensions/path.js";
8
9
  export { AgentNativeExtensionFrame, AgentNativeExtensionSlot, } from "./AgentNativeExtensionFrame.js";
9
10
  export { AGENT_NATIVE_EXTENSION_MESSAGE_TYPES, buildAgentNativeExtensionHtml, createHttpAgentNativeExtensionStorage, createLocalStorageAgentNativeExtensionStorage, getAgentNativeExtensionManifest, isAgentNativeExtensionAllowedInSlot, normalizeAgentNativeExtensionSandbox, } from "./portable-extension.js";
10
11
  // ─────────────────────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,iBAAiB,GAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAKzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAC7B,qCAAqC,EACrC,6CAA6C,EAC7C,+BAA+B,EAC/B,mCAAmC,EACnC,oCAAoC,GAWrC,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,2EAA2E;AAC3E,uEAAuE;AACvE,6DAA6D;AAC7D,gFAAgF;AAEhF,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,eAAe,IAAI,UAAU,GAE9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,IAAI,UAAU,GAE9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EACL,iBAAiB,IAAI,YAAY,GAElC,MAAM,wBAAwB,CAAC","sourcesContent":["export { ExtensionsSidebarSection } from \"./ExtensionsSidebarSection.js\";\nexport {\n ExtensionViewer,\n type ExtensionViewerProps,\n} from \"./ExtensionViewer.js\";\nexport {\n ExtensionEditor,\n type ExtensionEditorProps,\n} from \"./ExtensionEditor.js\";\nexport { ExtensionsListPage } from \"./ExtensionsListPage.js\";\nexport { ExtensionViewerPage } from \"./ExtensionViewerPage.js\";\nexport {\n EmbeddedExtension,\n type EmbeddedExtensionProps,\n} from \"./EmbeddedExtension.js\";\nexport { ExtensionSlot, type ExtensionSlotProps } from \"./ExtensionSlot.js\";\nexport {\n AgentNativeExtensionFrame,\n AgentNativeExtensionSlot,\n type AgentNativeExtensionFrameProps,\n type AgentNativeExtensionPermissionList,\n type AgentNativeExtensionSlotProps,\n type AgentNativeExtensionStorageScopeList,\n} from \"./AgentNativeExtensionFrame.js\";\nexport {\n AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n buildAgentNativeExtensionHtml,\n createHttpAgentNativeExtensionStorage,\n createLocalStorageAgentNativeExtensionStorage,\n getAgentNativeExtensionManifest,\n isAgentNativeExtensionAllowedInSlot,\n normalizeAgentNativeExtensionSandbox,\n type AgentNativeExtensionDefinition,\n type AgentNativeExtensionManifest,\n type AgentNativeExtensionMessageType,\n type AgentNativeExtensionStorage,\n type AgentNativeExtensionStorageContext,\n type AgentNativeExtensionStorageOptions,\n type AgentNativeExtensionStorageRow,\n type AgentNativeExtensionStorageScope,\n type BuildAgentNativeExtensionHtmlOptions,\n type CreateHttpAgentNativeExtensionStorageOptions,\n} from \"./portable-extension.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy aliases — these names predate the Tools → Extensions rename. Keep\n// exporting them so deployed templates that haven't been updated still\n// resolve. Use the canonical `Extension*` names in new code.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { ExtensionsSidebarSection as ToolsSidebarSection } from \"./ExtensionsSidebarSection.js\";\nexport {\n ExtensionViewer as ToolViewer,\n type ExtensionViewerProps as ToolViewerProps,\n} from \"./ExtensionViewer.js\";\nexport {\n ExtensionEditor as ToolEditor,\n type ExtensionEditorProps as ToolEditorProps,\n} from \"./ExtensionEditor.js\";\nexport { ExtensionsListPage as ToolsListPage } from \"./ExtensionsListPage.js\";\nexport { ExtensionViewerPage as ToolViewerPage } from \"./ExtensionViewerPage.js\";\nexport {\n EmbeddedExtension as EmbeddedTool,\n type EmbeddedExtensionProps as EmbeddedToolProps,\n} from \"./EmbeddedExtension.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,GAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,iBAAiB,GAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAKzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oCAAoC,EACpC,6BAA6B,EAC7B,qCAAqC,EACrC,6CAA6C,EAC7C,+BAA+B,EAC/B,mCAAmC,EACnC,oCAAoC,GAWrC,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,2EAA2E;AAC3E,uEAAuE;AACvE,6DAA6D;AAC7D,gFAAgF;AAEhF,OAAO,EAAE,wBAAwB,IAAI,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,eAAe,IAAI,UAAU,GAE9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,IAAI,UAAU,GAE9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EACL,iBAAiB,IAAI,YAAY,GAElC,MAAM,wBAAwB,CAAC","sourcesContent":["export { ExtensionsSidebarSection } from \"./ExtensionsSidebarSection.js\";\nexport {\n ExtensionViewer,\n type ExtensionViewerProps,\n} from \"./ExtensionViewer.js\";\nexport {\n ExtensionEditor,\n type ExtensionEditorProps,\n} from \"./ExtensionEditor.js\";\nexport { ExtensionsListPage } from \"./ExtensionsListPage.js\";\nexport { ExtensionViewerPage } from \"./ExtensionViewerPage.js\";\nexport {\n EmbeddedExtension,\n type EmbeddedExtensionProps,\n} from \"./EmbeddedExtension.js\";\nexport { ExtensionSlot, type ExtensionSlotProps } from \"./ExtensionSlot.js\";\nexport {\n EXTENSION_SLUG_MAX_LENGTH,\n extensionIdFromPathname,\n extensionNameToSlug,\n extensionPath,\n isExtensionPathname,\n} from \"../../extensions/path.js\";\nexport {\n AgentNativeExtensionFrame,\n AgentNativeExtensionSlot,\n type AgentNativeExtensionFrameProps,\n type AgentNativeExtensionPermissionList,\n type AgentNativeExtensionSlotProps,\n type AgentNativeExtensionStorageScopeList,\n} from \"./AgentNativeExtensionFrame.js\";\nexport {\n AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n buildAgentNativeExtensionHtml,\n createHttpAgentNativeExtensionStorage,\n createLocalStorageAgentNativeExtensionStorage,\n getAgentNativeExtensionManifest,\n isAgentNativeExtensionAllowedInSlot,\n normalizeAgentNativeExtensionSandbox,\n type AgentNativeExtensionDefinition,\n type AgentNativeExtensionManifest,\n type AgentNativeExtensionMessageType,\n type AgentNativeExtensionStorage,\n type AgentNativeExtensionStorageContext,\n type AgentNativeExtensionStorageOptions,\n type AgentNativeExtensionStorageRow,\n type AgentNativeExtensionStorageScope,\n type BuildAgentNativeExtensionHtmlOptions,\n type CreateHttpAgentNativeExtensionStorageOptions,\n} from \"./portable-extension.js\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy aliases — these names predate the Tools → Extensions rename. Keep\n// exporting them so deployed templates that haven't been updated still\n// resolve. Use the canonical `Extension*` names in new code.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { ExtensionsSidebarSection as ToolsSidebarSection } from \"./ExtensionsSidebarSection.js\";\nexport {\n ExtensionViewer as ToolViewer,\n type ExtensionViewerProps as ToolViewerProps,\n} from \"./ExtensionViewer.js\";\nexport {\n ExtensionEditor as ToolEditor,\n type ExtensionEditorProps as ToolEditorProps,\n} from \"./ExtensionEditor.js\";\nexport { ExtensionsListPage as ToolsListPage } from \"./ExtensionsListPage.js\";\nexport { ExtensionViewerPage as ToolViewerPage } from \"./ExtensionViewerPage.js\";\nexport {\n EmbeddedExtension as EmbeddedTool,\n type EmbeddedExtensionProps as EmbeddedToolProps,\n} from \"./EmbeddedExtension.js\";\n"]}
@@ -81,6 +81,25 @@ export declare function isLocalDatabase(): boolean;
81
81
  export declare function intType(): string;
82
82
  export declare function isConnectionError(err: any): boolean;
83
83
  export declare function retryOnConnectionError<T>(fn: () => Promise<T>, maxAttempts?: number): Promise<T>;
84
+ /**
85
+ * Max wall time for a single DB op (init or query) before we treat it as a
86
+ * dead connection. A frozen→thawed serverless instance can leave the Neon
87
+ * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither
88
+ * settles nor errors, so retryOnConnectionError() — which only retries thrown
89
+ * errors — can't help and the request hangs until the platform kills the
90
+ * function (~30s on Netlify). For authenticated requests that run a session
91
+ * lookup on every navigation this surfaces as "the site won't load". Bounding
92
+ * each op well under the platform function limit turns the silent hang into a
93
+ * CONNECT_TIMEOUT that the existing retry and reject-reset paths already
94
+ * handle. Override with DB_OP_TIMEOUT_MS.
95
+ */
96
+ export declare function dbOpTimeoutMs(): number;
97
+ /**
98
+ * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable
99
+ * query or pooled client should pass onTimeout so the losing operation does
100
+ * not keep occupying a scarce connection slot after the request has recovered.
101
+ */
102
+ export declare function withDbTimeout<T>(op: string, run: () => Promise<T>, ms?: number, onTimeout?: () => void | Promise<void>): Promise<T>;
84
103
  /**
85
104
  * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /
86
105
  * Cloudflare Pages Functions) where every concurrent request can spin up its
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AAEnD,MAAM,WAAW,MAAM;IACrB,OAAO,CACL,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,GACzC,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CAOpD;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzD;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAO/D;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxE;AAiBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAejD;AAQD,wBAAgB,UAAU,IAAI,OAAO,CAyBpC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED,iFAAiF;AACjF,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AA2BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAoBnD;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,SAAI,GACd,OAAO,CAAC,CAAC,CAAC,CAYZ;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAQ7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYlE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AA0MD,wBAAsB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7E;AAiBD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CA2BlC;AAED,qEAAqE;AACrE,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAejD"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"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"}
package/dist/db/client.js CHANGED
@@ -295,6 +295,95 @@ export async function retryOnConnectionError(fn, maxAttempts = 3) {
295
295
  throw last;
296
296
  }
297
297
  // ---------------------------------------------------------------------------
298
+ // Per-op timeout — converts a silent serverless hang into a retryable error
299
+ // ---------------------------------------------------------------------------
300
+ /**
301
+ * Max wall time for a single DB op (init or query) before we treat it as a
302
+ * dead connection. A frozen→thawed serverless instance can leave the Neon
303
+ * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither
304
+ * settles nor errors, so retryOnConnectionError() — which only retries thrown
305
+ * errors — can't help and the request hangs until the platform kills the
306
+ * function (~30s on Netlify). For authenticated requests that run a session
307
+ * lookup on every navigation this surfaces as "the site won't load". Bounding
308
+ * each op well under the platform function limit turns the silent hang into a
309
+ * CONNECT_TIMEOUT that the existing retry and reject-reset paths already
310
+ * handle. Override with DB_OP_TIMEOUT_MS.
311
+ */
312
+ export function dbOpTimeoutMs() {
313
+ const raw = Number(process.env.DB_OP_TIMEOUT_MS);
314
+ if (Number.isFinite(raw) && raw > 0)
315
+ return raw;
316
+ return isServerlessRuntime() ? 8_000 : 30_000;
317
+ }
318
+ /**
319
+ * Timeout error tagged with a recognized connection-error code so
320
+ * isConnectionError() / retryOnConnectionError() treat a hung op as a
321
+ * retryable dead connection, and upstream reject-reset guards (e.g. the
322
+ * cached session-table init promise) clear their poisoned state.
323
+ */
324
+ class DbTimeoutError extends Error {
325
+ code = "CONNECT_TIMEOUT";
326
+ constructor(op, ms) {
327
+ super(`DB ${op} timed out after ${ms}ms (connection terminated)`);
328
+ this.name = "DbTimeoutError";
329
+ }
330
+ }
331
+ /**
332
+ * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable
333
+ * query or pooled client should pass onTimeout so the losing operation does
334
+ * not keep occupying a scarce connection slot after the request has recovered.
335
+ */
336
+ export async function withDbTimeout(op, run, ms = dbOpTimeoutMs(), onTimeout) {
337
+ let timer;
338
+ let settled = false;
339
+ const runCleanup = () => {
340
+ if (!onTimeout)
341
+ return;
342
+ try {
343
+ const result = onTimeout();
344
+ if (result && typeof result.catch === "function") {
345
+ void result.catch((err) => {
346
+ console.warn(`[db] timeout cleanup for ${op} failed:`, err instanceof Error ? err.message : err);
347
+ });
348
+ }
349
+ }
350
+ catch (err) {
351
+ console.warn(`[db] timeout cleanup for ${op} failed:`, err instanceof Error ? err.message : err);
352
+ }
353
+ };
354
+ return await new Promise((resolve, reject) => {
355
+ const finish = (complete, value) => {
356
+ if (settled)
357
+ return;
358
+ settled = true;
359
+ if (timer)
360
+ clearTimeout(timer);
361
+ complete(value);
362
+ };
363
+ const fail = (err) => {
364
+ if (settled)
365
+ return;
366
+ settled = true;
367
+ if (timer)
368
+ clearTimeout(timer);
369
+ reject(err);
370
+ };
371
+ timer = setTimeout(() => {
372
+ runCleanup();
373
+ fail(new DbTimeoutError(op, ms));
374
+ }, ms);
375
+ let promise;
376
+ try {
377
+ promise = run();
378
+ }
379
+ catch (err) {
380
+ fail(err);
381
+ return;
382
+ }
383
+ promise.then((value) => finish(resolve, value), fail);
384
+ });
385
+ }
386
+ // ---------------------------------------------------------------------------
298
387
  // Serverless-aware Postgres pool options
299
388
  // ---------------------------------------------------------------------------
300
389
  /**
@@ -407,7 +496,25 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
407
496
  const rawSql = typeof sql === "string" ? sql : sql.sql;
408
497
  const args = typeof sql === "string" ? [] : sql.args || [];
409
498
  const pgSql = sqliteToPostgresParams(rawSql);
410
- const result = await retryOnConnectionError(() => pool.query(pgSql, args));
499
+ const result = await retryOnConnectionError(async () => {
500
+ const client = await pool.connect();
501
+ let released = false;
502
+ const releaseClient = (err) => {
503
+ if (released)
504
+ return;
505
+ released = true;
506
+ client.release(err);
507
+ };
508
+ try {
509
+ const result = await withDbTimeout("query", () => client.query(pgSql, args), dbOpTimeoutMs(), () => releaseClient(true));
510
+ releaseClient();
511
+ return result;
512
+ }
513
+ catch (err) {
514
+ releaseClient(isConnectionError(err) ? true : undefined);
515
+ throw err;
516
+ }
517
+ });
411
518
  return {
412
519
  rows: result.rows,
413
520
  rowsAffected: result.rowCount ?? 0,
@@ -428,18 +535,29 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
428
535
  idle_timeout: 0,
429
536
  onnotice: () => { },
430
537
  });
538
+ let timedOut = false;
539
+ let query;
431
540
  try {
432
541
  const rawSql = typeof sql === "string" ? sql : sql.sql;
433
542
  const args = typeof sql === "string" ? [] : sql.args || [];
434
543
  const pgSql = sqliteToPostgresParams(rawSql);
435
- const result = await conn.unsafe(pgSql, args);
544
+ const result = await withDbTimeout("query", () => {
545
+ query = conn.unsafe(pgSql, args);
546
+ return query;
547
+ }, dbOpTimeoutMs(), () => {
548
+ timedOut = true;
549
+ query?.cancel?.();
550
+ });
436
551
  return {
437
552
  rows: Array.from(result),
438
553
  rowsAffected: result.count ?? 0,
439
554
  };
440
555
  }
441
556
  finally {
442
- await conn.end();
557
+ if (timedOut)
558
+ await conn.end({ timeout: 1 });
559
+ else
560
+ await conn.end();
443
561
  }
444
562
  },
445
563
  };
@@ -458,7 +576,10 @@ async function createDbExecInternal(config = {}, trackSingletonResources = false
458
576
  const rawSql = typeof sql === "string" ? sql : sql.sql;
459
577
  const args = typeof sql === "string" ? [] : sql.args || [];
460
578
  const pgSql = sqliteToPostgresParams(rawSql);
461
- const result = await retryOnConnectionError(() => pool.unsafe(pgSql, args));
579
+ const result = await retryOnConnectionError(() => {
580
+ const query = pool.unsafe(pgSql, args);
581
+ return withDbTimeout("query", () => query, dbOpTimeoutMs(), () => query.cancel());
582
+ });
462
583
  return {
463
584
  rows: Array.from(result),
464
585
  rowsAffected: result.count ?? 0,
@@ -554,7 +675,17 @@ export function getDbExec() {
554
675
  async execute(sql) {
555
676
  if (!_initPromise)
556
677
  _initPromise = initClient();
557
- await _initPromise;
678
+ try {
679
+ await _initPromise;
680
+ }
681
+ catch (err) {
682
+ // A failed/hung init must not poison the singleton for the life of
683
+ // the process — drop it so the next call retries a fresh connection
684
+ // instead of re-awaiting a permanently rejected/pending promise.
685
+ _initPromise = undefined;
686
+ _exec = undefined;
687
+ throw err;
688
+ }
558
689
  // After init, swap to a sanitizing wrapper around the real client
559
690
  const wrapper = {
560
691
  execute: (s) => _exec.execute(sanitize(s)),