@agent-native/core 0.12.7 → 0.12.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/components/icons/AgentNativeIcon.d.ts +4 -5
- package/dist/client/components/icons/AgentNativeIcon.d.ts.map +1 -1
- package/dist/client/components/icons/AgentNativeIcon.js +5 -6
- package/dist/client/components/icons/AgentNativeIcon.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +1 -1
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +1 -1
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KASN,MAAM,OAAO,CAAC;AAuCf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAwJ7D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,kBAAkB,EAClB,eAAe,CAChB;IACC,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6HAA6H;IAC7H,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AA0tCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAShD;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;yDACqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,cAAsC,EACtC,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,QAAkB,EAClB,WAAmB,EACnB,aAAqB,GACtB,EAAE,iBAAiB,2CAqVnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,SAgB7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KASN,MAAM,OAAO,CAAC;AAuCf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAwJ7D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,kBAAkB,EAClB,eAAe,CAChB;IACC,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6HAA6H;IAC7H,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AA0tCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAShD;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;yDACqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,cAAsC,EACtC,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,QAAkB,EAClB,WAAmB,EACnB,aAAqB,GACtB,EAAE,iBAAiB,2CAqVnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,SAgB7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAuBtE"}
|
|
@@ -952,6 +952,6 @@ export function focusAgentChat() {
|
|
|
952
952
|
* Dispatches a custom event that AgentSidebar listens for.
|
|
953
953
|
*/
|
|
954
954
|
export function AgentToggleButton({ className }) {
|
|
955
|
-
return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => window.dispatchEvent(new Event("agent-panel:toggle")), className: cn("
|
|
955
|
+
return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Toggle agent", onClick: () => window.dispatchEvent(new Event("agent-panel:toggle")), className: cn("inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className), children: _jsx(AgentNativeIcon, { size: 22, "aria-hidden": true }) }) }), _jsx(TooltipContent, { children: "Toggle agent" })] }) }));
|
|
956
956
|
}
|
|
957
957
|
//# sourceMappingURL=AgentPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPanel.js","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentPanel — unified agent component with chat, CLI, and workspace modes.\n *\n * A self-contained panel with no layout opinions — drop it into a sidebar,\n * popover, dialog, full page, or any container. It fills its parent via\n * flex and min-h-0.\n *\n * Features:\n * - Chat mode: assistant-ui powered chat with tool calls\n * - CLI mode: embedded xterm.js terminal (dev mode only)\n * - Toggle between modes via header buttons\n *\n * Usage:\n * // In a sidebar\n * <div style={{ width: 380 }}><AgentPanel /></div>\n *\n * // In a popover\n * <Popover><AgentPanel suggestions={[...]} /></Popover>\n *\n * // Full page\n * <AgentPanel className=\"h-screen\" />\n */\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n lazy,\n Suspense,\n startTransition,\n} from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n normalizeTooltipText,\n} from \"./components/ui/tooltip.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from \"./components/ui/dropdown-menu.js\";\nimport {\n IconMessageCircle,\n IconTerminal2,\n IconSettings,\n IconLayoutSidebarRightCollapse,\n IconLayoutGrid,\n IconCheck,\n IconPlus,\n IconFolder,\n IconX,\n IconClockHour3,\n IconDotsVertical,\n IconHistory,\n IconTrash,\n IconArrowsMaximize,\n IconArrowsMinimize,\n} from \"@tabler/icons-react\";\nimport { AgentNativeIcon } from \"./components/icons/AgentNativeIcon.js\";\nimport { FeedbackButton } from \"./FeedbackButton.js\";\nimport {\n MultiTabAssistantChat,\n type MultiTabAssistantChatHeaderProps,\n} from \"./MultiTabAssistantChat.js\";\nimport type { AssistantChatProps } from \"./AssistantChat.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { useScreenRefreshKey } from \"./use-db-sync.js\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useLocation, useNavigate } from \"react-router\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { getFrameOrigin, isTrustedFrameMessage } from \"./frame.js\";\nimport {\n getInitialAgentSidebarOpen,\n SIDEBAR_OPEN_KEY,\n} from \"./agent-sidebar-state.js\";\n\n// Lazy-load AgentTerminal to avoid bundling xterm.js when not needed\nconst AgentTerminal = lazy(() =>\n import(\"./terminal/index.js\").then((m) => ({ default: m.AgentTerminal })),\n);\n\nfunction parentFrameTargetOrigin(): string {\n return getFrameOrigin() ?? window.location.origin;\n}\n\n// Lazy-load ResourcesPanel to avoid bundling when not needed\nconst ResourcesPanel = lazy(() =>\n import(\"./resources/ResourcesPanel.js\").then((m) => ({\n default: m.ResourcesPanel,\n })),\n);\n\n// Lazy-load SettingsPanel to avoid bundling when not needed\nconst SettingsPanel = lazy(() =>\n import(\"./settings/index.js\").then((m) => ({\n default: m.SettingsPanel,\n })),\n);\n\n// Lazy-load OnboardingPanel — only pulled in when onboarding is active.\nconst OnboardingPanel = lazy(() =>\n import(\"./onboarding/OnboardingPanel.js\").then((m) => ({\n default: m.OnboardingPanel,\n })),\n);\n\n// Lazy-load SetupButton — the header entry-point that re-opens the\n// onboarding panel after the user has dismissed it.\nconst SetupButton = lazy(() =>\n import(\"./onboarding/SetupButton.js\").then((m) => ({\n default: m.SetupButton,\n })),\n);\n\n// Setup/onboarding widget is hidden until the UX is improved.\n// Flip to `true` to restore the SetupButton in the header and the\n// OnboardingPanel above the chat.\nconst SHOW_ONBOARDING = false;\n\nconst CLI_STORAGE_KEY = \"agent-native-cli-command\";\nconst CLI_DEFAULT = \"claude\";\nconst EXEC_MODE_KEY = \"agent-native-exec-mode\";\ntype ExecMode = \"build\" | \"plan\";\ntype PanelMode = \"chat\" | \"cli\" | \"resources\" | \"settings\";\nconst AGENT_PANEL_FONT_FAMILY =\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\nconst AGENT_PANEL_ROOT_STYLE = {\n fontFamily: AGENT_PANEL_FONT_FAMILY,\n fontSize: 13,\n lineHeight: 1.2,\n} satisfies React.CSSProperties;\nconst AGENT_PANEL_HEADER_CLASS =\n \"relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2 border-b border-border\";\nconst AGENT_PANEL_HEADER_STYLE = {\n paddingLeft: 8,\n paddingRight: 8,\n} satisfies React.CSSProperties;\nconst AGENT_PANEL_CONTROL_STYLE = {\n fontSize: 12,\n lineHeight: 1,\n} satisfies React.CSSProperties;\nconst ACTIVATE_KEYS = new Set([\"Enter\", \" \"]);\n\ninterface AvailableCli {\n command: string;\n label: string;\n available: boolean;\n}\n\nfunction useAvailableClis() {\n const [clis, setClis] = useState<AvailableCli[]>([]);\n useEffect(() => {\n // Try to fetch available CLIs — endpoint is provided by the terminal plugin.\n // Returns 404 gracefully when the plugin isn't loaded.\n fetch(agentNativePath(\"/_agent-native/available-clis\"))\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => setClis(Array.isArray(data) ? data : []))\n .catch(() => {});\n }, []);\n return clis;\n}\n\nfunction useCliSelection(keyPrefix: string) {\n const cliKey = `${CLI_STORAGE_KEY}${keyPrefix}`;\n const [selected, setSelected] = useState(CLI_DEFAULT);\n useEffect(() => {\n try {\n const saved = localStorage.getItem(cliKey);\n if (saved) setSelected(saved);\n } catch {}\n }, [cliKey]);\n const select = (cmd: string) => {\n setSelected(cmd);\n try {\n localStorage.setItem(cliKey, cmd);\n } catch {}\n };\n return [selected, select] as const;\n}\n\n// Detect dev mode at build time (Vite replaces this)\nconst IS_DEV: boolean = import.meta.env?.DEV === true;\n\n// ─── Settings panel components moved to ./settings/ ────────────────────────\n\nfunction IconTooltip({\n content,\n children,\n}: {\n content: string;\n children: React.ReactNode;\n}) {\n return (\n <TooltipPrimitive.Provider delayDuration={250}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side=\"bottom\"\n sideOffset={8}\n className=\"z-[230] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md\"\n >\n {normalizeTooltipText(content)}\n <TooltipPrimitive.Arrow className=\"fill-popover\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n}\n\n// AgentSettingsPopover and AgentsSection moved to ./settings/\n\n// ─── AgentPanel ─────────────────────────────────────────────────────────────\n\nexport interface AgentPanelProps extends Omit<\n AssistantChatProps,\n \"onSwitchToCli\"\n> {\n /** Initial mode. Default: \"chat\" */\n defaultMode?: \"chat\" | \"cli\";\n /** CSS class for the outer container */\n className?: string;\n /** Called when the user clicks the collapse button. If provided, a collapse button appears in the header. */\n onCollapse?: () => void;\n /** Whether the panel is currently in fullscreen (Claude-style centered) mode. */\n isFullscreen?: boolean;\n /** Called when the user clicks the maximize/minimize button. If provided, the button appears next to the collapse button. */\n onToggleFullscreen?: () => void;\n /** URL of the app being developed (shown as \"Open app in new tab\" in settings). Set by frame. */\n devAppUrl?: string;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Optional notice rendered below the main header while Chat mode is active. */\n chatNotice?: React.ReactNode;\n}\n\nfunction useClientOnly() {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n return mounted;\n}\n\nfunction AgentPanelInner({\n defaultMode = \"chat\",\n className,\n apiUrl,\n emptyStateText,\n suggestions,\n showHeader = true,\n onCollapse,\n isFullscreen,\n onToggleFullscreen,\n devAppUrl,\n storageKey,\n chatNotice,\n}: AgentPanelProps) {\n const mounted = useClientOnly();\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const execModeKey = `${EXEC_MODE_KEY}${keyPrefix}`;\n const panelModeKey = `agent-native-panel-mode${keyPrefix}`;\n const isMac = useMemo(\n () =>\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.userAgent),\n [],\n );\n const closeTabHint = isMac ? \"\\u2303W\" : \"Alt+W\";\n const closeAllTabsHint = isMac ? \"\\u2303\\u2325W\" : \"Ctrl+Alt+W\";\n\n const [execMode, setExecMode] = useState<ExecMode>(() => {\n try {\n const saved = localStorage.getItem(execModeKey);\n if (saved === \"build\" || saved === \"plan\") return saved;\n } catch {}\n return \"build\";\n });\n\n const switchExecMode = useCallback(\n (next: ExecMode) => {\n setExecMode(next);\n try {\n localStorage.setItem(execModeKey, next);\n } catch {}\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:exec-mode-change\", {\n detail: { mode: next },\n }),\n );\n },\n [execModeKey],\n );\n\n const [mode, setMode] = useState<PanelMode>(() => {\n try {\n const saved = localStorage.getItem(panelModeKey);\n if (\n saved === \"chat\" ||\n saved === \"cli\" ||\n saved === \"resources\" ||\n saved === \"settings\"\n )\n return saved;\n } catch {}\n return defaultMode;\n });\n useEffect(() => {\n try {\n localStorage.setItem(panelModeKey, mode);\n } catch {}\n }, [mode, panelModeKey]);\n const switchMode = useCallback((m: PanelMode) => {\n startTransition(() => setMode(m));\n }, []);\n const activateOnKeyDown = useCallback(\n (activate: () => void) => (event: React.KeyboardEvent) => {\n if (!ACTIVATE_KEYS.has(event.key)) return;\n event.preventDefault();\n activate();\n },\n [],\n );\n\n // Listen for mode changes from the frame parent (via AgentSidebar)\n useEffect(() => {\n function handler(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (detail?.mode) switchMode(detail.mode);\n }\n window.addEventListener(\"agent-panel:set-mode\", handler);\n return () => window.removeEventListener(\"agent-panel:set-mode\", handler);\n }, [switchMode]);\n\n // Open settings tab when requested (replaces the old popover open event)\n useEffect(() => {\n function handleOpenSettings() {\n switchMode(\"settings\");\n }\n window.addEventListener(\"agent-panel:open-settings\", handleOpenSettings);\n return () =>\n window.removeEventListener(\n \"agent-panel:open-settings\",\n handleOpenSettings,\n );\n }, [switchMode]);\n\n // CLI terminal tabs (ephemeral — not persisted to SQL)\n const [cliTabs, setCliTabs] = useState<string[]>([\"cli-1\"]);\n const [activeCliTab, setActiveCliTab] = useState(\"cli-1\");\n const cliCounter = useRef(1);\n\n const addCliTab = useCallback(() => {\n const id = `cli-${++cliCounter.current}`;\n setCliTabs((prev) => [...prev, id]);\n setActiveCliTab(id);\n }, []);\n\n const closeCliTab = useCallback(\n (id: string) => {\n setCliTabs((prev) => {\n if (prev.length <= 1) {\n // Last tab — replace with a new one (acts as \"clear\")\n const newId = `cli-${++cliCounter.current}`;\n setActiveCliTab(newId);\n return [newId];\n }\n const next = prev.filter((t) => t !== id);\n if (id === activeCliTab) {\n const idx = prev.indexOf(id);\n setActiveCliTab(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n },\n [activeCliTab],\n );\n\n const closeOtherCliTabs = useCallback((id: string) => {\n setCliTabs([id]);\n setActiveCliTab(id);\n }, []);\n\n const closeAllCliTabs = useCallback(() => {\n const id = `cli-${++cliCounter.current}`;\n setCliTabs([id]);\n setActiveCliTab(id);\n }, []);\n\n // Tab close shortcuts. Avoid Cmd+W (browser/OS) and (on Windows) Ctrl+W.\n // Mac: Ctrl+W → close tab, Ctrl+Alt+W → close all\n // Windows/Linux: Alt+W → close tab, Ctrl+Alt+W → close all\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== \"w\" || e.metaKey || e.shiftKey) return;\n const isCloseAll = e.ctrlKey && e.altKey;\n const isCloseOne = isMac\n ? e.ctrlKey && !e.altKey\n : e.altKey && !e.ctrlKey;\n if (!isCloseAll && !isCloseOne) return;\n e.preventDefault();\n if (mode === \"chat\") {\n window.dispatchEvent(\n new CustomEvent(\n isCloseAll\n ? \"agent-chat:close-all-tabs\"\n : \"agent-chat:close-current-tab\",\n ),\n );\n } else if (mode === \"cli\") {\n if (isCloseAll) closeAllCliTabs();\n else if (activeCliTab) closeCliTab(activeCliTab);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [mode, activeCliTab, closeCliTab, closeAllCliTabs, isMac]);\n\n const availableClis = useAvailableClis();\n const [selectedCli, selectCli] = useCliSelection(keyPrefix);\n const selectedLabel =\n availableClis.find((c) => c.command === selectedCli)?.label || selectedCli;\n const { isDevMode, canToggle, setDevMode } = useDevMode(apiUrl);\n\n // Notify frame when dev mode changes — use both a local CustomEvent (for\n // when AgentPanel is rendered directly in the frame) AND postMessage (for\n // when AgentPanel is inside the iframe and needs to cross the boundary).\n const prevIsDevMode = useRef(isDevMode);\n useEffect(() => {\n if (prevIsDevMode.current !== isDevMode) {\n prevIsDevMode.current = isDevMode;\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:dev-mode-change\", {\n detail: { isDevMode },\n }),\n );\n // Cross iframe boundary to the frame parent\n if (window.parent !== window) {\n window.parent.postMessage(\n { type: \"agentNative.devModeChange\", data: { isDevMode } },\n parentFrameTargetOrigin(),\n );\n }\n }\n }, [isDevMode]);\n\n const isLocalhost =\n mounted &&\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\" ||\n window.location.hostname === \"::1\");\n const showDevToggle = canToggle && isLocalhost;\n\n const renderModeButtons = useCallback(\n (activeMode: PanelMode) => (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"chat\")}\n aria-label=\"Chat mode\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"chat\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconMessageCircle size={14} />\n Chat\n </button>\n </TooltipTrigger>\n <TooltipContent>Chat mode</TooltipContent>\n </Tooltip>\n {isDevMode && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"cli\")}\n aria-label=\"CLI terminal mode\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"cli\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconTerminal2 size={14} />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>CLI terminal mode</TooltipContent>\n </Tooltip>\n )}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"resources\")}\n aria-label=\"Workspace files, agents, skills, and tasks\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"resources\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconLayoutGrid size={14} />\n Workspace\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Workspace files, agents, skills, and tasks\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"settings\")}\n aria-label=\"Setup and configuration\"\n className={cn(\n \"flex items-center justify-center rounded-md px-1.5 py-1\",\n activeMode === \"settings\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n <IconSettings size={14} />\n </button>\n </TooltipTrigger>\n <TooltipContent>Setup and configuration</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n ),\n [isDevMode],\n );\n\n const renderHeaderActions = useCallback(\n () => (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {SHOW_ONBOARDING && isDevMode && (\n <Suspense fallback={null}>\n <SetupButton />\n </Suspense>\n )}\n <FeedbackButton variant=\"icon\" side=\"bottom\" align=\"end\" />\n {onToggleFullscreen && (\n <IconTooltip\n content={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n >\n <button\n onClick={onToggleFullscreen}\n aria-label={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n {isFullscreen ? (\n <IconArrowsMinimize size={14} />\n ) : (\n <IconArrowsMaximize size={14} />\n )}\n </button>\n </IconTooltip>\n )}\n {onCollapse && (\n <IconTooltip content=\"Collapse sidebar\">\n <button\n onClick={onCollapse}\n aria-label=\"Collapse sidebar\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconLayoutSidebarRightCollapse size={14} />\n </button>\n </IconTooltip>\n )}\n </div>\n ),\n [onCollapse, isDevMode, onToggleFullscreen, isFullscreen],\n );\n\n const [tabMenuOpen, setTabMenuOpen] = useState<string | null>(null);\n const [cliPickerOpen, setCliPickerOpen] = useState(false);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n const activeTabRefCb = useCallback((el: HTMLDivElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n // Use rAF so layout is settled after React commit\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left) {\n container.scrollLeft += tabRect.left - containerRect.left;\n } else if (tabRect.right > containerRect.right) {\n container.scrollLeft += tabRect.right - containerRect.right;\n }\n });\n }, []);\n\n const renderChatHeader = useCallback(\n ({\n tabs,\n activeTabId,\n setActiveTabId,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n showHistory,\n toggleHistory,\n }: MultiTabAssistantChatHeaderProps) => (\n <div className=\"flex flex-col shrink-0\">\n {/* Top bar: mode buttons + actions */}\n <div\n className={AGENT_PANEL_HEADER_CLASS}\n style={AGENT_PANEL_HEADER_STYLE}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {renderModeButtons(mode)}\n </div>\n <div className=\"flex items-center gap-0.5\">\n {renderHeaderActions()}\n </div>\n </div>\n {mode === \"chat\" && chatNotice ? (\n <div className=\"border-b border-border\">{chatNotice}</div>\n ) : null}\n {/* Tab bar: always visible for chat and CLI */}\n {(mode === \"chat\" || mode === \"cli\") &&\n (() => {\n // Compute parent/child tab groups for the sub-tab bar\n const activeTab = tabs.find((t) => t.id === activeTabId);\n // The \"focus parent\" is the parent thread for the active context\n const focusParentId = activeTab?.parentThreadId || activeTabId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n // Main row: only show top-level (non-child) tabs\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-2 py-1 border-b border-border gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mode === \"chat\"\n ? mainTabs.map((tab) => {\n // Highlight the parent tab if a child is active\n const isActive =\n tab.id === activeTabId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n role=\"button\"\n tabIndex={0}\n ref={isActive ? activeTabRefCb : undefined}\n onClick={() => setActiveTabId(tab.id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(tab.id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]\",\n isActive\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span className=\"truncate pr-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse\" />\n )}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={10} />\n </button>\n </div>\n );\n })\n : cliTabs.map((id, i) => (\n <div\n key={id}\n role=\"button\"\n tabIndex={0}\n ref={\n id === activeCliTab ? activeTabRefCb : undefined\n }\n onClick={() => setActiveCliTab(id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveCliTab(id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer\",\n id === activeCliTab\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span>Terminal {i + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeCliTab(id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={10} />\n </button>\n </div>\n ))}\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-auto\">\n {mode === \"chat\" && (\n <>\n <IconTooltip content=\"New chat\">\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={14} />\n </button>\n </IconTooltip>\n {toggleHistory && (\n <IconTooltip content=\"Chat history\">\n <button\n onClick={toggleHistory}\n aria-label=\"Chat history\"\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={14} />\n </button>\n </IconTooltip>\n )}\n <DropdownMenu\n open={tabMenuOpen === \"__chat_global\"}\n onOpenChange={(open) =>\n setTabMenuOpen(open ? \"__chat_global\" : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n tabMenuOpen === \"__chat_global\" &&\n \"bg-accent text-foreground\",\n )}\n aria-label=\"Chat tab options\"\n >\n <IconDotsVertical size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => closeTab(activeTabId)}\n >\n Close Tab\n <DropdownMenuShortcut>\n {closeTabHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeOtherTabs(activeTabId)}\n >\n Close Other Tabs\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => closeAllTabs()}>\n Close All Tabs\n <DropdownMenuShortcut>\n {closeAllTabsHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n {mode === \"cli\" && (\n <>\n <IconTooltip content=\"New terminal\">\n <button\n onClick={addCliTab}\n aria-label=\"New terminal\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={14} />\n </button>\n </IconTooltip>\n {availableClis.length > 0 && (\n <DropdownMenu\n open={cliPickerOpen}\n onOpenChange={setCliPickerOpen}\n >\n <DropdownMenuTrigger asChild>\n <button\n aria-label={`Select CLI, currently ${selectedLabel}`}\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n cliPickerOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSettings size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-48\"\n >\n {availableClis.map((cli) => (\n <DropdownMenuItem\n key={cli.command}\n onSelect={() => selectCli(cli.command)}\n className={cn(\n cli.command === selectedCli\n ? \"font-medium\"\n : \"text-muted-foreground\",\n )}\n >\n {cli.command === selectedCli ? (\n <IconCheck size={12} className=\"shrink-0\" />\n ) : (\n <span className=\"w-3\" />\n )}\n {cli.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <DropdownMenu\n open={tabMenuOpen === \"__cli_global\"}\n onOpenChange={(open) =>\n setTabMenuOpen(open ? \"__cli_global\" : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n tabMenuOpen === \"__cli_global\" &&\n \"bg-accent text-foreground\",\n )}\n aria-label=\"Terminal tab options\"\n >\n <IconDotsVertical size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => closeCliTab(activeCliTab)}\n >\n Close Tab\n <DropdownMenuShortcut>\n {closeTabHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeOtherCliTabs(activeCliTab)}\n >\n Close Other Tabs\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeAllCliTabs()}\n >\n Close All Tabs\n <DropdownMenuShortcut>\n {closeAllTabsHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </div>\n </div>\n {/* Sub-agent tab row — shown when the active context has children */}\n {mode === \"chat\" && hasSubTabs && (\n <div className=\"flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setActiveTabId(focusParentId)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(focusParentId),\n )}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeTabId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </div>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n role=\"button\"\n tabIndex={0}\n ref={\n tab.id === activeTabId ? activeTabRefCb : undefined\n }\n onClick={() => setActiveTabId(tab.id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(tab.id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]\",\n tab.id === activeTabId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span className=\"truncate pr-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse\" />\n )}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={8} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()}\n </div>\n ),\n [\n mode,\n renderHeaderActions,\n renderModeButtons,\n chatNotice,\n cliTabs,\n activeCliTab,\n addCliTab,\n closeCliTab,\n closeOtherCliTabs,\n closeAllCliTabs,\n tabMenuOpen,\n availableClis,\n selectedCli,\n selectedLabel,\n selectCli,\n cliPickerOpen,\n closeTabHint,\n closeAllTabsHint,\n ],\n );\n\n return (\n <div\n className={cn(\n \"agent-panel-root flex flex-1 flex-col min-h-0 h-full text-[13px] leading-[1.2] antialiased\",\n className,\n )}\n style={AGENT_PANEL_ROOT_STYLE}\n data-agent-fullscreen={isFullscreen ? \"true\" : undefined}\n >\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly.\n Fullscreen rules center the message stream and composer to a Claude-style\n column while leaving the header bar at full width so the action buttons\n stay pinned to the top corners. */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\" +\n `[data-agent-fullscreen='true'] .agent-thread-content,` +\n `[data-agent-fullscreen='true'] .agent-composer-area{` +\n `max-width:${FULLSCREEN_CONTENT_MAX_PX}px;` +\n `margin-left:auto;margin-right:auto;width:100%;}`,\n }}\n />\n {/* Framework onboarding — appears above the chat/cli/settings tabs\n so it's visible regardless of which tab the user is on. The panel\n hides itself once all required steps are done or the user\n dismisses it. Gated by SHOW_ONBOARDING until the UX is improved. */}\n {SHOW_ONBOARDING && mounted && isDevMode && (\n <Suspense fallback={null}>\n <OnboardingPanel />\n </Suspense>\n )}\n\n {/* Chat view — always mounted to preserve state.\n Header (with tabs + mode buttons) is always visible.\n Chat content is hidden when CLI or resources mode is active.\n The wrapper collapses (no flex-1) when another mode is active\n so it only takes the height of its header. */}\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n mode === \"chat\" ? \"flex-1\" : \"shrink-0\",\n )}\n >\n {mounted && (\n <MultiTabAssistantChat\n apiUrl={apiUrl}\n showHeader={false}\n renderHeader={showHeader ? renderChatHeader : undefined}\n renderOverlay={undefined}\n contentHidden={mode !== \"chat\"}\n emptyStateText={emptyStateText}\n suggestions={suggestions}\n onSwitchToCli={() => switchMode(\"cli\")}\n execMode={isDevMode ? execMode : undefined}\n onExecModeChange={isDevMode ? switchExecMode : undefined}\n storageKey={storageKey}\n />\n )}\n </div>\n\n {/* CLI terminals — dev mode: real terminal, prod mode: prompt to use dev */}\n {isDevMode\n ? mode === \"cli\" &&\n cliTabs.map((id) => (\n <div\n key={id}\n className=\"min-h-0 relative flex-1\"\n style={{\n display: id === activeCliTab ? undefined : \"none\",\n }}\n >\n <Suspense\n fallback={\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n Loading terminal...\n </div>\n }\n >\n <AgentTerminal\n command={selectedCli}\n hideInFrame={false}\n className=\"h-full\"\n style={{ background: \"transparent\" }}\n />\n </Suspense>\n </div>\n ))\n : mode === \"cli\" && (\n <div className=\"flex flex-1 flex-col items-center justify-center min-h-0 px-6 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconTerminal2 className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"text-center max-w-[260px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n CLI requires dev mode\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Run this app locally with{\" \"}\n <code className=\"bg-muted px-1 py-0.5 rounded text-[10px]\">\n pnpm dev\n </code>{\" \"}\n or use{\" \"}\n <span className=\"font-medium text-foreground\">\n Builder.io\n </span>{\" \"}\n to access the CLI terminal.\n </p>\n </div>\n </div>\n )}\n\n {/* Resources view */}\n {mode === \"resources\" && (\n <div className=\"flex-1 min-h-0\">\n <Suspense\n fallback={\n <div className=\"flex h-full flex-col min-h-0\">\n <div className=\"flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <div className=\"h-5 w-16 rounded bg-muted animate-pulse\" />\n <div className=\"h-5 w-14 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n </div>\n }\n >\n <ResourcesPanel />\n </Suspense>\n </div>\n )}\n\n {/* Settings / Setup view */}\n {mode === \"settings\" && (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <Suspense\n fallback={\n <div className=\"p-3 space-y-2\">\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n </div>\n }\n >\n <SettingsPanel\n isDevMode={isDevMode}\n onToggleDevMode={() => setDevMode(!isDevMode)}\n showDevToggle={showDevToggle}\n devAppUrl={devAppUrl}\n />\n </Suspense>\n </div>\n )}\n </div>\n );\n}\n\n// ─── Resize handle ──────────────────────────────────────────────────────────\n\nconst SIDEBAR_STORAGE_KEY = \"agent-native-sidebar-width\";\nconst SIDEBAR_FULLSCREEN_KEY = \"agent-native-sidebar-fullscreen\";\nconst SIDEBAR_MIN = 280;\nconst SIDEBAR_MAX = 700;\nconst SIDEBAR_OVERLAY_Z_INDEX = 70;\nconst SIDEBAR_FULLSCREEN_Z_INDEX = 90;\n/** Max width of the centered chat column in fullscreen mode (Claude-style). */\nconst FULLSCREEN_CONTENT_MAX_PX = 760;\n\nfunction ResizeHandle({\n position,\n onDrag,\n}: {\n position: \"left\" | \"right\";\n onDrag: (delta: number) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n const lastX = useRef(0);\n const onDragRef = useRef(onDrag);\n onDragRef.current = onDrag;\n const GRAB_ZONE = 5; // px on each side of the border\n\n // All drag logic runs via document-level listeners so the 1px-wide\n // element doesn't need to capture pointer events itself.\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n let cursorActive = false;\n\n function onMouseDown(e: MouseEvent) {\n const rect = el!.getBoundingClientRect();\n const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));\n if (dist > GRAB_ZONE) return;\n e.preventDefault();\n dragging.current = true;\n lastX.current = e.clientX;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n\n function onMouseMove(e: MouseEvent) {\n if (dragging.current) {\n const delta = e.clientX - lastX.current;\n lastX.current = e.clientX;\n onDragRef.current(position === \"left\" ? delta : -delta);\n return;\n }\n // Hover cursor\n const rect = el!.getBoundingClientRect();\n const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));\n const near = dist <= GRAB_ZONE;\n if (near && !cursorActive) {\n cursorActive = true;\n document.body.style.cursor = \"col-resize\";\n } else if (!near && cursorActive) {\n cursorActive = false;\n document.body.style.cursor = \"\";\n }\n }\n\n function onMouseUp() {\n if (!dragging.current) return;\n dragging.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n }\n\n document.addEventListener(\"mousedown\", onMouseDown);\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousedown\", onMouseDown);\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n if (cursorActive) document.body.style.cursor = \"\";\n };\n }, [position]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative z-20 shrink-0 w-px touch-none select-none transition-colors\",\n \"bg-border hover:bg-accent active:bg-accent\",\n )}\n style={{ cursor: \"col-resize\" }}\n />\n );\n}\n\n/**\n * Remounts its children whenever the framework's `refresh-screen` tool is\n * invoked. Used inside AgentSidebar so the main content area re-fetches\n * without disturbing the chat sidebar's in-flight state.\n *\n * Two mechanisms work together here:\n *\n * 1. Before the remount, every react-query cache entry is marked stale\n * via `invalidateQueries({ refetchType: \"none\" })`. This does NOT\n * trigger a refetch on its own, so active queries elsewhere (chat\n * sidebar, left nav) keep their current data — they'll refetch only\n * on their next natural trigger.\n * 2. The React `key` then bumps, unmounting and remounting the subtree.\n * On remount, child components re-subscribe to their queries, see\n * the data is stale, and refetch — regardless of configured\n * `staleTime`. This is what makes the dashboard pick up the agent's\n * edits even when the query uses `staleTime: 30_000` or similar.\n */\n/**\n * Syncs the current URL (pathname + search + hash) to application_state\n * under `__url__`, and processes one-shot URL-update commands the agent\n * writes to `__set_url__`. Lives inside AgentSidebar so every framework\n * template gets URL visibility + URL-write capability for its agent\n * without per-template wiring.\n *\n * Two directions:\n * UI → state — on route change, write `{ pathname, search, hash,\n * searchParams }` to `__url__`. The production agent reads\n * this and includes it in the auto-injected `<current-url>`\n * block, so the agent always knows what page the user is\n * on, including filter/search params like `?f_date=2026-01`.\n *\n * state → UI — the framework's `set-search-params` / `set-url-path`\n * tools write a command to `__set_url__`. This hook reads\n * the command, applies it via react-router, then deletes\n * the key. The UI reacts in one tick, no page reload.\n */\nfunction URLSync() {\n const location = useLocation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n\n // Outbound: write the current URL to app-state whenever it changes.\n React.useEffect(() => {\n const searchParams: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(location.search).entries()) {\n searchParams[k] = v;\n }\n const body = {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n searchParams,\n };\n fetch(agentNativePath(\"/_agent-native/application-state/__url__\"), {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }).catch(() => {});\n }, [location.pathname, location.search, location.hash]);\n\n // Inbound: poll for URL-update commands from the agent. We piggyback on\n // the same 2-second cadence useDbSync uses so there's no extra timer.\n const { data: command } = useQuery({\n queryKey: [\"__set_url__\"],\n queryFn: async () => {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/__set_url__\"),\n );\n if (!res.ok || res.status === 204) return null;\n const text = await res.text();\n if (!text) return null;\n const data = JSON.parse(text);\n return data ? { ...data, _ts: Date.now() } : null;\n } catch {\n return null;\n }\n },\n refetchInterval: 2_000,\n refetchIntervalInBackground: true,\n structuralSharing: false,\n retry: false,\n });\n\n React.useEffect(() => {\n if (!command) return;\n // Delete the one-shot command before applying so duplicate events\n // don't cause repeated navigation.\n fetch(agentNativePath(\"/_agent-native/application-state/__set_url__\"), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n const cmd = command as {\n pathname?: string;\n searchParams?: Record<string, string | null>;\n mergeSearchParams?: boolean;\n hash?: string;\n };\n try {\n const current = new URL(window.location.href);\n const nextPath = cmd.pathname ?? current.pathname;\n const nextSearch =\n cmd.mergeSearchParams !== false\n ? new URLSearchParams(current.search)\n : new URLSearchParams();\n if (cmd.searchParams) {\n for (const [k, v] of Object.entries(cmd.searchParams)) {\n if (v === null || v === \"\") nextSearch.delete(k);\n else nextSearch.set(k, v);\n }\n }\n const nextHash = cmd.hash ?? current.hash;\n const qs = nextSearch.toString();\n const url = nextPath + (qs ? `?${qs}` : \"\") + (nextHash || \"\");\n // Skip the navigation if the URL is already at the target state —\n // avoids needless react-router work and any revalidation side-effects\n // that come with it.\n // Mark that the agent just wrote the URL so consumers (e.g. a\n // dashboard restoring saved filter defaults) can skip any auto-\n // restore that would clobber the agent's change. Set this BEFORE\n // the same-URL short-circuit — a no-op nav is still an explicit\n // \"agent authored this state\" signal that consumers depend on.\n try {\n sessionStorage.setItem(\"__agentUrlAppliedAt__\", String(Date.now()));\n } catch {\n // sessionStorage unavailable — not fatal.\n }\n const currentUrl =\n current.pathname + (current.search || \"\") + (current.hash || \"\");\n if (url === currentUrl) {\n queryClient.setQueryData([\"__set_url__\"], null);\n return;\n }\n // Replace rather than push so repeated agent URL updates don't\n // clutter the history stack and can't trigger extra remounts from\n // router navigation lifecycle.\n navigate(url, { replace: true });\n } catch {\n // Malformed command — ignore.\n }\n queryClient.setQueryData([\"__set_url__\"], null);\n }, [command, navigate, queryClient]);\n\n return null;\n}\nfunction ScreenRefreshBoundary({ children }: { children: React.ReactNode }) {\n const key = useScreenRefreshKey();\n const queryClient = useQueryClient();\n const lastKeyRef = React.useRef(key);\n if (key !== lastKeyRef.current) {\n lastKeyRef.current = key;\n // Mark every cached query stale without kicking off a refetch. The\n // subtree-level refetches happen naturally when the new tree mounts\n // below and child components re-subscribe.\n queryClient.invalidateQueries({ refetchType: \"none\" });\n }\n return <React.Fragment key={key}>{children}</React.Fragment>;\n}\n\nclass AgentPanelErrorBoundary extends React.Component<\n { children: React.ReactNode; onReset: () => void },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(\"[agent-native] Agent panel crashed\", error, errorInfo);\n }\n\n render() {\n if (!this.state.error) return this.props.children;\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6 text-center\">\n <div className=\"max-w-[260px] space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n Agent panel hit an internal UI error.\n </p>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n The app is still usable. Reset the panel to reload the chat UI.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n onClick={() => {\n this.setState({ error: null });\n this.props.onReset();\n }}\n >\n Reset agent panel\n </button>\n </div>\n );\n }\n}\n\nexport function AgentPanel(props: AgentPanelProps) {\n const [resetKey, setResetKey] = useState(0);\n return (\n <TooltipProvider delayDuration={200}>\n <AgentPanelErrorBoundary onReset={() => setResetKey((key) => key + 1)}>\n <AgentPanelInner key={resetKey} {...props} />\n </AgentPanelErrorBoundary>\n </TooltipProvider>\n );\n}\n\n// ─── AgentSidebar — wraps content with a toggleable agent panel ─────────────\n\nexport interface AgentSidebarProps {\n children: React.ReactNode;\n /** Placeholder text for the empty chat state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Initial sidebar width in pixels. Mount-only; user resize and a saved\n * localStorage value override this. Default: 380 */\n defaultSidebarWidth?: number;\n /** @deprecated Use `defaultSidebarWidth` — this prop is mount-only. */\n sidebarWidth?: number;\n /** Which side the sidebar appears on. Default: \"right\" */\n position?: \"left\" | \"right\";\n /** Whether the sidebar starts open. Default: false */\n defaultOpen?: boolean;\n /** Animate the mobile overlay in a sheet-style slide transition. */\n animateMobile?: boolean;\n}\n\n/**\n * Wraps app content with a toggleable agent sidebar.\n * Use AgentToggleButton in your header to open/close it.\n */\nexport function AgentSidebar({\n children,\n emptyStateText = \"How can I help you?\",\n suggestions,\n defaultSidebarWidth,\n sidebarWidth,\n position = \"right\",\n defaultOpen = false,\n animateMobile = false,\n}: AgentSidebarProps) {\n const initialWidth = defaultSidebarWidth ?? sidebarWidth ?? 380;\n const [open, setOpen] = useState(() =>\n getInitialAgentSidebarOpen(defaultOpen),\n );\n const [presentationMode, setPresentationMode] = useState(false);\n const [width, setWidth] = useState(initialWidth);\n const [fullscreen, setFullscreen] = useState(() => {\n // Force-disable on mobile: a Claude-style centered column makes no sense\n // when the sidebar already covers most of the viewport.\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 767px)\").matches\n ) {\n return false;\n }\n try {\n return localStorage.getItem(SIDEBAR_FULLSCREEN_KEY) === \"true\";\n } catch {\n return false;\n }\n });\n\n // Track mobile viewport so we can switch to overlay mode.\n const [isMobile, setIsMobile] = useState(\n () =>\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 767px)\").matches,\n );\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 767px)\");\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, []);\n useEffect(() => {\n try {\n const saved = localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (saved) {\n const n = parseInt(saved, 10);\n if (n >= SIDEBAR_MIN && n <= SIDEBAR_MAX) setWidth(n);\n }\n } catch {}\n }, []);\n\n const setOpenPersisted = useCallback(\n (next: boolean | ((prev: boolean) => boolean)) => {\n setOpen((prev) => {\n const value = typeof next === \"function\" ? next(prev) : next;\n try {\n localStorage.setItem(SIDEBAR_OPEN_KEY, String(value));\n } catch {}\n return value;\n });\n },\n [],\n );\n\n const toggleFullscreen = useCallback(() => {\n setFullscreen((prev) => {\n const next = !prev;\n try {\n localStorage.setItem(SIDEBAR_FULLSCREEN_KEY, String(next));\n } catch {}\n return next;\n });\n }, []);\n\n // Track whether the frame is controlling the sidebar (code mode = frame active).\n // Default to true when inside an iframe — assume the frame sidebar is active\n // until told otherwise. This prevents both sidebars flashing after hot reloads.\n const [frameCodeMode, setFrameCodeMode] = useState(\n () => typeof window !== \"undefined\" && window.parent !== window,\n );\n\n useEffect(() => {\n const toggleHandler = () => {\n if (frameCodeMode && window.parent !== window) {\n // Forward toggle to frame parent — the frame sidebar handles it\n window.parent.postMessage(\n { type: \"agentNative.toggleSidebar\" },\n parentFrameTargetOrigin(),\n );\n } else {\n setOpenPersisted((prev) => !prev);\n }\n };\n const openHandler = () => {\n if (frameCodeMode && window.parent !== window) {\n window.parent.postMessage(\n { type: \"agentNative.toggleSidebar\", data: { open: true } },\n parentFrameTargetOrigin(),\n );\n } else {\n setOpenPersisted(true);\n }\n };\n window.addEventListener(\"agent-panel:toggle\", toggleHandler);\n window.addEventListener(\"agent-panel:open\", openHandler);\n return () => {\n window.removeEventListener(\"agent-panel:toggle\", toggleHandler);\n window.removeEventListener(\"agent-panel:open\", openHandler);\n };\n }, [setOpenPersisted, frameCodeMode]);\n\n // Listen for sidebar mode commands from the frame parent.\n // When frame is in \"code\" mode, hide the app sidebar.\n // When frame is in \"app\" mode, show the app sidebar, sync width and panel mode.\n useEffect(() => {\n if (window.parent === window) return; // Not in an iframe\n\n function handleMessage(event: MessageEvent) {\n if (event.data?.type !== \"agentNative.sidebarMode\") return;\n if (event.source !== window.parent || !isTrustedFrameMessage(event))\n return;\n const {\n mode,\n appMode,\n width: frameWidth,\n open: frameOpen,\n } = event.data.data || {};\n if (mode === \"code\") {\n // Frame is showing its own sidebar — hide the app's\n setFrameCodeMode(true);\n setOpenPersisted(false);\n } else if (mode === \"app\") {\n // Frame deferred to the app — show and sync width + mode\n setFrameCodeMode(false);\n if (frameOpen !== false) {\n setOpenPersisted(true);\n }\n if (\n frameWidth &&\n frameWidth >= SIDEBAR_MIN &&\n frameWidth <= SIDEBAR_MAX\n ) {\n setWidth(frameWidth);\n }\n // Sync the panel mode from frame tab selection\n if (\n appMode === \"cli\" ||\n appMode === \"resources\" ||\n appMode === \"chat\"\n ) {\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: appMode },\n }),\n );\n }\n }\n }\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [setOpenPersisted]);\n\n // Cmd+I / Ctrl+I to focus the agent chat. If the user has selected text,\n // capture it into application_state under `pending-selection-context` so\n // the agent's next turn includes it as immediate context to act on.\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"i\") {\n e.preventDefault();\n let selectionText = \"\";\n try {\n selectionText = window.getSelection()?.toString().trim() ?? \"\";\n } catch {}\n if (selectionText) {\n fetch(\n agentNativePath(\n \"/_agent-native/application-state/pending-selection-context\",\n ),\n {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n text: selectionText,\n capturedAt: Date.now(),\n }),\n },\n ).catch(() => {});\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-attached\", {\n detail: { text: selectionText, length: selectionText.length },\n }),\n );\n }\n focusAgentChat();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n // Hide sidebar during presentation mode\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.data?.type !== \"agentNative.presentationMode\") return;\n if (event.source !== window.parent || !isTrustedFrameMessage(event))\n return;\n setPresentationMode(event.data.data?.active === true);\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, []);\n\n const handleDrag = useCallback((delta: number) => {\n setWidth((prev) => {\n const next = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, prev + delta));\n try {\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(next));\n } catch {}\n return next;\n });\n }, []);\n\n const isLeft = position === \"left\";\n // Fullscreen only applies on desktop — on mobile the existing overlay is\n // already viewport-covering, so the maximize button is hidden and the\n // mounted state ignores any persisted value.\n const effectiveFullscreen = fullscreen && !isMobile;\n // On desktop the resize handle is also the visual divider. Avoid painting a\n // second panel border next to it.\n const showResizeHandle = !isMobile && !effectiveFullscreen && open;\n\n // On mobile the sidebar floats as a fixed overlay so the content below isn't\n // squashed. On desktop it participates in the flex layout as before, except\n // in fullscreen mode where it overlays the entire viewport (Claude-style).\n let panelStyle: React.CSSProperties;\n if (isMobile) {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n position: \"fixed\",\n top: 0,\n [isLeft ? \"left\" : \"right\"]: 0,\n height: \"100%\",\n width,\n maxWidth: \"85vw\",\n maxHeight: \"100vh\",\n zIndex: SIDEBAR_OVERLAY_Z_INDEX,\n background: \"hsl(var(--background))\",\n borderLeft: isLeft ? \"none\" : \"1px solid hsl(var(--border))\",\n borderRight: isLeft ? \"1px solid hsl(var(--border))\" : \"none\",\n display: animateMobile || open ? \"flex\" : \"none\",\n transform: animateMobile\n ? open\n ? \"translateX(0)\"\n : `translateX(${isLeft ? \"-\" : \"\"}calc(100% + 1px))`\n : undefined,\n pointerEvents: animateMobile && !open ? \"none\" : undefined,\n willChange: animateMobile ? \"transform\" : undefined,\n };\n } else if (effectiveFullscreen) {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n position: \"fixed\",\n inset: 0,\n width: \"100%\",\n maxHeight: \"100vh\",\n zIndex: SIDEBAR_FULLSCREEN_Z_INDEX,\n background: \"hsl(var(--background))\",\n display: open ? \"flex\" : \"none\",\n };\n } else {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n width,\n maxHeight: \"100vh\",\n borderLeft:\n isLeft || showResizeHandle ? \"none\" : \"1px solid hsl(var(--border))\",\n borderRight:\n !isLeft || showResizeHandle ? \"none\" : \"1px solid hsl(var(--border))\",\n display: open ? \"flex\" : \"none\",\n };\n }\n\n // Always render the sidebar panel (even when closed) so MultiTabAssistantChat\n // stays mounted and can receive messages (e.g. from voice dictation) while\n // the sidebar is visually hidden. When the user opens the sidebar they'll see\n // any in-progress or completed conversations.\n const sidebar = (\n <>\n {showResizeHandle && !isLeft && (\n <ResizeHandle position={position} onDrag={handleDrag} />\n )}\n <div\n className={cn(\n \"agent-sidebar-panel flex shrink-0 flex-col overflow-hidden text-[13px] leading-[1.2] antialiased\",\n animateMobile &&\n isMobile &&\n \"shadow-2xl transition-transform duration-[260ms] ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none\",\n )}\n style={panelStyle}\n inert={isMobile && !open ? true : undefined}\n aria-hidden={isMobile && !open ? true : undefined}\n >\n <AgentPanel\n emptyStateText={emptyStateText}\n suggestions={suggestions}\n onCollapse={() => setOpenPersisted(false)}\n isFullscreen={effectiveFullscreen}\n onToggleFullscreen={isMobile ? undefined : toggleFullscreen}\n />\n </div>\n {showResizeHandle && isLeft && (\n <ResizeHandle position={position} onDrag={handleDrag} />\n )}\n </>\n );\n\n return (\n <div className=\"flex min-w-0 flex-1 h-screen overflow-hidden\">\n {/* Mobile backdrop — tapping it closes the sidebar */}\n {isMobile && !presentationMode && (animateMobile || open) && (\n <div\n className={cn(\n \"fixed inset-0 bg-black/40\",\n animateMobile &&\n \"transition-opacity duration-200 motion-reduce:transition-none\",\n animateMobile && !open && \"pointer-events-none opacity-0\",\n animateMobile && open && \"opacity-100\",\n )}\n style={{ zIndex: SIDEBAR_OVERLAY_Z_INDEX - 1 }}\n onClick={() => setOpenPersisted(false)}\n />\n )}\n {/* URLSync writes the current URL to application-state so the agent\n sees what page/filters the user is on, and applies URL-update\n commands the agent writes via `set-search-params` / `set-url`. */}\n <URLSync />\n {isLeft && !presentationMode ? sidebar : null}\n <div className=\"flex flex-1 flex-col overflow-auto min-w-0\">\n {/* Screen-refresh key: the agent's `refresh-screen` tool bumps this\n counter, remounting only the main content subtree so it re-fetches\n its data. The sidebar above stays mounted, preserving chat state. */}\n <ScreenRefreshBoundary>{children}</ScreenRefreshBoundary>\n </div>\n {!isLeft && !presentationMode ? sidebar : null}\n </div>\n );\n}\n\n/**\n * Focus the agent chat composer input.\n * Opens the sidebar if closed, then focuses the text input.\n */\nexport function focusAgentChat() {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n // Wait for sidebar to render, then focus the composer\n requestAnimationFrame(() => {\n const panel = document.querySelector(\".agent-sidebar-panel\");\n if (!panel) return;\n const prosemirror = panel.querySelector(\n \".ProseMirror\",\n ) as HTMLElement | null;\n if (prosemirror) {\n prosemirror.focus();\n return;\n }\n const textarea = panel.querySelector(\"textarea\") as HTMLElement | null;\n if (textarea) textarea.focus();\n });\n}\n\n/**\n * Button to toggle the agent sidebar. Place this in your app's header/toolbar.\n * Dispatches a custom event that AgentSidebar listens for.\n */\nexport function AgentToggleButton({ className }: { className?: string }) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() =>\n window.dispatchEvent(new Event(\"agent-panel:toggle\"))\n }\n className={cn(\n \"ml-1.5 flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n className,\n )}\n >\n <AgentNativeIcon size={22} />\n </button>\n </TooltipTrigger>\n <TooltipContent>Toggle agent</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentPanel.js","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentPanel — unified agent component with chat, CLI, and workspace modes.\n *\n * A self-contained panel with no layout opinions — drop it into a sidebar,\n * popover, dialog, full page, or any container. It fills its parent via\n * flex and min-h-0.\n *\n * Features:\n * - Chat mode: assistant-ui powered chat with tool calls\n * - CLI mode: embedded xterm.js terminal (dev mode only)\n * - Toggle between modes via header buttons\n *\n * Usage:\n * // In a sidebar\n * <div style={{ width: 380 }}><AgentPanel /></div>\n *\n * // In a popover\n * <Popover><AgentPanel suggestions={[...]} /></Popover>\n *\n * // Full page\n * <AgentPanel className=\"h-screen\" />\n */\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n lazy,\n Suspense,\n startTransition,\n} from \"react\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n normalizeTooltipText,\n} from \"./components/ui/tooltip.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from \"./components/ui/dropdown-menu.js\";\nimport {\n IconMessageCircle,\n IconTerminal2,\n IconSettings,\n IconLayoutSidebarRightCollapse,\n IconLayoutGrid,\n IconCheck,\n IconPlus,\n IconFolder,\n IconX,\n IconClockHour3,\n IconDotsVertical,\n IconHistory,\n IconTrash,\n IconArrowsMaximize,\n IconArrowsMinimize,\n} from \"@tabler/icons-react\";\nimport { AgentNativeIcon } from \"./components/icons/AgentNativeIcon.js\";\nimport { FeedbackButton } from \"./FeedbackButton.js\";\nimport {\n MultiTabAssistantChat,\n type MultiTabAssistantChatHeaderProps,\n} from \"./MultiTabAssistantChat.js\";\nimport type { AssistantChatProps } from \"./AssistantChat.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { useScreenRefreshKey } from \"./use-db-sync.js\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useLocation, useNavigate } from \"react-router\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { getFrameOrigin, isTrustedFrameMessage } from \"./frame.js\";\nimport {\n getInitialAgentSidebarOpen,\n SIDEBAR_OPEN_KEY,\n} from \"./agent-sidebar-state.js\";\n\n// Lazy-load AgentTerminal to avoid bundling xterm.js when not needed\nconst AgentTerminal = lazy(() =>\n import(\"./terminal/index.js\").then((m) => ({ default: m.AgentTerminal })),\n);\n\nfunction parentFrameTargetOrigin(): string {\n return getFrameOrigin() ?? window.location.origin;\n}\n\n// Lazy-load ResourcesPanel to avoid bundling when not needed\nconst ResourcesPanel = lazy(() =>\n import(\"./resources/ResourcesPanel.js\").then((m) => ({\n default: m.ResourcesPanel,\n })),\n);\n\n// Lazy-load SettingsPanel to avoid bundling when not needed\nconst SettingsPanel = lazy(() =>\n import(\"./settings/index.js\").then((m) => ({\n default: m.SettingsPanel,\n })),\n);\n\n// Lazy-load OnboardingPanel — only pulled in when onboarding is active.\nconst OnboardingPanel = lazy(() =>\n import(\"./onboarding/OnboardingPanel.js\").then((m) => ({\n default: m.OnboardingPanel,\n })),\n);\n\n// Lazy-load SetupButton — the header entry-point that re-opens the\n// onboarding panel after the user has dismissed it.\nconst SetupButton = lazy(() =>\n import(\"./onboarding/SetupButton.js\").then((m) => ({\n default: m.SetupButton,\n })),\n);\n\n// Setup/onboarding widget is hidden until the UX is improved.\n// Flip to `true` to restore the SetupButton in the header and the\n// OnboardingPanel above the chat.\nconst SHOW_ONBOARDING = false;\n\nconst CLI_STORAGE_KEY = \"agent-native-cli-command\";\nconst CLI_DEFAULT = \"claude\";\nconst EXEC_MODE_KEY = \"agent-native-exec-mode\";\ntype ExecMode = \"build\" | \"plan\";\ntype PanelMode = \"chat\" | \"cli\" | \"resources\" | \"settings\";\nconst AGENT_PANEL_FONT_FAMILY =\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\nconst AGENT_PANEL_ROOT_STYLE = {\n fontFamily: AGENT_PANEL_FONT_FAMILY,\n fontSize: 13,\n lineHeight: 1.2,\n} satisfies React.CSSProperties;\nconst AGENT_PANEL_HEADER_CLASS =\n \"relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2 border-b border-border\";\nconst AGENT_PANEL_HEADER_STYLE = {\n paddingLeft: 8,\n paddingRight: 8,\n} satisfies React.CSSProperties;\nconst AGENT_PANEL_CONTROL_STYLE = {\n fontSize: 12,\n lineHeight: 1,\n} satisfies React.CSSProperties;\nconst ACTIVATE_KEYS = new Set([\"Enter\", \" \"]);\n\ninterface AvailableCli {\n command: string;\n label: string;\n available: boolean;\n}\n\nfunction useAvailableClis() {\n const [clis, setClis] = useState<AvailableCli[]>([]);\n useEffect(() => {\n // Try to fetch available CLIs — endpoint is provided by the terminal plugin.\n // Returns 404 gracefully when the plugin isn't loaded.\n fetch(agentNativePath(\"/_agent-native/available-clis\"))\n .then((r) => (r.ok ? r.json() : []))\n .then((data) => setClis(Array.isArray(data) ? data : []))\n .catch(() => {});\n }, []);\n return clis;\n}\n\nfunction useCliSelection(keyPrefix: string) {\n const cliKey = `${CLI_STORAGE_KEY}${keyPrefix}`;\n const [selected, setSelected] = useState(CLI_DEFAULT);\n useEffect(() => {\n try {\n const saved = localStorage.getItem(cliKey);\n if (saved) setSelected(saved);\n } catch {}\n }, [cliKey]);\n const select = (cmd: string) => {\n setSelected(cmd);\n try {\n localStorage.setItem(cliKey, cmd);\n } catch {}\n };\n return [selected, select] as const;\n}\n\n// Detect dev mode at build time (Vite replaces this)\nconst IS_DEV: boolean = import.meta.env?.DEV === true;\n\n// ─── Settings panel components moved to ./settings/ ────────────────────────\n\nfunction IconTooltip({\n content,\n children,\n}: {\n content: string;\n children: React.ReactNode;\n}) {\n return (\n <TooltipPrimitive.Provider delayDuration={250}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side=\"bottom\"\n sideOffset={8}\n className=\"z-[230] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md\"\n >\n {normalizeTooltipText(content)}\n <TooltipPrimitive.Arrow className=\"fill-popover\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n}\n\n// AgentSettingsPopover and AgentsSection moved to ./settings/\n\n// ─── AgentPanel ─────────────────────────────────────────────────────────────\n\nexport interface AgentPanelProps extends Omit<\n AssistantChatProps,\n \"onSwitchToCli\"\n> {\n /** Initial mode. Default: \"chat\" */\n defaultMode?: \"chat\" | \"cli\";\n /** CSS class for the outer container */\n className?: string;\n /** Called when the user clicks the collapse button. If provided, a collapse button appears in the header. */\n onCollapse?: () => void;\n /** Whether the panel is currently in fullscreen (Claude-style centered) mode. */\n isFullscreen?: boolean;\n /** Called when the user clicks the maximize/minimize button. If provided, the button appears next to the collapse button. */\n onToggleFullscreen?: () => void;\n /** URL of the app being developed (shown as \"Open app in new tab\" in settings). Set by frame. */\n devAppUrl?: string;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Optional notice rendered below the main header while Chat mode is active. */\n chatNotice?: React.ReactNode;\n}\n\nfunction useClientOnly() {\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n return mounted;\n}\n\nfunction AgentPanelInner({\n defaultMode = \"chat\",\n className,\n apiUrl,\n emptyStateText,\n suggestions,\n showHeader = true,\n onCollapse,\n isFullscreen,\n onToggleFullscreen,\n devAppUrl,\n storageKey,\n chatNotice,\n}: AgentPanelProps) {\n const mounted = useClientOnly();\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const execModeKey = `${EXEC_MODE_KEY}${keyPrefix}`;\n const panelModeKey = `agent-native-panel-mode${keyPrefix}`;\n const isMac = useMemo(\n () =>\n typeof navigator !== \"undefined\" &&\n /Mac|iPhone|iPad/.test(navigator.userAgent),\n [],\n );\n const closeTabHint = isMac ? \"\\u2303W\" : \"Alt+W\";\n const closeAllTabsHint = isMac ? \"\\u2303\\u2325W\" : \"Ctrl+Alt+W\";\n\n const [execMode, setExecMode] = useState<ExecMode>(() => {\n try {\n const saved = localStorage.getItem(execModeKey);\n if (saved === \"build\" || saved === \"plan\") return saved;\n } catch {}\n return \"build\";\n });\n\n const switchExecMode = useCallback(\n (next: ExecMode) => {\n setExecMode(next);\n try {\n localStorage.setItem(execModeKey, next);\n } catch {}\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:exec-mode-change\", {\n detail: { mode: next },\n }),\n );\n },\n [execModeKey],\n );\n\n const [mode, setMode] = useState<PanelMode>(() => {\n try {\n const saved = localStorage.getItem(panelModeKey);\n if (\n saved === \"chat\" ||\n saved === \"cli\" ||\n saved === \"resources\" ||\n saved === \"settings\"\n )\n return saved;\n } catch {}\n return defaultMode;\n });\n useEffect(() => {\n try {\n localStorage.setItem(panelModeKey, mode);\n } catch {}\n }, [mode, panelModeKey]);\n const switchMode = useCallback((m: PanelMode) => {\n startTransition(() => setMode(m));\n }, []);\n const activateOnKeyDown = useCallback(\n (activate: () => void) => (event: React.KeyboardEvent) => {\n if (!ACTIVATE_KEYS.has(event.key)) return;\n event.preventDefault();\n activate();\n },\n [],\n );\n\n // Listen for mode changes from the frame parent (via AgentSidebar)\n useEffect(() => {\n function handler(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (detail?.mode) switchMode(detail.mode);\n }\n window.addEventListener(\"agent-panel:set-mode\", handler);\n return () => window.removeEventListener(\"agent-panel:set-mode\", handler);\n }, [switchMode]);\n\n // Open settings tab when requested (replaces the old popover open event)\n useEffect(() => {\n function handleOpenSettings() {\n switchMode(\"settings\");\n }\n window.addEventListener(\"agent-panel:open-settings\", handleOpenSettings);\n return () =>\n window.removeEventListener(\n \"agent-panel:open-settings\",\n handleOpenSettings,\n );\n }, [switchMode]);\n\n // CLI terminal tabs (ephemeral — not persisted to SQL)\n const [cliTabs, setCliTabs] = useState<string[]>([\"cli-1\"]);\n const [activeCliTab, setActiveCliTab] = useState(\"cli-1\");\n const cliCounter = useRef(1);\n\n const addCliTab = useCallback(() => {\n const id = `cli-${++cliCounter.current}`;\n setCliTabs((prev) => [...prev, id]);\n setActiveCliTab(id);\n }, []);\n\n const closeCliTab = useCallback(\n (id: string) => {\n setCliTabs((prev) => {\n if (prev.length <= 1) {\n // Last tab — replace with a new one (acts as \"clear\")\n const newId = `cli-${++cliCounter.current}`;\n setActiveCliTab(newId);\n return [newId];\n }\n const next = prev.filter((t) => t !== id);\n if (id === activeCliTab) {\n const idx = prev.indexOf(id);\n setActiveCliTab(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n },\n [activeCliTab],\n );\n\n const closeOtherCliTabs = useCallback((id: string) => {\n setCliTabs([id]);\n setActiveCliTab(id);\n }, []);\n\n const closeAllCliTabs = useCallback(() => {\n const id = `cli-${++cliCounter.current}`;\n setCliTabs([id]);\n setActiveCliTab(id);\n }, []);\n\n // Tab close shortcuts. Avoid Cmd+W (browser/OS) and (on Windows) Ctrl+W.\n // Mac: Ctrl+W → close tab, Ctrl+Alt+W → close all\n // Windows/Linux: Alt+W → close tab, Ctrl+Alt+W → close all\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key.toLowerCase() !== \"w\" || e.metaKey || e.shiftKey) return;\n const isCloseAll = e.ctrlKey && e.altKey;\n const isCloseOne = isMac\n ? e.ctrlKey && !e.altKey\n : e.altKey && !e.ctrlKey;\n if (!isCloseAll && !isCloseOne) return;\n e.preventDefault();\n if (mode === \"chat\") {\n window.dispatchEvent(\n new CustomEvent(\n isCloseAll\n ? \"agent-chat:close-all-tabs\"\n : \"agent-chat:close-current-tab\",\n ),\n );\n } else if (mode === \"cli\") {\n if (isCloseAll) closeAllCliTabs();\n else if (activeCliTab) closeCliTab(activeCliTab);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [mode, activeCliTab, closeCliTab, closeAllCliTabs, isMac]);\n\n const availableClis = useAvailableClis();\n const [selectedCli, selectCli] = useCliSelection(keyPrefix);\n const selectedLabel =\n availableClis.find((c) => c.command === selectedCli)?.label || selectedCli;\n const { isDevMode, canToggle, setDevMode } = useDevMode(apiUrl);\n\n // Notify frame when dev mode changes — use both a local CustomEvent (for\n // when AgentPanel is rendered directly in the frame) AND postMessage (for\n // when AgentPanel is inside the iframe and needs to cross the boundary).\n const prevIsDevMode = useRef(isDevMode);\n useEffect(() => {\n if (prevIsDevMode.current !== isDevMode) {\n prevIsDevMode.current = isDevMode;\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:dev-mode-change\", {\n detail: { isDevMode },\n }),\n );\n // Cross iframe boundary to the frame parent\n if (window.parent !== window) {\n window.parent.postMessage(\n { type: \"agentNative.devModeChange\", data: { isDevMode } },\n parentFrameTargetOrigin(),\n );\n }\n }\n }, [isDevMode]);\n\n const isLocalhost =\n mounted &&\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname === \"127.0.0.1\" ||\n window.location.hostname === \"::1\");\n const showDevToggle = canToggle && isLocalhost;\n\n const renderModeButtons = useCallback(\n (activeMode: PanelMode) => (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"chat\")}\n aria-label=\"Chat mode\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"chat\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconMessageCircle size={14} />\n Chat\n </button>\n </TooltipTrigger>\n <TooltipContent>Chat mode</TooltipContent>\n </Tooltip>\n {isDevMode && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"cli\")}\n aria-label=\"CLI terminal mode\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"cli\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconTerminal2 size={14} />\n CLI\n </button>\n </TooltipTrigger>\n <TooltipContent>CLI terminal mode</TooltipContent>\n </Tooltip>\n )}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"resources\")}\n aria-label=\"Workspace files, agents, skills, and tasks\"\n className={cn(\n \"flex items-center gap-1 rounded-md px-2 py-1 text-[12px] leading-none\",\n activeMode === \"resources\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={AGENT_PANEL_CONTROL_STYLE}\n >\n <IconLayoutGrid size={14} />\n Workspace\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Workspace files, agents, skills, and tasks\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => switchMode(\"settings\")}\n aria-label=\"Setup and configuration\"\n className={cn(\n \"flex items-center justify-center rounded-md px-1.5 py-1\",\n activeMode === \"settings\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n <IconSettings size={14} />\n </button>\n </TooltipTrigger>\n <TooltipContent>Setup and configuration</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n ),\n [isDevMode],\n );\n\n const renderHeaderActions = useCallback(\n () => (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {SHOW_ONBOARDING && isDevMode && (\n <Suspense fallback={null}>\n <SetupButton />\n </Suspense>\n )}\n <FeedbackButton variant=\"icon\" side=\"bottom\" align=\"end\" />\n {onToggleFullscreen && (\n <IconTooltip\n content={isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n >\n <button\n onClick={onToggleFullscreen}\n aria-label={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n {isFullscreen ? (\n <IconArrowsMinimize size={14} />\n ) : (\n <IconArrowsMaximize size={14} />\n )}\n </button>\n </IconTooltip>\n )}\n {onCollapse && (\n <IconTooltip content=\"Collapse sidebar\">\n <button\n onClick={onCollapse}\n aria-label=\"Collapse sidebar\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconLayoutSidebarRightCollapse size={14} />\n </button>\n </IconTooltip>\n )}\n </div>\n ),\n [onCollapse, isDevMode, onToggleFullscreen, isFullscreen],\n );\n\n const [tabMenuOpen, setTabMenuOpen] = useState<string | null>(null);\n const [cliPickerOpen, setCliPickerOpen] = useState(false);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n const activeTabRefCb = useCallback((el: HTMLDivElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n // Use rAF so layout is settled after React commit\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left) {\n container.scrollLeft += tabRect.left - containerRect.left;\n } else if (tabRect.right > containerRect.right) {\n container.scrollLeft += tabRect.right - containerRect.right;\n }\n });\n }, []);\n\n const renderChatHeader = useCallback(\n ({\n tabs,\n activeTabId,\n setActiveTabId,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n showHistory,\n toggleHistory,\n }: MultiTabAssistantChatHeaderProps) => (\n <div className=\"flex flex-col shrink-0\">\n {/* Top bar: mode buttons + actions */}\n <div\n className={AGENT_PANEL_HEADER_CLASS}\n style={AGENT_PANEL_HEADER_STYLE}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {renderModeButtons(mode)}\n </div>\n <div className=\"flex items-center gap-0.5\">\n {renderHeaderActions()}\n </div>\n </div>\n {mode === \"chat\" && chatNotice ? (\n <div className=\"border-b border-border\">{chatNotice}</div>\n ) : null}\n {/* Tab bar: always visible for chat and CLI */}\n {(mode === \"chat\" || mode === \"cli\") &&\n (() => {\n // Compute parent/child tab groups for the sub-tab bar\n const activeTab = tabs.find((t) => t.id === activeTabId);\n // The \"focus parent\" is the parent thread for the active context\n const focusParentId = activeTab?.parentThreadId || activeTabId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n // Main row: only show top-level (non-child) tabs\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-2 py-1 border-b border-border gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mode === \"chat\"\n ? mainTabs.map((tab) => {\n // Highlight the parent tab if a child is active\n const isActive =\n tab.id === activeTabId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n role=\"button\"\n tabIndex={0}\n ref={isActive ? activeTabRefCb : undefined}\n onClick={() => setActiveTabId(tab.id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(tab.id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]\",\n isActive\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span className=\"truncate pr-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse\" />\n )}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={10} />\n </button>\n </div>\n );\n })\n : cliTabs.map((id, i) => (\n <div\n key={id}\n role=\"button\"\n tabIndex={0}\n ref={\n id === activeCliTab ? activeTabRefCb : undefined\n }\n onClick={() => setActiveCliTab(id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveCliTab(id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer\",\n id === activeCliTab\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span>Terminal {i + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeCliTab(id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={10} />\n </button>\n </div>\n ))}\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-auto\">\n {mode === \"chat\" && (\n <>\n <IconTooltip content=\"New chat\">\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={14} />\n </button>\n </IconTooltip>\n {toggleHistory && (\n <IconTooltip content=\"Chat history\">\n <button\n onClick={toggleHistory}\n aria-label=\"Chat history\"\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={14} />\n </button>\n </IconTooltip>\n )}\n <DropdownMenu\n open={tabMenuOpen === \"__chat_global\"}\n onOpenChange={(open) =>\n setTabMenuOpen(open ? \"__chat_global\" : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n tabMenuOpen === \"__chat_global\" &&\n \"bg-accent text-foreground\",\n )}\n aria-label=\"Chat tab options\"\n >\n <IconDotsVertical size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => closeTab(activeTabId)}\n >\n Close Tab\n <DropdownMenuShortcut>\n {closeTabHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeOtherTabs(activeTabId)}\n >\n Close Other Tabs\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => closeAllTabs()}>\n Close All Tabs\n <DropdownMenuShortcut>\n {closeAllTabsHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n {mode === \"cli\" && (\n <>\n <IconTooltip content=\"New terminal\">\n <button\n onClick={addCliTab}\n aria-label=\"New terminal\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={14} />\n </button>\n </IconTooltip>\n {availableClis.length > 0 && (\n <DropdownMenu\n open={cliPickerOpen}\n onOpenChange={setCliPickerOpen}\n >\n <DropdownMenuTrigger asChild>\n <button\n aria-label={`Select CLI, currently ${selectedLabel}`}\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n cliPickerOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSettings size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-48\"\n >\n {availableClis.map((cli) => (\n <DropdownMenuItem\n key={cli.command}\n onSelect={() => selectCli(cli.command)}\n className={cn(\n cli.command === selectedCli\n ? \"font-medium\"\n : \"text-muted-foreground\",\n )}\n >\n {cli.command === selectedCli ? (\n <IconCheck size={12} className=\"shrink-0\" />\n ) : (\n <span className=\"w-3\" />\n )}\n {cli.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <DropdownMenu\n open={tabMenuOpen === \"__cli_global\"}\n onOpenChange={(open) =>\n setTabMenuOpen(open ? \"__cli_global\" : null)\n }\n >\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n tabMenuOpen === \"__cli_global\" &&\n \"bg-accent text-foreground\",\n )}\n aria-label=\"Terminal tab options\"\n >\n <IconDotsVertical size={14} />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n sideOffset={4}\n className=\"w-44\"\n >\n <DropdownMenuItem\n onSelect={() => closeCliTab(activeCliTab)}\n >\n Close Tab\n <DropdownMenuShortcut>\n {closeTabHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeOtherCliTabs(activeCliTab)}\n >\n Close Other Tabs\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={() => closeAllCliTabs()}\n >\n Close All Tabs\n <DropdownMenuShortcut>\n {closeAllTabsHint}\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )}\n </div>\n </div>\n {/* Sub-agent tab row — shown when the active context has children */}\n {mode === \"chat\" && hasSubTabs && (\n <div className=\"flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setActiveTabId(focusParentId)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(focusParentId),\n )}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeTabId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </div>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n role=\"button\"\n tabIndex={0}\n ref={\n tab.id === activeTabId ? activeTabRefCb : undefined\n }\n onClick={() => setActiveTabId(tab.id)}\n onKeyDown={activateOnKeyDown(() =>\n setActiveTabId(tab.id),\n )}\n className={cn(\n \"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]\",\n tab.id === activeTabId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <span className=\"truncate pr-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse\" />\n )}\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={8} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()}\n </div>\n ),\n [\n mode,\n renderHeaderActions,\n renderModeButtons,\n chatNotice,\n cliTabs,\n activeCliTab,\n addCliTab,\n closeCliTab,\n closeOtherCliTabs,\n closeAllCliTabs,\n tabMenuOpen,\n availableClis,\n selectedCli,\n selectedLabel,\n selectCli,\n cliPickerOpen,\n closeTabHint,\n closeAllTabsHint,\n ],\n );\n\n return (\n <div\n className={cn(\n \"agent-panel-root flex flex-1 flex-col min-h-0 h-full text-[13px] leading-[1.2] antialiased\",\n className,\n )}\n style={AGENT_PANEL_ROOT_STYLE}\n data-agent-fullscreen={isFullscreen ? \"true\" : undefined}\n >\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly.\n Fullscreen rules center the message stream and composer to a Claude-style\n column while leaving the header bar at full width so the action buttons\n stay pinned to the top corners. */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\" +\n `[data-agent-fullscreen='true'] .agent-thread-content,` +\n `[data-agent-fullscreen='true'] .agent-composer-area{` +\n `max-width:${FULLSCREEN_CONTENT_MAX_PX}px;` +\n `margin-left:auto;margin-right:auto;width:100%;}`,\n }}\n />\n {/* Framework onboarding — appears above the chat/cli/settings tabs\n so it's visible regardless of which tab the user is on. The panel\n hides itself once all required steps are done or the user\n dismisses it. Gated by SHOW_ONBOARDING until the UX is improved. */}\n {SHOW_ONBOARDING && mounted && isDevMode && (\n <Suspense fallback={null}>\n <OnboardingPanel />\n </Suspense>\n )}\n\n {/* Chat view — always mounted to preserve state.\n Header (with tabs + mode buttons) is always visible.\n Chat content is hidden when CLI or resources mode is active.\n The wrapper collapses (no flex-1) when another mode is active\n so it only takes the height of its header. */}\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n mode === \"chat\" ? \"flex-1\" : \"shrink-0\",\n )}\n >\n {mounted && (\n <MultiTabAssistantChat\n apiUrl={apiUrl}\n showHeader={false}\n renderHeader={showHeader ? renderChatHeader : undefined}\n renderOverlay={undefined}\n contentHidden={mode !== \"chat\"}\n emptyStateText={emptyStateText}\n suggestions={suggestions}\n onSwitchToCli={() => switchMode(\"cli\")}\n execMode={isDevMode ? execMode : undefined}\n onExecModeChange={isDevMode ? switchExecMode : undefined}\n storageKey={storageKey}\n />\n )}\n </div>\n\n {/* CLI terminals — dev mode: real terminal, prod mode: prompt to use dev */}\n {isDevMode\n ? mode === \"cli\" &&\n cliTabs.map((id) => (\n <div\n key={id}\n className=\"min-h-0 relative flex-1\"\n style={{\n display: id === activeCliTab ? undefined : \"none\",\n }}\n >\n <Suspense\n fallback={\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n Loading terminal...\n </div>\n }\n >\n <AgentTerminal\n command={selectedCli}\n hideInFrame={false}\n className=\"h-full\"\n style={{ background: \"transparent\" }}\n />\n </Suspense>\n </div>\n ))\n : mode === \"cli\" && (\n <div className=\"flex flex-1 flex-col items-center justify-center min-h-0 px-6 gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <IconTerminal2 className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"text-center max-w-[260px]\">\n <p className=\"text-sm font-medium text-foreground mb-1\">\n CLI requires dev mode\n </p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Run this app locally with{\" \"}\n <code className=\"bg-muted px-1 py-0.5 rounded text-[10px]\">\n pnpm dev\n </code>{\" \"}\n or use{\" \"}\n <span className=\"font-medium text-foreground\">\n Builder.io\n </span>{\" \"}\n to access the CLI terminal.\n </p>\n </div>\n </div>\n )}\n\n {/* Resources view */}\n {mode === \"resources\" && (\n <div className=\"flex-1 min-h-0\">\n <Suspense\n fallback={\n <div className=\"flex h-full flex-col min-h-0\">\n <div className=\"flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5\">\n <div className=\"flex items-center gap-1\">\n <div className=\"h-5 w-16 rounded bg-muted animate-pulse\" />\n <div className=\"h-5 w-14 rounded bg-muted animate-pulse\" />\n </div>\n </div>\n </div>\n }\n >\n <ResourcesPanel />\n </Suspense>\n </div>\n )}\n\n {/* Settings / Setup view */}\n {mode === \"settings\" && (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <Suspense\n fallback={\n <div className=\"p-3 space-y-2\">\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n <div className=\"h-10 w-full rounded-lg bg-muted animate-pulse\" />\n </div>\n }\n >\n <SettingsPanel\n isDevMode={isDevMode}\n onToggleDevMode={() => setDevMode(!isDevMode)}\n showDevToggle={showDevToggle}\n devAppUrl={devAppUrl}\n />\n </Suspense>\n </div>\n )}\n </div>\n );\n}\n\n// ─── Resize handle ──────────────────────────────────────────────────────────\n\nconst SIDEBAR_STORAGE_KEY = \"agent-native-sidebar-width\";\nconst SIDEBAR_FULLSCREEN_KEY = \"agent-native-sidebar-fullscreen\";\nconst SIDEBAR_MIN = 280;\nconst SIDEBAR_MAX = 700;\nconst SIDEBAR_OVERLAY_Z_INDEX = 70;\nconst SIDEBAR_FULLSCREEN_Z_INDEX = 90;\n/** Max width of the centered chat column in fullscreen mode (Claude-style). */\nconst FULLSCREEN_CONTENT_MAX_PX = 760;\n\nfunction ResizeHandle({\n position,\n onDrag,\n}: {\n position: \"left\" | \"right\";\n onDrag: (delta: number) => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n const lastX = useRef(0);\n const onDragRef = useRef(onDrag);\n onDragRef.current = onDrag;\n const GRAB_ZONE = 5; // px on each side of the border\n\n // All drag logic runs via document-level listeners so the 1px-wide\n // element doesn't need to capture pointer events itself.\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n let cursorActive = false;\n\n function onMouseDown(e: MouseEvent) {\n const rect = el!.getBoundingClientRect();\n const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));\n if (dist > GRAB_ZONE) return;\n e.preventDefault();\n dragging.current = true;\n lastX.current = e.clientX;\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n\n function onMouseMove(e: MouseEvent) {\n if (dragging.current) {\n const delta = e.clientX - lastX.current;\n lastX.current = e.clientX;\n onDragRef.current(position === \"left\" ? delta : -delta);\n return;\n }\n // Hover cursor\n const rect = el!.getBoundingClientRect();\n const dist = Math.abs(e.clientX - (rect.left + rect.width / 2));\n const near = dist <= GRAB_ZONE;\n if (near && !cursorActive) {\n cursorActive = true;\n document.body.style.cursor = \"col-resize\";\n } else if (!near && cursorActive) {\n cursorActive = false;\n document.body.style.cursor = \"\";\n }\n }\n\n function onMouseUp() {\n if (!dragging.current) return;\n dragging.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n }\n\n document.addEventListener(\"mousedown\", onMouseDown);\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousedown\", onMouseDown);\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n if (cursorActive) document.body.style.cursor = \"\";\n };\n }, [position]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"relative z-20 shrink-0 w-px touch-none select-none transition-colors\",\n \"bg-border hover:bg-accent active:bg-accent\",\n )}\n style={{ cursor: \"col-resize\" }}\n />\n );\n}\n\n/**\n * Remounts its children whenever the framework's `refresh-screen` tool is\n * invoked. Used inside AgentSidebar so the main content area re-fetches\n * without disturbing the chat sidebar's in-flight state.\n *\n * Two mechanisms work together here:\n *\n * 1. Before the remount, every react-query cache entry is marked stale\n * via `invalidateQueries({ refetchType: \"none\" })`. This does NOT\n * trigger a refetch on its own, so active queries elsewhere (chat\n * sidebar, left nav) keep their current data — they'll refetch only\n * on their next natural trigger.\n * 2. The React `key` then bumps, unmounting and remounting the subtree.\n * On remount, child components re-subscribe to their queries, see\n * the data is stale, and refetch — regardless of configured\n * `staleTime`. This is what makes the dashboard pick up the agent's\n * edits even when the query uses `staleTime: 30_000` or similar.\n */\n/**\n * Syncs the current URL (pathname + search + hash) to application_state\n * under `__url__`, and processes one-shot URL-update commands the agent\n * writes to `__set_url__`. Lives inside AgentSidebar so every framework\n * template gets URL visibility + URL-write capability for its agent\n * without per-template wiring.\n *\n * Two directions:\n * UI → state — on route change, write `{ pathname, search, hash,\n * searchParams }` to `__url__`. The production agent reads\n * this and includes it in the auto-injected `<current-url>`\n * block, so the agent always knows what page the user is\n * on, including filter/search params like `?f_date=2026-01`.\n *\n * state → UI — the framework's `set-search-params` / `set-url-path`\n * tools write a command to `__set_url__`. This hook reads\n * the command, applies it via react-router, then deletes\n * the key. The UI reacts in one tick, no page reload.\n */\nfunction URLSync() {\n const location = useLocation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n\n // Outbound: write the current URL to app-state whenever it changes.\n React.useEffect(() => {\n const searchParams: Record<string, string> = {};\n for (const [k, v] of new URLSearchParams(location.search).entries()) {\n searchParams[k] = v;\n }\n const body = {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n searchParams,\n };\n fetch(agentNativePath(\"/_agent-native/application-state/__url__\"), {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }).catch(() => {});\n }, [location.pathname, location.search, location.hash]);\n\n // Inbound: poll for URL-update commands from the agent. We piggyback on\n // the same 2-second cadence useDbSync uses so there's no extra timer.\n const { data: command } = useQuery({\n queryKey: [\"__set_url__\"],\n queryFn: async () => {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/__set_url__\"),\n );\n if (!res.ok || res.status === 204) return null;\n const text = await res.text();\n if (!text) return null;\n const data = JSON.parse(text);\n return data ? { ...data, _ts: Date.now() } : null;\n } catch {\n return null;\n }\n },\n refetchInterval: 2_000,\n refetchIntervalInBackground: true,\n structuralSharing: false,\n retry: false,\n });\n\n React.useEffect(() => {\n if (!command) return;\n // Delete the one-shot command before applying so duplicate events\n // don't cause repeated navigation.\n fetch(agentNativePath(\"/_agent-native/application-state/__set_url__\"), {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n const cmd = command as {\n pathname?: string;\n searchParams?: Record<string, string | null>;\n mergeSearchParams?: boolean;\n hash?: string;\n };\n try {\n const current = new URL(window.location.href);\n const nextPath = cmd.pathname ?? current.pathname;\n const nextSearch =\n cmd.mergeSearchParams !== false\n ? new URLSearchParams(current.search)\n : new URLSearchParams();\n if (cmd.searchParams) {\n for (const [k, v] of Object.entries(cmd.searchParams)) {\n if (v === null || v === \"\") nextSearch.delete(k);\n else nextSearch.set(k, v);\n }\n }\n const nextHash = cmd.hash ?? current.hash;\n const qs = nextSearch.toString();\n const url = nextPath + (qs ? `?${qs}` : \"\") + (nextHash || \"\");\n // Skip the navigation if the URL is already at the target state —\n // avoids needless react-router work and any revalidation side-effects\n // that come with it.\n // Mark that the agent just wrote the URL so consumers (e.g. a\n // dashboard restoring saved filter defaults) can skip any auto-\n // restore that would clobber the agent's change. Set this BEFORE\n // the same-URL short-circuit — a no-op nav is still an explicit\n // \"agent authored this state\" signal that consumers depend on.\n try {\n sessionStorage.setItem(\"__agentUrlAppliedAt__\", String(Date.now()));\n } catch {\n // sessionStorage unavailable — not fatal.\n }\n const currentUrl =\n current.pathname + (current.search || \"\") + (current.hash || \"\");\n if (url === currentUrl) {\n queryClient.setQueryData([\"__set_url__\"], null);\n return;\n }\n // Replace rather than push so repeated agent URL updates don't\n // clutter the history stack and can't trigger extra remounts from\n // router navigation lifecycle.\n navigate(url, { replace: true });\n } catch {\n // Malformed command — ignore.\n }\n queryClient.setQueryData([\"__set_url__\"], null);\n }, [command, navigate, queryClient]);\n\n return null;\n}\nfunction ScreenRefreshBoundary({ children }: { children: React.ReactNode }) {\n const key = useScreenRefreshKey();\n const queryClient = useQueryClient();\n const lastKeyRef = React.useRef(key);\n if (key !== lastKeyRef.current) {\n lastKeyRef.current = key;\n // Mark every cached query stale without kicking off a refetch. The\n // subtree-level refetches happen naturally when the new tree mounts\n // below and child components re-subscribe.\n queryClient.invalidateQueries({ refetchType: \"none\" });\n }\n return <React.Fragment key={key}>{children}</React.Fragment>;\n}\n\nclass AgentPanelErrorBoundary extends React.Component<\n { children: React.ReactNode; onReset: () => void },\n { error: Error | null }\n> {\n state: { error: Error | null } = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(\"[agent-native] Agent panel crashed\", error, errorInfo);\n }\n\n render() {\n if (!this.state.error) return this.props.children;\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 p-6 text-center\">\n <div className=\"max-w-[260px] space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n Agent panel hit an internal UI error.\n </p>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n The app is still usable. Reset the panel to reload the chat UI.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n onClick={() => {\n this.setState({ error: null });\n this.props.onReset();\n }}\n >\n Reset agent panel\n </button>\n </div>\n );\n }\n}\n\nexport function AgentPanel(props: AgentPanelProps) {\n const [resetKey, setResetKey] = useState(0);\n return (\n <TooltipProvider delayDuration={200}>\n <AgentPanelErrorBoundary onReset={() => setResetKey((key) => key + 1)}>\n <AgentPanelInner key={resetKey} {...props} />\n </AgentPanelErrorBoundary>\n </TooltipProvider>\n );\n}\n\n// ─── AgentSidebar — wraps content with a toggleable agent panel ─────────────\n\nexport interface AgentSidebarProps {\n children: React.ReactNode;\n /** Placeholder text for the empty chat state */\n emptyStateText?: string;\n /** Suggestion prompts shown when no messages */\n suggestions?: string[];\n /** Initial sidebar width in pixels. Mount-only; user resize and a saved\n * localStorage value override this. Default: 380 */\n defaultSidebarWidth?: number;\n /** @deprecated Use `defaultSidebarWidth` — this prop is mount-only. */\n sidebarWidth?: number;\n /** Which side the sidebar appears on. Default: \"right\" */\n position?: \"left\" | \"right\";\n /** Whether the sidebar starts open. Default: false */\n defaultOpen?: boolean;\n /** Animate the mobile overlay in a sheet-style slide transition. */\n animateMobile?: boolean;\n}\n\n/**\n * Wraps app content with a toggleable agent sidebar.\n * Use AgentToggleButton in your header to open/close it.\n */\nexport function AgentSidebar({\n children,\n emptyStateText = \"How can I help you?\",\n suggestions,\n defaultSidebarWidth,\n sidebarWidth,\n position = \"right\",\n defaultOpen = false,\n animateMobile = false,\n}: AgentSidebarProps) {\n const initialWidth = defaultSidebarWidth ?? sidebarWidth ?? 380;\n const [open, setOpen] = useState(() =>\n getInitialAgentSidebarOpen(defaultOpen),\n );\n const [presentationMode, setPresentationMode] = useState(false);\n const [width, setWidth] = useState(initialWidth);\n const [fullscreen, setFullscreen] = useState(() => {\n // Force-disable on mobile: a Claude-style centered column makes no sense\n // when the sidebar already covers most of the viewport.\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 767px)\").matches\n ) {\n return false;\n }\n try {\n return localStorage.getItem(SIDEBAR_FULLSCREEN_KEY) === \"true\";\n } catch {\n return false;\n }\n });\n\n // Track mobile viewport so we can switch to overlay mode.\n const [isMobile, setIsMobile] = useState(\n () =>\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 767px)\").matches,\n );\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 767px)\");\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, []);\n useEffect(() => {\n try {\n const saved = localStorage.getItem(SIDEBAR_STORAGE_KEY);\n if (saved) {\n const n = parseInt(saved, 10);\n if (n >= SIDEBAR_MIN && n <= SIDEBAR_MAX) setWidth(n);\n }\n } catch {}\n }, []);\n\n const setOpenPersisted = useCallback(\n (next: boolean | ((prev: boolean) => boolean)) => {\n setOpen((prev) => {\n const value = typeof next === \"function\" ? next(prev) : next;\n try {\n localStorage.setItem(SIDEBAR_OPEN_KEY, String(value));\n } catch {}\n return value;\n });\n },\n [],\n );\n\n const toggleFullscreen = useCallback(() => {\n setFullscreen((prev) => {\n const next = !prev;\n try {\n localStorage.setItem(SIDEBAR_FULLSCREEN_KEY, String(next));\n } catch {}\n return next;\n });\n }, []);\n\n // Track whether the frame is controlling the sidebar (code mode = frame active).\n // Default to true when inside an iframe — assume the frame sidebar is active\n // until told otherwise. This prevents both sidebars flashing after hot reloads.\n const [frameCodeMode, setFrameCodeMode] = useState(\n () => typeof window !== \"undefined\" && window.parent !== window,\n );\n\n useEffect(() => {\n const toggleHandler = () => {\n if (frameCodeMode && window.parent !== window) {\n // Forward toggle to frame parent — the frame sidebar handles it\n window.parent.postMessage(\n { type: \"agentNative.toggleSidebar\" },\n parentFrameTargetOrigin(),\n );\n } else {\n setOpenPersisted((prev) => !prev);\n }\n };\n const openHandler = () => {\n if (frameCodeMode && window.parent !== window) {\n window.parent.postMessage(\n { type: \"agentNative.toggleSidebar\", data: { open: true } },\n parentFrameTargetOrigin(),\n );\n } else {\n setOpenPersisted(true);\n }\n };\n window.addEventListener(\"agent-panel:toggle\", toggleHandler);\n window.addEventListener(\"agent-panel:open\", openHandler);\n return () => {\n window.removeEventListener(\"agent-panel:toggle\", toggleHandler);\n window.removeEventListener(\"agent-panel:open\", openHandler);\n };\n }, [setOpenPersisted, frameCodeMode]);\n\n // Listen for sidebar mode commands from the frame parent.\n // When frame is in \"code\" mode, hide the app sidebar.\n // When frame is in \"app\" mode, show the app sidebar, sync width and panel mode.\n useEffect(() => {\n if (window.parent === window) return; // Not in an iframe\n\n function handleMessage(event: MessageEvent) {\n if (event.data?.type !== \"agentNative.sidebarMode\") return;\n if (event.source !== window.parent || !isTrustedFrameMessage(event))\n return;\n const {\n mode,\n appMode,\n width: frameWidth,\n open: frameOpen,\n } = event.data.data || {};\n if (mode === \"code\") {\n // Frame is showing its own sidebar — hide the app's\n setFrameCodeMode(true);\n setOpenPersisted(false);\n } else if (mode === \"app\") {\n // Frame deferred to the app — show and sync width + mode\n setFrameCodeMode(false);\n if (frameOpen !== false) {\n setOpenPersisted(true);\n }\n if (\n frameWidth &&\n frameWidth >= SIDEBAR_MIN &&\n frameWidth <= SIDEBAR_MAX\n ) {\n setWidth(frameWidth);\n }\n // Sync the panel mode from frame tab selection\n if (\n appMode === \"cli\" ||\n appMode === \"resources\" ||\n appMode === \"chat\"\n ) {\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: appMode },\n }),\n );\n }\n }\n }\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [setOpenPersisted]);\n\n // Cmd+I / Ctrl+I to focus the agent chat. If the user has selected text,\n // capture it into application_state under `pending-selection-context` so\n // the agent's next turn includes it as immediate context to act on.\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"i\") {\n e.preventDefault();\n let selectionText = \"\";\n try {\n selectionText = window.getSelection()?.toString().trim() ?? \"\";\n } catch {}\n if (selectionText) {\n fetch(\n agentNativePath(\n \"/_agent-native/application-state/pending-selection-context\",\n ),\n {\n method: \"PUT\",\n keepalive: true,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n text: selectionText,\n capturedAt: Date.now(),\n }),\n },\n ).catch(() => {});\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-attached\", {\n detail: { text: selectionText, length: selectionText.length },\n }),\n );\n }\n focusAgentChat();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n // Hide sidebar during presentation mode\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (event.data?.type !== \"agentNative.presentationMode\") return;\n if (event.source !== window.parent || !isTrustedFrameMessage(event))\n return;\n setPresentationMode(event.data.data?.active === true);\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, []);\n\n const handleDrag = useCallback((delta: number) => {\n setWidth((prev) => {\n const next = Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, prev + delta));\n try {\n localStorage.setItem(SIDEBAR_STORAGE_KEY, String(next));\n } catch {}\n return next;\n });\n }, []);\n\n const isLeft = position === \"left\";\n // Fullscreen only applies on desktop — on mobile the existing overlay is\n // already viewport-covering, so the maximize button is hidden and the\n // mounted state ignores any persisted value.\n const effectiveFullscreen = fullscreen && !isMobile;\n // On desktop the resize handle is also the visual divider. Avoid painting a\n // second panel border next to it.\n const showResizeHandle = !isMobile && !effectiveFullscreen && open;\n\n // On mobile the sidebar floats as a fixed overlay so the content below isn't\n // squashed. On desktop it participates in the flex layout as before, except\n // in fullscreen mode where it overlays the entire viewport (Claude-style).\n let panelStyle: React.CSSProperties;\n if (isMobile) {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n position: \"fixed\",\n top: 0,\n [isLeft ? \"left\" : \"right\"]: 0,\n height: \"100%\",\n width,\n maxWidth: \"85vw\",\n maxHeight: \"100vh\",\n zIndex: SIDEBAR_OVERLAY_Z_INDEX,\n background: \"hsl(var(--background))\",\n borderLeft: isLeft ? \"none\" : \"1px solid hsl(var(--border))\",\n borderRight: isLeft ? \"1px solid hsl(var(--border))\" : \"none\",\n display: animateMobile || open ? \"flex\" : \"none\",\n transform: animateMobile\n ? open\n ? \"translateX(0)\"\n : `translateX(${isLeft ? \"-\" : \"\"}calc(100% + 1px))`\n : undefined,\n pointerEvents: animateMobile && !open ? \"none\" : undefined,\n willChange: animateMobile ? \"transform\" : undefined,\n };\n } else if (effectiveFullscreen) {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n position: \"fixed\",\n inset: 0,\n width: \"100%\",\n maxHeight: \"100vh\",\n zIndex: SIDEBAR_FULLSCREEN_Z_INDEX,\n background: \"hsl(var(--background))\",\n display: open ? \"flex\" : \"none\",\n };\n } else {\n panelStyle = {\n ...AGENT_PANEL_ROOT_STYLE,\n width,\n maxHeight: \"100vh\",\n borderLeft:\n isLeft || showResizeHandle ? \"none\" : \"1px solid hsl(var(--border))\",\n borderRight:\n !isLeft || showResizeHandle ? \"none\" : \"1px solid hsl(var(--border))\",\n display: open ? \"flex\" : \"none\",\n };\n }\n\n // Always render the sidebar panel (even when closed) so MultiTabAssistantChat\n // stays mounted and can receive messages (e.g. from voice dictation) while\n // the sidebar is visually hidden. When the user opens the sidebar they'll see\n // any in-progress or completed conversations.\n const sidebar = (\n <>\n {showResizeHandle && !isLeft && (\n <ResizeHandle position={position} onDrag={handleDrag} />\n )}\n <div\n className={cn(\n \"agent-sidebar-panel flex shrink-0 flex-col overflow-hidden text-[13px] leading-[1.2] antialiased\",\n animateMobile &&\n isMobile &&\n \"shadow-2xl transition-transform duration-[260ms] ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none\",\n )}\n style={panelStyle}\n inert={isMobile && !open ? true : undefined}\n aria-hidden={isMobile && !open ? true : undefined}\n >\n <AgentPanel\n emptyStateText={emptyStateText}\n suggestions={suggestions}\n onCollapse={() => setOpenPersisted(false)}\n isFullscreen={effectiveFullscreen}\n onToggleFullscreen={isMobile ? undefined : toggleFullscreen}\n />\n </div>\n {showResizeHandle && isLeft && (\n <ResizeHandle position={position} onDrag={handleDrag} />\n )}\n </>\n );\n\n return (\n <div className=\"flex min-w-0 flex-1 h-screen overflow-hidden\">\n {/* Mobile backdrop — tapping it closes the sidebar */}\n {isMobile && !presentationMode && (animateMobile || open) && (\n <div\n className={cn(\n \"fixed inset-0 bg-black/40\",\n animateMobile &&\n \"transition-opacity duration-200 motion-reduce:transition-none\",\n animateMobile && !open && \"pointer-events-none opacity-0\",\n animateMobile && open && \"opacity-100\",\n )}\n style={{ zIndex: SIDEBAR_OVERLAY_Z_INDEX - 1 }}\n onClick={() => setOpenPersisted(false)}\n />\n )}\n {/* URLSync writes the current URL to application-state so the agent\n sees what page/filters the user is on, and applies URL-update\n commands the agent writes via `set-search-params` / `set-url`. */}\n <URLSync />\n {isLeft && !presentationMode ? sidebar : null}\n <div className=\"flex flex-1 flex-col overflow-auto min-w-0\">\n {/* Screen-refresh key: the agent's `refresh-screen` tool bumps this\n counter, remounting only the main content subtree so it re-fetches\n its data. The sidebar above stays mounted, preserving chat state. */}\n <ScreenRefreshBoundary>{children}</ScreenRefreshBoundary>\n </div>\n {!isLeft && !presentationMode ? sidebar : null}\n </div>\n );\n}\n\n/**\n * Focus the agent chat composer input.\n * Opens the sidebar if closed, then focuses the text input.\n */\nexport function focusAgentChat() {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n // Wait for sidebar to render, then focus the composer\n requestAnimationFrame(() => {\n const panel = document.querySelector(\".agent-sidebar-panel\");\n if (!panel) return;\n const prosemirror = panel.querySelector(\n \".ProseMirror\",\n ) as HTMLElement | null;\n if (prosemirror) {\n prosemirror.focus();\n return;\n }\n const textarea = panel.querySelector(\"textarea\") as HTMLElement | null;\n if (textarea) textarea.focus();\n });\n}\n\n/**\n * Button to toggle the agent sidebar. Place this in your app's header/toolbar.\n * Dispatches a custom event that AgentSidebar listens for.\n */\nexport function AgentToggleButton({ className }: { className?: string }) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Toggle agent\"\n onClick={() =>\n window.dispatchEvent(new Event(\"agent-panel:toggle\"))\n }\n className={cn(\n \"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n className,\n )}\n >\n <AgentNativeIcon size={22} aria-hidden />\n </button>\n </TooltipTrigger>\n <TooltipContent>Toggle agent</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"]}
|
|
@@ -9,11 +9,10 @@ interface AgentNativeIconProps extends Omit<SVGProps<SVGSVGElement>, "fill"> {
|
|
|
9
9
|
size?: number | string;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Monochrome agent-native "A" mark. Source paths are taken
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* or directly via `className`).
|
|
12
|
+
* Monochrome agent-native "A" mark. Source paths are taken from the Tauri
|
|
13
|
+
* menu-bar icon at `packages/core/src/assets/branding/tray-icon.svg`, with the
|
|
14
|
+
* padded tray viewBox cropped for toolbar use and `fill="white"` swapped for
|
|
15
|
+
* `fill="currentColor"` so the icon inherits the surrounding text color.
|
|
17
16
|
*/
|
|
18
17
|
export declare function AgentNativeIcon({ size, className, ...rest }: AgentNativeIconProps): import("react/jsx-runtime").JSX.Element;
|
|
19
18
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentNativeIcon.d.ts","sourceRoot":"","sources":["../../../../src/client/components/icons/AgentNativeIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,UAAU,oBAAqB,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAC1E;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"AgentNativeIcon.d.ts","sourceRoot":"","sources":["../../../../src/client/components/icons/AgentNativeIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,UAAU,oBAAqB,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAC1E;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAS,EACT,SAAS,EACT,GAAG,IAAI,EACR,EAAE,oBAAoB,2CAuBtB"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* Monochrome agent-native "A" mark. Source paths are taken
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* or directly via `className`).
|
|
3
|
+
* Monochrome agent-native "A" mark. Source paths are taken from the Tauri
|
|
4
|
+
* menu-bar icon at `packages/core/src/assets/branding/tray-icon.svg`, with the
|
|
5
|
+
* padded tray viewBox cropped for toolbar use and `fill="white"` swapped for
|
|
6
|
+
* `fill="currentColor"` so the icon inherits the surrounding text color.
|
|
8
7
|
*/
|
|
9
8
|
export function AgentNativeIcon({ size = 24, className, ...rest }) {
|
|
10
|
-
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "
|
|
9
|
+
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 114 114", fill: "none", className: className, ...rest, children: _jsxs("g", { transform: "translate(0 24)", children: [_jsx("path", { d: "M24.5537 65.7695H0L15.0859 39.4619L37.708 0L60.4912 39.4619H39.6396L24.5537 65.7695Z", fill: "currentColor" }), _jsx("path", { d: "M89.446 0H114L76.2921 65.7704H51.7383L89.446 0Z", fill: "currentColor" })] }) }));
|
|
11
10
|
}
|
|
12
11
|
//# sourceMappingURL=AgentNativeIcon.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentNativeIcon.js","sourceRoot":"","sources":["../../../../src/client/components/icons/AgentNativeIcon.tsx"],"names":[],"mappings":";AAYA
|
|
1
|
+
{"version":3,"file":"AgentNativeIcon.js","sourceRoot":"","sources":["../../../../src/client/components/icons/AgentNativeIcon.tsx"],"names":[],"mappings":";AAYA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,GAAG,EAAE,EACT,SAAS,EACT,GAAG,IAAI,EACc;IACrB,OAAO,CACL,cACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,aAAa,EACrB,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,SAAS,KAChB,IAAI,YAER,aAAG,SAAS,EAAC,iBAAiB,aAC5B,eACE,CAAC,EAAC,sFAAsF,EACxF,IAAI,EAAC,cAAc,GACnB,EACF,eACE,CAAC,EAAC,iDAAiD,EACnD,IAAI,EAAC,cAAc,GACnB,IACA,GACA,CACP,CAAC;AACJ,CAAC","sourcesContent":["import type { SVGProps } from \"react\";\n\ninterface AgentNativeIconProps extends Omit<SVGProps<SVGSVGElement>, \"fill\"> {\n /**\n * Pixel size for the icon. Mirrors the Tabler icons API so this can be a\n * drop-in replacement for `<IconMessageDots size={16} />` etc. If you want\n * className-driven sizing instead (e.g. `w-4 h-4`), omit `size` — the SVG\n * will fill its container based on the className.\n */\n size?: number | string;\n}\n\n/**\n * Monochrome agent-native \"A\" mark. Source paths are taken from the Tauri\n * menu-bar icon at `packages/core/src/assets/branding/tray-icon.svg`, with the\n * padded tray viewBox cropped for toolbar use and `fill=\"white\"` swapped for\n * `fill=\"currentColor\"` so the icon inherits the surrounding text color.\n */\nexport function AgentNativeIcon({\n size = 24,\n className,\n ...rest\n}: AgentNativeIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 114 114\"\n fill=\"none\"\n className={className}\n {...rest}\n >\n <g transform=\"translate(0 24)\">\n <path\n d=\"M24.5537 65.7695H0L15.0859 39.4619L37.708 0L60.4912 39.4619H39.6396L24.5537 65.7695Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M89.446 0H114L76.2921 65.7704H51.7383L89.446 0Z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n );\n}\n"]}
|
|
@@ -367,7 +367,7 @@ export function ExtensionViewer({ extensionId }) {
|
|
|
367
367
|
submitRename();
|
|
368
368
|
if (e.key === "Escape")
|
|
369
369
|
setIsRenaming(false);
|
|
370
|
-
}, className: "min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary" })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate text-sm font-medium", children: extension.name }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: startRename, className: "shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground", children: _jsx(IconPencil, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "Rename" })] })] }))] })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setRefreshKey((k) => k + 1), className: "inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer", children: _jsx(IconRefresh, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { children: "Refresh" })] }), _jsx(EditToolPopover, { extension: extension, onOpenChange: onPopoverOpenChange }), _jsx(ShareButton, { resourceType: "extension", resourceId: extensionId, resourceTitle: extension.name, onOpenChange: onPopoverOpenChange }), _jsx(ToolMoreMenu, { extensionId: extensionId, toolName: extension.name, onOpenChange: onPopoverOpenChange }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {
|
|
370
|
+
}, className: "min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary" })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate text-sm font-medium", children: extension.name }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: startRename, className: "shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground", children: _jsx(IconPencil, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "Rename" })] })] }))] })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setRefreshKey((k) => k + 1), className: "inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer", children: _jsx(IconRefresh, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { children: "Refresh" })] }), _jsx(EditToolPopover, { extension: extension, onOpenChange: onPopoverOpenChange }), _jsx(ShareButton, { resourceType: "extension", resourceId: extensionId, resourceTitle: extension.name, onOpenChange: onPopoverOpenChange }), _jsx(ToolMoreMenu, { extensionId: extensionId, toolName: extension.name, onOpenChange: onPopoverOpenChange }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {})] })] }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [!iframeReady && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-background z-10", children: _jsx(IconLoader2, { className: "size-5 animate-spin text-muted-foreground", role: "status", "aria-label": "Loading" }) })), _jsx("iframe", { ref: iframeRef, src: iframeSrc, className: "h-full w-full border-0", sandbox: "allow-scripts allow-forms", title: extension.name, style: {
|
|
371
371
|
pointerEvents: openPopoverCount > 0 ? "none" : "auto",
|
|
372
372
|
}, onLoad: () => {
|
|
373
373
|
sendThemeToIframe();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionViewer.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useNavigate } from \"react-router\";\nimport {\n IconArrowLeft,\n IconChevronRight,\n IconDots,\n IconLoader2,\n IconPencil,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { ShareButton } from \"../sharing/ShareButton.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.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 isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nfunction getParentThemeVars(): Record<string, string> {\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n}\n\nexport interface ExtensionViewerProps {\n extensionId: string;\n}\n\nfunction EditToolPopover({\n extension,\n onOpenChange,\n}: {\n extension: Extension;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n // Radix's outside-click detection runs in the parent document, so a click\n // inside the extension iframe (or any other iframe) never fires it. The browser\n // does shift focus to the iframe though, which blurs the parent window — we\n // hook that to close the popover so it behaves like a normal click-outside.\n useEffect(() => {\n if (!open) return;\n const handleBlur = () => {\n // Defer until after the focus actually lands so document.activeElement\n // reflects the iframe (or whatever the user clicked on).\n setTimeout(() => {\n if (document.activeElement?.tagName === \"IFRAME\")\n setOpenAndNotify(false);\n }, 0);\n };\n window.addEventListener(\"blur\", handleBlur);\n return () => window.removeEventListener(\"blur\", handleBlur);\n }, [open]);\n\n const handleSubmit = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Update extension \"${extension.name}\" (${extension.id}): ${trimmed}`,\n context: [\n `The user is viewing extension \"${extension.name}\" (id: ${extension.id}) and wants to edit it.`,\n \"This is an existing sandboxed Alpine.js extension stored in SQL. Use list-extensions/update-extension for this extension id.\",\n \"Do not call connect-builder and do not route this to a source-code change flow.\",\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setOpenAndNotify(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconPencil className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={6} className=\"w-[420px] p-3\">\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n Edit extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"What would you like to change?\"\n draftScope={`extensions:edit:${extension.id}`}\n onSubmit={handleSubmit}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function ExtensionViewer({ extensionId }: ExtensionViewerProps) {\n const [isDark, setIsDark] = useState(false);\n const [iframeReady, setIframeReady] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const toolRef = useRef<Extension | null>(null);\n const [isRenaming, setIsRenaming] = useState(false);\n const [renameValue, setRenameValue] = useState(\"\");\n const [refreshKey, setRefreshKey] = useState(0);\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n // Tracks how many toolbar popovers are open. Iframes capture pointer events\n // from areas they visually overlap, so when a popover opens above the iframe,\n // hover and click on the popover items get swallowed by the iframe. Disabling\n // pointer-events on the iframe while any popover is open lets the popover\n // receive its own events. Each popover increments on open / decrements on\n // close, so concurrent popovers (rare) compose correctly.\n const [openPopoverCount, setOpenPopoverCount] = useState(0);\n const onPopoverOpenChange = useCallback((open: boolean) => {\n setOpenPopoverCount((c) => Math.max(0, c + (open ? 1 : -1)));\n }, []);\n const queryClient = useQueryClient();\n // (audit H4) Role plumbed through from the iframe's render binding. Until\n // the iframe announces its role we deny non-trivial helper calls — that\n // way a malicious extension body that races the announcement can't briefly\n // operate at higher privilege than the viewer's actual role.\n const bridgeContextRef = useRef<{\n role: ExtensionBridgeRole;\n isAuthor: boolean;\n }>({\n role: \"viewer\",\n isAuthor: false,\n });\n\n useEffect(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark: document.documentElement.classList.contains(\"dark\"),\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n if (!iframeReady) return;\n sendThemeToIframe();\n }, [isDark, iframeReady]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message) return;\n\n if (message.type === \"agent-native-extension-binding\") {\n // (audit H4) The iframe announced its render binding. Trust the role\n // value because the iframe's binding is generated server-side in\n // extensions/routes.ts (resolveAccess), not by user-authored content.\n const binding = message.binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n };\n return;\n }\n\n if (\n message.type === \"agent-native-extension-consent-granted\" ||\n message.type === \"agent-native-extension-consent-cancelled\"\n ) {\n // (audit C1) The consent stub fired; force a reload of the iframe so\n // the next render returns the extension body (granted) or stays on the\n // stub (cancelled — viewer can also navigate away).\n if (message.type === \"agent-native-extension-consent-granted\") {\n // Invalidate the cached extension record — author may have edited\n // since the cache was warmed.\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extensionId],\n });\n setRefreshKey((k) => k + 1);\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: message.key,\n code: message.code,\n metaKey: !!message.metaKey,\n ctrlKey: !!message.ctrlKey,\n shiftKey: !!message.shiftKey,\n altKey: !!message.altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const t = toolRef.current;\n if (!t) return;\n const errors: string[] = message.errors || [];\n const errorDetails: Array<{ message: string; stack: string }> =\n message.errorDetails || [];\n const consoleLogs: Array<{ level: string; message: string }> =\n message.consoleLogs || [];\n const networkLogs: Array<{\n path: string;\n method: string;\n ok?: boolean;\n status?: number;\n error?: string;\n }> = message.networkLogs || [];\n\n const detailedTrace = errorDetails\n .map((e) => (e.stack ? `${e.message}\\n${e.stack}` : e.message))\n .join(\"\\n\\n\");\n\n const contextParts = [\n `The user is viewing extension \"${t.name}\" (id: ${t.id}) and there are runtime errors that need fixing.`,\n `\\nFull error details:\\n${detailedTrace}`,\n ];\n\n if (consoleLogs.length > 0) {\n const consoleStr = consoleLogs\n .map((l) => `[${l.level}] ${l.message}`)\n .join(\"\\n\");\n contextParts.push(`\\nRecent console output:\\n${consoleStr}`);\n }\n\n if (networkLogs.length > 0) {\n const netStr = networkLogs\n .map(\n (l) =>\n `${l.method} ${l.path} → ${l.ok ? l.status : \"FAILED: \" + (l.error || l.status)}`,\n )\n .join(\"\\n\");\n contextParts.push(`\\nRecent network requests:\\n${netStr}`);\n }\n\n sendToAgentChat({\n message: `Fix runtime errors in this extension:\\n${errors.join(\"\\n\")}`,\n context: contextParts.join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware policy gate: viewer-shared extensions can read\n // but not write. Decided here in the parent before the request\n // leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(\n path,\n options.method ?? \"GET\",\n bridgeContextRef.current,\n );\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n // (audit H5) Tag every outbound bridge request with the\n // X-Agent-Native-Extension-Bridge sentinel so the action-routes layer can\n // enforce per-action `toolCallable` opt-in. The header is added by\n // the parent — it is NOT taken from the iframe-supplied options\n // (which were filtered by sanitizeExtensionRequestOptions).\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extensionId, queryClient]);\n\n const { data: extension, isLoading } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension\");\n return res.json();\n },\n });\n\n toolRef.current = extension ?? null;\n\n const iframeSrc = useMemo(\n () =>\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?dark=${document.documentElement.classList.contains(\"dark\")}&v=${encodeURIComponent(extension?.updatedAt ?? \"\")}&r=${refreshKey}`,\n ),\n [extensionId, extension?.updatedAt, refreshKey],\n );\n\n useEffect(() => {\n setIframeReady(false);\n // Reset role to deny-by-default on every reload — the new render's\n // binding announcement re-establishes the role before any helper call.\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n }, [extensionId, extension?.updatedAt, refreshKey]);\n\n const startRename = useCallback(() => {\n if (!extension) return;\n setRenameValue(extension.name);\n setIsRenaming(true);\n requestAnimationFrame(() => renameInputRef.current?.select());\n }, [extension]);\n\n const submitRename = useCallback(async () => {\n const trimmed = renameValue.trim();\n if (!trimmed || !extension || trimmed === extension.name) {\n setIsRenaming(false);\n return;\n }\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n setIsRenaming(false);\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n }, [renameValue, extension, extensionId, queryClient]);\n\n if (isLoading) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-12 items-center gap-2 px-3 border-b shrink-0\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div className=\"h-3.5 w-24 rounded bg-muted animate-pulse\" />\n </div>\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (!extension) {\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Extension not found\n </div>\n );\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex h-12 shrink-0 items-center justify-between gap-3 border-b px-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Link\n to=\"/\"\n className=\"inline-flex h-8 shrink-0 items-center justify-center gap-1.5 rounded-md px-2 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back to app</span>\n </Link>\n </TooltipTrigger>\n <TooltipContent>Back to app</TooltipContent>\n </Tooltip>\n <nav\n aria-label=\"Extension breadcrumb\"\n className=\"group/name flex min-w-0 items-center gap-1 text-sm\"\n >\n <Link\n to=\"/extensions\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n >\n Extensions\n </Link>\n <IconChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/60\" />\n {isRenaming ? (\n <input\n ref={renameInputRef}\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={submitRename}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename();\n if (e.key === \"Escape\") setIsRenaming(false);\n }}\n className=\"min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary\"\n />\n ) : (\n <>\n <span className=\"truncate text-sm font-medium\">\n {extension.name}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={startRename}\n className=\"shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground\"\n >\n <IconPencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Rename</TooltipContent>\n </Tooltip>\n </>\n )}\n </nav>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRefreshKey((k) => k + 1)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconRefresh className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n <EditToolPopover\n extension={extension}\n onOpenChange={onPopoverOpenChange}\n />\n <ShareButton\n resourceType=\"extension\"\n resourceId={extensionId}\n resourceTitle={extension.name}\n onOpenChange={onPopoverOpenChange}\n />\n <ToolMoreMenu\n extensionId={extensionId}\n toolName={extension.name}\n onOpenChange={onPopoverOpenChange}\n />\n <NotificationsBell />\n <AgentToggleButton className=\"h-8 w-8 rounded-md hover:bg-accent\" />\n </div>\n </div>\n <div className=\"relative flex-1 min-h-0\">\n {!iframeReady && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background z-10\">\n <IconLoader2\n className=\"size-5 animate-spin text-muted-foreground\"\n role=\"status\"\n aria-label=\"Loading\"\n />\n </div>\n )}\n <iframe\n ref={iframeRef}\n key={`${extension.updatedAt}-${refreshKey}`}\n src={iframeSrc}\n className=\"h-full w-full border-0\"\n sandbox=\"allow-scripts allow-forms\"\n title={extension.name}\n style={{\n pointerEvents: openPopoverCount > 0 ? \"none\" : \"auto\",\n }}\n onLoad={() => {\n sendThemeToIframe();\n setTimeout(() => setIframeReady(true), 150);\n }}\n />\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\nfunction ToolMoreMenu({\n extensionId,\n toolName,\n onOpenChange,\n}: {\n extensionId: string;\n toolName: string;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const { data: slots = [] } = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n\n const closeMenu = () => {\n setOpenAndNotify(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async (slotId: string) => {\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"DELETE\",\n });\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n }\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpenAndNotify(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"More options\"\n >\n <IconDots className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>More options</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">Appears in</p>\n {slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n Not installed in any widget areas. Ask the agent to add it\n somewhere.\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n This extension can render in {slots.length} widget area\n {slots.length === 1 ? \"\" : \"s\"}.\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => removeFromSlot(s.slotId)}\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label=\"Remove from this widget area\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Remove from this widget area (for me)\n </TooltipContent>\n </Tooltip>\n </div>\n ))}\n </div>\n )}\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>Delete extension…</span>\n </button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n Delete <span className=\"font-medium\">{toolName}</span>? This\n removes the extension everywhere, for everyone it's shared with.\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n Delete\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExtensionViewer.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link, useNavigate } from \"react-router\";\nimport {\n IconArrowLeft,\n IconChevronRight,\n IconDots,\n IconLoader2,\n IconPencil,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { ShareButton } from \"../sharing/ShareButton.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.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 isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nfunction getParentThemeVars(): Record<string, string> {\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n}\n\nexport interface ExtensionViewerProps {\n extensionId: string;\n}\n\nfunction EditToolPopover({\n extension,\n onOpenChange,\n}: {\n extension: Extension;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n // Radix's outside-click detection runs in the parent document, so a click\n // inside the extension iframe (or any other iframe) never fires it. The browser\n // does shift focus to the iframe though, which blurs the parent window — we\n // hook that to close the popover so it behaves like a normal click-outside.\n useEffect(() => {\n if (!open) return;\n const handleBlur = () => {\n // Defer until after the focus actually lands so document.activeElement\n // reflects the iframe (or whatever the user clicked on).\n setTimeout(() => {\n if (document.activeElement?.tagName === \"IFRAME\")\n setOpenAndNotify(false);\n }, 0);\n };\n window.addEventListener(\"blur\", handleBlur);\n return () => window.removeEventListener(\"blur\", handleBlur);\n }, [open]);\n\n const handleSubmit = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Update extension \"${extension.name}\" (${extension.id}): ${trimmed}`,\n context: [\n `The user is viewing extension \"${extension.name}\" (id: ${extension.id}) and wants to edit it.`,\n \"This is an existing sandboxed Alpine.js extension stored in SQL. Use list-extensions/update-extension for this extension id.\",\n \"Do not call connect-builder and do not route this to a source-code change flow.\",\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setOpenAndNotify(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconPencil className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={6} className=\"w-[420px] p-3\">\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n Edit extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"What would you like to change?\"\n draftScope={`extensions:edit:${extension.id}`}\n onSubmit={handleSubmit}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function ExtensionViewer({ extensionId }: ExtensionViewerProps) {\n const [isDark, setIsDark] = useState(false);\n const [iframeReady, setIframeReady] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const toolRef = useRef<Extension | null>(null);\n const [isRenaming, setIsRenaming] = useState(false);\n const [renameValue, setRenameValue] = useState(\"\");\n const [refreshKey, setRefreshKey] = useState(0);\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n // Tracks how many toolbar popovers are open. Iframes capture pointer events\n // from areas they visually overlap, so when a popover opens above the iframe,\n // hover and click on the popover items get swallowed by the iframe. Disabling\n // pointer-events on the iframe while any popover is open lets the popover\n // receive its own events. Each popover increments on open / decrements on\n // close, so concurrent popovers (rare) compose correctly.\n const [openPopoverCount, setOpenPopoverCount] = useState(0);\n const onPopoverOpenChange = useCallback((open: boolean) => {\n setOpenPopoverCount((c) => Math.max(0, c + (open ? 1 : -1)));\n }, []);\n const queryClient = useQueryClient();\n // (audit H4) Role plumbed through from the iframe's render binding. Until\n // the iframe announces its role we deny non-trivial helper calls — that\n // way a malicious extension body that races the announcement can't briefly\n // operate at higher privilege than the viewer's actual role.\n const bridgeContextRef = useRef<{\n role: ExtensionBridgeRole;\n isAuthor: boolean;\n }>({\n role: \"viewer\",\n isAuthor: false,\n });\n\n useEffect(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark: document.documentElement.classList.contains(\"dark\"),\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n if (!iframeReady) return;\n sendThemeToIframe();\n }, [isDark, iframeReady]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message) return;\n\n if (message.type === \"agent-native-extension-binding\") {\n // (audit H4) The iframe announced its render binding. Trust the role\n // value because the iframe's binding is generated server-side in\n // extensions/routes.ts (resolveAccess), not by user-authored content.\n const binding = message.binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n };\n return;\n }\n\n if (\n message.type === \"agent-native-extension-consent-granted\" ||\n message.type === \"agent-native-extension-consent-cancelled\"\n ) {\n // (audit C1) The consent stub fired; force a reload of the iframe so\n // the next render returns the extension body (granted) or stays on the\n // stub (cancelled — viewer can also navigate away).\n if (message.type === \"agent-native-extension-consent-granted\") {\n // Invalidate the cached extension record — author may have edited\n // since the cache was warmed.\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extensionId],\n });\n setRefreshKey((k) => k + 1);\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: message.key,\n code: message.code,\n metaKey: !!message.metaKey,\n ctrlKey: !!message.ctrlKey,\n shiftKey: !!message.shiftKey,\n altKey: !!message.altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const t = toolRef.current;\n if (!t) return;\n const errors: string[] = message.errors || [];\n const errorDetails: Array<{ message: string; stack: string }> =\n message.errorDetails || [];\n const consoleLogs: Array<{ level: string; message: string }> =\n message.consoleLogs || [];\n const networkLogs: Array<{\n path: string;\n method: string;\n ok?: boolean;\n status?: number;\n error?: string;\n }> = message.networkLogs || [];\n\n const detailedTrace = errorDetails\n .map((e) => (e.stack ? `${e.message}\\n${e.stack}` : e.message))\n .join(\"\\n\\n\");\n\n const contextParts = [\n `The user is viewing extension \"${t.name}\" (id: ${t.id}) and there are runtime errors that need fixing.`,\n `\\nFull error details:\\n${detailedTrace}`,\n ];\n\n if (consoleLogs.length > 0) {\n const consoleStr = consoleLogs\n .map((l) => `[${l.level}] ${l.message}`)\n .join(\"\\n\");\n contextParts.push(`\\nRecent console output:\\n${consoleStr}`);\n }\n\n if (networkLogs.length > 0) {\n const netStr = networkLogs\n .map(\n (l) =>\n `${l.method} ${l.path} → ${l.ok ? l.status : \"FAILED: \" + (l.error || l.status)}`,\n )\n .join(\"\\n\");\n contextParts.push(`\\nRecent network requests:\\n${netStr}`);\n }\n\n sendToAgentChat({\n message: `Fix runtime errors in this extension:\\n${errors.join(\"\\n\")}`,\n context: contextParts.join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware policy gate: viewer-shared extensions can read\n // but not write. Decided here in the parent before the request\n // leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(\n path,\n options.method ?? \"GET\",\n bridgeContextRef.current,\n );\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n // (audit H5) Tag every outbound bridge request with the\n // X-Agent-Native-Extension-Bridge sentinel so the action-routes layer can\n // enforce per-action `toolCallable` opt-in. The header is added by\n // the parent — it is NOT taken from the iframe-supplied options\n // (which were filtered by sanitizeExtensionRequestOptions).\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extensionId, queryClient]);\n\n const { data: extension, isLoading } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension\");\n return res.json();\n },\n });\n\n toolRef.current = extension ?? null;\n\n const iframeSrc = useMemo(\n () =>\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?dark=${document.documentElement.classList.contains(\"dark\")}&v=${encodeURIComponent(extension?.updatedAt ?? \"\")}&r=${refreshKey}`,\n ),\n [extensionId, extension?.updatedAt, refreshKey],\n );\n\n useEffect(() => {\n setIframeReady(false);\n // Reset role to deny-by-default on every reload — the new render's\n // binding announcement re-establishes the role before any helper call.\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n }, [extensionId, extension?.updatedAt, refreshKey]);\n\n const startRename = useCallback(() => {\n if (!extension) return;\n setRenameValue(extension.name);\n setIsRenaming(true);\n requestAnimationFrame(() => renameInputRef.current?.select());\n }, [extension]);\n\n const submitRename = useCallback(async () => {\n const trimmed = renameValue.trim();\n if (!trimmed || !extension || trimmed === extension.name) {\n setIsRenaming(false);\n return;\n }\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n setIsRenaming(false);\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n }, [renameValue, extension, extensionId, queryClient]);\n\n if (isLoading) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-12 items-center gap-2 px-3 border-b shrink-0\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div className=\"h-3.5 w-24 rounded bg-muted animate-pulse\" />\n </div>\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (!extension) {\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n Extension not found\n </div>\n );\n }\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex h-12 shrink-0 items-center justify-between gap-3 border-b px-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Link\n to=\"/\"\n className=\"inline-flex h-8 shrink-0 items-center justify-center gap-1.5 rounded-md px-2 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Back to app</span>\n </Link>\n </TooltipTrigger>\n <TooltipContent>Back to app</TooltipContent>\n </Tooltip>\n <nav\n aria-label=\"Extension breadcrumb\"\n className=\"group/name flex min-w-0 items-center gap-1 text-sm\"\n >\n <Link\n to=\"/extensions\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n >\n Extensions\n </Link>\n <IconChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/60\" />\n {isRenaming ? (\n <input\n ref={renameInputRef}\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={submitRename}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename();\n if (e.key === \"Escape\") setIsRenaming(false);\n }}\n className=\"min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary\"\n />\n ) : (\n <>\n <span className=\"truncate text-sm font-medium\">\n {extension.name}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={startRename}\n className=\"shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground\"\n >\n <IconPencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Rename</TooltipContent>\n </Tooltip>\n </>\n )}\n </nav>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRefreshKey((k) => k + 1)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconRefresh className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n <EditToolPopover\n extension={extension}\n onOpenChange={onPopoverOpenChange}\n />\n <ShareButton\n resourceType=\"extension\"\n resourceId={extensionId}\n resourceTitle={extension.name}\n onOpenChange={onPopoverOpenChange}\n />\n <ToolMoreMenu\n extensionId={extensionId}\n toolName={extension.name}\n onOpenChange={onPopoverOpenChange}\n />\n <NotificationsBell />\n <AgentToggleButton />\n </div>\n </div>\n <div className=\"relative flex-1 min-h-0\">\n {!iframeReady && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background z-10\">\n <IconLoader2\n className=\"size-5 animate-spin text-muted-foreground\"\n role=\"status\"\n aria-label=\"Loading\"\n />\n </div>\n )}\n <iframe\n ref={iframeRef}\n key={`${extension.updatedAt}-${refreshKey}`}\n src={iframeSrc}\n className=\"h-full w-full border-0\"\n sandbox=\"allow-scripts allow-forms\"\n title={extension.name}\n style={{\n pointerEvents: openPopoverCount > 0 ? \"none\" : \"auto\",\n }}\n onLoad={() => {\n sendThemeToIframe();\n setTimeout(() => setIframeReady(true), 150);\n }}\n />\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\nfunction ToolMoreMenu({\n extensionId,\n toolName,\n onOpenChange,\n}: {\n extensionId: string;\n toolName: string;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const { data: slots = [] } = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n\n const closeMenu = () => {\n setOpenAndNotify(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async (slotId: string) => {\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"DELETE\",\n });\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n }\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpenAndNotify(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"More options\"\n >\n <IconDots className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>More options</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">Appears in</p>\n {slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n Not installed in any widget areas. Ask the agent to add it\n somewhere.\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n This extension can render in {slots.length} widget area\n {slots.length === 1 ? \"\" : \"s\"}.\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => removeFromSlot(s.slotId)}\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label=\"Remove from this widget area\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Remove from this widget area (for me)\n </TooltipContent>\n </Tooltip>\n </div>\n ))}\n </div>\n )}\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>Delete extension…</span>\n </button>\n </div>\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n Delete <span className=\"font-medium\">{toolName}</span>? This\n removes the extension everywhere, for everyone it's shared with.\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n Delete\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
|
@@ -92,7 +92,7 @@ export function ExtensionsListPage() {
|
|
|
92
92
|
queryClient.invalidateQueries({ queryKey: ["extensions"] });
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
|
-
return (_jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Link, { to: "/", className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", "aria-label": "Back to app", children: _jsx(IconArrowLeft, { className: "h-4 w-4" }) }), _jsx("h1", { className: "text-sm font-semibold", children: "Extensions" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), "New Extension"] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: "New extension" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you'd like to build...", draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {
|
|
95
|
+
return (_jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Link, { to: "/", className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", "aria-label": "Back to app", children: _jsx(IconArrowLeft, { className: "h-4 w-4" }) }), _jsx("h1", { className: "text-sm font-semibold", children: "Extensions" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), "New Extension"] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: "New extension" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you'd like to build...", draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {})] })] }), _jsx("div", { className: "flex-1 overflow-auto p-6", children: isLoading ? (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-lg border border-border bg-card p-5", children: [_jsx("div", { className: "mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 h-4 w-2/3 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-4/5 rounded bg-muted animate-pulse" })] }, i))) })) : toolList.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center gap-4 py-16 text-center", children: [_jsx(IconTool, { className: "h-10 w-10 text-muted-foreground/40" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: "No extensions yet" }), _jsx("p", { className: "text-xs text-muted-foreground mt-1", children: "Describe what you'd like to build" })] }), _jsx(CreateToolInput, { className: "w-full max-w-sm" })] })) : (_jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: toolList.map((extension) => (_jsxs("div", { className: cn("group relative rounded-lg border border-border bg-card", "hover:border-primary/30 hover:shadow-sm"), children: [_jsxs(Link, { to: `/extensions/${extension.id}`, className: "block p-5 pr-12", children: [_jsx("div", { className: "mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary", children: _jsx(IconTool, { className: "h-5 w-5" }) }), _jsx("h3", { className: "mb-1 text-sm font-semibold text-foreground", children: extension.name }), extension.description && (_jsx("p", { className: "line-clamp-2 text-xs text-muted-foreground", children: extension.description }))] }), _jsxs(Popover, { open: confirmDeleteId === extension.id, onOpenChange: (open) => setConfirmDeleteId(open ? extension.id : null), children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100", "aria-label": `Options for ${extension.name}`, children: _jsx(IconDotsVertical, { className: "h-4 w-4" }) }) }), _jsx(PopoverContent, { align: "end", sideOffset: 4, className: "w-64 p-0", children: _jsxs("div", { className: "p-3", children: [_jsxs("p", { className: "text-[12px]", children: ["Delete", " ", _jsx("span", { className: "font-medium", children: extension.name }), "? This removes it everywhere it is shared."] }), _jsxs("div", { className: "mt-3 flex justify-end gap-1", children: [_jsx("button", { type: "button", onClick: () => setConfirmDeleteId(null), className: "rounded-md px-2 py-1 text-[12px] hover:bg-accent", children: "Cancel" }), _jsxs("button", { type: "button", onClick: () => handleDelete(extension), disabled: deletingId === extension.id, className: cn("inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90", deletingId === extension.id && "opacity-60"), children: [_jsx(IconTrash, { className: "h-3.5 w-3.5" }), deletingId === extension.id
|
|
96
96
|
? "Deleting..."
|
|
97
97
|
: "Delete"] })] })] }) })] })] }, extension.id))) })) })] }));
|
|
98
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link } from \"react-router\";\nimport {\n IconArrowLeft,\n IconDotsVertical,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.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 TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(prompt: string) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <p className=\"text-sm font-semibold text-foreground\">New extension</p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build... e.g. a todo list, API dashboard, calculator\"\n draftScope=\"extensions:create\"\n onSubmit={(text) => submitCreateTool(text)}\n />\n </div>\n );\n}\n\nexport function ExtensionsListPage() {\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\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 toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text);\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n { method: \"DELETE\" },\n );\n if (!res.ok) throw new Error(\"Delete failed\");\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">Extensions</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n New Extension\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\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:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <NotificationsBell />\n <AgentToggleButton className=\"h-8 w-8 rounded-md hover:bg-accent\" />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto p-6\">\n {isLoading ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : toolList.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-4 py-16 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div>\n <p className=\"text-sm font-medium\">No extensions yet</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Describe what you'd like to build\n </p>\n </div>\n <CreateToolInput className=\"w-full max-w-sm\" />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n )}\n >\n <Link\n to={`/extensions/${extension.id}`}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 text-sm font-semibold text-foreground\">\n {extension.name}\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={`Options for ${extension.name}`}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n Delete{\" \"}\n <span className=\"font-medium\">{extension.name}</span>?\n This removes it everywhere it is shared.\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? \"Deleting...\"\n : \"Delete\"}\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link } from \"react-router\";\nimport {\n IconArrowLeft,\n IconDotsVertical,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.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 TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(prompt: string) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <p className=\"text-sm font-semibold text-foreground\">New extension</p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build... e.g. a todo list, API dashboard, calculator\"\n draftScope=\"extensions:create\"\n onSubmit={(text) => submitCreateTool(text)}\n />\n </div>\n );\n}\n\nexport function ExtensionsListPage() {\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\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 toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text);\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n { method: \"DELETE\" },\n );\n if (!res.ok) throw new Error(\"Delete failed\");\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">Extensions</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n New Extension\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\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:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <NotificationsBell />\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto p-6\">\n {isLoading ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : toolList.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-4 py-16 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div>\n <p className=\"text-sm font-medium\">No extensions yet</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Describe what you'd like to build\n </p>\n </div>\n <CreateToolInput className=\"w-full max-w-sm\" />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n )}\n >\n <Link\n to={`/extensions/${extension.id}`}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 text-sm font-semibold text-foreground\">\n {extension.name}\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={`Options for ${extension.name}`}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n Delete{\" \"}\n <span className=\"font-medium\">{extension.name}</span>?\n This removes it everywhere it is shared.\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? \"Deleting...\"\n : \"Delete\"}\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|