@agent-native/core 0.12.14 → 0.12.16

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 (72) hide show
  1. package/dist/agent/engine/index.d.ts +1 -0
  2. package/dist/agent/engine/index.d.ts.map +1 -1
  3. package/dist/agent/engine/index.js +1 -0
  4. package/dist/agent/engine/index.js.map +1 -1
  5. package/dist/agent/run-manager.d.ts.map +1 -1
  6. package/dist/agent/run-manager.js +56 -42
  7. package/dist/agent/run-manager.js.map +1 -1
  8. package/dist/cli/workspace-dev.js +26 -5
  9. package/dist/cli/workspace-dev.js.map +1 -1
  10. package/dist/client/AssistantChat.d.ts.map +1 -1
  11. package/dist/client/AssistantChat.js +33 -6
  12. package/dist/client/AssistantChat.js.map +1 -1
  13. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  14. package/dist/client/MultiTabAssistantChat.js +7 -2
  15. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  16. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  17. package/dist/client/NewWorkspaceAppFlow.js +2 -0
  18. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  19. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  20. package/dist/client/extensions/EmbeddedExtension.js +13 -12
  21. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  22. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -1
  23. package/dist/client/extensions/ExtensionEditor.js +23 -10
  24. package/dist/client/extensions/ExtensionEditor.js.map +1 -1
  25. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  26. package/dist/client/extensions/ExtensionViewer.js +15 -10
  27. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  28. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  29. package/dist/client/extensions/ExtensionsListPage.js +12 -6
  30. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  31. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  32. package/dist/client/extensions/ExtensionsSidebarSection.js +8 -9
  33. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  34. package/dist/client/extensions/delete-extension.d.ts +12 -0
  35. package/dist/client/extensions/delete-extension.d.ts.map +1 -0
  36. package/dist/client/extensions/delete-extension.js +49 -0
  37. package/dist/client/extensions/delete-extension.js.map +1 -0
  38. package/dist/client/sharing/ShareButton.js +6 -1
  39. package/dist/client/sharing/ShareButton.js.map +1 -1
  40. package/dist/client/sharing/ShareButton.spec.d.ts +2 -0
  41. package/dist/client/sharing/ShareButton.spec.d.ts.map +1 -0
  42. package/dist/client/sharing/ShareButton.spec.js +90 -0
  43. package/dist/client/sharing/ShareButton.spec.js.map +1 -0
  44. package/dist/client/sse-event-processor.d.ts.map +1 -1
  45. package/dist/client/sse-event-processor.js +10 -2
  46. package/dist/client/sse-event-processor.js.map +1 -1
  47. package/dist/client/use-chat-threads.d.ts.map +1 -1
  48. package/dist/client/use-chat-threads.js +19 -2
  49. package/dist/client/use-chat-threads.js.map +1 -1
  50. package/dist/client/use-db-sync.d.ts.map +1 -1
  51. package/dist/client/use-db-sync.js +3 -0
  52. package/dist/client/use-db-sync.js.map +1 -1
  53. package/dist/extensions/routes.d.ts.map +1 -1
  54. package/dist/extensions/routes.js +41 -5
  55. package/dist/extensions/routes.js.map +1 -1
  56. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  57. package/dist/server/agent-chat-plugin.js +11 -7
  58. package/dist/server/agent-chat-plugin.js.map +1 -1
  59. package/dist/templates/default/AGENTS.md +7 -1
  60. package/dist/templates/default/DEVELOPING.md +12 -0
  61. package/dist/templates/default/app/hooks/use-navigation-state.ts +81 -0
  62. package/dist/templates/default/app/root.tsx +11 -5
  63. package/dist/templates/workspace-root/AGENTS.md +13 -0
  64. package/dist/templates/workspace-root/README.md +6 -0
  65. package/docs/content/multi-app-workspace.md +2 -0
  66. package/package.json +1 -1
  67. package/src/templates/default/AGENTS.md +7 -1
  68. package/src/templates/default/DEVELOPING.md +12 -0
  69. package/src/templates/default/app/hooks/use-navigation-state.ts +81 -0
  70. package/src/templates/default/app/root.tsx +11 -5
  71. package/src/templates/workspace-root/AGENTS.md +13 -0
  72. package/src/templates/workspace-root/README.md +6 -0
@@ -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 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\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\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 (extensionId: string) => {\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 const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n {\n method: \"DELETE\",\n },\n );\n if (!res.ok) throw new Error(\"Delete failed\");\n queryClient.removeQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\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 <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-3 px-3 py-1.5 pr-24 text-left\"\n aria-label=\"About extensions\"\n >\n <IconTool className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 whitespace-nowrap\">Extensions</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\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 </PopoverContent>\n </Popover>\n <div className=\"absolute right-1 top-1/2 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.id)}\n className=\"text-destructive focus:text-destructive\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\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":"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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 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 <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex min-w-0 flex-1 items-center gap-3 px-3 py-1.5 pr-24 text-left\"\n aria-label=\"About extensions\"\n >\n <IconTool className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 whitespace-nowrap\">Extensions</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\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 </PopoverContent>\n </Popover>\n <div className=\"absolute right-1 top-1/2 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"]}
@@ -0,0 +1,12 @@
1
+ import type { QueryClient } from "@tanstack/react-query";
2
+ export interface ExtensionDeleteTarget {
3
+ id: string;
4
+ canDelete?: boolean | null;
5
+ }
6
+ export type ExtensionDeleteResult = {
7
+ mode: "deleted" | "hidden";
8
+ };
9
+ export declare function hideExtensionForCurrentUser(extensionId: string): Promise<ExtensionDeleteResult>;
10
+ export declare function deleteOrHideExtension(extension: ExtensionDeleteTarget): Promise<ExtensionDeleteResult>;
11
+ export declare function invalidateExtensionRemoval(queryClient: QueryClient, extensionId: string): void;
12
+ //# sourceMappingURL=delete-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-extension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/delete-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AAsBnE,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAWhC;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,qBAAqB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,GAClB,IAAI,CAMN"}
@@ -0,0 +1,49 @@
1
+ import { agentNativePath } from "../api-path.js";
2
+ async function readErrorMessage(res, fallback) {
3
+ try {
4
+ const text = await res.text();
5
+ if (!text)
6
+ return fallback;
7
+ try {
8
+ const parsed = JSON.parse(text);
9
+ if (parsed?.error)
10
+ return String(parsed.error);
11
+ if (parsed?.message)
12
+ return String(parsed.message);
13
+ }
14
+ catch {
15
+ return text.slice(0, 200);
16
+ }
17
+ }
18
+ catch {
19
+ // Ignore body read failures and use the fallback below.
20
+ }
21
+ return fallback;
22
+ }
23
+ export async function hideExtensionForCurrentUser(extensionId) {
24
+ const res = await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}/hide`), { method: "POST" });
25
+ if (!res.ok) {
26
+ throw new Error(await readErrorMessage(res, "Could not remove extension from your list"));
27
+ }
28
+ return { mode: "hidden" };
29
+ }
30
+ export async function deleteOrHideExtension(extension) {
31
+ if (extension.canDelete === false) {
32
+ return hideExtensionForCurrentUser(extension.id);
33
+ }
34
+ const res = await fetch(agentNativePath(`/_agent-native/extensions/${extension.id}`), { method: "DELETE" });
35
+ if (res.ok)
36
+ return { mode: "deleted" };
37
+ if (res.status === 403) {
38
+ return hideExtensionForCurrentUser(extension.id);
39
+ }
40
+ throw new Error(await readErrorMessage(res, "Delete failed"));
41
+ }
42
+ export function invalidateExtensionRemoval(queryClient, extensionId) {
43
+ queryClient.removeQueries({ queryKey: ["extension", extensionId] });
44
+ queryClient.invalidateQueries({ queryKey: ["extensions"] });
45
+ queryClient.invalidateQueries({ queryKey: ["extension-slots", extensionId] });
46
+ queryClient.invalidateQueries({ queryKey: ["slot-installs"] });
47
+ queryClient.invalidateQueries({ queryKey: ["slot-available"] });
48
+ }
49
+ //# sourceMappingURL=delete-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-extension.js","sourceRoot":"","sources":["../../../src/client/extensions/delete-extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASjD,KAAK,UAAU,gBAAgB,CAC7B,GAAa,EACb,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM,EAAE,KAAK;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,6BAA6B,WAAW,OAAO,CAAC,EAChE,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,MAAM,gBAAgB,CAAC,GAAG,EAAE,2CAA2C,CAAC,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAgC;IAEhC,IAAI,SAAS,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,eAAe,CAAC,6BAA6B,SAAS,CAAC,EAAE,EAAE,CAAC,EAC5D,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;IACF,IAAI,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAEvC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,WAAwB,EACxB,WAAmB;IAEnB,WAAW,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACpE,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5D,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9E,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC/D,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import type { QueryClient } from \"@tanstack/react-query\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ExtensionDeleteTarget {\n id: string;\n canDelete?: boolean | null;\n}\n\nexport type ExtensionDeleteResult = { mode: \"deleted\" | \"hidden\" };\n\nasync function readErrorMessage(\n res: Response,\n fallback: string,\n): Promise<string> {\n try {\n const text = await res.text();\n if (!text) return fallback;\n try {\n const parsed = JSON.parse(text);\n if (parsed?.error) return String(parsed.error);\n if (parsed?.message) return String(parsed.message);\n } catch {\n return text.slice(0, 200);\n }\n } catch {\n // Ignore body read failures and use the fallback below.\n }\n return fallback;\n}\n\nexport async function hideExtensionForCurrentUser(\n extensionId: string,\n): Promise<ExtensionDeleteResult> {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}/hide`),\n { method: \"POST\" },\n );\n if (!res.ok) {\n throw new Error(\n await readErrorMessage(res, \"Could not remove extension from your list\"),\n );\n }\n return { mode: \"hidden\" };\n}\n\nexport async function deleteOrHideExtension(\n extension: ExtensionDeleteTarget,\n): Promise<ExtensionDeleteResult> {\n if (extension.canDelete === false) {\n return hideExtensionForCurrentUser(extension.id);\n }\n\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n { method: \"DELETE\" },\n );\n if (res.ok) return { mode: \"deleted\" };\n\n if (res.status === 403) {\n return hideExtensionForCurrentUser(extension.id);\n }\n\n throw new Error(await readErrorMessage(res, \"Delete failed\"));\n}\n\nexport function invalidateExtensionRemoval(\n queryClient: QueryClient,\n extensionId: string,\n): void {\n queryClient.removeQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n queryClient.invalidateQueries({ queryKey: [\"extension-slots\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\"] });\n queryClient.invalidateQueries({ queryKey: [\"slot-available\"] });\n}\n"]}
@@ -307,6 +307,11 @@ function SharePanel(props) {
307
307
  },
308
308
  });
309
309
  };
310
+ const handleDone = () => {
311
+ if (canManage && hasInviteEmail)
312
+ handleAdd();
313
+ onClose();
314
+ };
310
315
  const titleText = resourceTitle
311
316
  ? `Share "${resourceTitle}"`
312
317
  : `Share ${resourceType}`;
@@ -324,7 +329,7 @@ function SharePanel(props) {
324
329
  ? s.principalId
325
330
  : displayName(s.principalId, orgMembers), org: s.principalType === "org" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: s.principalType === "org"
326
331
  ? s.principalId
327
- : displayName(s.principalId, orgMembers) }), canManage ? (_jsx(RoleSelect, { value: s.role, onChange: (r) => handleChangeRole(s, r), disabled: inFlight.has(keyOf(s)), plain: true })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: cap(s.role) })), canManage ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: () => handleRemove(s), disabled: inFlight.has(keyOf(s)), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, keyOf(s)))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: "No one has access yet." })) : null] }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: "General access" }), _jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage, visibilityCopy: props.visibilityCopy }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: meta.description })] })] }), props.accessNote ? (_jsx("div", { className: "mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground", children: props.accessNote })) : null, props.shareUrl ? (_jsx(CopyLinkField, { value: props.shareUrl, label: props.shareUrlLabel, description: props.shareUrlDescription })) : null, _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: onClose, className: BUTTON_PRIMARY_SM, children: "Done" }) })] }));
332
+ : displayName(s.principalId, orgMembers) }), canManage ? (_jsx(RoleSelect, { value: s.role, onChange: (r) => handleChangeRole(s, r), disabled: inFlight.has(keyOf(s)), plain: true })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: cap(s.role) })), canManage ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: () => handleRemove(s), disabled: inFlight.has(keyOf(s)), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, keyOf(s)))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: "No one has access yet." })) : null] }), _jsx("div", { className: "mb-2 text-sm font-semibold", children: "General access" }), _jsxs("div", { className: "mb-4 flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage, visibilityCopy: props.visibilityCopy }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: meta.description })] })] }), props.accessNote ? (_jsx("div", { className: "mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground", children: props.accessNote })) : null, props.shareUrl ? (_jsx(CopyLinkField, { value: props.shareUrl, label: props.shareUrlLabel, description: props.shareUrlDescription })) : null, _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: handleDone, className: BUTTON_PRIMARY_SM, children: "Done" }) })] }));
328
333
  }
329
334
  function CopyLinkField({ value, label = "Share link", description, }) {
330
335
  const [copied, setCopied] = useState(false);
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover. */\n shareUrl?: string;\n /** Optional label for the copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the copyable link section. */\n shareUrlDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility) => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId !== visibilityRequestId.current) return;\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n sharesQuery.refetch().finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: () => {\n if (requestId !== visibilityRequestId.current) return;\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n },\n },\n );\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => void;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n onVisibilityChange(next);\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder=\"Add people by email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n value={value}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm text-muted-foreground outline-none\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n}) {\n const current = visibilityMeta(props.value, props.visibilityCopy);\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={(Object.keys(VIS_META) as Visibility[]).map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
1
+ {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover. */\n shareUrl?: string;\n /** Optional label for the copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the copyable link section. */\n shareUrlDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility) => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId !== visibilityRequestId.current) return;\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n sharesQuery.refetch().finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: () => {\n if (requestId !== visibilityRequestId.current) return;\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n },\n },\n );\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => void;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n onVisibilityChange(next);\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleDone = () => {\n if (canManage && hasInviteEmail) handleAdd();\n onClose();\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder=\"Add people by email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={handleDone}\n className={BUTTON_PRIMARY_SM}\n >\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n value={value}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm text-muted-foreground outline-none\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n}) {\n const current = visibilityMeta(props.value, props.visibilityCopy);\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={(Object.keys(VIS_META) as Visibility[]).map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ShareButton.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShareButton.spec.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.spec.tsx"],"names":[],"mappings":""}