@tutti-os/agent-gui 0.0.134 → 0.0.136
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
2
|
+
import { ReactNode, MouseEventHandler, PointerEventHandler } from 'react';
|
|
3
3
|
import { BrowserNodeHostApi, BrowserNodeSessionMode, BrowserNodeFeature } from '@tutti-os/browser-node';
|
|
4
4
|
import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
|
|
5
5
|
import { IconProps } from '@tutti-os/ui-system';
|
|
@@ -152,10 +152,18 @@ interface AgentToolSidebarHandle {
|
|
|
152
152
|
closeTab(tabId: string): void;
|
|
153
153
|
openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;
|
|
154
154
|
}
|
|
155
|
+
type AgentToolSidebarHeaderDrag = {
|
|
156
|
+
mode?: "native-window";
|
|
157
|
+
} | {
|
|
158
|
+
mode: "host";
|
|
159
|
+
onDoubleClick?: MouseEventHandler<HTMLDivElement>;
|
|
160
|
+
onPointerDown?: PointerEventHandler<HTMLDivElement>;
|
|
161
|
+
};
|
|
155
162
|
interface AgentToolSidebarProps {
|
|
156
163
|
children: ReactNode;
|
|
157
164
|
containerWidth: number;
|
|
158
165
|
copy: AgentToolSidebarCopy;
|
|
166
|
+
headerDrag?: AgentToolSidebarHeaderDrag;
|
|
159
167
|
headerPlacement?: "inline" | "external" | "panel";
|
|
160
168
|
mainContentMinWidthPx?: number;
|
|
161
169
|
panels: readonly AgentToolPanelDefinition[];
|
|
@@ -186,4 +194,4 @@ declare function AgentToolSidebarPicker({ panels, onSelect }: {
|
|
|
186
194
|
onSelect: (panel: AgentToolPanelId) => void;
|
|
187
195
|
}): ReactNode;
|
|
188
196
|
|
|
189
|
-
export { AgentToolBrowserPanel, type AgentToolBrowserPanelProps, type AgentToolPanelDefinition, AgentToolPanelIcon, type AgentToolPanelId, AgentToolSidebar, type AgentToolSidebarAction, type AgentToolSidebarCopy, type AgentToolSidebarHandle, AgentToolSidebarPicker, type AgentToolSidebarProps, type AgentToolSidebarReminderCounts, type AgentToolSidebarState, AgentToolSidebarToolbar, type AgentToolTab, agentToolBrowserDefaultUrl, agentToolEmptySidebarWidth, agentToolMainMinWidth, agentToolPanelDefaultWidthById, agentToolPanelIds, agentToolPanelMaxWidthById, agentToolPanelMinWidthById, clampAgentToolPanelWidth, createAgentToolBrowserFeature, createAgentToolSidebarState, filterAgentToolPanels, formatAgentToolReminderCount, isAgentToolPanelId, reduceAgentToolSidebarState, resolveAgentToolPanelExpansionReset, resolveAgentToolPanelExpansionTransfer, resolveAgentToolPanelMaxWidth, resolveAgentToolPanelPreferredWidth, resolveAgentToolSidebarLayoutWidth, resolveAgentToolSidebarWidth, shouldResizeAgentToolContainer };
|
|
197
|
+
export { AgentToolBrowserPanel, type AgentToolBrowserPanelProps, type AgentToolPanelDefinition, AgentToolPanelIcon, type AgentToolPanelId, AgentToolSidebar, type AgentToolSidebarAction, type AgentToolSidebarCopy, type AgentToolSidebarHandle, type AgentToolSidebarHeaderDrag, AgentToolSidebarPicker, type AgentToolSidebarProps, type AgentToolSidebarReminderCounts, type AgentToolSidebarState, AgentToolSidebarToolbar, type AgentToolTab, agentToolBrowserDefaultUrl, agentToolEmptySidebarWidth, agentToolMainMinWidth, agentToolPanelDefaultWidthById, agentToolPanelIds, agentToolPanelMaxWidthById, agentToolPanelMinWidthById, clampAgentToolPanelWidth, createAgentToolBrowserFeature, createAgentToolSidebarState, filterAgentToolPanels, formatAgentToolReminderCount, isAgentToolPanelId, reduceAgentToolSidebarState, resolveAgentToolPanelExpansionReset, resolveAgentToolPanelExpansionTransfer, resolveAgentToolPanelMaxWidth, resolveAgentToolPanelPreferredWidth, resolveAgentToolSidebarLayoutWidth, resolveAgentToolSidebarWidth, shouldResizeAgentToolContainer };
|
|
@@ -1147,6 +1147,7 @@ var AgentToolSidebar = forwardRef(function AgentToolSidebar2({
|
|
|
1147
1147
|
children,
|
|
1148
1148
|
containerWidth,
|
|
1149
1149
|
copy,
|
|
1150
|
+
headerDrag,
|
|
1150
1151
|
headerPlacement = "inline",
|
|
1151
1152
|
mainContentMinWidthPx,
|
|
1152
1153
|
panels: unfilteredPanels,
|
|
@@ -1218,17 +1219,39 @@ var AgentToolSidebar = forwardRef(function AgentToolSidebar2({
|
|
|
1218
1219
|
}),
|
|
1219
1220
|
[addPanel, closePanel, closePanelTab, openPanel]
|
|
1220
1221
|
);
|
|
1222
|
+
const isHostHeaderDrag = headerDrag?.mode === "host";
|
|
1223
|
+
const handleHeaderDoubleClick = (event) => {
|
|
1224
|
+
if (isAgentToolSidebarHeaderControl(event.target)) {
|
|
1225
|
+
event.stopPropagation();
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
if (headerDrag?.mode === "host") {
|
|
1229
|
+
headerDrag.onDoubleClick?.(event);
|
|
1230
|
+
}
|
|
1231
|
+
};
|
|
1232
|
+
const handleHeaderPointerDown = (event) => {
|
|
1233
|
+
if (isAgentToolSidebarHeaderControl(event.target)) {
|
|
1234
|
+
event.stopPropagation();
|
|
1235
|
+
return;
|
|
1236
|
+
}
|
|
1237
|
+
if (headerDrag?.mode === "host") {
|
|
1238
|
+
headerDrag.onPointerDown?.(event);
|
|
1239
|
+
}
|
|
1240
|
+
};
|
|
1221
1241
|
const toolActions = /* @__PURE__ */ jsxs3(
|
|
1222
1242
|
"div",
|
|
1223
1243
|
{
|
|
1224
1244
|
className: cn2(
|
|
1225
|
-
"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
|
|
1245
|
+
"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",
|
|
1246
|
+
isHostHeaderDrag ? "[-webkit-app-region:no-drag]" : "[-webkit-app-region:drag]",
|
|
1226
1247
|
isSidebarOpen && "border-b border-[var(--border-1)]"
|
|
1227
1248
|
),
|
|
1228
1249
|
"data-standalone-agent-tool-sidebar-drag-region": "true",
|
|
1229
1250
|
"data-standalone-agent-tool-sidebar-header": "true",
|
|
1230
1251
|
ref: measureToolActions,
|
|
1231
1252
|
style: isSidebarOpen ? { width: `${activePanelWidth}px`, maxWidth: "100%" } : void 0,
|
|
1253
|
+
onDoubleClick: isHostHeaderDrag ? handleHeaderDoubleClick : void 0,
|
|
1254
|
+
onPointerDown: isHostHeaderDrag ? handleHeaderPointerDown : void 0,
|
|
1232
1255
|
children: [
|
|
1233
1256
|
activeTabId ? /* @__PURE__ */ jsx4(
|
|
1234
1257
|
ToolSidebarTabBar,
|
|
@@ -1406,7 +1429,7 @@ function ToolSidebarTabBar({
|
|
|
1406
1429
|
"div",
|
|
1407
1430
|
{
|
|
1408
1431
|
"aria-label": copy.tool,
|
|
1409
|
-
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
|
|
1432
|
+
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",
|
|
1410
1433
|
"data-standalone-agent-tool-tab-list": "true",
|
|
1411
1434
|
role: "tablist",
|
|
1412
1435
|
children: /* @__PURE__ */ jsx4("div", { className: "flex min-w-0 flex-1 items-center gap-1 overflow-x-auto", children: mountedTabs.map((tab) => {
|
|
@@ -1461,6 +1484,11 @@ function ToolSidebarTabBar({
|
|
|
1461
1484
|
}
|
|
1462
1485
|
);
|
|
1463
1486
|
}
|
|
1487
|
+
function isAgentToolSidebarHeaderControl(target) {
|
|
1488
|
+
return target instanceof Element && target.closest(
|
|
1489
|
+
'.nodrag, button, a, input, textarea, select, option, [role="button"], [role="menuitem"], [contenteditable="true"]'
|
|
1490
|
+
) !== null;
|
|
1491
|
+
}
|
|
1464
1492
|
export {
|
|
1465
1493
|
AgentToolBrowserPanel,
|
|
1466
1494
|
AgentToolPanelIcon,
|
|
@@ -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\";\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 \"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): AgentToolSidebarState {\n const nextTab: AgentToolTab = {\n id: tab.tabId,\n panel: tab.panel,\n ...(tab.resourceId ? { resourceId: tab.resourceId } : {})\n };\n return {\n activePanel: nextTab.panel,\n activeTabId: nextTab.id,\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 { lazy, Suspense, useMemo, useState, type ReactNode } from \"react\";\nimport {\n createBrowserNodeFeature,\n isBrowserNodeSurfaceEvent,\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 browserApi: BrowserNodeHostApi;\n defaultUrl?: string;\n hidden: boolean;\n i18n: I18nRuntime<string>;\n loadingFallback?: ReactNode;\n navigationActions?: ReactNode;\n nodeIdPrefix?: string;\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n sessionPartition?: string | null;\n}\n\nexport function AgentToolBrowserPanel({\n browserApi,\n defaultUrl = agentToolBrowserDefaultUrl,\n hidden,\n i18n,\n loadingFallback = null,\n navigationActions,\n nodeIdPrefix = \"browser:agent-tool\",\n profileId = null,\n sessionMode = \"shared\",\n sessionPartition = null\n}: AgentToolBrowserPanelProps): ReactNode {\n const [nodeId] = useState(() => createAgentToolBrowserNodeId(nodeIdPrefix));\n const feature = useMemo(\n () => createAgentToolBrowserFeature({ browserApi, i18n, nodeId }),\n [browserApi, i18n, nodeId]\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 >\n <Suspense fallback={loadingFallback}>\n <LazyBrowserNode\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 i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\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 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 openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n}\n\nexport interface AgentToolSidebarProps {\n children: ReactNode;\n containerWidth: number;\n copy: AgentToolSidebarCopy;\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 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 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 openPanel\n }),\n [addPanel, closePanel, closePanelTab, openPanel]\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 [-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 >\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 [-webkit-app-region:drag]\"\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","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 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 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","useState","useState","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\";\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 \"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): AgentToolSidebarState {\n const nextTab: AgentToolTab = {\n id: tab.tabId,\n panel: tab.panel,\n ...(tab.resourceId ? { resourceId: tab.resourceId } : {})\n };\n return {\n activePanel: nextTab.panel,\n activeTabId: nextTab.id,\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 { lazy, Suspense, useMemo, useState, type ReactNode } from \"react\";\nimport {\n createBrowserNodeFeature,\n isBrowserNodeSurfaceEvent,\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 browserApi: BrowserNodeHostApi;\n defaultUrl?: string;\n hidden: boolean;\n i18n: I18nRuntime<string>;\n loadingFallback?: ReactNode;\n navigationActions?: ReactNode;\n nodeIdPrefix?: string;\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n sessionPartition?: string | null;\n}\n\nexport function AgentToolBrowserPanel({\n browserApi,\n defaultUrl = agentToolBrowserDefaultUrl,\n hidden,\n i18n,\n loadingFallback = null,\n navigationActions,\n nodeIdPrefix = \"browser:agent-tool\",\n profileId = null,\n sessionMode = \"shared\",\n sessionPartition = null\n}: AgentToolBrowserPanelProps): ReactNode {\n const [nodeId] = useState(() => createAgentToolBrowserNodeId(nodeIdPrefix));\n const feature = useMemo(\n () => createAgentToolBrowserFeature({ browserApi, i18n, nodeId }),\n [browserApi, i18n, nodeId]\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 >\n <Suspense fallback={loadingFallback}>\n <LazyBrowserNode\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 i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\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 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 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 openPanel\n }),\n [addPanel, closePanel, closePanelTab, 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 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 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 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 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","useState","useState","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.136",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -140,18 +140,18 @@
|
|
|
140
140
|
"@tiptap/react": "^3.11.1",
|
|
141
141
|
"@tiptap/starter-kit": "^3.11.1",
|
|
142
142
|
"@tiptap/suggestion": "^3.11.1",
|
|
143
|
-
"@tutti-os/agent-activity-core": "0.0.
|
|
144
|
-
"@tutti-os/browser-node": "0.0.
|
|
145
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
146
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
147
|
-
"@tutti-os/ui-rich-text": "0.0.
|
|
148
|
-
"@tutti-os/ui-system": "0.0.
|
|
149
|
-
"@tutti-os/workbench-surface": "0.0.
|
|
150
|
-
"@tutti-os/workspace-external-core": "0.0.
|
|
151
|
-
"@tutti-os/workspace-file-manager": "0.0.
|
|
152
|
-
"@tutti-os/workspace-file-reference": "0.0.
|
|
153
|
-
"@tutti-os/workspace-issue-manager": "0.0.
|
|
154
|
-
"@tutti-os/workspace-user-project": "0.0.
|
|
143
|
+
"@tutti-os/agent-activity-core": "0.0.136",
|
|
144
|
+
"@tutti-os/browser-node": "0.0.136",
|
|
145
|
+
"@tutti-os/ui-i18n-runtime": "0.0.136",
|
|
146
|
+
"@tutti-os/ui-react-hooks": "0.0.136",
|
|
147
|
+
"@tutti-os/ui-rich-text": "0.0.136",
|
|
148
|
+
"@tutti-os/ui-system": "0.0.136",
|
|
149
|
+
"@tutti-os/workbench-surface": "0.0.136",
|
|
150
|
+
"@tutti-os/workspace-external-core": "0.0.136",
|
|
151
|
+
"@tutti-os/workspace-file-manager": "0.0.136",
|
|
152
|
+
"@tutti-os/workspace-file-reference": "0.0.136",
|
|
153
|
+
"@tutti-os/workspace-issue-manager": "0.0.136",
|
|
154
|
+
"@tutti-os/workspace-user-project": "0.0.136",
|
|
155
155
|
"clsx": "^2.1.1",
|
|
156
156
|
"framer-motion": "^12.40.0",
|
|
157
157
|
"lodash": "^4.17.21",
|