@tutti-os/agent-gui 0.0.201 → 0.0.202
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/agent-conversation/index.js +1 -1
- package/dist/agent-gui.js +3 -3
- package/dist/app/renderer/agentactivity.css +45 -115
- package/dist/{chunk-ZADHMOME.js → chunk-UVJBQ6WD.js} +28 -14
- package/dist/chunk-UVJBQ6WD.js.map +1 -0
- package/dist/{chunk-DAP74J63.js → chunk-VZ4QAXXL.js} +263 -155
- package/dist/chunk-VZ4QAXXL.js.map +1 -0
- package/dist/{chunk-7NUEEGAA.js → chunk-X5V6P2EB.js} +5 -1
- package/dist/chunk-X5V6P2EB.js.map +1 -0
- package/dist/index.js +3 -3
- package/dist/workbench/contribution.js +1 -1
- package/dist/workbench/index.js +1 -1
- package/dist/workbench/tool-sidebar/index.js +1 -1
- package/dist/workbench/tool-sidebar/index.js.map +1 -1
- package/package.json +14 -14
- package/dist/chunk-7NUEEGAA.js.map +0 -1
- package/dist/chunk-DAP74J63.js.map +0 -1
- package/dist/chunk-ZADHMOME.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../workbench/tool-sidebar/model.ts","../../../workbench/tool-sidebar/AgentToolBrowserPanel.tsx","../../../workbench/tool-sidebar/AgentToolSidebar.tsx","../../../workbench/tool-sidebar/Picker.tsx","../../../workbench/tool-sidebar/Toolbar.tsx","../../../workbench/tool-sidebar/useAgentToolSidebarController.ts","../../../workbench/tool-sidebar/useAgentToolSidebarLayout.ts"],"sourcesContent":["export const agentToolPanelIds = [\n \"files\",\n \"terminal\",\n \"browser\",\n \"tasks\",\n \"apps\",\n \"messages\"\n] as const;\n\nexport type AgentToolPanelId = (typeof agentToolPanelIds)[number];\n\nexport interface AgentToolPanelDefinition {\n id: AgentToolPanelId;\n label: string;\n}\n\nexport interface AgentToolTab {\n id: string;\n panel: AgentToolPanelId;\n resourceId?: string;\n}\n\nconst supportedPanelIds = new Set<string>(agentToolPanelIds);\n\nexport function isAgentToolPanelId(value: string): value is AgentToolPanelId {\n return supportedPanelIds.has(value);\n}\n\nexport function filterAgentToolPanels(\n panels: readonly { id: string; label: string }[]\n): AgentToolPanelDefinition[] {\n const seen = new Set<AgentToolPanelId>();\n const filtered: AgentToolPanelDefinition[] = [];\n for (const panel of panels) {\n if (!isAgentToolPanelId(panel.id) || seen.has(panel.id)) {\n continue;\n }\n seen.add(panel.id);\n filtered.push({ id: panel.id, label: panel.label });\n }\n return filtered;\n}\n\nconst adjacentPanelDefaultWidth = 720;\nexport const agentToolEmptySidebarWidth = Math.round(\n adjacentPanelDefaultWidth * 0.6\n);\nexport const agentToolMainMinWidth = 280;\n\nexport const agentToolPanelDefaultWidthById: Record<AgentToolPanelId, number> =\n {\n apps: adjacentPanelDefaultWidth,\n browser: adjacentPanelDefaultWidth,\n files: adjacentPanelDefaultWidth,\n messages: 440,\n tasks: 860,\n terminal: adjacentPanelDefaultWidth\n };\n\nexport const agentToolPanelMinWidthById: Record<AgentToolPanelId, number> = {\n apps: 420,\n browser: 420,\n files: 480,\n messages: 320,\n tasks: 420,\n terminal: 420\n};\n\nexport const agentToolPanelMaxWidthById: Record<AgentToolPanelId, number> = {\n apps: 1_200,\n browser: 1_200,\n files: Number.MAX_SAFE_INTEGER,\n messages: 1_200,\n tasks: 1_200,\n terminal: 1_200\n};\n\nexport interface AgentToolSidebarState {\n activePanel: AgentToolPanelId | null;\n activeTabId: string | null;\n mountedTabs: AgentToolTab[];\n}\n\nexport type AgentToolSidebarAction =\n | {\n panel: AgentToolPanelId;\n resourceId?: string;\n tabId: string;\n type: \"open-panel\" | \"add-panel\" | \"ensure-panel\";\n }\n | { tabId: string; type: \"activate-tab\" | \"close-tab\" }\n | { type: \"close\" };\n\nexport function createAgentToolSidebarState(\n initial?: Partial<AgentToolSidebarState>\n): AgentToolSidebarState {\n const activePanel = initial?.activePanel ?? null;\n const mountedTabs = initial?.mountedTabs ?? [];\n const activeTabId =\n initial?.activeTabId ??\n (activePanel === null\n ? null\n : (findLastTab(mountedTabs, activePanel)?.id ?? null));\n return {\n activePanel: activeTabId === null ? null : activePanel,\n activeTabId,\n mountedTabs\n };\n}\n\nexport function reduceAgentToolSidebarState(\n state: AgentToolSidebarState,\n action: AgentToolSidebarAction\n): AgentToolSidebarState {\n switch (action.type) {\n case \"close\":\n return state.activeTabId === null\n ? state\n : { ...state, activePanel: null, activeTabId: null };\n case \"close-tab\": {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === action.tabId\n );\n if (closingIndex < 0) {\n return state;\n }\n const mountedTabs = state.mountedTabs.filter(\n (tab) => tab.id !== action.tabId\n );\n if (state.activeTabId !== action.tabId) {\n return { ...state, mountedTabs };\n }\n const nextTab =\n mountedTabs[Math.max(0, closingIndex - 1)] ?? mountedTabs[0] ?? null;\n return {\n activePanel: nextTab?.panel ?? null,\n activeTabId: nextTab?.id ?? null,\n mountedTabs\n };\n }\n case \"activate-tab\": {\n const tab = state.mountedTabs.find(\n (candidate) => candidate.id === action.tabId\n );\n return tab\n ? { ...state, activePanel: tab.panel, activeTabId: tab.id }\n : state;\n }\n case \"add-panel\":\n return addTab(state, action);\n case \"ensure-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing ? state : addTab(state, action, { activate: false });\n }\n case \"open-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing\n ? { ...state, activePanel: existing.panel, activeTabId: existing.id }\n : addTab(state, action);\n }\n }\n}\n\nfunction addTab(\n state: AgentToolSidebarState,\n tab: {\n panel: AgentToolPanelId;\n resourceId?: string;\n tabId: string;\n },\n options: { activate?: boolean } = {}\n): AgentToolSidebarState {\n const nextTab: AgentToolTab = {\n id: tab.tabId,\n panel: tab.panel,\n ...(tab.resourceId ? { resourceId: tab.resourceId } : {})\n };\n const activate = options.activate !== false;\n return {\n activePanel: activate ? nextTab.panel : state.activePanel,\n activeTabId: activate ? nextTab.id : state.activeTabId,\n mountedTabs: state.mountedTabs.some(\n (candidate) => candidate.id === nextTab.id\n )\n ? state.mountedTabs\n : [...state.mountedTabs, nextTab]\n };\n}\n\nfunction findLastTab(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): AgentToolTab | null {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (tab?.panel === panel && (tab.resourceId ?? undefined) === resourceId) {\n return tab;\n }\n }\n return null;\n}\n\nexport function resolveAgentToolPanelExpansionReset(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n widthBeforeExpansion?: number;\n}): { panel: AgentToolPanelId; width: number } | null {\n if (input.expandedPanel === null || input.expandedPanel === input.nextPanel) {\n return null;\n }\n return {\n panel: input.expandedPanel,\n width:\n typeof input.widthBeforeExpansion === \"number\" &&\n Number.isFinite(input.widthBeforeExpansion)\n ? input.widthBeforeExpansion\n : agentToolPanelDefaultWidthById[input.expandedPanel]\n };\n}\n\nexport function resolveAgentToolPanelExpansionTransfer(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n nextPanelWidth: number;\n widthBeforeExpansion?: number;\n}): {\n expandedPanel: AgentToolPanelId;\n nextPanelWidthBeforeExpansion: number;\n previousPanel: AgentToolPanelId;\n previousPanelWidth: number;\n} | null {\n const reset = resolveAgentToolPanelExpansionReset(input);\n if (!reset || input.nextPanel === null) {\n return null;\n }\n return {\n expandedPanel: input.nextPanel,\n nextPanelWidthBeforeExpansion:\n Number.isFinite(input.nextPanelWidth) && input.nextPanelWidth > 0\n ? input.nextPanelWidth\n : agentToolPanelDefaultWidthById[input.nextPanel],\n previousPanel: reset.panel,\n previousPanelWidth: reset.width\n };\n}\n\nexport function resolveAgentToolPanelMaxWidth(\n panel: AgentToolPanelId,\n viewportWidth: number,\n allowFullWidth = false,\n mainContentMinWidth = agentToolMainMinWidth\n): number {\n const resolvedMainMin = Number.isFinite(mainContentMinWidth)\n ? Math.max(0, mainContentMinWidth)\n : agentToolMainMinWidth;\n const resolvedViewport = Number.isFinite(viewportWidth)\n ? viewportWidth\n : resolvedMainMin + agentToolPanelMinWidthById[panel];\n return Math.max(\n 0,\n Math.min(\n allowFullWidth\n ? Number.MAX_SAFE_INTEGER\n : agentToolPanelMaxWidthById[panel],\n resolvedViewport - resolvedMainMin\n )\n );\n}\n\nexport function clampAgentToolPanelWidth(input: {\n allowFullWidth?: boolean;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n viewportWidth: number;\n width: number;\n}): number {\n const maxWidth = resolveAgentToolPanelMaxWidth(\n input.panel,\n input.viewportWidth,\n input.allowFullWidth,\n input.mainContentMinWidth\n );\n const minWidth = Math.min(agentToolPanelMinWidthById[input.panel], maxWidth);\n const width = Number.isFinite(input.width)\n ? input.width\n : agentToolPanelDefaultWidthById[input.panel];\n return Math.round(Math.min(maxWidth, Math.max(minWidth, width)));\n}\n\nexport function resolveAgentToolSidebarWidth(input: {\n allowFullWidth?: boolean;\n baselineViewportWidth: number;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n preferredWidth: number;\n viewportWidth: number;\n}): number {\n const baseline = Number.isFinite(input.baselineViewportWidth)\n ? Math.max(0, input.baselineViewportWidth)\n : input.viewportWidth;\n return clampAgentToolPanelWidth({\n allowFullWidth: input.allowFullWidth,\n mainContentMinWidth: input.mainContentMinWidth,\n panel: input.panel,\n viewportWidth: input.viewportWidth,\n width: Math.max(input.preferredWidth, input.viewportWidth - baseline)\n });\n}\n\nexport function resolveAgentToolSidebarLayoutWidth(input: {\n baselineContainerWidth: number;\n panelWidth: number;\n containerWidth: number;\n}): number {\n return Math.round(Math.max(0, input.panelWidth));\n}\n\nexport function resolveAgentToolPanelPreferredWidth(input: {\n isExpanded: boolean;\n manuallyResizedWidth?: number | null;\n panelWidth: number;\n}): number {\n return !input.isExpanded &&\n typeof input.manuallyResizedWidth === \"number\" &&\n Number.isFinite(input.manuallyResizedWidth)\n ? input.manuallyResizedWidth\n : input.panelWidth;\n}\n\nexport function shouldResizeAgentToolContainer(input: {\n currentWidth: number;\n lastResize?: { actualWidth: number; requestedWidth: number } | null;\n requestedWidth: number;\n}): boolean {\n return (\n input.currentWidth !== input.requestedWidth &&\n !(\n input.lastResize?.requestedWidth === input.requestedWidth &&\n input.lastResize.actualWidth === input.currentWidth\n )\n );\n}\n\nexport function formatAgentToolReminderCount(\n value: number | null | undefined\n): string | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n const count = Math.floor(value);\n return count > 99 ? \"99+\" : String(count);\n}\n","import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\nimport {\n closeBrowserNodeTab,\n createBrowserNodeFeature,\n isBrowserNodeSurfaceEvent,\n type BrowserNodeChromeImportPromptAdapter,\n type BrowserNodeAutomationTargetMetadata,\n type BrowserNodeFeature,\n type BrowserNodeHostApi,\n type BrowserNodeSessionMode\n} from \"@tutti-os/browser-node\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\n\nconst LazyBrowserNode = lazy(() =>\n import(\"@tutti-os/browser-node/react\").then(({ BrowserNode }) => ({\n default: BrowserNode\n }))\n);\n\nexport const agentToolBrowserDefaultUrl = \"https://www.google.com/\";\n\nexport interface AgentToolBrowserPanelProps {\n automationTarget?: Omit<\n BrowserNodeAutomationTargetMetadata,\n \"focused\" | \"selected\" | \"surfaceId\" | \"tabId\"\n > | null;\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n defaultUrl?: string;\n hidden: boolean;\n i18n: I18nRuntime<string>;\n loadingFallback?: ReactNode;\n navigationActions?: ReactNode;\n nodeIdPrefix?: string;\n onControllerReady?: (controller: AgentToolBrowserController | null) => void;\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n sessionPartition?: string | null;\n}\n\nexport interface AgentToolBrowserController {\n closePage(nodeId: string): \"closed\" | \"last-page\" | \"not-found\";\n createPage(url?: string | null): string;\n ownsPage(nodeId: string): boolean;\n selectPage(nodeId: string): boolean;\n surfaceNodeId: string;\n}\n\nexport function AgentToolBrowserPanel({\n automationTarget = null,\n browserApi,\n chromeCookieImportPrompt,\n defaultUrl = agentToolBrowserDefaultUrl,\n hidden,\n i18n,\n loadingFallback = null,\n navigationActions,\n nodeIdPrefix = \"browser:agent-tool\",\n onControllerReady,\n profileId = null,\n sessionMode = \"shared\",\n sessionPartition = null\n}: AgentToolBrowserPanelProps): ReactNode {\n const [nodeId] = useState(() => createAgentToolBrowserNodeId(nodeIdPrefix));\n const feature = useMemo(\n () =>\n createAgentToolBrowserFeature({\n browserApi,\n ...(chromeCookieImportPrompt ? { chromeCookieImportPrompt } : {}),\n i18n,\n nodeId\n }),\n [browserApi, chromeCookieImportPrompt, i18n, nodeId]\n );\n const controller = useMemo<AgentToolBrowserController>(() => {\n const getPage = (pageNodeId: string) => {\n const state = feature.tabsStore.getSurfaceState(nodeId);\n const tab = state?.tabs.find(\n (candidate) => candidate.nodeId === pageNodeId\n );\n return state && tab ? { state, tab } : null;\n };\n return {\n closePage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return \"not-found\";\n if (page.state.tabs.length === 1) return \"last-page\";\n closeBrowserNodeTab(feature, nodeId, page.tab.id);\n return \"closed\";\n },\n createPage(url) {\n const resolvedUrl = url?.trim() || \"about:blank\";\n const state = feature.tabsStore.ensureSurface(nodeId, defaultUrl);\n const activeTab = state.tabs.find(\n (tab) => tab.id === state.activeTabId\n );\n const activeRuntime = activeTab\n ? feature.runtimeStore.getNodeState(activeTab.nodeId)\n : null;\n if (\n state.tabs.length === 1 &&\n activeTab?.defaultUrl === \"about:blank\" &&\n !activeRuntime?.url\n ) {\n feature.tabsStore.syncDefaultUrl(nodeId, resolvedUrl);\n return activeTab.nodeId;\n }\n return feature.tabsStore.addTab(nodeId, resolvedUrl).nodeId;\n },\n ownsPage: (pageNodeId) => getPage(pageNodeId) !== null,\n selectPage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return false;\n feature.tabsStore.selectTab(nodeId, page.tab.id);\n return true;\n },\n surfaceNodeId: nodeId\n };\n }, [defaultUrl, feature, nodeId]);\n\n const bindController = useCallback(\n (node: HTMLDivElement | null) =>\n onControllerReady?.(node ? controller : null),\n [controller, onControllerReady]\n );\n\n return (\n <div\n className=\"relative h-full min-h-0 overflow-hidden\"\n data-agent-tool-browser-surface=\"true\"\n data-agent-tool-browser-surface-id={nodeId}\n ref={bindController}\n >\n <Suspense fallback={loadingFallback}>\n <LazyBrowserNode\n automationTarget={\n automationTarget ? { ...automationTarget, focused: !hidden } : null\n }\n defaultUrl={defaultUrl}\n feature={feature}\n hidden={hidden}\n navigationActions={navigationActions}\n nodeId={nodeId}\n profileId={profileId}\n sessionMode={sessionMode}\n sessionPartition={sessionPartition}\n syncDefaultUrl\n tabs\n />\n </Suspense>\n </div>\n );\n}\n\nexport function createAgentToolBrowserFeature(input: {\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\n ...(input.chromeCookieImportPrompt\n ? { chromeCookieImportPrompt: input.chromeCookieImportPrompt }\n : {}),\n hostApi: createScopedAgentToolBrowserHostApi(\n input.browserApi,\n input.nodeId\n ),\n i18n: input.i18n,\n resolveSearchUrl: resolveAgentToolBrowserSearchUrl\n });\n}\n\nfunction createScopedAgentToolBrowserHostApi(\n browserApi: BrowserNodeHostApi,\n nodeId: string\n): BrowserNodeHostApi {\n return {\n ...browserApi,\n onEvent(listener) {\n return browserApi.onEvent((event) => {\n if (isBrowserNodeSurfaceEvent(nodeId, event)) {\n listener(event);\n }\n });\n }\n };\n}\n\nfunction resolveAgentToolBrowserSearchUrl(query: string): string {\n const searchUrl = new URL(\"https://www.google.com/search\");\n searchUrl.searchParams.set(\"q\", query);\n return searchUrl.toString();\n}\n\nfunction createAgentToolBrowserNodeId(prefix: string): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${prefix}:${instanceId}`;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n type MouseEventHandler,\n type PointerEventHandler,\n type ReactNode\n} from \"react\";\nimport { CloseIcon, cn } from \"@tutti-os/ui-system\";\nimport {\n filterAgentToolPanels,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { AgentToolSidebarPicker } from \"./Picker.tsx\";\nimport {\n AgentToolPanelIcon,\n AgentToolSidebarToolbar,\n type AgentToolSidebarCopy,\n type AgentToolSidebarReminderCounts\n} from \"./Toolbar.tsx\";\nimport { useAgentToolSidebarController } from \"./useAgentToolSidebarController.ts\";\n\nexport interface AgentToolSidebarHandle {\n addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n close(): void;\n closeTab(tabId: string): void;\n ensurePanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n}\n\nexport type AgentToolSidebarHeaderDrag =\n | { mode?: \"native-window\" }\n | {\n mode: \"host\";\n onDoubleClick?: MouseEventHandler<HTMLDivElement>;\n onPointerDown?: PointerEventHandler<HTMLDivElement>;\n };\n\nexport interface AgentToolSidebarProps {\n children: ReactNode;\n containerWidth: number;\n copy: AgentToolSidebarCopy;\n headerDrag?: AgentToolSidebarHeaderDrag;\n headerPlacement?: \"inline\" | \"external\" | \"panel\";\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n renderHeader: (toolActions: ReactNode) => ReactNode;\n renderLoading?: (tab: AgentToolTab) => ReactNode;\n renderPanel: (input: {\n active: boolean;\n closeSidebar: () => void;\n tab: AgentToolTab;\n }) => ReactNode;\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onLayoutWidthChange?: (width: number) => void;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}\n\nexport const AgentToolSidebar = forwardRef<\n AgentToolSidebarHandle,\n AgentToolSidebarProps\n>(function AgentToolSidebar(\n {\n children,\n containerWidth,\n copy,\n headerDrag,\n headerPlacement = \"inline\",\n mainContentMinWidthPx,\n panels: unfilteredPanels,\n quickActionPanels,\n reminders,\n renderHeader,\n renderLoading,\n renderPanel,\n renderTabIcon,\n resolveTabLabel,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n },\n ref\n): ReactNode {\n const panels = filterAgentToolPanels(unfilteredPanels);\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n measureToolActions,\n mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n stopResizing,\n toolActionsWidth,\n toggleSidebar,\n togglePanelExpansion\n } = useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabClose,\n onTabsChange,\n panels,\n resizeContainerContentWidth\n });\n\n useImperativeHandle(\n ref,\n () => ({\n addPanel,\n close: closePanel,\n closeTab: closePanelTab,\n ensurePanel,\n openPanel\n }),\n [addPanel, closePanel, closePanelTab, ensurePanel, openPanel]\n );\n\n const isHostHeaderDrag = headerDrag?.mode === \"host\";\n const handleHeaderDoubleClick: MouseEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onDoubleClick?.(event);\n }\n };\n const handleHeaderPointerDown: PointerEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onPointerDown?.(event);\n }\n };\n\n const toolActions = (\n <div\n className={cn(\n \"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 max-w-full shrink-0 cursor-grab items-center pr-[var(--agent-gui-workbench-header-padding-x)] active:cursor-grabbing\",\n isHostHeaderDrag\n ? \"[-webkit-app-region:no-drag]\"\n : \"[-webkit-app-region:drag]\",\n isSidebarOpen && \"border-b border-[var(--border-1)]\"\n )}\n data-standalone-agent-tool-sidebar-drag-region=\"true\"\n data-standalone-agent-tool-sidebar-header=\"true\"\n ref={measureToolActions}\n style={\n isSidebarOpen\n ? { width: `${activePanelWidth}px`, maxWidth: \"100%\" }\n : undefined\n }\n onDoubleClick={isHostHeaderDrag ? handleHeaderDoubleClick : undefined}\n onPointerDown={isHostHeaderDrag ? handleHeaderPointerDown : undefined}\n >\n {activeTabId ? (\n <ToolSidebarTabBar\n activeTabId={activeTabId}\n copy={copy}\n labelByPanel={labelByPanel}\n mountedTabs={mountedTabs}\n renderTabIcon={renderTabIcon}\n resolveTabLabel={resolveTabLabel}\n onClosePanel={closePanelTab}\n onOpenPanel={activatePanelTab}\n />\n ) : null}\n <AgentToolSidebarToolbar\n activePanel={activePanel}\n copy={copy}\n isExpanded={isActivePanelExpanded}\n isOpen={isSidebarOpen}\n panels={panels}\n quickActionPanels={quickActionPanels}\n reminders={reminders}\n onAddPanel={addPanel}\n onOpenPanel={openPanel}\n onToggleExpansion={() => {\n if (activePanel) togglePanelExpansion(activePanel);\n }}\n onToggleSidebar={toggleSidebar}\n />\n </div>\n );\n\n return (\n <>\n {headerPlacement === \"external\" || headerPlacement === \"panel\" ? (\n renderHeader(\n headerPlacement === \"panel\" && isSidebarOpen ? null : toolActions\n )\n ) : (\n <div\n className=\"workbench-window__header workbench-window__header--custom\"\n style={\n {\n \"--agent-gui-tool-sidebar-layout-width\": isSidebarOpen\n ? `${activePanelLayoutWidth}px`\n : `${toolActionsWidth}px`\n } as CSSProperties\n }\n >\n {renderHeader(toolActions)}\n </div>\n )}\n <div\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\",\n headerPlacement === \"inline\" && \"workbench-window__body\"\n )}\n ref={bindLifecycle}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <div className=\"h-full min-w-0 flex-1 overflow-hidden\">\n {children}\n </div>\n <aside\n aria-hidden={!isSidebarOpen}\n className={cn(\n \"relative h-full min-h-0 shrink-0 overflow-hidden [contain:layout_paint]\",\n shouldAnimateSidebarWidth &&\n \"motion-safe:transition-[width] motion-safe:duration-[260ms] motion-safe:ease-in-out motion-reduce:transition-none\",\n isActivePanelExpanded && \"border-l border-[var(--line-1)]\",\n !isSidebarOpen && \"pointer-events-none\"\n )}\n data-standalone-agent-tool-sidebar=\"true\"\n ref={bindLayoutWidthProjection}\n style={{\n width: isSidebarOpen ? `${activePanelLayoutWidth}px` : \"0px\",\n zIndex: \"var(--z-panel)\"\n }}\n onTransitionEnd={handleSidebarTransitionEnd}\n >\n <div\n className={cn(\n \"absolute inset-y-0 right-0 flex flex-col bg-[var(--background-session-sidepanel)]\",\n isSidebarOpen &&\n !shouldAnimateSidebarLayout &&\n \"motion-safe:animate-in motion-safe:slide-in-from-right-3 motion-safe:duration-[160ms] motion-safe:ease-out motion-reduce:animate-none\",\n !isSidebarOpen && !isEmptySidebarClosing && \"invisible\"\n )}\n style={\n {\n \"--background-panel\": \"var(--background-session-sidepanel)\",\n width: `${activePanelWidth}px`\n } as CSSProperties\n }\n >\n {isSidebarOpen && !isEmptySidebar ? (\n <div\n aria-label={copy.resizeSidebar}\n aria-orientation=\"vertical\"\n aria-valuemax={activePanelMaxWidth}\n aria-valuemin={activePanelMinWidth}\n aria-valuenow={activePanelWidth}\n className=\"absolute top-0 left-0 z-20 h-full w-2 cursor-col-resize touch-none outline-none before:absolute before:left-0 before:h-full before:w-px before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n data-standalone-agent-tool-sidebar-resize-handle=\"true\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleResizeKeyDown}\n onLostPointerCapture={stopResizing}\n onPointerDown={handleResizePointerDown}\n onPointerMove={handleResizePointerMove}\n onPointerUp={stopResizing}\n />\n ) : null}\n {isSidebarOpen && headerPlacement === \"panel\"\n ? toolActions\n : null}\n {isSidebarOpen && headerPlacement === \"inline\" ? (\n <div\n aria-hidden\n className=\"shrink-0\"\n data-standalone-agent-tool-sidebar-header-spacer=\"true\"\n style={{\n height: \"var(--agent-gui-workbench-header-height, 44px)\"\n }}\n />\n ) : null}\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {isEmptySidebar || isEmptySidebarClosing ? (\n <AgentToolSidebarPicker\n panels={panels}\n onSelect={openPanel}\n />\n ) : null}\n {mountedTabs.map((tab) => (\n <div\n aria-hidden={activeTabId !== tab.id}\n className={cn(\n \"absolute inset-0 min-h-0 overflow-hidden\",\n activeTabId !== tab.id && \"invisible pointer-events-none\"\n )}\n key={tab.id}\n >\n {contentReadyTabIds.includes(tab.id) ? (\n <div\n className={cn(\n \"h-full min-h-0\",\n tab.panel !== \"terminal\" &&\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-150 motion-reduce:animate-none\"\n )}\n >\n {renderPanel({\n active: activeTabId === tab.id,\n closeSidebar: closePanel,\n tab\n })}\n </div>\n ) : activeTabId === tab.id ? (\n (renderLoading?.(tab) ?? null)\n ) : null}\n </div>\n ))}\n </div>\n </div>\n </aside>\n </div>\n </div>\n </>\n );\n});\n\nfunction ToolSidebarTabBar({\n activeTabId,\n copy,\n labelByPanel,\n mountedTabs,\n renderTabIcon,\n resolveTabLabel,\n onClosePanel,\n onOpenPanel\n}: {\n activeTabId: string;\n copy: AgentToolSidebarCopy;\n labelByPanel: ReadonlyMap<AgentToolPanelId, string>;\n mountedTabs: readonly AgentToolTab[];\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n onClosePanel: (tabId: string) => void;\n onOpenPanel: (tab: AgentToolTab) => void;\n}): ReactNode {\n return (\n <div\n aria-label={copy.tool}\n className=\"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 flex-1 cursor-grab items-center gap-1 overflow-hidden px-2 active:cursor-grabbing\"\n data-standalone-agent-tool-tab-list=\"true\"\n role=\"tablist\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\">\n {mountedTabs.map((tab) => {\n const defaultLabel = labelByPanel.get(tab.panel) ?? tab.panel;\n const label = resolveTabLabel?.(tab, defaultLabel) ?? defaultLabel;\n return (\n <div\n className={cn(\n \"group flex h-7 max-w-44 shrink-0 items-center rounded-sm overflow-hidden border text-xs text-[var(--text-tertiary)]\",\n activeTabId === tab.id\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border-transparent\"\n )}\n key={tab.id}\n >\n <button\n aria-selected={activeTabId === tab.id}\n className=\"nodrag flex h-full min-w-0 flex-1 items-center gap-1.5 overflow-hidden px-2 text-left outline-none [-webkit-app-region:no-drag] focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]\"\n data-standalone-agent-tool-tab={tab.panel}\n data-standalone-agent-tool-tab-id={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onOpenPanel(tab)}\n >\n {renderTabIcon?.(tab) ?? (\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-3.5 shrink-0\"\n panel={tab.panel}\n />\n )}\n <span className=\"truncate\">{label}</span>\n </button>\n <button\n aria-label={`${copy.close} ${label}`}\n className=\"nodrag mr-1 rounded p-0.5 opacity-100 hover:bg-[var(--transparency-block)] [-webkit-app-region:no-drag]\"\n type=\"button\"\n onClick={() => onClosePanel(tab.id)}\n >\n <CloseIcon aria-hidden className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction isAgentToolSidebarHeaderControl(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n target.closest(\n '.nodrag, button, a, input, textarea, select, option, [role=\"button\"], [role=\"menuitem\"], [contenteditable=\"true\"]'\n ) !== null\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { AgentToolPanelDefinition, AgentToolPanelId } from \"./model.ts\";\nimport { AgentToolPanelIcon } from \"./Toolbar.tsx\";\n\nexport function AgentToolSidebarPicker({\n panels,\n onSelect\n}: {\n panels: readonly AgentToolPanelDefinition[];\n onSelect: (panel: AgentToolPanelId) => void;\n}): ReactNode {\n return (\n <div\n className=\"flex h-full min-h-0 items-center justify-center overflow-auto px-6 py-10\"\n data-standalone-agent-tool-sidebar-picker=\"true\"\n >\n <div className=\"flex w-full max-w-[340px] flex-col gap-2\">\n {panels.map((panel) => (\n <Button\n className=\"h-12 w-full justify-start gap-2.5 rounded-lg border border-[var(--line-1)] bg-[var(--background-fronted)] px-2.5 text-left text-[14px] font-medium text-[var(--text-primary)] shadow-none hover:border-[var(--line-2)] hover:bg-[var(--transparency-hover)]\"\n key={panel.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onSelect(panel.id)}\n >\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-[7px] bg-[var(--transparency-block)] text-[var(--text-secondary)] group-hover/button:text-[var(--text-primary)]\">\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n </span>\n <span>{panel.label}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport {\n AddLinedIcon,\n Button,\n ChatIcon,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MaximizeIcon,\n NavApplicationsLinedIcon,\n PanelIcon,\n RestoreIcon,\n TaskIcon,\n TerminalLinedIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n WebIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n formatAgentToolReminderCount,\n type AgentToolPanelDefinition,\n type AgentToolPanelId\n} from \"./model.ts\";\n\nexport interface AgentToolSidebarCopy {\n close: string;\n closeRightPanel: string;\n expand: string;\n newTab: string;\n openRightPanel: string;\n resizeSidebar: string;\n shrink: string;\n tool: string;\n}\n\nexport type AgentToolSidebarReminderCounts = Partial<\n Record<AgentToolPanelId, number>\n>;\n\nconst iconByPanel = {\n apps: NavApplicationsLinedIcon,\n browser: WebIcon,\n files: FolderIcon,\n messages: ChatIcon,\n tasks: TaskIcon,\n terminal: TerminalLinedIcon\n} satisfies Record<AgentToolPanelId, ComponentType<IconProps>>;\n\nexport function AgentToolPanelIcon({\n panel,\n ...iconProps\n}: IconProps & { panel: AgentToolPanelId }): ReactNode {\n const Icon = iconByPanel[panel];\n return <Icon {...iconProps} />;\n}\n\nexport function AgentToolSidebarToolbar({\n activePanel,\n copy,\n isExpanded,\n isOpen,\n panels,\n quickActionPanels = [],\n reminders = {},\n onAddPanel,\n onOpenPanel,\n onToggleExpansion,\n onToggleSidebar\n}: {\n activePanel: AgentToolPanelId | null;\n copy: AgentToolSidebarCopy;\n isExpanded: boolean;\n isOpen: boolean;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n onAddPanel: (panel: AgentToolPanelId) => void;\n onOpenPanel: (panel: AgentToolPanelId) => void;\n onToggleExpansion: () => void;\n onToggleSidebar: () => void;\n}): ReactNode {\n const label = isOpen ? copy.closeRightPanel : copy.openRightPanel;\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const quickActions = quickActionPanels.filter((panel) =>\n labelByPanel.has(panel)\n );\n\n return (\n <TooltipProvider>\n <nav\n aria-label={copy.tool}\n className={cn(\n \"nodrag pointer-events-auto flex h-[var(--agent-gui-workbench-header-height,44px)] items-center gap-1 [-webkit-app-region:no-drag]\",\n activePanel === null && isOpen && \"ml-auto\"\n )}\n data-standalone-agent-tool-sidebar-toolbar=\"true\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {activePanel ? (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.newTab}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n >\n <AddLinedIcon aria-hidden className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-36\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {panels.map((panel) => (\n <DropdownMenuItem\n key={panel.id}\n onSelect={() => onAddPanel(panel.id)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n <span>{panel.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n {activePanel === null && !isOpen\n ? quickActions.map((panel) => (\n <ToolbarQuickActionTooltip\n key={panel}\n label={labelByPanel.get(panel) ?? panel}\n >\n <Button\n aria-label={labelByPanel.get(panel) ?? panel}\n aria-pressed={false}\n className=\"relative text-[var(--text-secondary)]\"\n data-standalone-agent-tool-sidebar-quick-action={panel}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => onOpenPanel(panel)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel}\n />\n <ReminderBadge count={reminders[panel]} />\n </Button>\n </ToolbarQuickActionTooltip>\n ))\n : null}\n {activePanel ? (\n <Button\n aria-label={`${isExpanded ? copy.shrink : copy.expand} ${labelByPanel.get(activePanel) ?? activePanel}`}\n aria-pressed={isExpanded}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={onToggleExpansion}\n >\n {isExpanded ? (\n <RestoreIcon aria-hidden className=\"size-3.5\" />\n ) : (\n <MaximizeIcon aria-hidden className=\"size-3.5\" />\n )}\n </Button>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n aria-pressed={isOpen}\n className=\"relative\"\n data-standalone-agent-tool-sidebar-toggle=\"true\"\n size=\"icon-sm\"\n type=\"button\"\n variant={isOpen && activePanel !== null ? \"secondary\" : \"chrome\"}\n onClick={onToggleSidebar}\n >\n <PanelIcon aria-hidden className=\"size-[18px] -scale-x-100\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </nav>\n </TooltipProvider>\n );\n}\n\nfunction ToolbarQuickActionTooltip({\n children,\n label\n}: {\n children: ReactNode;\n label: string;\n}): ReactNode {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ReminderBadge({ count }: { count?: number }): ReactNode {\n const label = formatAgentToolReminderCount(count);\n return label ? (\n <span className=\"absolute -top-1 -right-1 inline-flex min-w-4 items-center justify-center rounded-full bg-[var(--state-danger)] px-1 text-[9px] leading-4 font-semibold text-[var(--white-stationary)]\">\n {label}\n </span>\n ) : null;\n}\n","import {\n useCallback,\n useReducer,\n useRef,\n useState,\n type TransitionEvent\n} from \"react\";\nimport {\n agentToolEmptySidebarWidth,\n createAgentToolSidebarState,\n reduceAgentToolSidebarState,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { useAgentToolSidebarLayout } from \"./useAgentToolSidebarLayout.ts\";\n\nconst collapsedToolActionsWidthPx = 132;\n\nexport function useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n panels,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n}: {\n containerWidth: number;\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onLayoutWidthChange?: (width: number) => void;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}) {\n const panelIds = new Set(panels.map((panel) => panel.id));\n const [state, dispatch] = useReducer(\n reduceAgentToolSidebarState,\n undefined,\n createAgentToolSidebarState\n );\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const [isEmptySidebarClosing, setIsEmptySidebarClosing] = useState(false);\n const [contentReadyTabIds, setContentReadyTabIds] = useState<string[]>([]);\n const [toolActionsWidth, setToolActionsWidth] = useState(\n collapsedToolActionsWidthPx\n );\n const activePanel = state.activePanel;\n const activeTabId = state.activeTabId;\n const fallbackPanel = panels[0]?.id ?? null;\n const isEmptySidebar = isSidebarOpen && state.mountedTabs.length === 0;\n const isEmptySidebarSurface =\n (isSidebarOpen || isEmptySidebarClosing) && state.mountedTabs.length === 0;\n const layoutPanel =\n activePanel ?? (isEmptySidebarSurface ? fallbackPanel : null);\n const isActivePanelContentReady =\n activeTabId !== null && contentReadyTabIds.includes(activeTabId);\n const shouldAnimateSidebarLayout =\n state.mountedTabs.length === 0 || isActivePanelContentReady;\n const shouldAnimateSidebarWidth = isEmptySidebarSurface;\n const layout = useAgentToolSidebarLayout({\n activePanel: layoutPanel,\n activePanelPreferredWidth: isEmptySidebarSurface\n ? agentToolEmptySidebarWidth\n : undefined,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n });\n const resizeAnimationFrameRef = useRef<number | null>(null);\n const contentAnimationFrameIdsRef = useRef(new Set<number>());\n const toolActionsResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const scheduleResizeForPanel = useCallback(\n (\n panel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: { animateContainer?: boolean; preserveBaseline?: boolean }\n ) => {\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n }\n resizeAnimationFrameRef.current = window.requestAnimationFrame(() => {\n resizeAnimationFrameRef.current = null;\n void layout.resizeForPanel(panel, preferredWidth, options);\n });\n },\n [layout.resizeForPanel]\n );\n\n const showSidebar = useCallback(() => {\n setIsEmptySidebarClosing(false);\n setIsSidebarOpen(true);\n }, []);\n\n const markContentReady = useCallback((tabId: string) => {\n if (prefersReducedMotion()) {\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n return;\n }\n let completedSynchronously = false;\n let frameId = 0;\n frameId = window.requestAnimationFrame(() => {\n completedSynchronously = true;\n contentAnimationFrameIdsRef.current.delete(frameId);\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n });\n if (!completedSynchronously) {\n contentAnimationFrameIdsRef.current.add(frameId);\n }\n }, []);\n\n const closePanel = useCallback(() => {\n setIsSidebarOpen(false);\n dispatch({ type: \"close\" });\n onActivePanelChange?.(null);\n if (state.mountedTabs.length > 0 || prefersReducedMotion()) {\n setIsEmptySidebarClosing(false);\n scheduleResizeForPanel(null);\n return;\n }\n setIsEmptySidebarClosing(true);\n scheduleResizeForPanel(null, undefined, {\n animateContainer: true,\n preserveBaseline: true\n });\n }, [onActivePanelChange, scheduleResizeForPanel, state.mountedTabs.length]);\n\n const openPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = resolveToolTabId(state.mountedTabs, panel, resourceId);\n const action = { panel, resourceId, tabId, type: \"open-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n if (nextState.mountedTabs !== state.mountedTabs) {\n onTabsChange?.(nextState.mountedTabs);\n }\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const addPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = createToolTabId(panel);\n const action = { panel, resourceId, tabId, type: \"add-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const ensurePanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n const existing = state.mountedTabs.find(\n (tab) =>\n tab.panel === panel && (tab.resourceId ?? undefined) === resourceId\n );\n if (existing) return existing.id;\n const tabId = createToolTabId(panel);\n const action = {\n panel,\n resourceId,\n tabId,\n type: \"ensure-panel\"\n } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n return tabId;\n },\n [markContentReady, onTabsChange, panelIds, state]\n );\n\n const closePanelTab = useCallback(\n (tabId: string) => {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === tabId\n );\n const closingTab = state.mountedTabs[closingIndex];\n if (!closingTab) return;\n const action = { tabId, type: \"close-tab\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n setIsSidebarOpen(true);\n dispatch(action);\n onTabClose?.(closingTab);\n onActivePanelChange?.(nextState.activePanel);\n onTabsChange?.(nextState.mountedTabs);\n if (nextState.activePanel === null) {\n if (fallbackPanel) {\n scheduleResizeForPanel(fallbackPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n }\n return;\n }\n scheduleResizeForPanel(nextState.activePanel);\n },\n [\n fallbackPanel,\n onActivePanelChange,\n onTabClose,\n onTabsChange,\n scheduleResizeForPanel,\n state\n ]\n );\n\n const activatePanelTab = useCallback(\n (tab: AgentToolTab) => {\n onPanelOpen?.(tab.panel, tab.resourceId);\n dispatch({ tabId: tab.id, type: \"activate-tab\" });\n onActivePanelChange?.(tab.panel);\n markContentReady(tab.id);\n scheduleResizeForPanel(tab.panel);\n },\n [markContentReady, onActivePanelChange, onPanelOpen, scheduleResizeForPanel]\n );\n\n const toggleSidebar = useCallback(() => {\n const nextPanel = activePanel ?? fallbackPanel;\n if (isSidebarOpen) {\n closePanel();\n return;\n }\n if (!nextPanel) return;\n showSidebar();\n if (state.mountedTabs.length === 0) {\n scheduleResizeForPanel(nextPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n return;\n }\n const tabId = resolveToolTabId(state.mountedTabs, nextPanel);\n dispatch({ panel: nextPanel, tabId, type: \"open-panel\" });\n onActivePanelChange?.(nextPanel);\n markContentReady(tabId);\n scheduleResizeForPanel(nextPanel);\n }, [\n activePanel,\n closePanel,\n fallbackPanel,\n isSidebarOpen,\n markContentReady,\n onActivePanelChange,\n scheduleResizeForPanel,\n showSidebar,\n state.mountedTabs\n ]);\n\n const handleSidebarTransitionEnd = useCallback(\n (event: TransitionEvent<HTMLElement>) => {\n if (\n event.currentTarget !== event.target ||\n event.propertyName !== \"width\" ||\n isSidebarOpen ||\n !isEmptySidebarClosing\n ) {\n return;\n }\n setIsEmptySidebarClosing(false);\n layout.resetContainerResizeBaseline();\n },\n [isEmptySidebarClosing, isSidebarOpen, layout.resetContainerResizeBaseline]\n );\n\n const bindLayoutWidthProjection = useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n onLayoutWidthChange?.(\n isSidebarOpen ? layout.activePanelLayoutWidth : 0\n );\n }\n },\n [isSidebarOpen, layout.activePanelLayoutWidth, onLayoutWidthChange]\n );\n\n const bindLifecycle = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) return;\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n resizeAnimationFrameRef.current = null;\n }\n for (const frameId of contentAnimationFrameIdsRef.current) {\n window.cancelAnimationFrame(frameId);\n }\n contentAnimationFrameIdsRef.current.clear();\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n layout.bindLayoutRoot(null);\n },\n [layout.bindLayoutRoot]\n );\n\n const measureToolActions = useCallback((node: HTMLDivElement | null) => {\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n if (!node) return;\n const measure = (): void => {\n const width = Math.ceil(node.getBoundingClientRect().width);\n if (width > 0) setToolActionsWidth(width);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n toolActionsResizeObserverRef.current = observer;\n }, []);\n\n return {\n ...layout,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n markContentReady,\n measureToolActions,\n mountedTabs: state.mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n toolActionsWidth,\n toggleSidebar\n };\n}\n\nfunction resolveToolTabId(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): string {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (\n tab?.panel === panel &&\n (resourceId === undefined || tab.resourceId === resourceId)\n ) {\n return tab.id;\n }\n }\n return createToolTabId(panel);\n}\n\nfunction createToolTabId(panel: AgentToolPanelId): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${panel}:${instanceId}`;\n}\n\nfunction prefersReducedMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent\n} from \"react\";\nimport {\n agentToolPanelDefaultWidthById,\n agentToolPanelMinWidthById,\n clampAgentToolPanelWidth,\n resolveAgentToolPanelExpansionReset,\n resolveAgentToolPanelExpansionTransfer,\n resolveAgentToolPanelMaxWidth,\n resolveAgentToolPanelPreferredWidth,\n resolveAgentToolSidebarLayoutWidth,\n resolveAgentToolSidebarWidth,\n shouldResizeAgentToolContainer,\n type AgentToolPanelId\n} from \"./model.ts\";\n\ntype ToolPanelWidths = Record<AgentToolPanelId, number>;\n\ninterface ToolPanelResizeState {\n panel: AgentToolPanelId;\n pointerId: number;\n startClientX: number;\n startWidth: number;\n}\n\nexport interface ResizeForPanelOptions {\n animateContainer?: boolean;\n preserveBaseline?: boolean;\n}\n\nexport function useAgentToolSidebarLayout({\n activePanel,\n activePanelPreferredWidth,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n}: {\n activePanel: AgentToolPanelId | null;\n activePanelPreferredWidth?: number;\n containerWidth: number;\n mainContentMinWidthPx?: number;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n}) {\n const [containerResolution, setContainerResolution] = useState(() => ({\n resolved: containerWidth,\n source: containerWidth\n }));\n if (containerResolution.source !== containerWidth) {\n setContainerResolution({\n resolved: containerWidth,\n source: containerWidth\n });\n }\n const resolvedContainerWidth = containerResolution.resolved;\n const [panelWidths, setPanelWidths] = useState<ToolPanelWidths>(() => ({\n ...agentToolPanelDefaultWidthById\n }));\n const [manuallyResizedWidth, setManuallyResizedWidth] = useState<\n number | null\n >(null);\n const [expandedPanel, setExpandedPanel] = useState<AgentToolPanelId | null>(\n null\n );\n const expandedPanelRef = useRef<AgentToolPanelId | null>(null);\n const baselineContainerWidthRef = useRef<number | null>(null);\n const panelWidthBeforeExpandRef = useRef<Partial<ToolPanelWidths>>({});\n const resizeRequestRef = useRef(0);\n const lastContainerResizeRef = useRef<{\n actualWidth: number;\n requestedWidth: number;\n } | null>(null);\n const dragRef = useRef<ToolPanelResizeState | null>(null);\n const resizeStyleRef = useRef<{ cursor: string; userSelect: string } | null>(\n null\n );\n\n const isActivePanelExpanded =\n activePanel !== null && expandedPanel === activePanel;\n const activePanelMaxWidth = activePanel\n ? resolveAgentToolPanelMaxWidth(\n activePanel,\n resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx\n )\n : 0;\n const activePanelMinWidth = activePanel\n ? Math.min(agentToolPanelMinWidthById[activePanel], activePanelMaxWidth)\n : 0;\n const activePanelWidth = activePanel\n ? resolveActivePanelWidth({\n activePanel,\n activePanelMaxWidth,\n activePanelPreferredWidth,\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx,\n panelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: isActivePanelExpanded,\n manuallyResizedWidth,\n panelWidth: panelWidths[activePanel]\n })\n })\n : 0;\n const activePanelLayoutWidth = activePanel\n ? resolveAgentToolSidebarLayoutWidth({\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n panelWidth: activePanelWidth\n })\n : 0;\n\n const resetPanelExpansion = useCallback(\n (nextPanel: AgentToolPanelId | null): \"reset\" | \"transferred\" | null => {\n const reset = resolveAgentToolPanelExpansionReset({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n widthBeforeExpansion:\n expandedPanelRef.current === null\n ? undefined\n : panelWidthBeforeExpandRef.current[expandedPanelRef.current]\n });\n if (!reset) return null;\n\n if (nextPanel !== null) {\n const transfer = resolveAgentToolPanelExpansionTransfer({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n nextPanelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n }),\n widthBeforeExpansion:\n panelWidthBeforeExpandRef.current[expandedPanelRef.current!] ??\n manuallyResizedWidth ??\n undefined\n });\n if (!transfer) return null;\n expandedPanelRef.current = transfer.expandedPanel;\n setExpandedPanel(transfer.expandedPanel);\n setPanelWidths((current) => ({\n ...current,\n [transfer.previousPanel]: transfer.previousPanelWidth,\n [transfer.expandedPanel]: Number.MAX_SAFE_INTEGER\n }));\n panelWidthBeforeExpandRef.current[transfer.expandedPanel] =\n transfer.nextPanelWidthBeforeExpansion;\n delete panelWidthBeforeExpandRef.current[transfer.previousPanel];\n return \"transferred\";\n }\n\n expandedPanelRef.current = null;\n setExpandedPanel(null);\n setPanelWidths((current) => ({ ...current, [reset.panel]: reset.width }));\n delete panelWidthBeforeExpandRef.current[reset.panel];\n return \"reset\";\n },\n [manuallyResizedWidth, panelWidths]\n );\n\n const resizeForPanel = useCallback(\n async (\n nextPanel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: ResizeForPanelOptions\n ): Promise<boolean> => {\n const requestId = ++resizeRequestRef.current;\n const expansionTransition = resetPanelExpansion(nextPanel);\n if (\n expansionTransition === \"transferred\" ||\n (nextPanel !== null && expandedPanelRef.current === nextPanel)\n ) {\n return true;\n }\n if (nextPanel !== null && baselineContainerWidthRef.current === null) {\n baselineContainerWidthRef.current = resolvedContainerWidth;\n }\n const baseline = baselineContainerWidthRef.current;\n const requestedWidth =\n nextPanel === null\n ? baseline\n : (baseline ?? resolvedContainerWidth) +\n resolvePreferredWidth(\n preferredWidth,\n resolveAgentToolPanelPreferredWidth({\n isExpanded: expandedPanelRef.current === nextPanel,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n })\n );\n\n if (\n requestedWidth !== null &&\n shouldResizeAgentToolContainer({\n currentWidth: resolvedContainerWidth,\n lastResize: lastContainerResizeRef.current,\n requestedWidth\n })\n ) {\n try {\n const result = await resizeContainerContentWidth(\n requestedWidth,\n options?.animateContainer\n );\n if (requestId !== resizeRequestRef.current) return false;\n if (result.width > 0) {\n lastContainerResizeRef.current = {\n actualWidth: result.width,\n requestedWidth\n };\n setContainerResolution((current) => ({\n ...current,\n resolved: result.width\n }));\n }\n } catch {\n if (requestId !== resizeRequestRef.current) return false;\n }\n }\n\n if (nextPanel === null && options?.preserveBaseline !== true) {\n baselineContainerWidthRef.current = null;\n }\n return true;\n },\n [\n manuallyResizedWidth,\n panelWidths,\n resetPanelExpansion,\n resizeContainerContentWidth,\n resolvedContainerWidth\n ]\n );\n\n const resetContainerResizeBaseline = useCallback(() => {\n baselineContainerWidthRef.current = null;\n }, []);\n\n const updatePanelWidth = useCallback(\n (panel: AgentToolPanelId, width: number) => {\n const nextWidth = clampAgentToolPanelWidth({\n allowFullWidth: expandedPanel === panel,\n mainContentMinWidth: mainContentMinWidthPx,\n panel,\n viewportWidth: resolvedContainerWidth,\n width\n });\n setManuallyResizedWidth(nextWidth);\n setPanelWidths((current) => ({ ...current, [panel]: nextWidth }));\n },\n [expandedPanel, mainContentMinWidthPx, resolvedContainerWidth]\n );\n\n const togglePanelExpansion = useCallback(\n (panel: AgentToolPanelId) => {\n if (expandedPanelRef.current === panel) {\n resetPanelExpansion(null);\n return;\n }\n resetPanelExpansion(panel);\n expandedPanelRef.current = panel;\n setExpandedPanel(panel);\n setPanelWidths((current) => {\n panelWidthBeforeExpandRef.current[panel] =\n resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: current[panel]\n });\n return { ...current, [panel]: Number.MAX_SAFE_INTEGER };\n });\n },\n [manuallyResizedWidth, resetPanelExpansion]\n );\n\n const stopResizing = useCallback(() => {\n dragRef.current = null;\n const styles = resizeStyleRef.current;\n if (!styles) return;\n document.body.style.cursor = styles.cursor;\n document.body.style.userSelect = styles.userSelect;\n resizeStyleRef.current = null;\n }, []);\n const bindLayoutRoot = useCallback(\n (node: HTMLElement | null) => {\n if (!node) stopResizing();\n },\n [stopResizing]\n );\n\n const handleResizePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || activePanel === null) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n dragRef.current = {\n panel: activePanel,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startWidth: activePanelWidth\n };\n resizeStyleRef.current = {\n cursor: document.body.style.cursor,\n userSelect: document.body.style.userSelect\n };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [activePanel, activePanelWidth]\n );\n\n const handleResizePointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n const resizeState = dragRef.current;\n if (!resizeState || resizeState.pointerId !== event.pointerId) return;\n updatePanelWidth(\n resizeState.panel,\n resizeState.startWidth + resizeState.startClientX - event.clientX\n );\n },\n [updatePanelWidth]\n );\n\n const handleResizeKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (activePanel === null) return;\n if (event.key === \"Home\") {\n event.preventDefault();\n updatePanelWidth(activePanel, activePanelMinWidth);\n } else if (event.key === \"End\") {\n event.preventDefault();\n updatePanelWidth(activePanel, Number.MAX_SAFE_INTEGER);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n updatePanelWidth(\n activePanel,\n activePanelWidth + (event.key === \"ArrowLeft\" ? 24 : -24)\n );\n }\n },\n [activePanel, activePanelMinWidth, activePanelWidth, updatePanelWidth]\n );\n\n return {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n bindLayoutRoot,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n resetContainerResizeBaseline,\n resizeForPanel,\n stopResizing,\n togglePanelExpansion\n };\n}\n\nfunction resolveActivePanelWidth(input: {\n activePanel: AgentToolPanelId;\n activePanelMaxWidth: number;\n activePanelPreferredWidth?: number;\n baselineContainerWidth: number;\n containerWidth: number;\n isActivePanelExpanded: boolean;\n mainContentMinWidthPx?: number;\n panelWidth: number;\n}): number {\n if (\n typeof input.activePanelPreferredWidth === \"number\" &&\n Number.isFinite(input.activePanelPreferredWidth)\n ) {\n return Math.round(\n Math.max(\n 0,\n Math.min(input.activePanelMaxWidth, input.activePanelPreferredWidth)\n )\n );\n }\n return resolveAgentToolSidebarWidth({\n allowFullWidth: input.isActivePanelExpanded,\n baselineViewportWidth: input.baselineContainerWidth,\n mainContentMinWidth: input.mainContentMinWidthPx,\n panel: input.activePanel,\n preferredWidth: input.panelWidth,\n viewportWidth: input.containerWidth\n });\n}\n\nfunction resolvePreferredWidth(\n preferredWidth: number | undefined,\n fallbackWidth: number\n): number {\n return typeof preferredWidth === \"number\" && Number.isFinite(preferredWidth)\n ? Math.max(0, Math.round(preferredWidth))\n : fallbackWidth;\n}\n"],"mappings":"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","names":["cn","Button","jsx","jsx","jsxs","Button","useCallback","useRef","useState","useCallback","useState","useState","useCallback","useState","useRef","useCallback","jsx","jsxs","AgentToolSidebar","cn"]}
|
|
1
|
+
{"version":3,"sources":["../../../workbench/tool-sidebar/model.ts","../../../workbench/tool-sidebar/AgentToolBrowserPanel.tsx","../../../workbench/tool-sidebar/AgentToolSidebar.tsx","../../../workbench/tool-sidebar/Picker.tsx","../../../workbench/tool-sidebar/Toolbar.tsx","../../../workbench/tool-sidebar/useAgentToolSidebarController.ts","../../../workbench/tool-sidebar/useAgentToolSidebarLayout.ts"],"sourcesContent":["export const agentToolPanelIds = [\n \"files\",\n \"terminal\",\n \"browser\",\n \"tasks\",\n \"apps\",\n \"messages\"\n] as const;\n\nexport type AgentToolPanelId = (typeof agentToolPanelIds)[number];\n\nexport interface AgentToolPanelDefinition {\n id: AgentToolPanelId;\n label: string;\n}\n\nexport interface AgentToolTab {\n id: string;\n panel: AgentToolPanelId;\n resourceId?: string;\n}\n\nconst supportedPanelIds = new Set<string>(agentToolPanelIds);\n\nexport function isAgentToolPanelId(value: string): value is AgentToolPanelId {\n return supportedPanelIds.has(value);\n}\n\nexport function filterAgentToolPanels(\n panels: readonly { id: string; label: string }[]\n): AgentToolPanelDefinition[] {\n const seen = new Set<AgentToolPanelId>();\n const filtered: AgentToolPanelDefinition[] = [];\n for (const panel of panels) {\n if (!isAgentToolPanelId(panel.id) || seen.has(panel.id)) {\n continue;\n }\n seen.add(panel.id);\n filtered.push({ id: panel.id, label: panel.label });\n }\n return filtered;\n}\n\nconst adjacentPanelDefaultWidth = 720;\nexport const agentToolEmptySidebarWidth = Math.round(\n adjacentPanelDefaultWidth * 0.6\n);\nexport const agentToolMainMinWidth = 280;\n\nexport const agentToolPanelDefaultWidthById: Record<AgentToolPanelId, number> =\n {\n apps: adjacentPanelDefaultWidth,\n browser: adjacentPanelDefaultWidth,\n files: adjacentPanelDefaultWidth,\n messages: 440,\n tasks: 860,\n terminal: adjacentPanelDefaultWidth\n };\n\nexport const agentToolPanelMinWidthById: Record<AgentToolPanelId, number> = {\n apps: 420,\n browser: 420,\n files: 480,\n messages: 320,\n tasks: 420,\n terminal: 420\n};\n\nexport const agentToolPanelMaxWidthById: Record<AgentToolPanelId, number> = {\n apps: 1_200,\n browser: 1_200,\n files: Number.MAX_SAFE_INTEGER,\n messages: 1_200,\n tasks: 1_200,\n terminal: 1_200\n};\n\nexport interface AgentToolSidebarState {\n activePanel: AgentToolPanelId | null;\n activeTabId: string | null;\n mountedTabs: AgentToolTab[];\n}\n\nexport type AgentToolSidebarAction =\n | {\n panel: AgentToolPanelId;\n resourceId?: string;\n tabId: string;\n type: \"open-panel\" | \"add-panel\" | \"ensure-panel\";\n }\n | { tabId: string; type: \"activate-tab\" | \"close-tab\" }\n | { type: \"close\" };\n\nexport function createAgentToolSidebarState(\n initial?: Partial<AgentToolSidebarState>\n): AgentToolSidebarState {\n const activePanel = initial?.activePanel ?? null;\n const mountedTabs = initial?.mountedTabs ?? [];\n const activeTabId =\n initial?.activeTabId ??\n (activePanel === null\n ? null\n : (findLastTab(mountedTabs, activePanel)?.id ?? null));\n return {\n activePanel: activeTabId === null ? null : activePanel,\n activeTabId,\n mountedTabs\n };\n}\n\nexport function reduceAgentToolSidebarState(\n state: AgentToolSidebarState,\n action: AgentToolSidebarAction\n): AgentToolSidebarState {\n switch (action.type) {\n case \"close\":\n return state.activeTabId === null\n ? state\n : { ...state, activePanel: null, activeTabId: null };\n case \"close-tab\": {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === action.tabId\n );\n if (closingIndex < 0) {\n return state;\n }\n const mountedTabs = state.mountedTabs.filter(\n (tab) => tab.id !== action.tabId\n );\n if (state.activeTabId !== action.tabId) {\n return { ...state, mountedTabs };\n }\n const nextTab =\n mountedTabs[Math.max(0, closingIndex - 1)] ?? mountedTabs[0] ?? null;\n return {\n activePanel: nextTab?.panel ?? null,\n activeTabId: nextTab?.id ?? null,\n mountedTabs\n };\n }\n case \"activate-tab\": {\n const tab = state.mountedTabs.find(\n (candidate) => candidate.id === action.tabId\n );\n return tab\n ? { ...state, activePanel: tab.panel, activeTabId: tab.id }\n : state;\n }\n case \"add-panel\":\n return addTab(state, action);\n case \"ensure-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing ? state : addTab(state, action, { activate: false });\n }\n case \"open-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing\n ? { ...state, activePanel: existing.panel, activeTabId: existing.id }\n : addTab(state, action);\n }\n }\n}\n\nfunction addTab(\n state: AgentToolSidebarState,\n tab: {\n panel: AgentToolPanelId;\n resourceId?: string;\n tabId: string;\n },\n options: { activate?: boolean } = {}\n): AgentToolSidebarState {\n const nextTab: AgentToolTab = {\n id: tab.tabId,\n panel: tab.panel,\n ...(tab.resourceId ? { resourceId: tab.resourceId } : {})\n };\n const activate = options.activate !== false;\n return {\n activePanel: activate ? nextTab.panel : state.activePanel,\n activeTabId: activate ? nextTab.id : state.activeTabId,\n mountedTabs: state.mountedTabs.some(\n (candidate) => candidate.id === nextTab.id\n )\n ? state.mountedTabs\n : [...state.mountedTabs, nextTab]\n };\n}\n\nfunction findLastTab(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): AgentToolTab | null {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (tab?.panel === panel && (tab.resourceId ?? undefined) === resourceId) {\n return tab;\n }\n }\n return null;\n}\n\nexport function resolveAgentToolPanelExpansionReset(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n widthBeforeExpansion?: number;\n}): { panel: AgentToolPanelId; width: number } | null {\n if (input.expandedPanel === null || input.expandedPanel === input.nextPanel) {\n return null;\n }\n return {\n panel: input.expandedPanel,\n width:\n typeof input.widthBeforeExpansion === \"number\" &&\n Number.isFinite(input.widthBeforeExpansion)\n ? input.widthBeforeExpansion\n : agentToolPanelDefaultWidthById[input.expandedPanel]\n };\n}\n\nexport function resolveAgentToolPanelExpansionTransfer(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n nextPanelWidth: number;\n widthBeforeExpansion?: number;\n}): {\n expandedPanel: AgentToolPanelId;\n nextPanelWidthBeforeExpansion: number;\n previousPanel: AgentToolPanelId;\n previousPanelWidth: number;\n} | null {\n const reset = resolveAgentToolPanelExpansionReset(input);\n if (!reset || input.nextPanel === null) {\n return null;\n }\n return {\n expandedPanel: input.nextPanel,\n nextPanelWidthBeforeExpansion:\n Number.isFinite(input.nextPanelWidth) && input.nextPanelWidth > 0\n ? input.nextPanelWidth\n : agentToolPanelDefaultWidthById[input.nextPanel],\n previousPanel: reset.panel,\n previousPanelWidth: reset.width\n };\n}\n\nexport function resolveAgentToolPanelMaxWidth(\n panel: AgentToolPanelId,\n viewportWidth: number,\n allowFullWidth = false,\n mainContentMinWidth = agentToolMainMinWidth\n): number {\n const resolvedMainMin = Number.isFinite(mainContentMinWidth)\n ? Math.max(0, mainContentMinWidth)\n : agentToolMainMinWidth;\n const resolvedViewport = Number.isFinite(viewportWidth)\n ? viewportWidth\n : resolvedMainMin + agentToolPanelMinWidthById[panel];\n return Math.max(\n 0,\n Math.min(\n allowFullWidth\n ? Number.MAX_SAFE_INTEGER\n : agentToolPanelMaxWidthById[panel],\n resolvedViewport - resolvedMainMin\n )\n );\n}\n\nexport function clampAgentToolPanelWidth(input: {\n allowFullWidth?: boolean;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n viewportWidth: number;\n width: number;\n}): number {\n const maxWidth = resolveAgentToolPanelMaxWidth(\n input.panel,\n input.viewportWidth,\n input.allowFullWidth,\n input.mainContentMinWidth\n );\n const minWidth = Math.min(agentToolPanelMinWidthById[input.panel], maxWidth);\n const width = Number.isFinite(input.width)\n ? input.width\n : agentToolPanelDefaultWidthById[input.panel];\n return Math.round(Math.min(maxWidth, Math.max(minWidth, width)));\n}\n\nexport function resolveAgentToolSidebarWidth(input: {\n allowFullWidth?: boolean;\n baselineViewportWidth: number;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n preferredWidth: number;\n viewportWidth: number;\n}): number {\n const baseline = Number.isFinite(input.baselineViewportWidth)\n ? Math.max(0, input.baselineViewportWidth)\n : input.viewportWidth;\n return clampAgentToolPanelWidth({\n allowFullWidth: input.allowFullWidth,\n mainContentMinWidth: input.mainContentMinWidth,\n panel: input.panel,\n viewportWidth: input.viewportWidth,\n width: Math.max(input.preferredWidth, input.viewportWidth - baseline)\n });\n}\n\nexport function resolveAgentToolSidebarLayoutWidth(input: {\n baselineContainerWidth: number;\n panelWidth: number;\n containerWidth: number;\n}): number {\n return Math.round(Math.max(0, input.panelWidth));\n}\n\nexport function resolveAgentToolPanelPreferredWidth(input: {\n isExpanded: boolean;\n manuallyResizedWidth?: number | null;\n panelWidth: number;\n}): number {\n return !input.isExpanded &&\n typeof input.manuallyResizedWidth === \"number\" &&\n Number.isFinite(input.manuallyResizedWidth)\n ? input.manuallyResizedWidth\n : input.panelWidth;\n}\n\nexport function shouldResizeAgentToolContainer(input: {\n currentWidth: number;\n lastResize?: { actualWidth: number; requestedWidth: number } | null;\n requestedWidth: number;\n}): boolean {\n return (\n input.currentWidth !== input.requestedWidth &&\n !(\n input.lastResize?.requestedWidth === input.requestedWidth &&\n input.lastResize.actualWidth === input.currentWidth\n )\n );\n}\n\nexport function formatAgentToolReminderCount(\n value: number | null | undefined\n): string | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n const count = Math.floor(value);\n return count > 99 ? \"99+\" : String(count);\n}\n","import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\nimport {\n closeBrowserNodeTab,\n createBrowserNodeFeature,\n isBrowserNodeSurfaceEvent,\n type BrowserNodeChromeImportPromptAdapter,\n type BrowserNodeAutomationTargetMetadata,\n type BrowserNodeFeature,\n type BrowserNodeHostApi,\n type BrowserNodeSessionMode\n} from \"@tutti-os/browser-node\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\n\nconst LazyBrowserNode = lazy(() =>\n import(\"@tutti-os/browser-node/react\").then(({ BrowserNode }) => ({\n default: BrowserNode\n }))\n);\n\nexport const agentToolBrowserDefaultUrl = \"https://www.google.com/\";\n\nexport interface AgentToolBrowserPanelProps {\n automationTarget?: Omit<\n BrowserNodeAutomationTargetMetadata,\n \"focused\" | \"selected\" | \"surfaceId\" | \"tabId\"\n > | null;\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n defaultUrl?: string;\n hidden: boolean;\n i18n: I18nRuntime<string>;\n loadingFallback?: ReactNode;\n navigationActions?: ReactNode;\n nodeIdPrefix?: string;\n onControllerReady?: (controller: AgentToolBrowserController | null) => void;\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n sessionPartition?: string | null;\n}\n\nexport interface AgentToolBrowserController {\n closePage(nodeId: string): \"closed\" | \"last-page\" | \"not-found\";\n createPage(url?: string | null): string;\n ownsPage(nodeId: string): boolean;\n selectPage(nodeId: string): boolean;\n surfaceNodeId: string;\n}\n\nexport function AgentToolBrowserPanel({\n automationTarget = null,\n browserApi,\n chromeCookieImportPrompt,\n defaultUrl = agentToolBrowserDefaultUrl,\n hidden,\n i18n,\n loadingFallback = null,\n navigationActions,\n nodeIdPrefix = \"browser:agent-tool\",\n onControllerReady,\n profileId = null,\n sessionMode = \"shared\",\n sessionPartition = null\n}: AgentToolBrowserPanelProps): ReactNode {\n const [nodeId] = useState(() => createAgentToolBrowserNodeId(nodeIdPrefix));\n const feature = useMemo(\n () =>\n createAgentToolBrowserFeature({\n browserApi,\n ...(chromeCookieImportPrompt ? { chromeCookieImportPrompt } : {}),\n i18n,\n nodeId\n }),\n [browserApi, chromeCookieImportPrompt, i18n, nodeId]\n );\n const controller = useMemo<AgentToolBrowserController>(() => {\n const getPage = (pageNodeId: string) => {\n const state = feature.tabsStore.getSurfaceState(nodeId);\n const tab = state?.tabs.find(\n (candidate) => candidate.nodeId === pageNodeId\n );\n return state && tab ? { state, tab } : null;\n };\n return {\n closePage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return \"not-found\";\n if (page.state.tabs.length === 1) return \"last-page\";\n closeBrowserNodeTab(feature, nodeId, page.tab.id);\n return \"closed\";\n },\n createPage(url) {\n const resolvedUrl = url?.trim() || \"about:blank\";\n const state = feature.tabsStore.ensureSurface(nodeId, defaultUrl);\n const activeTab = state.tabs.find(\n (tab) => tab.id === state.activeTabId\n );\n const activeRuntime = activeTab\n ? feature.runtimeStore.getNodeState(activeTab.nodeId)\n : null;\n if (\n state.tabs.length === 1 &&\n activeTab?.defaultUrl === \"about:blank\" &&\n !activeRuntime?.url\n ) {\n feature.tabsStore.syncDefaultUrl(nodeId, resolvedUrl);\n return activeTab.nodeId;\n }\n return feature.tabsStore.addTab(nodeId, resolvedUrl).nodeId;\n },\n ownsPage: (pageNodeId) => getPage(pageNodeId) !== null,\n selectPage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return false;\n feature.tabsStore.selectTab(nodeId, page.tab.id);\n return true;\n },\n surfaceNodeId: nodeId\n };\n }, [defaultUrl, feature, nodeId]);\n\n const bindController = useCallback(\n (node: HTMLDivElement | null) =>\n onControllerReady?.(node ? controller : null),\n [controller, onControllerReady]\n );\n\n return (\n <div\n className=\"relative h-full min-h-0 overflow-hidden\"\n data-agent-tool-browser-surface=\"true\"\n data-agent-tool-browser-surface-id={nodeId}\n ref={bindController}\n >\n <Suspense fallback={loadingFallback}>\n <LazyBrowserNode\n automationTarget={\n automationTarget ? { ...automationTarget, focused: !hidden } : null\n }\n defaultUrl={defaultUrl}\n feature={feature}\n hidden={hidden}\n navigationActions={navigationActions}\n nodeId={nodeId}\n profileId={profileId}\n sessionMode={sessionMode}\n sessionPartition={sessionPartition}\n syncDefaultUrl\n tabs\n />\n </Suspense>\n </div>\n );\n}\n\nexport function createAgentToolBrowserFeature(input: {\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\n ...(input.chromeCookieImportPrompt\n ? { chromeCookieImportPrompt: input.chromeCookieImportPrompt }\n : {}),\n hostApi: createScopedAgentToolBrowserHostApi(\n input.browserApi,\n input.nodeId\n ),\n i18n: input.i18n,\n resolveSearchUrl: resolveAgentToolBrowserSearchUrl\n });\n}\n\nfunction createScopedAgentToolBrowserHostApi(\n browserApi: BrowserNodeHostApi,\n nodeId: string\n): BrowserNodeHostApi {\n return {\n ...browserApi,\n onEvent(listener) {\n return browserApi.onEvent((event) => {\n if (isBrowserNodeSurfaceEvent(nodeId, event)) {\n listener(event);\n }\n });\n }\n };\n}\n\nfunction resolveAgentToolBrowserSearchUrl(query: string): string {\n const searchUrl = new URL(\"https://www.google.com/search\");\n searchUrl.searchParams.set(\"q\", query);\n return searchUrl.toString();\n}\n\nfunction createAgentToolBrowserNodeId(prefix: string): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${prefix}:${instanceId}`;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n type MouseEventHandler,\n type PointerEventHandler,\n type ReactNode\n} from \"react\";\nimport { CloseIcon, cn } from \"@tutti-os/ui-system\";\nimport {\n filterAgentToolPanels,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { AgentToolSidebarPicker } from \"./Picker.tsx\";\nimport {\n AgentToolPanelIcon,\n AgentToolSidebarToolbar,\n type AgentToolSidebarCopy,\n type AgentToolSidebarReminderCounts\n} from \"./Toolbar.tsx\";\nimport { useAgentToolSidebarController } from \"./useAgentToolSidebarController.ts\";\n\nexport interface AgentToolSidebarHandle {\n addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n close(): void;\n closeTab(tabId: string): void;\n ensurePanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n}\n\nexport type AgentToolSidebarHeaderDrag =\n | { mode?: \"native-window\" }\n | {\n mode: \"host\";\n onDoubleClick?: MouseEventHandler<HTMLDivElement>;\n onPointerDown?: PointerEventHandler<HTMLDivElement>;\n };\n\nexport interface AgentToolSidebarProps {\n children: ReactNode;\n containerWidth: number;\n copy: AgentToolSidebarCopy;\n headerDrag?: AgentToolSidebarHeaderDrag;\n headerPlacement?: \"inline\" | \"external\" | \"panel\";\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n renderHeader: (toolActions: ReactNode) => ReactNode;\n renderLoading?: (tab: AgentToolTab) => ReactNode;\n renderPanel: (input: {\n active: boolean;\n closeSidebar: () => void;\n tab: AgentToolTab;\n }) => ReactNode;\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onLayoutWidthChange?: (width: number) => void;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}\n\nexport const AgentToolSidebar = forwardRef<\n AgentToolSidebarHandle,\n AgentToolSidebarProps\n>(function AgentToolSidebar(\n {\n children,\n containerWidth,\n copy,\n headerDrag,\n headerPlacement = \"inline\",\n mainContentMinWidthPx,\n panels: unfilteredPanels,\n quickActionPanels,\n reminders,\n renderHeader,\n renderLoading,\n renderPanel,\n renderTabIcon,\n resolveTabLabel,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n },\n ref\n): ReactNode {\n const panels = filterAgentToolPanels(unfilteredPanels);\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n measureToolActions,\n mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n stopResizing,\n toolActionsWidth,\n toggleSidebar,\n togglePanelExpansion\n } = useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabClose,\n onTabsChange,\n panels,\n resizeContainerContentWidth\n });\n\n useImperativeHandle(\n ref,\n () => ({\n addPanel,\n close: closePanel,\n closeTab: closePanelTab,\n ensurePanel,\n openPanel\n }),\n [addPanel, closePanel, closePanelTab, ensurePanel, openPanel]\n );\n\n const isHostHeaderDrag = headerDrag?.mode === \"host\";\n const handleHeaderDoubleClick: MouseEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onDoubleClick?.(event);\n }\n };\n const handleHeaderPointerDown: PointerEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onPointerDown?.(event);\n }\n };\n\n const toolActions = (\n <div\n className={cn(\n \"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 max-w-full shrink-0 cursor-grab items-center pr-[var(--agent-gui-workbench-header-padding-x)] active:cursor-grabbing\",\n isHostHeaderDrag\n ? \"[-webkit-app-region:no-drag]\"\n : \"[-webkit-app-region:drag]\",\n isSidebarOpen && \"border-b border-[var(--border-1)]\"\n )}\n data-standalone-agent-tool-sidebar-drag-region=\"true\"\n data-standalone-agent-tool-sidebar-header=\"true\"\n ref={measureToolActions}\n style={\n isSidebarOpen\n ? { width: `${activePanelWidth}px`, maxWidth: \"100%\" }\n : undefined\n }\n onDoubleClick={isHostHeaderDrag ? handleHeaderDoubleClick : undefined}\n onPointerDown={isHostHeaderDrag ? handleHeaderPointerDown : undefined}\n >\n {activeTabId ? (\n <ToolSidebarTabBar\n activeTabId={activeTabId}\n copy={copy}\n labelByPanel={labelByPanel}\n mountedTabs={mountedTabs}\n renderTabIcon={renderTabIcon}\n resolveTabLabel={resolveTabLabel}\n onClosePanel={closePanelTab}\n onOpenPanel={activatePanelTab}\n />\n ) : null}\n <AgentToolSidebarToolbar\n activePanel={activePanel}\n copy={copy}\n isExpanded={isActivePanelExpanded}\n isOpen={isSidebarOpen}\n panels={panels}\n quickActionPanels={quickActionPanels}\n reminders={reminders}\n onAddPanel={addPanel}\n onOpenPanel={openPanel}\n onToggleExpansion={() => {\n if (activePanel) togglePanelExpansion(activePanel);\n }}\n onToggleSidebar={toggleSidebar}\n />\n </div>\n );\n\n return (\n <>\n {headerPlacement === \"external\" || headerPlacement === \"panel\" ? (\n renderHeader(\n headerPlacement === \"panel\" && isSidebarOpen ? null : toolActions\n )\n ) : (\n <div\n className=\"workbench-window__header workbench-window__header--custom\"\n style={\n {\n \"--agent-gui-tool-sidebar-layout-width\": isSidebarOpen\n ? `${activePanelLayoutWidth}px`\n : `${toolActionsWidth}px`\n } as CSSProperties\n }\n >\n {renderHeader(toolActions)}\n </div>\n )}\n <div\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\",\n headerPlacement === \"inline\" && \"workbench-window__body\"\n )}\n ref={bindLifecycle}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <div className=\"h-full min-w-0 flex-1 overflow-hidden\">\n {children}\n </div>\n <aside\n aria-hidden={!isSidebarOpen}\n className={cn(\n \"relative h-full min-h-0 shrink-0 overflow-hidden [contain:layout_paint]\",\n shouldAnimateSidebarWidth &&\n \"motion-safe:transition-[width] motion-safe:duration-[260ms] motion-safe:ease-in-out motion-reduce:transition-none\",\n isActivePanelExpanded && \"border-l border-[var(--line-1)]\",\n !isSidebarOpen && \"pointer-events-none\"\n )}\n data-standalone-agent-tool-sidebar=\"true\"\n ref={bindLayoutWidthProjection}\n style={{\n width: isSidebarOpen ? `${activePanelLayoutWidth}px` : \"0px\",\n zIndex: \"var(--z-panel)\"\n }}\n onTransitionEnd={handleSidebarTransitionEnd}\n >\n <div\n className={cn(\n \"absolute inset-y-0 right-0 flex flex-col bg-[var(--background-session-sidepanel)]\",\n isSidebarOpen &&\n !shouldAnimateSidebarLayout &&\n \"motion-safe:animate-in motion-safe:slide-in-from-right-3 motion-safe:duration-[160ms] motion-safe:ease-out motion-reduce:animate-none\",\n !isSidebarOpen && !isEmptySidebarClosing && \"invisible\"\n )}\n style={\n {\n \"--background-panel\": \"var(--background-session-sidepanel)\",\n width: `${activePanelWidth}px`\n } as CSSProperties\n }\n >\n {isSidebarOpen && !isEmptySidebar ? (\n <div\n aria-label={copy.resizeSidebar}\n aria-orientation=\"vertical\"\n aria-valuemax={activePanelMaxWidth}\n aria-valuemin={activePanelMinWidth}\n aria-valuenow={activePanelWidth}\n className=\"absolute top-0 left-0 z-20 h-full w-2 cursor-col-resize touch-none outline-none before:absolute before:left-0 before:h-full before:w-px before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n data-standalone-agent-tool-sidebar-resize-handle=\"true\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleResizeKeyDown}\n onLostPointerCapture={stopResizing}\n onPointerDown={handleResizePointerDown}\n onPointerMove={handleResizePointerMove}\n onPointerUp={stopResizing}\n />\n ) : null}\n {isSidebarOpen && headerPlacement === \"panel\"\n ? toolActions\n : null}\n {isSidebarOpen && headerPlacement === \"inline\" ? (\n <div\n aria-hidden\n className=\"shrink-0\"\n data-standalone-agent-tool-sidebar-header-spacer=\"true\"\n style={{\n height: \"var(--agent-gui-workbench-header-height, 44px)\"\n }}\n />\n ) : null}\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {isEmptySidebar || isEmptySidebarClosing ? (\n <AgentToolSidebarPicker\n panels={panels}\n onSelect={openPanel}\n />\n ) : null}\n {mountedTabs.map((tab) => (\n <div\n aria-hidden={activeTabId !== tab.id}\n className={cn(\n \"absolute inset-0 min-h-0 overflow-hidden\",\n activeTabId !== tab.id && \"invisible pointer-events-none\"\n )}\n key={tab.id}\n >\n {contentReadyTabIds.includes(tab.id) ? (\n <div\n className={cn(\n \"h-full min-h-0\",\n tab.panel !== \"terminal\" &&\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-150 motion-reduce:animate-none\"\n )}\n >\n {renderPanel({\n active: activeTabId === tab.id,\n closeSidebar: closePanel,\n tab\n })}\n </div>\n ) : activeTabId === tab.id ? (\n (renderLoading?.(tab) ?? null)\n ) : null}\n </div>\n ))}\n </div>\n </div>\n </aside>\n </div>\n </div>\n </>\n );\n});\n\nfunction ToolSidebarTabBar({\n activeTabId,\n copy,\n labelByPanel,\n mountedTabs,\n renderTabIcon,\n resolveTabLabel,\n onClosePanel,\n onOpenPanel\n}: {\n activeTabId: string;\n copy: AgentToolSidebarCopy;\n labelByPanel: ReadonlyMap<AgentToolPanelId, string>;\n mountedTabs: readonly AgentToolTab[];\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n onClosePanel: (tabId: string) => void;\n onOpenPanel: (tab: AgentToolTab) => void;\n}): ReactNode {\n return (\n <div\n aria-label={copy.tool}\n className=\"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 flex-1 cursor-grab items-center gap-1 overflow-hidden px-2 active:cursor-grabbing\"\n data-standalone-agent-tool-tab-list=\"true\"\n role=\"tablist\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\">\n {mountedTabs.map((tab) => {\n const defaultLabel = labelByPanel.get(tab.panel) ?? tab.panel;\n const label = resolveTabLabel?.(tab, defaultLabel) ?? defaultLabel;\n return (\n <div\n className={cn(\n \"group flex h-7 max-w-44 shrink-0 items-center rounded-sm overflow-hidden border text-xs text-[var(--text-tertiary)]\",\n activeTabId === tab.id\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border-transparent\"\n )}\n key={tab.id}\n >\n <button\n aria-selected={activeTabId === tab.id}\n className=\"nodrag flex h-full min-w-0 flex-1 items-center gap-1.5 overflow-hidden px-2 text-left outline-none [-webkit-app-region:no-drag] focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]\"\n data-standalone-agent-tool-tab={tab.panel}\n data-standalone-agent-tool-tab-id={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onOpenPanel(tab)}\n >\n {renderTabIcon?.(tab) ?? (\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-3.5 shrink-0\"\n panel={tab.panel}\n />\n )}\n <span className=\"truncate\">{label}</span>\n </button>\n <button\n aria-label={`${copy.close} ${label}`}\n className=\"nodrag mr-1 rounded p-0.5 opacity-100 hover:bg-[var(--transparency-block)] [-webkit-app-region:no-drag]\"\n type=\"button\"\n onClick={() => onClosePanel(tab.id)}\n >\n <CloseIcon aria-hidden className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction isAgentToolSidebarHeaderControl(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n target.closest(\n '.nodrag, button, a, input, textarea, select, option, [role=\"button\"], [role=\"menuitem\"], [contenteditable=\"true\"]'\n ) !== null\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { AgentToolPanelDefinition, AgentToolPanelId } from \"./model.ts\";\nimport { AgentToolPanelIcon } from \"./Toolbar.tsx\";\n\nexport function AgentToolSidebarPicker({\n panels,\n onSelect\n}: {\n panels: readonly AgentToolPanelDefinition[];\n onSelect: (panel: AgentToolPanelId) => void;\n}): ReactNode {\n return (\n <div\n className=\"flex h-full min-h-0 items-center justify-center overflow-auto px-6 py-10\"\n data-standalone-agent-tool-sidebar-picker=\"true\"\n >\n <div className=\"flex w-full max-w-[340px] flex-col gap-2\">\n {panels.map((panel) => (\n <Button\n className=\"h-12 w-full justify-start gap-2.5 rounded-lg border border-[var(--line-1)] bg-[var(--background-fronted)] px-2.5 text-left text-[14px] font-medium text-[var(--text-primary)] shadow-none hover:border-[var(--line-2)] hover:bg-[var(--transparency-hover)]\"\n key={panel.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onSelect(panel.id)}\n >\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-[7px] bg-[var(--transparency-block)] text-[var(--text-secondary)] group-hover/button:text-[var(--text-primary)]\">\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n </span>\n <span>{panel.label}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport {\n AddLinedIcon,\n Button,\n ChatIcon,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MaximizeIcon,\n NavApplicationsLinedIcon,\n PanelIcon,\n RestoreIcon,\n TaskIcon,\n TerminalLinedIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n WebIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n formatAgentToolReminderCount,\n type AgentToolPanelDefinition,\n type AgentToolPanelId\n} from \"./model.ts\";\n\nexport interface AgentToolSidebarCopy {\n close: string;\n closeRightPanel: string;\n expand: string;\n newTab: string;\n openRightPanel: string;\n resizeSidebar: string;\n shrink: string;\n tool: string;\n}\n\nexport type AgentToolSidebarReminderCounts = Partial<\n Record<AgentToolPanelId, number>\n>;\n\nconst iconByPanel = {\n apps: NavApplicationsLinedIcon,\n browser: WebIcon,\n files: FolderIcon,\n messages: ChatIcon,\n tasks: TaskIcon,\n terminal: TerminalLinedIcon\n} satisfies Record<AgentToolPanelId, ComponentType<IconProps>>;\n\nexport function AgentToolPanelIcon({\n panel,\n ...iconProps\n}: IconProps & { panel: AgentToolPanelId }): ReactNode {\n const Icon = iconByPanel[panel];\n return <Icon {...iconProps} />;\n}\n\nexport function AgentToolSidebarToolbar({\n activePanel,\n copy,\n isExpanded,\n isOpen,\n panels,\n quickActionPanels = [],\n reminders = {},\n onAddPanel,\n onOpenPanel,\n onToggleExpansion,\n onToggleSidebar\n}: {\n activePanel: AgentToolPanelId | null;\n copy: AgentToolSidebarCopy;\n isExpanded: boolean;\n isOpen: boolean;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n onAddPanel: (panel: AgentToolPanelId) => void;\n onOpenPanel: (panel: AgentToolPanelId) => void;\n onToggleExpansion: () => void;\n onToggleSidebar: () => void;\n}): ReactNode {\n const label = isOpen ? copy.closeRightPanel : copy.openRightPanel;\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const quickActions = quickActionPanels.filter((panel) =>\n labelByPanel.has(panel)\n );\n\n return (\n <TooltipProvider>\n <nav\n aria-label={copy.tool}\n className={cn(\n \"nodrag pointer-events-auto flex h-[var(--agent-gui-workbench-header-height,44px)] items-center gap-1 [-webkit-app-region:no-drag]\",\n activePanel === null && isOpen && \"ml-auto\"\n )}\n data-standalone-agent-tool-sidebar-toolbar=\"true\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {activePanel ? (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.newTab}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n >\n <AddLinedIcon aria-hidden className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-36\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {panels.map((panel) => (\n <DropdownMenuItem\n key={panel.id}\n onSelect={() => onAddPanel(panel.id)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n <span>{panel.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n {activePanel === null && !isOpen\n ? quickActions.map((panel) => (\n <ToolbarQuickActionTooltip\n key={panel}\n label={labelByPanel.get(panel) ?? panel}\n >\n <Button\n aria-label={labelByPanel.get(panel) ?? panel}\n aria-pressed={false}\n className=\"relative text-[var(--text-secondary)]\"\n data-standalone-agent-tool-sidebar-quick-action={panel}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => onOpenPanel(panel)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel}\n />\n <ReminderBadge count={reminders[panel]} />\n </Button>\n </ToolbarQuickActionTooltip>\n ))\n : null}\n {activePanel ? (\n <Button\n aria-label={`${isExpanded ? copy.shrink : copy.expand} ${labelByPanel.get(activePanel) ?? activePanel}`}\n aria-pressed={isExpanded}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={onToggleExpansion}\n >\n {isExpanded ? (\n <RestoreIcon aria-hidden className=\"size-3.5\" />\n ) : (\n <MaximizeIcon aria-hidden className=\"size-3.5\" />\n )}\n </Button>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n aria-pressed={isOpen}\n className=\"relative\"\n data-standalone-agent-tool-sidebar-toggle=\"true\"\n size=\"icon-sm\"\n type=\"button\"\n variant={isOpen && activePanel !== null ? \"secondary\" : \"chrome\"}\n onClick={onToggleSidebar}\n >\n <PanelIcon aria-hidden className=\"size-[18px] -scale-x-100\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </nav>\n </TooltipProvider>\n );\n}\n\nfunction ToolbarQuickActionTooltip({\n children,\n label\n}: {\n children: ReactNode;\n label: string;\n}): ReactNode {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ReminderBadge({ count }: { count?: number }): ReactNode {\n const label = formatAgentToolReminderCount(count);\n return label ? (\n <span className=\"absolute -top-1 -right-1 inline-flex min-w-4 items-center justify-center rounded-full bg-[var(--accent-codex)] px-1 text-[9px] leading-4 font-semibold text-[var(--white-stationary)]\">\n {label}\n </span>\n ) : null;\n}\n","import {\n useCallback,\n useReducer,\n useRef,\n useState,\n type TransitionEvent\n} from \"react\";\nimport {\n agentToolEmptySidebarWidth,\n createAgentToolSidebarState,\n reduceAgentToolSidebarState,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { useAgentToolSidebarLayout } from \"./useAgentToolSidebarLayout.ts\";\n\nconst collapsedToolActionsWidthPx = 132;\n\nexport function useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n panels,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n}: {\n containerWidth: number;\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onLayoutWidthChange?: (width: number) => void;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}) {\n const panelIds = new Set(panels.map((panel) => panel.id));\n const [state, dispatch] = useReducer(\n reduceAgentToolSidebarState,\n undefined,\n createAgentToolSidebarState\n );\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const [isEmptySidebarClosing, setIsEmptySidebarClosing] = useState(false);\n const [contentReadyTabIds, setContentReadyTabIds] = useState<string[]>([]);\n const [toolActionsWidth, setToolActionsWidth] = useState(\n collapsedToolActionsWidthPx\n );\n const activePanel = state.activePanel;\n const activeTabId = state.activeTabId;\n const fallbackPanel = panels[0]?.id ?? null;\n const isEmptySidebar = isSidebarOpen && state.mountedTabs.length === 0;\n const isEmptySidebarSurface =\n (isSidebarOpen || isEmptySidebarClosing) && state.mountedTabs.length === 0;\n const layoutPanel =\n activePanel ?? (isEmptySidebarSurface ? fallbackPanel : null);\n const isActivePanelContentReady =\n activeTabId !== null && contentReadyTabIds.includes(activeTabId);\n const shouldAnimateSidebarLayout =\n state.mountedTabs.length === 0 || isActivePanelContentReady;\n const shouldAnimateSidebarWidth = isEmptySidebarSurface;\n const layout = useAgentToolSidebarLayout({\n activePanel: layoutPanel,\n activePanelPreferredWidth: isEmptySidebarSurface\n ? agentToolEmptySidebarWidth\n : undefined,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n });\n const resizeAnimationFrameRef = useRef<number | null>(null);\n const contentAnimationFrameIdsRef = useRef(new Set<number>());\n const toolActionsResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const scheduleResizeForPanel = useCallback(\n (\n panel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: { animateContainer?: boolean; preserveBaseline?: boolean }\n ) => {\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n }\n resizeAnimationFrameRef.current = window.requestAnimationFrame(() => {\n resizeAnimationFrameRef.current = null;\n void layout.resizeForPanel(panel, preferredWidth, options);\n });\n },\n [layout.resizeForPanel]\n );\n\n const showSidebar = useCallback(() => {\n setIsEmptySidebarClosing(false);\n setIsSidebarOpen(true);\n }, []);\n\n const markContentReady = useCallback((tabId: string) => {\n if (prefersReducedMotion()) {\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n return;\n }\n let completedSynchronously = false;\n let frameId = 0;\n frameId = window.requestAnimationFrame(() => {\n completedSynchronously = true;\n contentAnimationFrameIdsRef.current.delete(frameId);\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n });\n if (!completedSynchronously) {\n contentAnimationFrameIdsRef.current.add(frameId);\n }\n }, []);\n\n const closePanel = useCallback(() => {\n setIsSidebarOpen(false);\n dispatch({ type: \"close\" });\n onActivePanelChange?.(null);\n if (state.mountedTabs.length > 0 || prefersReducedMotion()) {\n setIsEmptySidebarClosing(false);\n scheduleResizeForPanel(null);\n return;\n }\n setIsEmptySidebarClosing(true);\n scheduleResizeForPanel(null, undefined, {\n animateContainer: true,\n preserveBaseline: true\n });\n }, [onActivePanelChange, scheduleResizeForPanel, state.mountedTabs.length]);\n\n const openPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = resolveToolTabId(state.mountedTabs, panel, resourceId);\n const action = { panel, resourceId, tabId, type: \"open-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n if (nextState.mountedTabs !== state.mountedTabs) {\n onTabsChange?.(nextState.mountedTabs);\n }\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const addPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = createToolTabId(panel);\n const action = { panel, resourceId, tabId, type: \"add-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const ensurePanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n const existing = state.mountedTabs.find(\n (tab) =>\n tab.panel === panel && (tab.resourceId ?? undefined) === resourceId\n );\n if (existing) return existing.id;\n const tabId = createToolTabId(panel);\n const action = {\n panel,\n resourceId,\n tabId,\n type: \"ensure-panel\"\n } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n return tabId;\n },\n [markContentReady, onTabsChange, panelIds, state]\n );\n\n const closePanelTab = useCallback(\n (tabId: string) => {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === tabId\n );\n const closingTab = state.mountedTabs[closingIndex];\n if (!closingTab) return;\n const action = { tabId, type: \"close-tab\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n setIsSidebarOpen(true);\n dispatch(action);\n onTabClose?.(closingTab);\n onActivePanelChange?.(nextState.activePanel);\n onTabsChange?.(nextState.mountedTabs);\n if (nextState.activePanel === null) {\n if (fallbackPanel) {\n scheduleResizeForPanel(fallbackPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n }\n return;\n }\n scheduleResizeForPanel(nextState.activePanel);\n },\n [\n fallbackPanel,\n onActivePanelChange,\n onTabClose,\n onTabsChange,\n scheduleResizeForPanel,\n state\n ]\n );\n\n const activatePanelTab = useCallback(\n (tab: AgentToolTab) => {\n onPanelOpen?.(tab.panel, tab.resourceId);\n dispatch({ tabId: tab.id, type: \"activate-tab\" });\n onActivePanelChange?.(tab.panel);\n markContentReady(tab.id);\n scheduleResizeForPanel(tab.panel);\n },\n [markContentReady, onActivePanelChange, onPanelOpen, scheduleResizeForPanel]\n );\n\n const toggleSidebar = useCallback(() => {\n const nextPanel = activePanel ?? fallbackPanel;\n if (isSidebarOpen) {\n closePanel();\n return;\n }\n if (!nextPanel) return;\n showSidebar();\n if (state.mountedTabs.length === 0) {\n scheduleResizeForPanel(nextPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n return;\n }\n const tabId = resolveToolTabId(state.mountedTabs, nextPanel);\n dispatch({ panel: nextPanel, tabId, type: \"open-panel\" });\n onActivePanelChange?.(nextPanel);\n markContentReady(tabId);\n scheduleResizeForPanel(nextPanel);\n }, [\n activePanel,\n closePanel,\n fallbackPanel,\n isSidebarOpen,\n markContentReady,\n onActivePanelChange,\n scheduleResizeForPanel,\n showSidebar,\n state.mountedTabs\n ]);\n\n const handleSidebarTransitionEnd = useCallback(\n (event: TransitionEvent<HTMLElement>) => {\n if (\n event.currentTarget !== event.target ||\n event.propertyName !== \"width\" ||\n isSidebarOpen ||\n !isEmptySidebarClosing\n ) {\n return;\n }\n setIsEmptySidebarClosing(false);\n layout.resetContainerResizeBaseline();\n },\n [isEmptySidebarClosing, isSidebarOpen, layout.resetContainerResizeBaseline]\n );\n\n const bindLayoutWidthProjection = useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n onLayoutWidthChange?.(\n isSidebarOpen ? layout.activePanelLayoutWidth : 0\n );\n }\n },\n [isSidebarOpen, layout.activePanelLayoutWidth, onLayoutWidthChange]\n );\n\n const bindLifecycle = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) return;\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n resizeAnimationFrameRef.current = null;\n }\n for (const frameId of contentAnimationFrameIdsRef.current) {\n window.cancelAnimationFrame(frameId);\n }\n contentAnimationFrameIdsRef.current.clear();\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n layout.bindLayoutRoot(null);\n },\n [layout.bindLayoutRoot]\n );\n\n const measureToolActions = useCallback((node: HTMLDivElement | null) => {\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n if (!node) return;\n const measure = (): void => {\n const width = Math.ceil(node.getBoundingClientRect().width);\n if (width > 0) setToolActionsWidth(width);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n toolActionsResizeObserverRef.current = observer;\n }, []);\n\n return {\n ...layout,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n markContentReady,\n measureToolActions,\n mountedTabs: state.mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n toolActionsWidth,\n toggleSidebar\n };\n}\n\nfunction resolveToolTabId(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): string {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (\n tab?.panel === panel &&\n (resourceId === undefined || tab.resourceId === resourceId)\n ) {\n return tab.id;\n }\n }\n return createToolTabId(panel);\n}\n\nfunction createToolTabId(panel: AgentToolPanelId): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${panel}:${instanceId}`;\n}\n\nfunction prefersReducedMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent\n} from \"react\";\nimport {\n agentToolPanelDefaultWidthById,\n agentToolPanelMinWidthById,\n clampAgentToolPanelWidth,\n resolveAgentToolPanelExpansionReset,\n resolveAgentToolPanelExpansionTransfer,\n resolveAgentToolPanelMaxWidth,\n resolveAgentToolPanelPreferredWidth,\n resolveAgentToolSidebarLayoutWidth,\n resolveAgentToolSidebarWidth,\n shouldResizeAgentToolContainer,\n type AgentToolPanelId\n} from \"./model.ts\";\n\ntype ToolPanelWidths = Record<AgentToolPanelId, number>;\n\ninterface ToolPanelResizeState {\n panel: AgentToolPanelId;\n pointerId: number;\n startClientX: number;\n startWidth: number;\n}\n\nexport interface ResizeForPanelOptions {\n animateContainer?: boolean;\n preserveBaseline?: boolean;\n}\n\nexport function useAgentToolSidebarLayout({\n activePanel,\n activePanelPreferredWidth,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n}: {\n activePanel: AgentToolPanelId | null;\n activePanelPreferredWidth?: number;\n containerWidth: number;\n mainContentMinWidthPx?: number;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n}) {\n const [containerResolution, setContainerResolution] = useState(() => ({\n resolved: containerWidth,\n source: containerWidth\n }));\n if (containerResolution.source !== containerWidth) {\n setContainerResolution({\n resolved: containerWidth,\n source: containerWidth\n });\n }\n const resolvedContainerWidth = containerResolution.resolved;\n const [panelWidths, setPanelWidths] = useState<ToolPanelWidths>(() => ({\n ...agentToolPanelDefaultWidthById\n }));\n const [manuallyResizedWidth, setManuallyResizedWidth] = useState<\n number | null\n >(null);\n const [expandedPanel, setExpandedPanel] = useState<AgentToolPanelId | null>(\n null\n );\n const expandedPanelRef = useRef<AgentToolPanelId | null>(null);\n const baselineContainerWidthRef = useRef<number | null>(null);\n const panelWidthBeforeExpandRef = useRef<Partial<ToolPanelWidths>>({});\n const resizeRequestRef = useRef(0);\n const lastContainerResizeRef = useRef<{\n actualWidth: number;\n requestedWidth: number;\n } | null>(null);\n const dragRef = useRef<ToolPanelResizeState | null>(null);\n const resizeStyleRef = useRef<{ cursor: string; userSelect: string } | null>(\n null\n );\n\n const isActivePanelExpanded =\n activePanel !== null && expandedPanel === activePanel;\n const activePanelMaxWidth = activePanel\n ? resolveAgentToolPanelMaxWidth(\n activePanel,\n resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx\n )\n : 0;\n const activePanelMinWidth = activePanel\n ? Math.min(agentToolPanelMinWidthById[activePanel], activePanelMaxWidth)\n : 0;\n const activePanelWidth = activePanel\n ? resolveActivePanelWidth({\n activePanel,\n activePanelMaxWidth,\n activePanelPreferredWidth,\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx,\n panelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: isActivePanelExpanded,\n manuallyResizedWidth,\n panelWidth: panelWidths[activePanel]\n })\n })\n : 0;\n const activePanelLayoutWidth = activePanel\n ? resolveAgentToolSidebarLayoutWidth({\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n panelWidth: activePanelWidth\n })\n : 0;\n\n const resetPanelExpansion = useCallback(\n (nextPanel: AgentToolPanelId | null): \"reset\" | \"transferred\" | null => {\n const reset = resolveAgentToolPanelExpansionReset({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n widthBeforeExpansion:\n expandedPanelRef.current === null\n ? undefined\n : panelWidthBeforeExpandRef.current[expandedPanelRef.current]\n });\n if (!reset) return null;\n\n if (nextPanel !== null) {\n const transfer = resolveAgentToolPanelExpansionTransfer({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n nextPanelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n }),\n widthBeforeExpansion:\n panelWidthBeforeExpandRef.current[expandedPanelRef.current!] ??\n manuallyResizedWidth ??\n undefined\n });\n if (!transfer) return null;\n expandedPanelRef.current = transfer.expandedPanel;\n setExpandedPanel(transfer.expandedPanel);\n setPanelWidths((current) => ({\n ...current,\n [transfer.previousPanel]: transfer.previousPanelWidth,\n [transfer.expandedPanel]: Number.MAX_SAFE_INTEGER\n }));\n panelWidthBeforeExpandRef.current[transfer.expandedPanel] =\n transfer.nextPanelWidthBeforeExpansion;\n delete panelWidthBeforeExpandRef.current[transfer.previousPanel];\n return \"transferred\";\n }\n\n expandedPanelRef.current = null;\n setExpandedPanel(null);\n setPanelWidths((current) => ({ ...current, [reset.panel]: reset.width }));\n delete panelWidthBeforeExpandRef.current[reset.panel];\n return \"reset\";\n },\n [manuallyResizedWidth, panelWidths]\n );\n\n const resizeForPanel = useCallback(\n async (\n nextPanel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: ResizeForPanelOptions\n ): Promise<boolean> => {\n const requestId = ++resizeRequestRef.current;\n const expansionTransition = resetPanelExpansion(nextPanel);\n if (\n expansionTransition === \"transferred\" ||\n (nextPanel !== null && expandedPanelRef.current === nextPanel)\n ) {\n return true;\n }\n if (nextPanel !== null && baselineContainerWidthRef.current === null) {\n baselineContainerWidthRef.current = resolvedContainerWidth;\n }\n const baseline = baselineContainerWidthRef.current;\n const requestedWidth =\n nextPanel === null\n ? baseline\n : (baseline ?? resolvedContainerWidth) +\n resolvePreferredWidth(\n preferredWidth,\n resolveAgentToolPanelPreferredWidth({\n isExpanded: expandedPanelRef.current === nextPanel,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n })\n );\n\n if (\n requestedWidth !== null &&\n shouldResizeAgentToolContainer({\n currentWidth: resolvedContainerWidth,\n lastResize: lastContainerResizeRef.current,\n requestedWidth\n })\n ) {\n try {\n const result = await resizeContainerContentWidth(\n requestedWidth,\n options?.animateContainer\n );\n if (requestId !== resizeRequestRef.current) return false;\n if (result.width > 0) {\n lastContainerResizeRef.current = {\n actualWidth: result.width,\n requestedWidth\n };\n setContainerResolution((current) => ({\n ...current,\n resolved: result.width\n }));\n }\n } catch {\n if (requestId !== resizeRequestRef.current) return false;\n }\n }\n\n if (nextPanel === null && options?.preserveBaseline !== true) {\n baselineContainerWidthRef.current = null;\n }\n return true;\n },\n [\n manuallyResizedWidth,\n panelWidths,\n resetPanelExpansion,\n resizeContainerContentWidth,\n resolvedContainerWidth\n ]\n );\n\n const resetContainerResizeBaseline = useCallback(() => {\n baselineContainerWidthRef.current = null;\n }, []);\n\n const updatePanelWidth = useCallback(\n (panel: AgentToolPanelId, width: number) => {\n const nextWidth = clampAgentToolPanelWidth({\n allowFullWidth: expandedPanel === panel,\n mainContentMinWidth: mainContentMinWidthPx,\n panel,\n viewportWidth: resolvedContainerWidth,\n width\n });\n setManuallyResizedWidth(nextWidth);\n setPanelWidths((current) => ({ ...current, [panel]: nextWidth }));\n },\n [expandedPanel, mainContentMinWidthPx, resolvedContainerWidth]\n );\n\n const togglePanelExpansion = useCallback(\n (panel: AgentToolPanelId) => {\n if (expandedPanelRef.current === panel) {\n resetPanelExpansion(null);\n return;\n }\n resetPanelExpansion(panel);\n expandedPanelRef.current = panel;\n setExpandedPanel(panel);\n setPanelWidths((current) => {\n panelWidthBeforeExpandRef.current[panel] =\n resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: current[panel]\n });\n return { ...current, [panel]: Number.MAX_SAFE_INTEGER };\n });\n },\n [manuallyResizedWidth, resetPanelExpansion]\n );\n\n const stopResizing = useCallback(() => {\n dragRef.current = null;\n const styles = resizeStyleRef.current;\n if (!styles) return;\n document.body.style.cursor = styles.cursor;\n document.body.style.userSelect = styles.userSelect;\n resizeStyleRef.current = null;\n }, []);\n const bindLayoutRoot = useCallback(\n (node: HTMLElement | null) => {\n if (!node) stopResizing();\n },\n [stopResizing]\n );\n\n const handleResizePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || activePanel === null) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n dragRef.current = {\n panel: activePanel,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startWidth: activePanelWidth\n };\n resizeStyleRef.current = {\n cursor: document.body.style.cursor,\n userSelect: document.body.style.userSelect\n };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [activePanel, activePanelWidth]\n );\n\n const handleResizePointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n const resizeState = dragRef.current;\n if (!resizeState || resizeState.pointerId !== event.pointerId) return;\n updatePanelWidth(\n resizeState.panel,\n resizeState.startWidth + resizeState.startClientX - event.clientX\n );\n },\n [updatePanelWidth]\n );\n\n const handleResizeKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (activePanel === null) return;\n if (event.key === \"Home\") {\n event.preventDefault();\n updatePanelWidth(activePanel, activePanelMinWidth);\n } else if (event.key === \"End\") {\n event.preventDefault();\n updatePanelWidth(activePanel, Number.MAX_SAFE_INTEGER);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n updatePanelWidth(\n activePanel,\n activePanelWidth + (event.key === \"ArrowLeft\" ? 24 : -24)\n );\n }\n },\n [activePanel, activePanelMinWidth, activePanelWidth, updatePanelWidth]\n );\n\n return {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n bindLayoutRoot,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n resetContainerResizeBaseline,\n resizeForPanel,\n stopResizing,\n togglePanelExpansion\n };\n}\n\nfunction resolveActivePanelWidth(input: {\n activePanel: AgentToolPanelId;\n activePanelMaxWidth: number;\n activePanelPreferredWidth?: number;\n baselineContainerWidth: number;\n containerWidth: number;\n isActivePanelExpanded: boolean;\n mainContentMinWidthPx?: number;\n panelWidth: number;\n}): number {\n if (\n typeof input.activePanelPreferredWidth === \"number\" &&\n Number.isFinite(input.activePanelPreferredWidth)\n ) {\n return Math.round(\n Math.max(\n 0,\n Math.min(input.activePanelMaxWidth, input.activePanelPreferredWidth)\n )\n );\n }\n return resolveAgentToolSidebarWidth({\n allowFullWidth: input.isActivePanelExpanded,\n baselineViewportWidth: input.baselineContainerWidth,\n mainContentMinWidth: input.mainContentMinWidthPx,\n panel: input.activePanel,\n preferredWidth: input.panelWidth,\n viewportWidth: input.containerWidth\n });\n}\n\nfunction resolvePreferredWidth(\n preferredWidth: number | undefined,\n fallbackWidth: number\n): number {\n return typeof preferredWidth === \"number\" && Number.isFinite(preferredWidth)\n ? Math.max(0, Math.round(preferredWidth))\n : fallbackWidth;\n}\n"],"mappings":"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","names":["cn","Button","jsx","jsx","jsxs","Button","useCallback","useRef","useState","useCallback","useState","useState","useCallback","useState","useRef","useCallback","jsx","jsxs","AgentToolSidebar","cn"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/agent-gui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.202",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -143,19 +143,19 @@
|
|
|
143
143
|
"dependencies": {
|
|
144
144
|
"@monaco-editor/react": "^4.7.0",
|
|
145
145
|
"@tanstack/react-virtual": "^3.13.12",
|
|
146
|
-
"@tutti-os/agent-activity-core": "0.0.
|
|
147
|
-
"@tutti-os/browser-node": "0.0.
|
|
148
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
149
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
150
|
-
"@tutti-os/ui-rich-text": "0.0.
|
|
151
|
-
"@tutti-os/ui-system": "0.0.
|
|
152
|
-
"@tutti-os/workbench-surface": "0.0.
|
|
153
|
-
"@tutti-os/workspace-external-core": "0.0.
|
|
154
|
-
"@tutti-os/workspace-file-manager": "0.0.
|
|
155
|
-
"@tutti-os/workspace-file-preview": "0.0.
|
|
156
|
-
"@tutti-os/workspace-file-reference": "0.0.
|
|
157
|
-
"@tutti-os/workspace-issue-manager": "0.0.
|
|
158
|
-
"@tutti-os/workspace-user-project": "0.0.
|
|
146
|
+
"@tutti-os/agent-activity-core": "0.0.202",
|
|
147
|
+
"@tutti-os/browser-node": "0.0.202",
|
|
148
|
+
"@tutti-os/ui-i18n-runtime": "0.0.202",
|
|
149
|
+
"@tutti-os/ui-react-hooks": "0.0.202",
|
|
150
|
+
"@tutti-os/ui-rich-text": "0.0.202",
|
|
151
|
+
"@tutti-os/ui-system": "0.0.202",
|
|
152
|
+
"@tutti-os/workbench-surface": "0.0.202",
|
|
153
|
+
"@tutti-os/workspace-external-core": "0.0.202",
|
|
154
|
+
"@tutti-os/workspace-file-manager": "0.0.202",
|
|
155
|
+
"@tutti-os/workspace-file-preview": "0.0.202",
|
|
156
|
+
"@tutti-os/workspace-file-reference": "0.0.202",
|
|
157
|
+
"@tutti-os/workspace-issue-manager": "0.0.202",
|
|
158
|
+
"@tutti-os/workspace-user-project": "0.0.202",
|
|
159
159
|
"clsx": "^2.1.1",
|
|
160
160
|
"framer-motion": "^12.40.0",
|
|
161
161
|
"lodash": "^4.17.21",
|