@tutti-os/agent-gui 0.0.156 → 0.0.157
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,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, MouseEventHandler, PointerEventHandler } from 'react';
|
|
3
|
-
import { BrowserNodeHostApi, BrowserNodeChromeImportPromptAdapter, BrowserNodeSessionMode, BrowserNodeFeature } from '@tutti-os/browser-node';
|
|
3
|
+
import { BrowserNodeAutomationTargetMetadata, BrowserNodeHostApi, BrowserNodeChromeImportPromptAdapter, 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';
|
|
6
6
|
|
|
@@ -34,7 +34,7 @@ type AgentToolSidebarAction = {
|
|
|
34
34
|
panel: AgentToolPanelId;
|
|
35
35
|
resourceId?: string;
|
|
36
36
|
tabId: string;
|
|
37
|
-
type: "open-panel" | "add-panel";
|
|
37
|
+
type: "open-panel" | "add-panel" | "ensure-panel";
|
|
38
38
|
} | {
|
|
39
39
|
tabId: string;
|
|
40
40
|
type: "activate-tab" | "close-tab";
|
|
@@ -100,6 +100,7 @@ declare function formatAgentToolReminderCount(value: number | null | undefined):
|
|
|
100
100
|
|
|
101
101
|
declare const agentToolBrowserDefaultUrl = "https://www.google.com/";
|
|
102
102
|
interface AgentToolBrowserPanelProps {
|
|
103
|
+
automationTarget?: Omit<BrowserNodeAutomationTargetMetadata, "focused" | "selected" | "surfaceId" | "tabId"> | null;
|
|
103
104
|
browserApi: BrowserNodeHostApi;
|
|
104
105
|
chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;
|
|
105
106
|
defaultUrl?: string;
|
|
@@ -108,11 +109,19 @@ interface AgentToolBrowserPanelProps {
|
|
|
108
109
|
loadingFallback?: ReactNode;
|
|
109
110
|
navigationActions?: ReactNode;
|
|
110
111
|
nodeIdPrefix?: string;
|
|
112
|
+
onControllerReady?: (controller: AgentToolBrowserController | null) => void;
|
|
111
113
|
profileId?: string | null;
|
|
112
114
|
sessionMode?: BrowserNodeSessionMode;
|
|
113
115
|
sessionPartition?: string | null;
|
|
114
116
|
}
|
|
115
|
-
|
|
117
|
+
interface AgentToolBrowserController {
|
|
118
|
+
closePage(nodeId: string): "closed" | "last-page" | "not-found";
|
|
119
|
+
createPage(url?: string | null): string;
|
|
120
|
+
ownsPage(nodeId: string): boolean;
|
|
121
|
+
selectPage(nodeId: string): boolean;
|
|
122
|
+
surfaceNodeId: string;
|
|
123
|
+
}
|
|
124
|
+
declare function AgentToolBrowserPanel({ automationTarget, browserApi, chromeCookieImportPrompt, defaultUrl, hidden, i18n, loadingFallback, navigationActions, nodeIdPrefix, onControllerReady, profileId, sessionMode, sessionPartition }: AgentToolBrowserPanelProps): ReactNode;
|
|
116
125
|
declare function createAgentToolBrowserFeature(input: {
|
|
117
126
|
browserApi: BrowserNodeHostApi;
|
|
118
127
|
chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;
|
|
@@ -152,6 +161,7 @@ interface AgentToolSidebarHandle {
|
|
|
152
161
|
addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;
|
|
153
162
|
close(): void;
|
|
154
163
|
closeTab(tabId: string): void;
|
|
164
|
+
ensurePanel(panel: AgentToolPanelId, resourceId?: string): string | null;
|
|
155
165
|
openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;
|
|
156
166
|
}
|
|
157
167
|
type AgentToolSidebarHeaderDrag = {
|
|
@@ -196,4 +206,4 @@ declare function AgentToolSidebarPicker({ panels, onSelect }: {
|
|
|
196
206
|
onSelect: (panel: AgentToolPanelId) => void;
|
|
197
207
|
}): ReactNode;
|
|
198
208
|
|
|
199
|
-
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 };
|
|
209
|
+
export { type AgentToolBrowserController, 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 };
|
|
@@ -94,6 +94,14 @@ function reduceAgentToolSidebarState(state, action) {
|
|
|
94
94
|
}
|
|
95
95
|
case "add-panel":
|
|
96
96
|
return addTab(state, action);
|
|
97
|
+
case "ensure-panel": {
|
|
98
|
+
const existing = findLastTab(
|
|
99
|
+
state.mountedTabs,
|
|
100
|
+
action.panel,
|
|
101
|
+
action.resourceId
|
|
102
|
+
);
|
|
103
|
+
return existing ? state : addTab(state, action, { activate: false });
|
|
104
|
+
}
|
|
97
105
|
case "open-panel": {
|
|
98
106
|
const existing = findLastTab(
|
|
99
107
|
state.mountedTabs,
|
|
@@ -104,15 +112,16 @@ function reduceAgentToolSidebarState(state, action) {
|
|
|
104
112
|
}
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
|
-
function addTab(state, tab) {
|
|
115
|
+
function addTab(state, tab, options = {}) {
|
|
108
116
|
const nextTab = {
|
|
109
117
|
id: tab.tabId,
|
|
110
118
|
panel: tab.panel,
|
|
111
119
|
...tab.resourceId ? { resourceId: tab.resourceId } : {}
|
|
112
120
|
};
|
|
121
|
+
const activate = options.activate !== false;
|
|
113
122
|
return {
|
|
114
|
-
activePanel: nextTab.panel,
|
|
115
|
-
activeTabId: nextTab.id,
|
|
123
|
+
activePanel: activate ? nextTab.panel : state.activePanel,
|
|
124
|
+
activeTabId: activate ? nextTab.id : state.activeTabId,
|
|
116
125
|
mountedTabs: state.mountedTabs.some(
|
|
117
126
|
(candidate) => candidate.id === nextTab.id
|
|
118
127
|
) ? state.mountedTabs : [...state.mountedTabs, nextTab]
|
|
@@ -198,8 +207,15 @@ function formatAgentToolReminderCount(value) {
|
|
|
198
207
|
}
|
|
199
208
|
|
|
200
209
|
// workbench/tool-sidebar/AgentToolBrowserPanel.tsx
|
|
201
|
-
import { lazy, Suspense, useMemo, useState } from "react";
|
|
202
210
|
import {
|
|
211
|
+
lazy,
|
|
212
|
+
Suspense,
|
|
213
|
+
useCallback,
|
|
214
|
+
useMemo,
|
|
215
|
+
useState
|
|
216
|
+
} from "react";
|
|
217
|
+
import {
|
|
218
|
+
closeBrowserNodeTab,
|
|
203
219
|
createBrowserNodeFeature,
|
|
204
220
|
isBrowserNodeSurfaceEvent
|
|
205
221
|
} from "@tutti-os/browser-node";
|
|
@@ -211,6 +227,7 @@ var LazyBrowserNode = lazy(
|
|
|
211
227
|
);
|
|
212
228
|
var agentToolBrowserDefaultUrl = "https://www.google.com/";
|
|
213
229
|
function AgentToolBrowserPanel({
|
|
230
|
+
automationTarget = null,
|
|
214
231
|
browserApi,
|
|
215
232
|
chromeCookieImportPrompt,
|
|
216
233
|
defaultUrl = agentToolBrowserDefaultUrl,
|
|
@@ -219,6 +236,7 @@ function AgentToolBrowserPanel({
|
|
|
219
236
|
loadingFallback = null,
|
|
220
237
|
navigationActions,
|
|
221
238
|
nodeIdPrefix = "browser:agent-tool",
|
|
239
|
+
onControllerReady,
|
|
222
240
|
profileId = null,
|
|
223
241
|
sessionMode = "shared",
|
|
224
242
|
sessionPartition = null
|
|
@@ -233,15 +251,60 @@ function AgentToolBrowserPanel({
|
|
|
233
251
|
}),
|
|
234
252
|
[browserApi, chromeCookieImportPrompt, i18n, nodeId]
|
|
235
253
|
);
|
|
254
|
+
const controller = useMemo(() => {
|
|
255
|
+
const getPage = (pageNodeId) => {
|
|
256
|
+
const state = feature.tabsStore.getSurfaceState(nodeId);
|
|
257
|
+
const tab = state?.tabs.find(
|
|
258
|
+
(candidate) => candidate.nodeId === pageNodeId
|
|
259
|
+
);
|
|
260
|
+
return state && tab ? { state, tab } : null;
|
|
261
|
+
};
|
|
262
|
+
return {
|
|
263
|
+
closePage(pageNodeId) {
|
|
264
|
+
const page = getPage(pageNodeId);
|
|
265
|
+
if (!page) return "not-found";
|
|
266
|
+
if (page.state.tabs.length === 1) return "last-page";
|
|
267
|
+
closeBrowserNodeTab(feature, nodeId, page.tab.id);
|
|
268
|
+
return "closed";
|
|
269
|
+
},
|
|
270
|
+
createPage(url) {
|
|
271
|
+
const resolvedUrl = url?.trim() || "about:blank";
|
|
272
|
+
const state = feature.tabsStore.ensureSurface(nodeId, defaultUrl);
|
|
273
|
+
const activeTab = state.tabs.find(
|
|
274
|
+
(tab) => tab.id === state.activeTabId
|
|
275
|
+
);
|
|
276
|
+
const activeRuntime = activeTab ? feature.runtimeStore.getNodeState(activeTab.nodeId) : null;
|
|
277
|
+
if (state.tabs.length === 1 && activeTab?.defaultUrl === "about:blank" && !activeRuntime?.url) {
|
|
278
|
+
feature.tabsStore.syncDefaultUrl(nodeId, resolvedUrl);
|
|
279
|
+
return activeTab.nodeId;
|
|
280
|
+
}
|
|
281
|
+
return feature.tabsStore.addTab(nodeId, resolvedUrl).nodeId;
|
|
282
|
+
},
|
|
283
|
+
ownsPage: (pageNodeId) => getPage(pageNodeId) !== null,
|
|
284
|
+
selectPage(pageNodeId) {
|
|
285
|
+
const page = getPage(pageNodeId);
|
|
286
|
+
if (!page) return false;
|
|
287
|
+
feature.tabsStore.selectTab(nodeId, page.tab.id);
|
|
288
|
+
return true;
|
|
289
|
+
},
|
|
290
|
+
surfaceNodeId: nodeId
|
|
291
|
+
};
|
|
292
|
+
}, [defaultUrl, feature, nodeId]);
|
|
293
|
+
const bindController = useCallback(
|
|
294
|
+
(node) => onControllerReady?.(node ? controller : null),
|
|
295
|
+
[controller, onControllerReady]
|
|
296
|
+
);
|
|
236
297
|
return /* @__PURE__ */ jsx(
|
|
237
298
|
"div",
|
|
238
299
|
{
|
|
239
300
|
className: "relative h-full min-h-0 overflow-hidden",
|
|
240
301
|
"data-agent-tool-browser-surface": "true",
|
|
241
302
|
"data-agent-tool-browser-surface-id": nodeId,
|
|
303
|
+
ref: bindController,
|
|
242
304
|
children: /* @__PURE__ */ jsx(Suspense, { fallback: loadingFallback, children: /* @__PURE__ */ jsx(
|
|
243
305
|
LazyBrowserNode,
|
|
244
306
|
{
|
|
307
|
+
automationTarget: automationTarget ? { ...automationTarget, focused: !hidden } : null,
|
|
245
308
|
defaultUrl,
|
|
246
309
|
feature,
|
|
247
310
|
hidden,
|
|
@@ -525,7 +588,7 @@ function AgentToolSidebarPicker({
|
|
|
525
588
|
|
|
526
589
|
// workbench/tool-sidebar/useAgentToolSidebarController.ts
|
|
527
590
|
import {
|
|
528
|
-
useCallback as
|
|
591
|
+
useCallback as useCallback3,
|
|
529
592
|
useReducer,
|
|
530
593
|
useRef as useRef2,
|
|
531
594
|
useState as useState3
|
|
@@ -533,7 +596,7 @@ import {
|
|
|
533
596
|
|
|
534
597
|
// workbench/tool-sidebar/useAgentToolSidebarLayout.ts
|
|
535
598
|
import {
|
|
536
|
-
useCallback,
|
|
599
|
+
useCallback as useCallback2,
|
|
537
600
|
useRef,
|
|
538
601
|
useState as useState2
|
|
539
602
|
} from "react";
|
|
@@ -598,7 +661,7 @@ function useAgentToolSidebarLayout({
|
|
|
598
661
|
containerWidth: resolvedContainerWidth,
|
|
599
662
|
panelWidth: activePanelWidth
|
|
600
663
|
}) : 0;
|
|
601
|
-
const resetPanelExpansion =
|
|
664
|
+
const resetPanelExpansion = useCallback2(
|
|
602
665
|
(nextPanel) => {
|
|
603
666
|
const reset = resolveAgentToolPanelExpansionReset({
|
|
604
667
|
expandedPanel: expandedPanelRef.current,
|
|
@@ -637,7 +700,7 @@ function useAgentToolSidebarLayout({
|
|
|
637
700
|
},
|
|
638
701
|
[manuallyResizedWidth, panelWidths]
|
|
639
702
|
);
|
|
640
|
-
const resizeForPanel =
|
|
703
|
+
const resizeForPanel = useCallback2(
|
|
641
704
|
async (nextPanel, preferredWidth, options) => {
|
|
642
705
|
const requestId = ++resizeRequestRef.current;
|
|
643
706
|
const expansionTransition = resetPanelExpansion(nextPanel);
|
|
@@ -694,10 +757,10 @@ function useAgentToolSidebarLayout({
|
|
|
694
757
|
resolvedContainerWidth
|
|
695
758
|
]
|
|
696
759
|
);
|
|
697
|
-
const resetContainerResizeBaseline =
|
|
760
|
+
const resetContainerResizeBaseline = useCallback2(() => {
|
|
698
761
|
baselineContainerWidthRef.current = null;
|
|
699
762
|
}, []);
|
|
700
|
-
const updatePanelWidth =
|
|
763
|
+
const updatePanelWidth = useCallback2(
|
|
701
764
|
(panel, width) => {
|
|
702
765
|
const nextWidth = clampAgentToolPanelWidth({
|
|
703
766
|
allowFullWidth: expandedPanel === panel,
|
|
@@ -711,7 +774,7 @@ function useAgentToolSidebarLayout({
|
|
|
711
774
|
},
|
|
712
775
|
[expandedPanel, mainContentMinWidthPx, resolvedContainerWidth]
|
|
713
776
|
);
|
|
714
|
-
const togglePanelExpansion =
|
|
777
|
+
const togglePanelExpansion = useCallback2(
|
|
715
778
|
(panel) => {
|
|
716
779
|
if (expandedPanelRef.current === panel) {
|
|
717
780
|
resetPanelExpansion(null);
|
|
@@ -731,7 +794,7 @@ function useAgentToolSidebarLayout({
|
|
|
731
794
|
},
|
|
732
795
|
[manuallyResizedWidth, resetPanelExpansion]
|
|
733
796
|
);
|
|
734
|
-
const stopResizing =
|
|
797
|
+
const stopResizing = useCallback2(() => {
|
|
735
798
|
dragRef.current = null;
|
|
736
799
|
const styles = resizeStyleRef.current;
|
|
737
800
|
if (!styles) return;
|
|
@@ -739,13 +802,13 @@ function useAgentToolSidebarLayout({
|
|
|
739
802
|
document.body.style.userSelect = styles.userSelect;
|
|
740
803
|
resizeStyleRef.current = null;
|
|
741
804
|
}, []);
|
|
742
|
-
const bindLayoutRoot =
|
|
805
|
+
const bindLayoutRoot = useCallback2(
|
|
743
806
|
(node) => {
|
|
744
807
|
if (!node) stopResizing();
|
|
745
808
|
},
|
|
746
809
|
[stopResizing]
|
|
747
810
|
);
|
|
748
|
-
const handleResizePointerDown =
|
|
811
|
+
const handleResizePointerDown = useCallback2(
|
|
749
812
|
(event) => {
|
|
750
813
|
if (event.button !== 0 || activePanel === null) return;
|
|
751
814
|
event.preventDefault();
|
|
@@ -765,7 +828,7 @@ function useAgentToolSidebarLayout({
|
|
|
765
828
|
},
|
|
766
829
|
[activePanel, activePanelWidth]
|
|
767
830
|
);
|
|
768
|
-
const handleResizePointerMove =
|
|
831
|
+
const handleResizePointerMove = useCallback2(
|
|
769
832
|
(event) => {
|
|
770
833
|
const resizeState = dragRef.current;
|
|
771
834
|
if (!resizeState || resizeState.pointerId !== event.pointerId) return;
|
|
@@ -776,7 +839,7 @@ function useAgentToolSidebarLayout({
|
|
|
776
839
|
},
|
|
777
840
|
[updatePanelWidth]
|
|
778
841
|
);
|
|
779
|
-
const handleResizeKeyDown =
|
|
842
|
+
const handleResizeKeyDown = useCallback2(
|
|
780
843
|
(event) => {
|
|
781
844
|
if (activePanel === null) return;
|
|
782
845
|
if (event.key === "Home") {
|
|
@@ -877,7 +940,7 @@ function useAgentToolSidebarController({
|
|
|
877
940
|
const resizeAnimationFrameRef = useRef2(null);
|
|
878
941
|
const contentAnimationFrameIdsRef = useRef2(/* @__PURE__ */ new Set());
|
|
879
942
|
const toolActionsResizeObserverRef = useRef2(null);
|
|
880
|
-
const scheduleResizeForPanel =
|
|
943
|
+
const scheduleResizeForPanel = useCallback3(
|
|
881
944
|
(panel, preferredWidth, options) => {
|
|
882
945
|
if (resizeAnimationFrameRef.current !== null) {
|
|
883
946
|
window.cancelAnimationFrame(resizeAnimationFrameRef.current);
|
|
@@ -889,11 +952,11 @@ function useAgentToolSidebarController({
|
|
|
889
952
|
},
|
|
890
953
|
[layout.resizeForPanel]
|
|
891
954
|
);
|
|
892
|
-
const showSidebar =
|
|
955
|
+
const showSidebar = useCallback3(() => {
|
|
893
956
|
setIsEmptySidebarClosing(false);
|
|
894
957
|
setIsSidebarOpen(true);
|
|
895
958
|
}, []);
|
|
896
|
-
const markContentReady =
|
|
959
|
+
const markContentReady = useCallback3((tabId) => {
|
|
897
960
|
if (prefersReducedMotion()) {
|
|
898
961
|
setContentReadyTabIds(
|
|
899
962
|
(current) => current.includes(tabId) ? current : [...current, tabId]
|
|
@@ -913,7 +976,7 @@ function useAgentToolSidebarController({
|
|
|
913
976
|
contentAnimationFrameIdsRef.current.add(frameId);
|
|
914
977
|
}
|
|
915
978
|
}, []);
|
|
916
|
-
const closePanel =
|
|
979
|
+
const closePanel = useCallback3(() => {
|
|
917
980
|
setIsSidebarOpen(false);
|
|
918
981
|
dispatch({ type: "close" });
|
|
919
982
|
onActivePanelChange?.(null);
|
|
@@ -928,7 +991,7 @@ function useAgentToolSidebarController({
|
|
|
928
991
|
preserveBaseline: true
|
|
929
992
|
});
|
|
930
993
|
}, [onActivePanelChange, scheduleResizeForPanel, state.mountedTabs.length]);
|
|
931
|
-
const openPanel =
|
|
994
|
+
const openPanel = useCallback3(
|
|
932
995
|
(panel, resourceId) => {
|
|
933
996
|
if (!panelIds.has(panel)) return null;
|
|
934
997
|
showSidebar();
|
|
@@ -956,7 +1019,7 @@ function useAgentToolSidebarController({
|
|
|
956
1019
|
state
|
|
957
1020
|
]
|
|
958
1021
|
);
|
|
959
|
-
const addPanel =
|
|
1022
|
+
const addPanel = useCallback3(
|
|
960
1023
|
(panel, resourceId) => {
|
|
961
1024
|
if (!panelIds.has(panel)) return null;
|
|
962
1025
|
showSidebar();
|
|
@@ -982,7 +1045,29 @@ function useAgentToolSidebarController({
|
|
|
982
1045
|
state
|
|
983
1046
|
]
|
|
984
1047
|
);
|
|
985
|
-
const
|
|
1048
|
+
const ensurePanel = useCallback3(
|
|
1049
|
+
(panel, resourceId) => {
|
|
1050
|
+
if (!panelIds.has(panel)) return null;
|
|
1051
|
+
const existing = state.mountedTabs.find(
|
|
1052
|
+
(tab) => tab.panel === panel && (tab.resourceId ?? void 0) === resourceId
|
|
1053
|
+
);
|
|
1054
|
+
if (existing) return existing.id;
|
|
1055
|
+
const tabId = createToolTabId(panel);
|
|
1056
|
+
const action = {
|
|
1057
|
+
panel,
|
|
1058
|
+
resourceId,
|
|
1059
|
+
tabId,
|
|
1060
|
+
type: "ensure-panel"
|
|
1061
|
+
};
|
|
1062
|
+
const nextState = reduceAgentToolSidebarState(state, action);
|
|
1063
|
+
dispatch(action);
|
|
1064
|
+
onTabsChange?.(nextState.mountedTabs);
|
|
1065
|
+
markContentReady(tabId);
|
|
1066
|
+
return tabId;
|
|
1067
|
+
},
|
|
1068
|
+
[markContentReady, onTabsChange, panelIds, state]
|
|
1069
|
+
);
|
|
1070
|
+
const closePanelTab = useCallback3(
|
|
986
1071
|
(tabId) => {
|
|
987
1072
|
const closingIndex = state.mountedTabs.findIndex(
|
|
988
1073
|
(tab) => tab.id === tabId
|
|
@@ -1015,7 +1100,7 @@ function useAgentToolSidebarController({
|
|
|
1015
1100
|
state
|
|
1016
1101
|
]
|
|
1017
1102
|
);
|
|
1018
|
-
const activatePanelTab =
|
|
1103
|
+
const activatePanelTab = useCallback3(
|
|
1019
1104
|
(tab) => {
|
|
1020
1105
|
onPanelOpen?.(tab.panel, tab.resourceId);
|
|
1021
1106
|
dispatch({ tabId: tab.id, type: "activate-tab" });
|
|
@@ -1025,7 +1110,7 @@ function useAgentToolSidebarController({
|
|
|
1025
1110
|
},
|
|
1026
1111
|
[markContentReady, onActivePanelChange, onPanelOpen, scheduleResizeForPanel]
|
|
1027
1112
|
);
|
|
1028
|
-
const toggleSidebar =
|
|
1113
|
+
const toggleSidebar = useCallback3(() => {
|
|
1029
1114
|
const nextPanel = activePanel ?? fallbackPanel;
|
|
1030
1115
|
if (isSidebarOpen) {
|
|
1031
1116
|
closePanel();
|
|
@@ -1055,7 +1140,7 @@ function useAgentToolSidebarController({
|
|
|
1055
1140
|
showSidebar,
|
|
1056
1141
|
state.mountedTabs
|
|
1057
1142
|
]);
|
|
1058
|
-
const handleSidebarTransitionEnd =
|
|
1143
|
+
const handleSidebarTransitionEnd = useCallback3(
|
|
1059
1144
|
(event) => {
|
|
1060
1145
|
if (event.currentTarget !== event.target || event.propertyName !== "width" || isSidebarOpen || !isEmptySidebarClosing) {
|
|
1061
1146
|
return;
|
|
@@ -1065,7 +1150,7 @@ function useAgentToolSidebarController({
|
|
|
1065
1150
|
},
|
|
1066
1151
|
[isEmptySidebarClosing, isSidebarOpen, layout.resetContainerResizeBaseline]
|
|
1067
1152
|
);
|
|
1068
|
-
const bindLayoutWidthProjection =
|
|
1153
|
+
const bindLayoutWidthProjection = useCallback3(
|
|
1069
1154
|
(node) => {
|
|
1070
1155
|
if (node) {
|
|
1071
1156
|
onLayoutWidthChange?.(
|
|
@@ -1075,7 +1160,7 @@ function useAgentToolSidebarController({
|
|
|
1075
1160
|
},
|
|
1076
1161
|
[isSidebarOpen, layout.activePanelLayoutWidth, onLayoutWidthChange]
|
|
1077
1162
|
);
|
|
1078
|
-
const bindLifecycle =
|
|
1163
|
+
const bindLifecycle = useCallback3(
|
|
1079
1164
|
(node) => {
|
|
1080
1165
|
if (node) return;
|
|
1081
1166
|
if (resizeAnimationFrameRef.current !== null) {
|
|
@@ -1092,7 +1177,7 @@ function useAgentToolSidebarController({
|
|
|
1092
1177
|
},
|
|
1093
1178
|
[layout.bindLayoutRoot]
|
|
1094
1179
|
);
|
|
1095
|
-
const measureToolActions =
|
|
1180
|
+
const measureToolActions = useCallback3((node) => {
|
|
1096
1181
|
toolActionsResizeObserverRef.current?.disconnect();
|
|
1097
1182
|
toolActionsResizeObserverRef.current = null;
|
|
1098
1183
|
if (!node) return;
|
|
@@ -1117,6 +1202,7 @@ function useAgentToolSidebarController({
|
|
|
1117
1202
|
closePanel,
|
|
1118
1203
|
closePanelTab,
|
|
1119
1204
|
contentReadyTabIds,
|
|
1205
|
+
ensurePanel,
|
|
1120
1206
|
handleSidebarTransitionEnd,
|
|
1121
1207
|
isEmptySidebar,
|
|
1122
1208
|
isEmptySidebarClosing,
|
|
@@ -1192,6 +1278,7 @@ var AgentToolSidebar = forwardRef(function AgentToolSidebar2({
|
|
|
1192
1278
|
closePanel,
|
|
1193
1279
|
closePanelTab,
|
|
1194
1280
|
contentReadyTabIds,
|
|
1281
|
+
ensurePanel,
|
|
1195
1282
|
handleSidebarTransitionEnd,
|
|
1196
1283
|
isEmptySidebar,
|
|
1197
1284
|
isEmptySidebarClosing,
|
|
@@ -1222,9 +1309,10 @@ var AgentToolSidebar = forwardRef(function AgentToolSidebar2({
|
|
|
1222
1309
|
addPanel,
|
|
1223
1310
|
close: closePanel,
|
|
1224
1311
|
closeTab: closePanelTab,
|
|
1312
|
+
ensurePanel,
|
|
1225
1313
|
openPanel
|
|
1226
1314
|
}),
|
|
1227
|
-
[addPanel, closePanel, closePanelTab, openPanel]
|
|
1315
|
+
[addPanel, closePanel, closePanelTab, ensurePanel, openPanel]
|
|
1228
1316
|
);
|
|
1229
1317
|
const isHostHeaderDrag = headerDrag?.mode === "host";
|
|
1230
1318
|
const handleHeaderDoubleClick = (event) => {
|
|
@@ -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 BrowserNodeChromeImportPromptAdapter,\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 chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\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 chromeCookieImportPrompt,\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 () =>\n createAgentToolBrowserFeature({\n browserApi,\n ...(chromeCookieImportPrompt ? { chromeCookieImportPrompt } : {}),\n i18n,\n nodeId\n }),\n [browserApi, chromeCookieImportPrompt, 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 chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\n ...(input.chromeCookieImportPrompt\n ? { chromeCookieImportPrompt: input.chromeCookieImportPrompt }\n : {}),\n hostApi: createScopedAgentToolBrowserHostApi(\n input.browserApi,\n input.nodeId\n ),\n i18n: input.i18n,\n resolveSearchUrl: resolveAgentToolBrowserSearchUrl\n });\n}\n\nfunction createScopedAgentToolBrowserHostApi(\n browserApi: BrowserNodeHostApi,\n nodeId: string\n): BrowserNodeHostApi {\n return {\n ...browserApi,\n onEvent(listener) {\n return browserApi.onEvent((event) => {\n if (isBrowserNodeSurfaceEvent(nodeId, event)) {\n listener(event);\n }\n });\n }\n };\n}\n\nfunction resolveAgentToolBrowserSearchUrl(query: string): string {\n const searchUrl = new URL(\"https://www.google.com/search\");\n searchUrl.searchParams.set(\"q\", query);\n return searchUrl.toString();\n}\n\nfunction createAgentToolBrowserNodeId(prefix: string): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${prefix}:${instanceId}`;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n type MouseEventHandler,\n type PointerEventHandler,\n type ReactNode\n} from \"react\";\nimport { CloseIcon, cn } from \"@tutti-os/ui-system\";\nimport {\n filterAgentToolPanels,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { AgentToolSidebarPicker } from \"./Picker.tsx\";\nimport {\n AgentToolPanelIcon,\n AgentToolSidebarToolbar,\n type AgentToolSidebarCopy,\n type AgentToolSidebarReminderCounts\n} from \"./Toolbar.tsx\";\nimport { useAgentToolSidebarController } from \"./useAgentToolSidebarController.ts\";\n\nexport interface AgentToolSidebarHandle {\n addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n close(): void;\n closeTab(tabId: string): void;\n 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 event.stopPropagation();\n headerDrag.onDoubleClick?.(event);\n }\n };\n const handleHeaderPointerDown: PointerEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onPointerDown?.(event);\n }\n };\n\n const toolActions = (\n <div\n className={cn(\n \"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 max-w-full shrink-0 cursor-grab items-center pr-[var(--agent-gui-workbench-header-padding-x)] active:cursor-grabbing\",\n isHostHeaderDrag\n ? \"[-webkit-app-region:no-drag]\"\n : \"[-webkit-app-region:drag]\",\n isSidebarOpen && \"border-b border-[var(--border-1)]\"\n )}\n data-standalone-agent-tool-sidebar-drag-region=\"true\"\n data-standalone-agent-tool-sidebar-header=\"true\"\n ref={measureToolActions}\n style={\n isSidebarOpen\n ? { width: `${activePanelWidth}px`, maxWidth: \"100%\" }\n : undefined\n }\n onDoubleClick={isHostHeaderDrag ? handleHeaderDoubleClick : undefined}\n onPointerDown={isHostHeaderDrag ? handleHeaderPointerDown : undefined}\n >\n {activeTabId ? (\n <ToolSidebarTabBar\n activeTabId={activeTabId}\n copy={copy}\n labelByPanel={labelByPanel}\n mountedTabs={mountedTabs}\n renderTabIcon={renderTabIcon}\n resolveTabLabel={resolveTabLabel}\n onClosePanel={closePanelTab}\n onOpenPanel={activatePanelTab}\n />\n ) : null}\n <AgentToolSidebarToolbar\n activePanel={activePanel}\n copy={copy}\n isExpanded={isActivePanelExpanded}\n isOpen={isSidebarOpen}\n panels={panels}\n quickActionPanels={quickActionPanels}\n reminders={reminders}\n onAddPanel={addPanel}\n onOpenPanel={openPanel}\n onToggleExpansion={() => {\n if (activePanel) togglePanelExpansion(activePanel);\n }}\n onToggleSidebar={toggleSidebar}\n />\n </div>\n );\n\n return (\n <>\n {headerPlacement === \"external\" || headerPlacement === \"panel\" ? (\n renderHeader(\n headerPlacement === \"panel\" && isSidebarOpen ? null : toolActions\n )\n ) : (\n <div\n className=\"workbench-window__header workbench-window__header--custom\"\n style={\n {\n \"--agent-gui-tool-sidebar-layout-width\": isSidebarOpen\n ? `${activePanelLayoutWidth}px`\n : `${toolActionsWidth}px`\n } as CSSProperties\n }\n >\n {renderHeader(toolActions)}\n </div>\n )}\n <div\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\",\n headerPlacement === \"inline\" && \"workbench-window__body\"\n )}\n ref={bindLifecycle}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <div className=\"h-full min-w-0 flex-1 overflow-hidden\">\n {children}\n </div>\n <aside\n aria-hidden={!isSidebarOpen}\n className={cn(\n \"relative h-full min-h-0 shrink-0 overflow-hidden [contain:layout_paint]\",\n shouldAnimateSidebarWidth &&\n \"motion-safe:transition-[width] motion-safe:duration-[260ms] motion-safe:ease-in-out motion-reduce:transition-none\",\n isActivePanelExpanded && \"border-l border-[var(--line-1)]\",\n !isSidebarOpen && \"pointer-events-none\"\n )}\n data-standalone-agent-tool-sidebar=\"true\"\n ref={bindLayoutWidthProjection}\n style={{\n width: isSidebarOpen ? `${activePanelLayoutWidth}px` : \"0px\",\n zIndex: \"var(--z-panel)\"\n }}\n onTransitionEnd={handleSidebarTransitionEnd}\n >\n <div\n className={cn(\n \"absolute inset-y-0 right-0 flex flex-col bg-[var(--background-session-sidepanel)]\",\n isSidebarOpen &&\n !shouldAnimateSidebarLayout &&\n \"motion-safe:animate-in motion-safe:slide-in-from-right-3 motion-safe:duration-[160ms] motion-safe:ease-out motion-reduce:animate-none\",\n !isSidebarOpen && !isEmptySidebarClosing && \"invisible\"\n )}\n style={\n {\n \"--background-panel\": \"var(--background-session-sidepanel)\",\n width: `${activePanelWidth}px`\n } as CSSProperties\n }\n >\n {isSidebarOpen && !isEmptySidebar ? (\n <div\n aria-label={copy.resizeSidebar}\n aria-orientation=\"vertical\"\n aria-valuemax={activePanelMaxWidth}\n aria-valuemin={activePanelMinWidth}\n aria-valuenow={activePanelWidth}\n className=\"absolute top-0 left-0 z-20 h-full w-2 cursor-col-resize touch-none outline-none before:absolute before:left-0 before:h-full before:w-px before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n data-standalone-agent-tool-sidebar-resize-handle=\"true\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleResizeKeyDown}\n onLostPointerCapture={stopResizing}\n onPointerDown={handleResizePointerDown}\n onPointerMove={handleResizePointerMove}\n onPointerUp={stopResizing}\n />\n ) : null}\n {isSidebarOpen && headerPlacement === \"panel\"\n ? toolActions\n : null}\n {isSidebarOpen && headerPlacement === \"inline\" ? (\n <div\n aria-hidden\n className=\"shrink-0\"\n data-standalone-agent-tool-sidebar-header-spacer=\"true\"\n style={{\n height: \"var(--agent-gui-workbench-header-height, 44px)\"\n }}\n />\n ) : null}\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {isEmptySidebar || isEmptySidebarClosing ? (\n <AgentToolSidebarPicker\n panels={panels}\n onSelect={openPanel}\n />\n ) : null}\n {mountedTabs.map((tab) => (\n <div\n aria-hidden={activeTabId !== tab.id}\n className={cn(\n \"absolute inset-0 min-h-0 overflow-hidden\",\n activeTabId !== tab.id && \"invisible pointer-events-none\"\n )}\n key={tab.id}\n >\n {contentReadyTabIds.includes(tab.id) ? (\n <div\n className={cn(\n \"h-full min-h-0\",\n tab.panel !== \"terminal\" &&\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-150 motion-reduce:animate-none\"\n )}\n >\n {renderPanel({\n active: activeTabId === tab.id,\n closeSidebar: closePanel,\n tab\n })}\n </div>\n ) : activeTabId === tab.id ? (\n (renderLoading?.(tab) ?? null)\n ) : null}\n </div>\n ))}\n </div>\n </div>\n </aside>\n </div>\n </div>\n </>\n );\n});\n\nfunction ToolSidebarTabBar({\n activeTabId,\n copy,\n labelByPanel,\n mountedTabs,\n renderTabIcon,\n resolveTabLabel,\n onClosePanel,\n onOpenPanel\n}: {\n activeTabId: string;\n copy: AgentToolSidebarCopy;\n labelByPanel: ReadonlyMap<AgentToolPanelId, string>;\n mountedTabs: readonly AgentToolTab[];\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n onClosePanel: (tabId: string) => void;\n onOpenPanel: (tab: AgentToolTab) => void;\n}): ReactNode {\n return (\n <div\n aria-label={copy.tool}\n className=\"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 flex-1 cursor-grab items-center gap-1 overflow-hidden px-2 active:cursor-grabbing\"\n data-standalone-agent-tool-tab-list=\"true\"\n role=\"tablist\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\">\n {mountedTabs.map((tab) => {\n const defaultLabel = labelByPanel.get(tab.panel) ?? tab.panel;\n const label = resolveTabLabel?.(tab, defaultLabel) ?? defaultLabel;\n return (\n <div\n className={cn(\n \"group flex h-7 max-w-44 shrink-0 items-center rounded-sm overflow-hidden border text-xs text-[var(--text-tertiary)]\",\n activeTabId === tab.id\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border-transparent\"\n )}\n key={tab.id}\n >\n <button\n aria-selected={activeTabId === tab.id}\n className=\"nodrag flex h-full min-w-0 flex-1 items-center gap-1.5 overflow-hidden px-2 text-left outline-none [-webkit-app-region:no-drag] focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]\"\n data-standalone-agent-tool-tab={tab.panel}\n data-standalone-agent-tool-tab-id={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onOpenPanel(tab)}\n >\n {renderTabIcon?.(tab) ?? (\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-3.5 shrink-0\"\n panel={tab.panel}\n />\n )}\n <span className=\"truncate\">{label}</span>\n </button>\n <button\n aria-label={`${copy.close} ${label}`}\n className=\"nodrag mr-1 rounded p-0.5 opacity-100 hover:bg-[var(--transparency-block)] [-webkit-app-region:no-drag]\"\n type=\"button\"\n onClick={() => onClosePanel(tab.id)}\n >\n <CloseIcon aria-hidden className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction isAgentToolSidebarHeaderControl(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n target.closest(\n '.nodrag, button, a, input, textarea, select, option, [role=\"button\"], [role=\"menuitem\"], [contenteditable=\"true\"]'\n ) !== null\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { AgentToolPanelDefinition, AgentToolPanelId } from \"./model.ts\";\nimport { AgentToolPanelIcon } from \"./Toolbar.tsx\";\n\nexport function AgentToolSidebarPicker({\n panels,\n onSelect\n}: {\n panels: readonly AgentToolPanelDefinition[];\n onSelect: (panel: AgentToolPanelId) => void;\n}): ReactNode {\n return (\n <div\n className=\"flex h-full min-h-0 items-center justify-center overflow-auto px-6 py-10\"\n data-standalone-agent-tool-sidebar-picker=\"true\"\n >\n <div className=\"flex w-full max-w-[340px] flex-col gap-2\">\n {panels.map((panel) => (\n <Button\n className=\"h-12 w-full justify-start gap-2.5 rounded-lg border border-[var(--line-1)] bg-[var(--background-fronted)] px-2.5 text-left text-[14px] font-medium text-[var(--text-primary)] shadow-none hover:border-[var(--line-2)] hover:bg-[var(--transparency-hover)]\"\n key={panel.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onSelect(panel.id)}\n >\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-[7px] bg-[var(--transparency-block)] text-[var(--text-secondary)] group-hover/button:text-[var(--text-primary)]\">\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n </span>\n <span>{panel.label}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport {\n AddLinedIcon,\n Button,\n ChatIcon,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MaximizeIcon,\n NavApplicationsLinedIcon,\n PanelIcon,\n RestoreIcon,\n TaskIcon,\n TerminalLinedIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n WebIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n formatAgentToolReminderCount,\n type AgentToolPanelDefinition,\n type AgentToolPanelId\n} from \"./model.ts\";\n\nexport interface AgentToolSidebarCopy {\n close: string;\n closeRightPanel: string;\n expand: string;\n newTab: string;\n openRightPanel: string;\n resizeSidebar: string;\n shrink: string;\n tool: string;\n}\n\nexport type AgentToolSidebarReminderCounts = Partial<\n Record<AgentToolPanelId, number>\n>;\n\nconst iconByPanel = {\n apps: NavApplicationsLinedIcon,\n browser: WebIcon,\n files: FolderIcon,\n messages: ChatIcon,\n tasks: TaskIcon,\n terminal: TerminalLinedIcon\n} satisfies Record<AgentToolPanelId, ComponentType<IconProps>>;\n\nexport function AgentToolPanelIcon({\n panel,\n ...iconProps\n}: IconProps & { panel: AgentToolPanelId }): ReactNode {\n const Icon = iconByPanel[panel];\n return <Icon {...iconProps} />;\n}\n\nexport function AgentToolSidebarToolbar({\n activePanel,\n copy,\n isExpanded,\n isOpen,\n panels,\n quickActionPanels = [],\n reminders = {},\n onAddPanel,\n onOpenPanel,\n onToggleExpansion,\n onToggleSidebar\n}: {\n activePanel: AgentToolPanelId | null;\n copy: AgentToolSidebarCopy;\n isExpanded: boolean;\n isOpen: boolean;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n onAddPanel: (panel: AgentToolPanelId) => void;\n onOpenPanel: (panel: AgentToolPanelId) => void;\n onToggleExpansion: () => void;\n onToggleSidebar: () => void;\n}): ReactNode {\n const label = isOpen ? copy.closeRightPanel : copy.openRightPanel;\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const quickActions = quickActionPanels.filter((panel) =>\n labelByPanel.has(panel)\n );\n\n return (\n <TooltipProvider>\n <nav\n aria-label={copy.tool}\n className={cn(\n \"nodrag pointer-events-auto flex h-[var(--agent-gui-workbench-header-height,44px)] items-center gap-1 [-webkit-app-region:no-drag]\",\n activePanel === null && isOpen && \"ml-auto\"\n )}\n data-standalone-agent-tool-sidebar-toolbar=\"true\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {activePanel ? (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.newTab}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n >\n <AddLinedIcon aria-hidden className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-36\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {panels.map((panel) => (\n <DropdownMenuItem\n key={panel.id}\n onSelect={() => onAddPanel(panel.id)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n <span>{panel.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n {activePanel === null && !isOpen\n ? quickActions.map((panel) => (\n <ToolbarQuickActionTooltip\n key={panel}\n label={labelByPanel.get(panel) ?? panel}\n >\n <Button\n aria-label={labelByPanel.get(panel) ?? panel}\n aria-pressed={false}\n className=\"relative text-[var(--text-secondary)]\"\n data-standalone-agent-tool-sidebar-quick-action={panel}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => onOpenPanel(panel)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel}\n />\n <ReminderBadge count={reminders[panel]} />\n </Button>\n </ToolbarQuickActionTooltip>\n ))\n : null}\n {activePanel ? (\n <Button\n aria-label={`${isExpanded ? copy.shrink : copy.expand} ${labelByPanel.get(activePanel) ?? activePanel}`}\n aria-pressed={isExpanded}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={onToggleExpansion}\n >\n {isExpanded ? (\n <RestoreIcon aria-hidden className=\"size-3.5\" />\n ) : (\n <MaximizeIcon aria-hidden className=\"size-3.5\" />\n )}\n </Button>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n aria-pressed={isOpen}\n className=\"relative\"\n data-standalone-agent-tool-sidebar-toggle=\"true\"\n size=\"icon-sm\"\n type=\"button\"\n variant={isOpen && activePanel !== null ? \"secondary\" : \"chrome\"}\n onClick={onToggleSidebar}\n >\n <PanelIcon aria-hidden className=\"size-[18px] -scale-x-100\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </nav>\n </TooltipProvider>\n );\n}\n\nfunction ToolbarQuickActionTooltip({\n children,\n label\n}: {\n children: ReactNode;\n label: string;\n}): ReactNode {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ReminderBadge({ count }: { count?: number }): ReactNode {\n const label = formatAgentToolReminderCount(count);\n return label ? (\n <span className=\"absolute -top-1 -right-1 inline-flex min-w-4 items-center justify-center rounded-full bg-[var(--state-danger)] px-1 text-[9px] leading-4 font-semibold text-[var(--white-stationary)]\">\n {label}\n </span>\n ) : null;\n}\n","import {\n useCallback,\n useReducer,\n useRef,\n useState,\n type TransitionEvent\n} from \"react\";\nimport {\n agentToolEmptySidebarWidth,\n createAgentToolSidebarState,\n reduceAgentToolSidebarState,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { useAgentToolSidebarLayout } from \"./useAgentToolSidebarLayout.ts\";\n\nconst collapsedToolActionsWidthPx = 132;\n\nexport function useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n panels,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n}: {\n containerWidth: number;\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onLayoutWidthChange?: (width: number) => void;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}) {\n const panelIds = new Set(panels.map((panel) => panel.id));\n const [state, dispatch] = useReducer(\n reduceAgentToolSidebarState,\n undefined,\n createAgentToolSidebarState\n );\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const [isEmptySidebarClosing, setIsEmptySidebarClosing] = useState(false);\n const [contentReadyTabIds, setContentReadyTabIds] = useState<string[]>([]);\n const [toolActionsWidth, setToolActionsWidth] = useState(\n collapsedToolActionsWidthPx\n );\n const activePanel = state.activePanel;\n const activeTabId = state.activeTabId;\n const fallbackPanel = panels[0]?.id ?? null;\n const isEmptySidebar = isSidebarOpen && state.mountedTabs.length === 0;\n const isEmptySidebarSurface =\n (isSidebarOpen || isEmptySidebarClosing) && state.mountedTabs.length === 0;\n const layoutPanel =\n activePanel ?? (isEmptySidebarSurface ? fallbackPanel : null);\n const isActivePanelContentReady =\n activeTabId !== null && contentReadyTabIds.includes(activeTabId);\n const shouldAnimateSidebarLayout =\n state.mountedTabs.length === 0 || isActivePanelContentReady;\n const shouldAnimateSidebarWidth = isEmptySidebarSurface;\n const layout = useAgentToolSidebarLayout({\n activePanel: layoutPanel,\n activePanelPreferredWidth: isEmptySidebarSurface\n ? agentToolEmptySidebarWidth\n : undefined,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n });\n const resizeAnimationFrameRef = useRef<number | null>(null);\n const contentAnimationFrameIdsRef = useRef(new Set<number>());\n const toolActionsResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const scheduleResizeForPanel = useCallback(\n (\n panel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: { animateContainer?: boolean; preserveBaseline?: boolean }\n ) => {\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n }\n resizeAnimationFrameRef.current = window.requestAnimationFrame(() => {\n resizeAnimationFrameRef.current = null;\n void layout.resizeForPanel(panel, preferredWidth, options);\n });\n },\n [layout.resizeForPanel]\n );\n\n const showSidebar = useCallback(() => {\n setIsEmptySidebarClosing(false);\n setIsSidebarOpen(true);\n }, []);\n\n const markContentReady = useCallback((tabId: string) => {\n if (prefersReducedMotion()) {\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n return;\n }\n let completedSynchronously = false;\n let frameId = 0;\n frameId = window.requestAnimationFrame(() => {\n completedSynchronously = true;\n contentAnimationFrameIdsRef.current.delete(frameId);\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n });\n if (!completedSynchronously) {\n contentAnimationFrameIdsRef.current.add(frameId);\n }\n }, []);\n\n const closePanel = useCallback(() => {\n setIsSidebarOpen(false);\n dispatch({ type: \"close\" });\n onActivePanelChange?.(null);\n if (state.mountedTabs.length > 0 || prefersReducedMotion()) {\n setIsEmptySidebarClosing(false);\n scheduleResizeForPanel(null);\n return;\n }\n setIsEmptySidebarClosing(true);\n scheduleResizeForPanel(null, undefined, {\n animateContainer: true,\n preserveBaseline: true\n });\n }, [onActivePanelChange, scheduleResizeForPanel, state.mountedTabs.length]);\n\n const openPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = resolveToolTabId(state.mountedTabs, panel, resourceId);\n const action = { panel, resourceId, tabId, type: \"open-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n if (nextState.mountedTabs !== state.mountedTabs) {\n onTabsChange?.(nextState.mountedTabs);\n }\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const addPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = createToolTabId(panel);\n const action = { panel, resourceId, tabId, type: \"add-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const 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\" | \"ensure-panel\";\n }\n | { tabId: string; type: \"activate-tab\" | \"close-tab\" }\n | { type: \"close\" };\n\nexport function createAgentToolSidebarState(\n initial?: Partial<AgentToolSidebarState>\n): AgentToolSidebarState {\n const activePanel = initial?.activePanel ?? null;\n const mountedTabs = initial?.mountedTabs ?? [];\n const activeTabId =\n initial?.activeTabId ??\n (activePanel === null\n ? null\n : (findLastTab(mountedTabs, activePanel)?.id ?? null));\n return {\n activePanel: activeTabId === null ? null : activePanel,\n activeTabId,\n mountedTabs\n };\n}\n\nexport function reduceAgentToolSidebarState(\n state: AgentToolSidebarState,\n action: AgentToolSidebarAction\n): AgentToolSidebarState {\n switch (action.type) {\n case \"close\":\n return state.activeTabId === null\n ? state\n : { ...state, activePanel: null, activeTabId: null };\n case \"close-tab\": {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === action.tabId\n );\n if (closingIndex < 0) {\n return state;\n }\n const mountedTabs = state.mountedTabs.filter(\n (tab) => tab.id !== action.tabId\n );\n if (state.activeTabId !== action.tabId) {\n return { ...state, mountedTabs };\n }\n const nextTab =\n mountedTabs[Math.max(0, closingIndex - 1)] ?? mountedTabs[0] ?? null;\n return {\n activePanel: nextTab?.panel ?? null,\n activeTabId: nextTab?.id ?? null,\n mountedTabs\n };\n }\n case \"activate-tab\": {\n const tab = state.mountedTabs.find(\n (candidate) => candidate.id === action.tabId\n );\n return tab\n ? { ...state, activePanel: tab.panel, activeTabId: tab.id }\n : state;\n }\n case \"add-panel\":\n return addTab(state, action);\n case \"ensure-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing ? state : addTab(state, action, { activate: false });\n }\n case \"open-panel\": {\n const existing = findLastTab(\n state.mountedTabs,\n action.panel,\n action.resourceId\n );\n return existing\n ? { ...state, activePanel: existing.panel, activeTabId: existing.id }\n : addTab(state, action);\n }\n }\n}\n\nfunction addTab(\n state: AgentToolSidebarState,\n tab: {\n panel: AgentToolPanelId;\n resourceId?: string;\n tabId: string;\n },\n options: { activate?: boolean } = {}\n): AgentToolSidebarState {\n const nextTab: AgentToolTab = {\n id: tab.tabId,\n panel: tab.panel,\n ...(tab.resourceId ? { resourceId: tab.resourceId } : {})\n };\n const activate = options.activate !== false;\n return {\n activePanel: activate ? nextTab.panel : state.activePanel,\n activeTabId: activate ? nextTab.id : state.activeTabId,\n mountedTabs: state.mountedTabs.some(\n (candidate) => candidate.id === nextTab.id\n )\n ? state.mountedTabs\n : [...state.mountedTabs, nextTab]\n };\n}\n\nfunction findLastTab(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): AgentToolTab | null {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (tab?.panel === panel && (tab.resourceId ?? undefined) === resourceId) {\n return tab;\n }\n }\n return null;\n}\n\nexport function resolveAgentToolPanelExpansionReset(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n widthBeforeExpansion?: number;\n}): { panel: AgentToolPanelId; width: number } | null {\n if (input.expandedPanel === null || input.expandedPanel === input.nextPanel) {\n return null;\n }\n return {\n panel: input.expandedPanel,\n width:\n typeof input.widthBeforeExpansion === \"number\" &&\n Number.isFinite(input.widthBeforeExpansion)\n ? input.widthBeforeExpansion\n : agentToolPanelDefaultWidthById[input.expandedPanel]\n };\n}\n\nexport function resolveAgentToolPanelExpansionTransfer(input: {\n expandedPanel: AgentToolPanelId | null;\n nextPanel: AgentToolPanelId | null;\n nextPanelWidth: number;\n widthBeforeExpansion?: number;\n}): {\n expandedPanel: AgentToolPanelId;\n nextPanelWidthBeforeExpansion: number;\n previousPanel: AgentToolPanelId;\n previousPanelWidth: number;\n} | null {\n const reset = resolveAgentToolPanelExpansionReset(input);\n if (!reset || input.nextPanel === null) {\n return null;\n }\n return {\n expandedPanel: input.nextPanel,\n nextPanelWidthBeforeExpansion:\n Number.isFinite(input.nextPanelWidth) && input.nextPanelWidth > 0\n ? input.nextPanelWidth\n : agentToolPanelDefaultWidthById[input.nextPanel],\n previousPanel: reset.panel,\n previousPanelWidth: reset.width\n };\n}\n\nexport function resolveAgentToolPanelMaxWidth(\n panel: AgentToolPanelId,\n viewportWidth: number,\n allowFullWidth = false,\n mainContentMinWidth = agentToolMainMinWidth\n): number {\n const resolvedMainMin = Number.isFinite(mainContentMinWidth)\n ? Math.max(0, mainContentMinWidth)\n : agentToolMainMinWidth;\n const resolvedViewport = Number.isFinite(viewportWidth)\n ? viewportWidth\n : resolvedMainMin + agentToolPanelMinWidthById[panel];\n return Math.max(\n 0,\n Math.min(\n allowFullWidth\n ? Number.MAX_SAFE_INTEGER\n : agentToolPanelMaxWidthById[panel],\n resolvedViewport - resolvedMainMin\n )\n );\n}\n\nexport function clampAgentToolPanelWidth(input: {\n allowFullWidth?: boolean;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n viewportWidth: number;\n width: number;\n}): number {\n const maxWidth = resolveAgentToolPanelMaxWidth(\n input.panel,\n input.viewportWidth,\n input.allowFullWidth,\n input.mainContentMinWidth\n );\n const minWidth = Math.min(agentToolPanelMinWidthById[input.panel], maxWidth);\n const width = Number.isFinite(input.width)\n ? input.width\n : agentToolPanelDefaultWidthById[input.panel];\n return Math.round(Math.min(maxWidth, Math.max(minWidth, width)));\n}\n\nexport function resolveAgentToolSidebarWidth(input: {\n allowFullWidth?: boolean;\n baselineViewportWidth: number;\n mainContentMinWidth?: number;\n panel: AgentToolPanelId;\n preferredWidth: number;\n viewportWidth: number;\n}): number {\n const baseline = Number.isFinite(input.baselineViewportWidth)\n ? Math.max(0, input.baselineViewportWidth)\n : input.viewportWidth;\n return clampAgentToolPanelWidth({\n allowFullWidth: input.allowFullWidth,\n mainContentMinWidth: input.mainContentMinWidth,\n panel: input.panel,\n viewportWidth: input.viewportWidth,\n width: Math.max(input.preferredWidth, input.viewportWidth - baseline)\n });\n}\n\nexport function resolveAgentToolSidebarLayoutWidth(input: {\n baselineContainerWidth: number;\n panelWidth: number;\n containerWidth: number;\n}): number {\n return Math.round(Math.max(0, input.panelWidth));\n}\n\nexport function resolveAgentToolPanelPreferredWidth(input: {\n isExpanded: boolean;\n manuallyResizedWidth?: number | null;\n panelWidth: number;\n}): number {\n return !input.isExpanded &&\n typeof input.manuallyResizedWidth === \"number\" &&\n Number.isFinite(input.manuallyResizedWidth)\n ? input.manuallyResizedWidth\n : input.panelWidth;\n}\n\nexport function shouldResizeAgentToolContainer(input: {\n currentWidth: number;\n lastResize?: { actualWidth: number; requestedWidth: number } | null;\n requestedWidth: number;\n}): boolean {\n return (\n input.currentWidth !== input.requestedWidth &&\n !(\n input.lastResize?.requestedWidth === input.requestedWidth &&\n input.lastResize.actualWidth === input.currentWidth\n )\n );\n}\n\nexport function formatAgentToolReminderCount(\n value: number | null | undefined\n): string | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n const count = Math.floor(value);\n return count > 99 ? \"99+\" : String(count);\n}\n","import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\nimport {\n closeBrowserNodeTab,\n createBrowserNodeFeature,\n isBrowserNodeSurfaceEvent,\n type BrowserNodeChromeImportPromptAdapter,\n type BrowserNodeAutomationTargetMetadata,\n type BrowserNodeFeature,\n type BrowserNodeHostApi,\n type BrowserNodeSessionMode\n} from \"@tutti-os/browser-node\";\nimport type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\n\nconst LazyBrowserNode = lazy(() =>\n import(\"@tutti-os/browser-node/react\").then(({ BrowserNode }) => ({\n default: BrowserNode\n }))\n);\n\nexport const agentToolBrowserDefaultUrl = \"https://www.google.com/\";\n\nexport interface AgentToolBrowserPanelProps {\n automationTarget?: Omit<\n BrowserNodeAutomationTargetMetadata,\n \"focused\" | \"selected\" | \"surfaceId\" | \"tabId\"\n > | null;\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n defaultUrl?: string;\n hidden: boolean;\n i18n: I18nRuntime<string>;\n loadingFallback?: ReactNode;\n navigationActions?: ReactNode;\n nodeIdPrefix?: string;\n onControllerReady?: (controller: AgentToolBrowserController | null) => void;\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n sessionPartition?: string | null;\n}\n\nexport interface AgentToolBrowserController {\n closePage(nodeId: string): \"closed\" | \"last-page\" | \"not-found\";\n createPage(url?: string | null): string;\n ownsPage(nodeId: string): boolean;\n selectPage(nodeId: string): boolean;\n surfaceNodeId: string;\n}\n\nexport function AgentToolBrowserPanel({\n automationTarget = null,\n browserApi,\n chromeCookieImportPrompt,\n defaultUrl = agentToolBrowserDefaultUrl,\n hidden,\n i18n,\n loadingFallback = null,\n navigationActions,\n nodeIdPrefix = \"browser:agent-tool\",\n onControllerReady,\n profileId = null,\n sessionMode = \"shared\",\n sessionPartition = null\n}: AgentToolBrowserPanelProps): ReactNode {\n const [nodeId] = useState(() => createAgentToolBrowserNodeId(nodeIdPrefix));\n const feature = useMemo(\n () =>\n createAgentToolBrowserFeature({\n browserApi,\n ...(chromeCookieImportPrompt ? { chromeCookieImportPrompt } : {}),\n i18n,\n nodeId\n }),\n [browserApi, chromeCookieImportPrompt, i18n, nodeId]\n );\n const controller = useMemo<AgentToolBrowserController>(() => {\n const getPage = (pageNodeId: string) => {\n const state = feature.tabsStore.getSurfaceState(nodeId);\n const tab = state?.tabs.find(\n (candidate) => candidate.nodeId === pageNodeId\n );\n return state && tab ? { state, tab } : null;\n };\n return {\n closePage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return \"not-found\";\n if (page.state.tabs.length === 1) return \"last-page\";\n closeBrowserNodeTab(feature, nodeId, page.tab.id);\n return \"closed\";\n },\n createPage(url) {\n const resolvedUrl = url?.trim() || \"about:blank\";\n const state = feature.tabsStore.ensureSurface(nodeId, defaultUrl);\n const activeTab = state.tabs.find(\n (tab) => tab.id === state.activeTabId\n );\n const activeRuntime = activeTab\n ? feature.runtimeStore.getNodeState(activeTab.nodeId)\n : null;\n if (\n state.tabs.length === 1 &&\n activeTab?.defaultUrl === \"about:blank\" &&\n !activeRuntime?.url\n ) {\n feature.tabsStore.syncDefaultUrl(nodeId, resolvedUrl);\n return activeTab.nodeId;\n }\n return feature.tabsStore.addTab(nodeId, resolvedUrl).nodeId;\n },\n ownsPage: (pageNodeId) => getPage(pageNodeId) !== null,\n selectPage(pageNodeId) {\n const page = getPage(pageNodeId);\n if (!page) return false;\n feature.tabsStore.selectTab(nodeId, page.tab.id);\n return true;\n },\n surfaceNodeId: nodeId\n };\n }, [defaultUrl, feature, nodeId]);\n\n const bindController = useCallback(\n (node: HTMLDivElement | null) =>\n onControllerReady?.(node ? controller : null),\n [controller, onControllerReady]\n );\n\n return (\n <div\n className=\"relative h-full min-h-0 overflow-hidden\"\n data-agent-tool-browser-surface=\"true\"\n data-agent-tool-browser-surface-id={nodeId}\n ref={bindController}\n >\n <Suspense fallback={loadingFallback}>\n <LazyBrowserNode\n automationTarget={\n automationTarget ? { ...automationTarget, focused: !hidden } : null\n }\n defaultUrl={defaultUrl}\n feature={feature}\n hidden={hidden}\n navigationActions={navigationActions}\n nodeId={nodeId}\n profileId={profileId}\n sessionMode={sessionMode}\n sessionPartition={sessionPartition}\n syncDefaultUrl\n tabs\n />\n </Suspense>\n </div>\n );\n}\n\nexport function createAgentToolBrowserFeature(input: {\n browserApi: BrowserNodeHostApi;\n chromeCookieImportPrompt?: BrowserNodeChromeImportPromptAdapter;\n i18n: I18nRuntime<string>;\n nodeId: string;\n}): BrowserNodeFeature {\n return createBrowserNodeFeature({\n ...(input.chromeCookieImportPrompt\n ? { chromeCookieImportPrompt: input.chromeCookieImportPrompt }\n : {}),\n hostApi: createScopedAgentToolBrowserHostApi(\n input.browserApi,\n input.nodeId\n ),\n i18n: input.i18n,\n resolveSearchUrl: resolveAgentToolBrowserSearchUrl\n });\n}\n\nfunction createScopedAgentToolBrowserHostApi(\n browserApi: BrowserNodeHostApi,\n nodeId: string\n): BrowserNodeHostApi {\n return {\n ...browserApi,\n onEvent(listener) {\n return browserApi.onEvent((event) => {\n if (isBrowserNodeSurfaceEvent(nodeId, event)) {\n listener(event);\n }\n });\n }\n };\n}\n\nfunction resolveAgentToolBrowserSearchUrl(query: string): string {\n const searchUrl = new URL(\"https://www.google.com/search\");\n searchUrl.searchParams.set(\"q\", query);\n return searchUrl.toString();\n}\n\nfunction createAgentToolBrowserNodeId(prefix: string): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${prefix}:${instanceId}`;\n}\n","import {\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n type MouseEventHandler,\n type PointerEventHandler,\n type ReactNode\n} from \"react\";\nimport { CloseIcon, cn } from \"@tutti-os/ui-system\";\nimport {\n filterAgentToolPanels,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { AgentToolSidebarPicker } from \"./Picker.tsx\";\nimport {\n AgentToolPanelIcon,\n AgentToolSidebarToolbar,\n type AgentToolSidebarCopy,\n type AgentToolSidebarReminderCounts\n} from \"./Toolbar.tsx\";\nimport { useAgentToolSidebarController } from \"./useAgentToolSidebarController.ts\";\n\nexport interface AgentToolSidebarHandle {\n addPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n close(): void;\n closeTab(tabId: string): void;\n ensurePanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n openPanel(panel: AgentToolPanelId, resourceId?: string): string | null;\n}\n\nexport type AgentToolSidebarHeaderDrag =\n | { mode?: \"native-window\" }\n | {\n mode: \"host\";\n onDoubleClick?: MouseEventHandler<HTMLDivElement>;\n onPointerDown?: PointerEventHandler<HTMLDivElement>;\n };\n\nexport interface AgentToolSidebarProps {\n children: ReactNode;\n containerWidth: number;\n copy: AgentToolSidebarCopy;\n headerDrag?: AgentToolSidebarHeaderDrag;\n headerPlacement?: \"inline\" | \"external\" | \"panel\";\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n renderHeader: (toolActions: ReactNode) => ReactNode;\n renderLoading?: (tab: AgentToolTab) => ReactNode;\n renderPanel: (input: {\n active: boolean;\n closeSidebar: () => void;\n tab: AgentToolTab;\n }) => ReactNode;\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onLayoutWidthChange?: (width: number) => void;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}\n\nexport const AgentToolSidebar = forwardRef<\n AgentToolSidebarHandle,\n AgentToolSidebarProps\n>(function AgentToolSidebar(\n {\n children,\n containerWidth,\n copy,\n headerDrag,\n headerPlacement = \"inline\",\n mainContentMinWidthPx,\n panels: unfilteredPanels,\n quickActionPanels,\n reminders,\n renderHeader,\n renderLoading,\n renderPanel,\n renderTabIcon,\n resolveTabLabel,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n },\n ref\n): ReactNode {\n const panels = filterAgentToolPanels(unfilteredPanels);\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n measureToolActions,\n mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n stopResizing,\n toolActionsWidth,\n toggleSidebar,\n togglePanelExpansion\n } = useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabClose,\n onTabsChange,\n panels,\n resizeContainerContentWidth\n });\n\n useImperativeHandle(\n ref,\n () => ({\n addPanel,\n close: closePanel,\n closeTab: closePanelTab,\n ensurePanel,\n openPanel\n }),\n [addPanel, closePanel, closePanelTab, ensurePanel, openPanel]\n );\n\n const isHostHeaderDrag = headerDrag?.mode === \"host\";\n const handleHeaderDoubleClick: MouseEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onDoubleClick?.(event);\n }\n };\n const handleHeaderPointerDown: PointerEventHandler<HTMLDivElement> = (\n event\n ) => {\n if (isAgentToolSidebarHeaderControl(event.target)) {\n event.stopPropagation();\n return;\n }\n if (headerDrag?.mode === \"host\") {\n event.stopPropagation();\n headerDrag.onPointerDown?.(event);\n }\n };\n\n const toolActions = (\n <div\n className={cn(\n \"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 max-w-full shrink-0 cursor-grab items-center pr-[var(--agent-gui-workbench-header-padding-x)] active:cursor-grabbing\",\n isHostHeaderDrag\n ? \"[-webkit-app-region:no-drag]\"\n : \"[-webkit-app-region:drag]\",\n isSidebarOpen && \"border-b border-[var(--border-1)]\"\n )}\n data-standalone-agent-tool-sidebar-drag-region=\"true\"\n data-standalone-agent-tool-sidebar-header=\"true\"\n ref={measureToolActions}\n style={\n isSidebarOpen\n ? { width: `${activePanelWidth}px`, maxWidth: \"100%\" }\n : undefined\n }\n onDoubleClick={isHostHeaderDrag ? handleHeaderDoubleClick : undefined}\n onPointerDown={isHostHeaderDrag ? handleHeaderPointerDown : undefined}\n >\n {activeTabId ? (\n <ToolSidebarTabBar\n activeTabId={activeTabId}\n copy={copy}\n labelByPanel={labelByPanel}\n mountedTabs={mountedTabs}\n renderTabIcon={renderTabIcon}\n resolveTabLabel={resolveTabLabel}\n onClosePanel={closePanelTab}\n onOpenPanel={activatePanelTab}\n />\n ) : null}\n <AgentToolSidebarToolbar\n activePanel={activePanel}\n copy={copy}\n isExpanded={isActivePanelExpanded}\n isOpen={isSidebarOpen}\n panels={panels}\n quickActionPanels={quickActionPanels}\n reminders={reminders}\n onAddPanel={addPanel}\n onOpenPanel={openPanel}\n onToggleExpansion={() => {\n if (activePanel) togglePanelExpansion(activePanel);\n }}\n onToggleSidebar={toggleSidebar}\n />\n </div>\n );\n\n return (\n <>\n {headerPlacement === \"external\" || headerPlacement === \"panel\" ? (\n renderHeader(\n headerPlacement === \"panel\" && isSidebarOpen ? null : toolActions\n )\n ) : (\n <div\n className=\"workbench-window__header workbench-window__header--custom\"\n style={\n {\n \"--agent-gui-tool-sidebar-layout-width\": isSidebarOpen\n ? `${activePanelLayoutWidth}px`\n : `${toolActionsWidth}px`\n } as CSSProperties\n }\n >\n {renderHeader(toolActions)}\n </div>\n )}\n <div\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\",\n headerPlacement === \"inline\" && \"workbench-window__body\"\n )}\n ref={bindLifecycle}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n <div className=\"h-full min-w-0 flex-1 overflow-hidden\">\n {children}\n </div>\n <aside\n aria-hidden={!isSidebarOpen}\n className={cn(\n \"relative h-full min-h-0 shrink-0 overflow-hidden [contain:layout_paint]\",\n shouldAnimateSidebarWidth &&\n \"motion-safe:transition-[width] motion-safe:duration-[260ms] motion-safe:ease-in-out motion-reduce:transition-none\",\n isActivePanelExpanded && \"border-l border-[var(--line-1)]\",\n !isSidebarOpen && \"pointer-events-none\"\n )}\n data-standalone-agent-tool-sidebar=\"true\"\n ref={bindLayoutWidthProjection}\n style={{\n width: isSidebarOpen ? `${activePanelLayoutWidth}px` : \"0px\",\n zIndex: \"var(--z-panel)\"\n }}\n onTransitionEnd={handleSidebarTransitionEnd}\n >\n <div\n className={cn(\n \"absolute inset-y-0 right-0 flex flex-col bg-[var(--background-session-sidepanel)]\",\n isSidebarOpen &&\n !shouldAnimateSidebarLayout &&\n \"motion-safe:animate-in motion-safe:slide-in-from-right-3 motion-safe:duration-[160ms] motion-safe:ease-out motion-reduce:animate-none\",\n !isSidebarOpen && !isEmptySidebarClosing && \"invisible\"\n )}\n style={\n {\n \"--background-panel\": \"var(--background-session-sidepanel)\",\n width: `${activePanelWidth}px`\n } as CSSProperties\n }\n >\n {isSidebarOpen && !isEmptySidebar ? (\n <div\n aria-label={copy.resizeSidebar}\n aria-orientation=\"vertical\"\n aria-valuemax={activePanelMaxWidth}\n aria-valuemin={activePanelMinWidth}\n aria-valuenow={activePanelWidth}\n className=\"absolute top-0 left-0 z-20 h-full w-2 cursor-col-resize touch-none outline-none before:absolute before:left-0 before:h-full before:w-px before:bg-transparent hover:before:bg-[var(--border-focus)] focus-visible:before:bg-[var(--border-focus)]\"\n data-standalone-agent-tool-sidebar-resize-handle=\"true\"\n role=\"separator\"\n tabIndex={0}\n onKeyDown={handleResizeKeyDown}\n onLostPointerCapture={stopResizing}\n onPointerDown={handleResizePointerDown}\n onPointerMove={handleResizePointerMove}\n onPointerUp={stopResizing}\n />\n ) : null}\n {isSidebarOpen && headerPlacement === \"panel\"\n ? toolActions\n : null}\n {isSidebarOpen && headerPlacement === \"inline\" ? (\n <div\n aria-hidden\n className=\"shrink-0\"\n data-standalone-agent-tool-sidebar-header-spacer=\"true\"\n style={{\n height: \"var(--agent-gui-workbench-header-height, 44px)\"\n }}\n />\n ) : null}\n <div className=\"relative min-h-0 flex-1 overflow-hidden\">\n {isEmptySidebar || isEmptySidebarClosing ? (\n <AgentToolSidebarPicker\n panels={panels}\n onSelect={openPanel}\n />\n ) : null}\n {mountedTabs.map((tab) => (\n <div\n aria-hidden={activeTabId !== tab.id}\n className={cn(\n \"absolute inset-0 min-h-0 overflow-hidden\",\n activeTabId !== tab.id && \"invisible pointer-events-none\"\n )}\n key={tab.id}\n >\n {contentReadyTabIds.includes(tab.id) ? (\n <div\n className={cn(\n \"h-full min-h-0\",\n tab.panel !== \"terminal\" &&\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-150 motion-reduce:animate-none\"\n )}\n >\n {renderPanel({\n active: activeTabId === tab.id,\n closeSidebar: closePanel,\n tab\n })}\n </div>\n ) : activeTabId === tab.id ? (\n (renderLoading?.(tab) ?? null)\n ) : null}\n </div>\n ))}\n </div>\n </div>\n </aside>\n </div>\n </div>\n </>\n );\n});\n\nfunction ToolSidebarTabBar({\n activeTabId,\n copy,\n labelByPanel,\n mountedTabs,\n renderTabIcon,\n resolveTabLabel,\n onClosePanel,\n onOpenPanel\n}: {\n activeTabId: string;\n copy: AgentToolSidebarCopy;\n labelByPanel: ReadonlyMap<AgentToolPanelId, string>;\n mountedTabs: readonly AgentToolTab[];\n renderTabIcon?: (tab: AgentToolTab) => ReactNode;\n resolveTabLabel?: (tab: AgentToolTab, defaultLabel: string) => string;\n onClosePanel: (tabId: string) => void;\n onOpenPanel: (tab: AgentToolTab) => void;\n}): ReactNode {\n return (\n <div\n aria-label={copy.tool}\n className=\"flex h-[var(--agent-gui-workbench-header-height,44px)] min-w-0 flex-1 cursor-grab items-center gap-1 overflow-hidden px-2 active:cursor-grabbing\"\n data-standalone-agent-tool-tab-list=\"true\"\n role=\"tablist\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-1 overflow-x-auto\">\n {mountedTabs.map((tab) => {\n const defaultLabel = labelByPanel.get(tab.panel) ?? tab.panel;\n const label = resolveTabLabel?.(tab, defaultLabel) ?? defaultLabel;\n return (\n <div\n className={cn(\n \"group flex h-7 max-w-44 shrink-0 items-center rounded-sm overflow-hidden border text-xs text-[var(--text-tertiary)]\",\n activeTabId === tab.id\n ? \"border-[var(--line-2)] bg-[var(--background-fronted)] text-[var(--text-primary)]\"\n : \"border-transparent\"\n )}\n key={tab.id}\n >\n <button\n aria-selected={activeTabId === tab.id}\n className=\"nodrag flex h-full min-w-0 flex-1 items-center gap-1.5 overflow-hidden px-2 text-left outline-none [-webkit-app-region:no-drag] focus-visible:ring-2 focus-visible:ring-[var(--border-focus)]\"\n data-standalone-agent-tool-tab={tab.panel}\n data-standalone-agent-tool-tab-id={tab.id}\n role=\"tab\"\n type=\"button\"\n onClick={() => onOpenPanel(tab)}\n >\n {renderTabIcon?.(tab) ?? (\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-3.5 shrink-0\"\n panel={tab.panel}\n />\n )}\n <span className=\"truncate\">{label}</span>\n </button>\n <button\n aria-label={`${copy.close} ${label}`}\n className=\"nodrag mr-1 rounded p-0.5 opacity-100 hover:bg-[var(--transparency-block)] [-webkit-app-region:no-drag]\"\n type=\"button\"\n onClick={() => onClosePanel(tab.id)}\n >\n <CloseIcon aria-hidden className=\"size-3\" />\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction isAgentToolSidebarHeaderControl(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n target.closest(\n '.nodrag, button, a, input, textarea, select, option, [role=\"button\"], [role=\"menuitem\"], [contenteditable=\"true\"]'\n ) !== null\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { AgentToolPanelDefinition, AgentToolPanelId } from \"./model.ts\";\nimport { AgentToolPanelIcon } from \"./Toolbar.tsx\";\n\nexport function AgentToolSidebarPicker({\n panels,\n onSelect\n}: {\n panels: readonly AgentToolPanelDefinition[];\n onSelect: (panel: AgentToolPanelId) => void;\n}): ReactNode {\n return (\n <div\n className=\"flex h-full min-h-0 items-center justify-center overflow-auto px-6 py-10\"\n data-standalone-agent-tool-sidebar-picker=\"true\"\n >\n <div className=\"flex w-full max-w-[340px] flex-col gap-2\">\n {panels.map((panel) => (\n <Button\n className=\"h-12 w-full justify-start gap-2.5 rounded-lg border border-[var(--line-1)] bg-[var(--background-fronted)] px-2.5 text-left text-[14px] font-medium text-[var(--text-primary)] shadow-none hover:border-[var(--line-2)] hover:bg-[var(--transparency-hover)]\"\n key={panel.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onSelect(panel.id)}\n >\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-[7px] bg-[var(--transparency-block)] text-[var(--text-secondary)] group-hover/button:text-[var(--text-primary)]\">\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n </span>\n <span>{panel.label}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport {\n AddLinedIcon,\n Button,\n ChatIcon,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n FolderIcon,\n MaximizeIcon,\n NavApplicationsLinedIcon,\n PanelIcon,\n RestoreIcon,\n TaskIcon,\n TerminalLinedIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n WebIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n formatAgentToolReminderCount,\n type AgentToolPanelDefinition,\n type AgentToolPanelId\n} from \"./model.ts\";\n\nexport interface AgentToolSidebarCopy {\n close: string;\n closeRightPanel: string;\n expand: string;\n newTab: string;\n openRightPanel: string;\n resizeSidebar: string;\n shrink: string;\n tool: string;\n}\n\nexport type AgentToolSidebarReminderCounts = Partial<\n Record<AgentToolPanelId, number>\n>;\n\nconst iconByPanel = {\n apps: NavApplicationsLinedIcon,\n browser: WebIcon,\n files: FolderIcon,\n messages: ChatIcon,\n tasks: TaskIcon,\n terminal: TerminalLinedIcon\n} satisfies Record<AgentToolPanelId, ComponentType<IconProps>>;\n\nexport function AgentToolPanelIcon({\n panel,\n ...iconProps\n}: IconProps & { panel: AgentToolPanelId }): ReactNode {\n const Icon = iconByPanel[panel];\n return <Icon {...iconProps} />;\n}\n\nexport function AgentToolSidebarToolbar({\n activePanel,\n copy,\n isExpanded,\n isOpen,\n panels,\n quickActionPanels = [],\n reminders = {},\n onAddPanel,\n onOpenPanel,\n onToggleExpansion,\n onToggleSidebar\n}: {\n activePanel: AgentToolPanelId | null;\n copy: AgentToolSidebarCopy;\n isExpanded: boolean;\n isOpen: boolean;\n panels: readonly AgentToolPanelDefinition[];\n quickActionPanels?: readonly AgentToolPanelId[];\n reminders?: AgentToolSidebarReminderCounts;\n onAddPanel: (panel: AgentToolPanelId) => void;\n onOpenPanel: (panel: AgentToolPanelId) => void;\n onToggleExpansion: () => void;\n onToggleSidebar: () => void;\n}): ReactNode {\n const label = isOpen ? copy.closeRightPanel : copy.openRightPanel;\n const labelByPanel = new Map(panels.map((panel) => [panel.id, panel.label]));\n const quickActions = quickActionPanels.filter((panel) =>\n labelByPanel.has(panel)\n );\n\n return (\n <TooltipProvider>\n <nav\n aria-label={copy.tool}\n className={cn(\n \"nodrag pointer-events-auto flex h-[var(--agent-gui-workbench-header-height,44px)] items-center gap-1 [-webkit-app-region:no-drag]\",\n activePanel === null && isOpen && \"ml-auto\"\n )}\n data-standalone-agent-tool-sidebar-toolbar=\"true\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {activePanel ? (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.newTab}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n >\n <AddLinedIcon aria-hidden className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"min-w-36\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {panels.map((panel) => (\n <DropdownMenuItem\n key={panel.id}\n onSelect={() => onAddPanel(panel.id)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel.id}\n />\n <span>{panel.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n {activePanel === null && !isOpen\n ? quickActions.map((panel) => (\n <ToolbarQuickActionTooltip\n key={panel}\n label={labelByPanel.get(panel) ?? panel}\n >\n <Button\n aria-label={labelByPanel.get(panel) ?? panel}\n aria-pressed={false}\n className=\"relative text-[var(--text-secondary)]\"\n data-standalone-agent-tool-sidebar-quick-action={panel}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => onOpenPanel(panel)}\n >\n <AgentToolPanelIcon\n aria-hidden\n className=\"size-4\"\n panel={panel}\n />\n <ReminderBadge count={reminders[panel]} />\n </Button>\n </ToolbarQuickActionTooltip>\n ))\n : null}\n {activePanel ? (\n <Button\n aria-label={`${isExpanded ? copy.shrink : copy.expand} ${labelByPanel.get(activePanel) ?? activePanel}`}\n aria-pressed={isExpanded}\n className=\"text-[var(--text-secondary)]\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={onToggleExpansion}\n >\n {isExpanded ? (\n <RestoreIcon aria-hidden className=\"size-3.5\" />\n ) : (\n <MaximizeIcon aria-hidden className=\"size-3.5\" />\n )}\n </Button>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n aria-pressed={isOpen}\n className=\"relative\"\n data-standalone-agent-tool-sidebar-toggle=\"true\"\n size=\"icon-sm\"\n type=\"button\"\n variant={isOpen && activePanel !== null ? \"secondary\" : \"chrome\"}\n onClick={onToggleSidebar}\n >\n <PanelIcon aria-hidden className=\"size-[18px] -scale-x-100\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </nav>\n </TooltipProvider>\n );\n}\n\nfunction ToolbarQuickActionTooltip({\n children,\n label\n}: {\n children: ReactNode;\n label: string;\n}): ReactNode {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ReminderBadge({ count }: { count?: number }): ReactNode {\n const label = formatAgentToolReminderCount(count);\n return label ? (\n <span className=\"absolute -top-1 -right-1 inline-flex min-w-4 items-center justify-center rounded-full bg-[var(--state-danger)] px-1 text-[9px] leading-4 font-semibold text-[var(--white-stationary)]\">\n {label}\n </span>\n ) : null;\n}\n","import {\n useCallback,\n useReducer,\n useRef,\n useState,\n type TransitionEvent\n} from \"react\";\nimport {\n agentToolEmptySidebarWidth,\n createAgentToolSidebarState,\n reduceAgentToolSidebarState,\n type AgentToolPanelDefinition,\n type AgentToolPanelId,\n type AgentToolTab\n} from \"./model.ts\";\nimport { useAgentToolSidebarLayout } from \"./useAgentToolSidebarLayout.ts\";\n\nconst collapsedToolActionsWidthPx = 132;\n\nexport function useAgentToolSidebarController({\n containerWidth,\n mainContentMinWidthPx,\n panels,\n resizeContainerContentWidth,\n onActivePanelChange,\n onLayoutWidthChange,\n onPanelOpen,\n onTabsChange,\n onTabClose\n}: {\n containerWidth: number;\n mainContentMinWidthPx?: number;\n panels: readonly AgentToolPanelDefinition[];\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n onActivePanelChange?: (panel: AgentToolPanelId | null) => void;\n onLayoutWidthChange?: (width: number) => void;\n onPanelOpen?: (panel: AgentToolPanelId, resourceId?: string) => void;\n onTabsChange?: (tabs: readonly AgentToolTab[]) => void;\n onTabClose?: (tab: AgentToolTab) => void;\n}) {\n const panelIds = new Set(panels.map((panel) => panel.id));\n const [state, dispatch] = useReducer(\n reduceAgentToolSidebarState,\n undefined,\n createAgentToolSidebarState\n );\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const [isEmptySidebarClosing, setIsEmptySidebarClosing] = useState(false);\n const [contentReadyTabIds, setContentReadyTabIds] = useState<string[]>([]);\n const [toolActionsWidth, setToolActionsWidth] = useState(\n collapsedToolActionsWidthPx\n );\n const activePanel = state.activePanel;\n const activeTabId = state.activeTabId;\n const fallbackPanel = panels[0]?.id ?? null;\n const isEmptySidebar = isSidebarOpen && state.mountedTabs.length === 0;\n const isEmptySidebarSurface =\n (isSidebarOpen || isEmptySidebarClosing) && state.mountedTabs.length === 0;\n const layoutPanel =\n activePanel ?? (isEmptySidebarSurface ? fallbackPanel : null);\n const isActivePanelContentReady =\n activeTabId !== null && contentReadyTabIds.includes(activeTabId);\n const shouldAnimateSidebarLayout =\n state.mountedTabs.length === 0 || isActivePanelContentReady;\n const shouldAnimateSidebarWidth = isEmptySidebarSurface;\n const layout = useAgentToolSidebarLayout({\n activePanel: layoutPanel,\n activePanelPreferredWidth: isEmptySidebarSurface\n ? agentToolEmptySidebarWidth\n : undefined,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n });\n const resizeAnimationFrameRef = useRef<number | null>(null);\n const contentAnimationFrameIdsRef = useRef(new Set<number>());\n const toolActionsResizeObserverRef = useRef<ResizeObserver | null>(null);\n\n const scheduleResizeForPanel = useCallback(\n (\n panel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: { animateContainer?: boolean; preserveBaseline?: boolean }\n ) => {\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n }\n resizeAnimationFrameRef.current = window.requestAnimationFrame(() => {\n resizeAnimationFrameRef.current = null;\n void layout.resizeForPanel(panel, preferredWidth, options);\n });\n },\n [layout.resizeForPanel]\n );\n\n const showSidebar = useCallback(() => {\n setIsEmptySidebarClosing(false);\n setIsSidebarOpen(true);\n }, []);\n\n const markContentReady = useCallback((tabId: string) => {\n if (prefersReducedMotion()) {\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n return;\n }\n let completedSynchronously = false;\n let frameId = 0;\n frameId = window.requestAnimationFrame(() => {\n completedSynchronously = true;\n contentAnimationFrameIdsRef.current.delete(frameId);\n setContentReadyTabIds((current) =>\n current.includes(tabId) ? current : [...current, tabId]\n );\n });\n if (!completedSynchronously) {\n contentAnimationFrameIdsRef.current.add(frameId);\n }\n }, []);\n\n const closePanel = useCallback(() => {\n setIsSidebarOpen(false);\n dispatch({ type: \"close\" });\n onActivePanelChange?.(null);\n if (state.mountedTabs.length > 0 || prefersReducedMotion()) {\n setIsEmptySidebarClosing(false);\n scheduleResizeForPanel(null);\n return;\n }\n setIsEmptySidebarClosing(true);\n scheduleResizeForPanel(null, undefined, {\n animateContainer: true,\n preserveBaseline: true\n });\n }, [onActivePanelChange, scheduleResizeForPanel, state.mountedTabs.length]);\n\n const openPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = resolveToolTabId(state.mountedTabs, panel, resourceId);\n const action = { panel, resourceId, tabId, type: \"open-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n if (nextState.mountedTabs !== state.mountedTabs) {\n onTabsChange?.(nextState.mountedTabs);\n }\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const addPanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n showSidebar();\n onPanelOpen?.(panel, resourceId);\n const tabId = createToolTabId(panel);\n const action = { panel, resourceId, tabId, type: \"add-panel\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onActivePanelChange?.(panel);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n scheduleResizeForPanel(panel);\n return tabId;\n },\n [\n markContentReady,\n onActivePanelChange,\n onPanelOpen,\n onTabsChange,\n panelIds,\n scheduleResizeForPanel,\n showSidebar,\n state\n ]\n );\n\n const ensurePanel = useCallback(\n (panel: AgentToolPanelId, resourceId?: string) => {\n if (!panelIds.has(panel)) return null;\n const existing = state.mountedTabs.find(\n (tab) =>\n tab.panel === panel && (tab.resourceId ?? undefined) === resourceId\n );\n if (existing) return existing.id;\n const tabId = createToolTabId(panel);\n const action = {\n panel,\n resourceId,\n tabId,\n type: \"ensure-panel\"\n } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n dispatch(action);\n onTabsChange?.(nextState.mountedTabs);\n markContentReady(tabId);\n return tabId;\n },\n [markContentReady, onTabsChange, panelIds, state]\n );\n\n const closePanelTab = useCallback(\n (tabId: string) => {\n const closingIndex = state.mountedTabs.findIndex(\n (tab) => tab.id === tabId\n );\n const closingTab = state.mountedTabs[closingIndex];\n if (!closingTab) return;\n const action = { tabId, type: \"close-tab\" } as const;\n const nextState = reduceAgentToolSidebarState(state, action);\n setIsSidebarOpen(true);\n dispatch(action);\n onTabClose?.(closingTab);\n onActivePanelChange?.(nextState.activePanel);\n onTabsChange?.(nextState.mountedTabs);\n if (nextState.activePanel === null) {\n if (fallbackPanel) {\n scheduleResizeForPanel(fallbackPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n }\n return;\n }\n scheduleResizeForPanel(nextState.activePanel);\n },\n [\n fallbackPanel,\n onActivePanelChange,\n onTabClose,\n onTabsChange,\n scheduleResizeForPanel,\n state\n ]\n );\n\n const activatePanelTab = useCallback(\n (tab: AgentToolTab) => {\n onPanelOpen?.(tab.panel, tab.resourceId);\n dispatch({ tabId: tab.id, type: \"activate-tab\" });\n onActivePanelChange?.(tab.panel);\n markContentReady(tab.id);\n scheduleResizeForPanel(tab.panel);\n },\n [markContentReady, onActivePanelChange, onPanelOpen, scheduleResizeForPanel]\n );\n\n const toggleSidebar = useCallback(() => {\n const nextPanel = activePanel ?? fallbackPanel;\n if (isSidebarOpen) {\n closePanel();\n return;\n }\n if (!nextPanel) return;\n showSidebar();\n if (state.mountedTabs.length === 0) {\n scheduleResizeForPanel(nextPanel, agentToolEmptySidebarWidth, {\n animateContainer: !prefersReducedMotion()\n });\n return;\n }\n const tabId = resolveToolTabId(state.mountedTabs, nextPanel);\n dispatch({ panel: nextPanel, tabId, type: \"open-panel\" });\n onActivePanelChange?.(nextPanel);\n markContentReady(tabId);\n scheduleResizeForPanel(nextPanel);\n }, [\n activePanel,\n closePanel,\n fallbackPanel,\n isSidebarOpen,\n markContentReady,\n onActivePanelChange,\n scheduleResizeForPanel,\n showSidebar,\n state.mountedTabs\n ]);\n\n const handleSidebarTransitionEnd = useCallback(\n (event: TransitionEvent<HTMLElement>) => {\n if (\n event.currentTarget !== event.target ||\n event.propertyName !== \"width\" ||\n isSidebarOpen ||\n !isEmptySidebarClosing\n ) {\n return;\n }\n setIsEmptySidebarClosing(false);\n layout.resetContainerResizeBaseline();\n },\n [isEmptySidebarClosing, isSidebarOpen, layout.resetContainerResizeBaseline]\n );\n\n const bindLayoutWidthProjection = useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n onLayoutWidthChange?.(\n isSidebarOpen ? layout.activePanelLayoutWidth : 0\n );\n }\n },\n [isSidebarOpen, layout.activePanelLayoutWidth, onLayoutWidthChange]\n );\n\n const bindLifecycle = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) return;\n if (resizeAnimationFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeAnimationFrameRef.current);\n resizeAnimationFrameRef.current = null;\n }\n for (const frameId of contentAnimationFrameIdsRef.current) {\n window.cancelAnimationFrame(frameId);\n }\n contentAnimationFrameIdsRef.current.clear();\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n layout.bindLayoutRoot(null);\n },\n [layout.bindLayoutRoot]\n );\n\n const measureToolActions = useCallback((node: HTMLDivElement | null) => {\n toolActionsResizeObserverRef.current?.disconnect();\n toolActionsResizeObserverRef.current = null;\n if (!node) return;\n const measure = (): void => {\n const width = Math.ceil(node.getBoundingClientRect().width);\n if (width > 0) setToolActionsWidth(width);\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n toolActionsResizeObserverRef.current = observer;\n }, []);\n\n return {\n ...layout,\n activePanel,\n activeTabId,\n activatePanelTab,\n addPanel,\n bindLayoutWidthProjection,\n bindLifecycle,\n closePanel,\n closePanelTab,\n contentReadyTabIds,\n ensurePanel,\n handleSidebarTransitionEnd,\n isEmptySidebar,\n isEmptySidebarClosing,\n isSidebarOpen,\n markContentReady,\n measureToolActions,\n mountedTabs: state.mountedTabs,\n openPanel,\n shouldAnimateSidebarLayout,\n shouldAnimateSidebarWidth,\n toolActionsWidth,\n toggleSidebar\n };\n}\n\nfunction resolveToolTabId(\n tabs: readonly AgentToolTab[],\n panel: AgentToolPanelId,\n resourceId?: string\n): string {\n for (let index = tabs.length - 1; index >= 0; index -= 1) {\n const tab = tabs[index];\n if (\n tab?.panel === panel &&\n (resourceId === undefined || tab.resourceId === resourceId)\n ) {\n return tab.id;\n }\n }\n return createToolTabId(panel);\n}\n\nfunction createToolTabId(panel: AgentToolPanelId): string {\n const instanceId =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return `${panel}:${instanceId}`;\n}\n\nfunction prefersReducedMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent\n} from \"react\";\nimport {\n agentToolPanelDefaultWidthById,\n agentToolPanelMinWidthById,\n clampAgentToolPanelWidth,\n resolveAgentToolPanelExpansionReset,\n resolveAgentToolPanelExpansionTransfer,\n resolveAgentToolPanelMaxWidth,\n resolveAgentToolPanelPreferredWidth,\n resolveAgentToolSidebarLayoutWidth,\n resolveAgentToolSidebarWidth,\n shouldResizeAgentToolContainer,\n type AgentToolPanelId\n} from \"./model.ts\";\n\ntype ToolPanelWidths = Record<AgentToolPanelId, number>;\n\ninterface ToolPanelResizeState {\n panel: AgentToolPanelId;\n pointerId: number;\n startClientX: number;\n startWidth: number;\n}\n\nexport interface ResizeForPanelOptions {\n animateContainer?: boolean;\n preserveBaseline?: boolean;\n}\n\nexport function useAgentToolSidebarLayout({\n activePanel,\n activePanelPreferredWidth,\n containerWidth,\n mainContentMinWidthPx,\n resizeContainerContentWidth\n}: {\n activePanel: AgentToolPanelId | null;\n activePanelPreferredWidth?: number;\n containerWidth: number;\n mainContentMinWidthPx?: number;\n resizeContainerContentWidth(\n width: number,\n animate?: boolean\n ): Promise<{ width: number }>;\n}) {\n const [containerResolution, setContainerResolution] = useState(() => ({\n resolved: containerWidth,\n source: containerWidth\n }));\n if (containerResolution.source !== containerWidth) {\n setContainerResolution({\n resolved: containerWidth,\n source: containerWidth\n });\n }\n const resolvedContainerWidth = containerResolution.resolved;\n const [panelWidths, setPanelWidths] = useState<ToolPanelWidths>(() => ({\n ...agentToolPanelDefaultWidthById\n }));\n const [manuallyResizedWidth, setManuallyResizedWidth] = useState<\n number | null\n >(null);\n const [expandedPanel, setExpandedPanel] = useState<AgentToolPanelId | null>(\n null\n );\n const expandedPanelRef = useRef<AgentToolPanelId | null>(null);\n const baselineContainerWidthRef = useRef<number | null>(null);\n const panelWidthBeforeExpandRef = useRef<Partial<ToolPanelWidths>>({});\n const resizeRequestRef = useRef(0);\n const lastContainerResizeRef = useRef<{\n actualWidth: number;\n requestedWidth: number;\n } | null>(null);\n const dragRef = useRef<ToolPanelResizeState | null>(null);\n const resizeStyleRef = useRef<{ cursor: string; userSelect: string } | null>(\n null\n );\n\n const isActivePanelExpanded =\n activePanel !== null && expandedPanel === activePanel;\n const activePanelMaxWidth = activePanel\n ? resolveAgentToolPanelMaxWidth(\n activePanel,\n resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx\n )\n : 0;\n const activePanelMinWidth = activePanel\n ? Math.min(agentToolPanelMinWidthById[activePanel], activePanelMaxWidth)\n : 0;\n const activePanelWidth = activePanel\n ? resolveActivePanelWidth({\n activePanel,\n activePanelMaxWidth,\n activePanelPreferredWidth,\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n isActivePanelExpanded,\n mainContentMinWidthPx,\n panelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: isActivePanelExpanded,\n manuallyResizedWidth,\n panelWidth: panelWidths[activePanel]\n })\n })\n : 0;\n const activePanelLayoutWidth = activePanel\n ? resolveAgentToolSidebarLayoutWidth({\n baselineContainerWidth:\n baselineContainerWidthRef.current ?? resolvedContainerWidth,\n containerWidth: resolvedContainerWidth,\n panelWidth: activePanelWidth\n })\n : 0;\n\n const resetPanelExpansion = useCallback(\n (nextPanel: AgentToolPanelId | null): \"reset\" | \"transferred\" | null => {\n const reset = resolveAgentToolPanelExpansionReset({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n widthBeforeExpansion:\n expandedPanelRef.current === null\n ? undefined\n : panelWidthBeforeExpandRef.current[expandedPanelRef.current]\n });\n if (!reset) return null;\n\n if (nextPanel !== null) {\n const transfer = resolveAgentToolPanelExpansionTransfer({\n expandedPanel: expandedPanelRef.current,\n nextPanel,\n nextPanelWidth: resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n }),\n widthBeforeExpansion:\n panelWidthBeforeExpandRef.current[expandedPanelRef.current!] ??\n manuallyResizedWidth ??\n undefined\n });\n if (!transfer) return null;\n expandedPanelRef.current = transfer.expandedPanel;\n setExpandedPanel(transfer.expandedPanel);\n setPanelWidths((current) => ({\n ...current,\n [transfer.previousPanel]: transfer.previousPanelWidth,\n [transfer.expandedPanel]: Number.MAX_SAFE_INTEGER\n }));\n panelWidthBeforeExpandRef.current[transfer.expandedPanel] =\n transfer.nextPanelWidthBeforeExpansion;\n delete panelWidthBeforeExpandRef.current[transfer.previousPanel];\n return \"transferred\";\n }\n\n expandedPanelRef.current = null;\n setExpandedPanel(null);\n setPanelWidths((current) => ({ ...current, [reset.panel]: reset.width }));\n delete panelWidthBeforeExpandRef.current[reset.panel];\n return \"reset\";\n },\n [manuallyResizedWidth, panelWidths]\n );\n\n const resizeForPanel = useCallback(\n async (\n nextPanel: AgentToolPanelId | null,\n preferredWidth?: number,\n options?: ResizeForPanelOptions\n ): Promise<boolean> => {\n const requestId = ++resizeRequestRef.current;\n const expansionTransition = resetPanelExpansion(nextPanel);\n if (\n expansionTransition === \"transferred\" ||\n (nextPanel !== null && expandedPanelRef.current === nextPanel)\n ) {\n return true;\n }\n if (nextPanel !== null && baselineContainerWidthRef.current === null) {\n baselineContainerWidthRef.current = resolvedContainerWidth;\n }\n const baseline = baselineContainerWidthRef.current;\n const requestedWidth =\n nextPanel === null\n ? baseline\n : (baseline ?? resolvedContainerWidth) +\n resolvePreferredWidth(\n preferredWidth,\n resolveAgentToolPanelPreferredWidth({\n isExpanded: expandedPanelRef.current === nextPanel,\n manuallyResizedWidth,\n panelWidth: panelWidths[nextPanel]\n })\n );\n\n if (\n requestedWidth !== null &&\n shouldResizeAgentToolContainer({\n currentWidth: resolvedContainerWidth,\n lastResize: lastContainerResizeRef.current,\n requestedWidth\n })\n ) {\n try {\n const result = await resizeContainerContentWidth(\n requestedWidth,\n options?.animateContainer\n );\n if (requestId !== resizeRequestRef.current) return false;\n if (result.width > 0) {\n lastContainerResizeRef.current = {\n actualWidth: result.width,\n requestedWidth\n };\n setContainerResolution((current) => ({\n ...current,\n resolved: result.width\n }));\n }\n } catch {\n if (requestId !== resizeRequestRef.current) return false;\n }\n }\n\n if (nextPanel === null && options?.preserveBaseline !== true) {\n baselineContainerWidthRef.current = null;\n }\n return true;\n },\n [\n manuallyResizedWidth,\n panelWidths,\n resetPanelExpansion,\n resizeContainerContentWidth,\n resolvedContainerWidth\n ]\n );\n\n const resetContainerResizeBaseline = useCallback(() => {\n baselineContainerWidthRef.current = null;\n }, []);\n\n const updatePanelWidth = useCallback(\n (panel: AgentToolPanelId, width: number) => {\n const nextWidth = clampAgentToolPanelWidth({\n allowFullWidth: expandedPanel === panel,\n mainContentMinWidth: mainContentMinWidthPx,\n panel,\n viewportWidth: resolvedContainerWidth,\n width\n });\n setManuallyResizedWidth(nextWidth);\n setPanelWidths((current) => ({ ...current, [panel]: nextWidth }));\n },\n [expandedPanel, mainContentMinWidthPx, resolvedContainerWidth]\n );\n\n const togglePanelExpansion = useCallback(\n (panel: AgentToolPanelId) => {\n if (expandedPanelRef.current === panel) {\n resetPanelExpansion(null);\n return;\n }\n resetPanelExpansion(panel);\n expandedPanelRef.current = panel;\n setExpandedPanel(panel);\n setPanelWidths((current) => {\n panelWidthBeforeExpandRef.current[panel] =\n resolveAgentToolPanelPreferredWidth({\n isExpanded: false,\n manuallyResizedWidth,\n panelWidth: current[panel]\n });\n return { ...current, [panel]: Number.MAX_SAFE_INTEGER };\n });\n },\n [manuallyResizedWidth, resetPanelExpansion]\n );\n\n const stopResizing = useCallback(() => {\n dragRef.current = null;\n const styles = resizeStyleRef.current;\n if (!styles) return;\n document.body.style.cursor = styles.cursor;\n document.body.style.userSelect = styles.userSelect;\n resizeStyleRef.current = null;\n }, []);\n const bindLayoutRoot = useCallback(\n (node: HTMLElement | null) => {\n if (!node) stopResizing();\n },\n [stopResizing]\n );\n\n const handleResizePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || activePanel === null) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n dragRef.current = {\n panel: activePanel,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startWidth: activePanelWidth\n };\n resizeStyleRef.current = {\n cursor: document.body.style.cursor,\n userSelect: document.body.style.userSelect\n };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n },\n [activePanel, activePanelWidth]\n );\n\n const handleResizePointerMove = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n const resizeState = dragRef.current;\n if (!resizeState || resizeState.pointerId !== event.pointerId) return;\n updatePanelWidth(\n resizeState.panel,\n resizeState.startWidth + resizeState.startClientX - event.clientX\n );\n },\n [updatePanelWidth]\n );\n\n const handleResizeKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (activePanel === null) return;\n if (event.key === \"Home\") {\n event.preventDefault();\n updatePanelWidth(activePanel, activePanelMinWidth);\n } else if (event.key === \"End\") {\n event.preventDefault();\n updatePanelWidth(activePanel, Number.MAX_SAFE_INTEGER);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n updatePanelWidth(\n activePanel,\n activePanelWidth + (event.key === \"ArrowLeft\" ? 24 : -24)\n );\n }\n },\n [activePanel, activePanelMinWidth, activePanelWidth, updatePanelWidth]\n );\n\n return {\n activePanelLayoutWidth,\n activePanelMaxWidth,\n activePanelMinWidth,\n activePanelWidth,\n bindLayoutRoot,\n handleResizeKeyDown,\n handleResizePointerDown,\n handleResizePointerMove,\n isActivePanelExpanded,\n resetContainerResizeBaseline,\n resizeForPanel,\n stopResizing,\n togglePanelExpansion\n };\n}\n\nfunction resolveActivePanelWidth(input: {\n activePanel: AgentToolPanelId;\n activePanelMaxWidth: number;\n activePanelPreferredWidth?: number;\n baselineContainerWidth: number;\n containerWidth: number;\n isActivePanelExpanded: boolean;\n mainContentMinWidthPx?: number;\n panelWidth: number;\n}): number {\n if (\n typeof input.activePanelPreferredWidth === \"number\" &&\n Number.isFinite(input.activePanelPreferredWidth)\n ) {\n return Math.round(\n Math.max(\n 0,\n Math.min(input.activePanelMaxWidth, input.activePanelPreferredWidth)\n )\n );\n }\n return resolveAgentToolSidebarWidth({\n allowFullWidth: input.isActivePanelExpanded,\n baselineViewportWidth: input.baselineContainerWidth,\n mainContentMinWidth: input.mainContentMinWidthPx,\n panel: input.activePanel,\n preferredWidth: input.panelWidth,\n viewportWidth: input.containerWidth\n });\n}\n\nfunction resolvePreferredWidth(\n preferredWidth: number | undefined,\n fallbackWidth: number\n): number {\n return typeof preferredWidth === \"number\" && Number.isFinite(preferredWidth)\n ? Math.max(0, Math.round(preferredWidth))\n : fallbackWidth;\n}\n"],"mappings":"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","names":["cn","Button","jsx","jsx","jsxs","Button","useCallback","useRef","useState","useCallback","useState","useState","useCallback","useState","useRef","useCallback","jsx","jsxs","AgentToolSidebar","cn"]}
|
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.157",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -144,18 +144,18 @@
|
|
|
144
144
|
"@tiptap/react": "^3.11.1",
|
|
145
145
|
"@tiptap/starter-kit": "^3.11.1",
|
|
146
146
|
"@tiptap/suggestion": "^3.11.1",
|
|
147
|
-
"@tutti-os/agent-activity-core": "0.0.
|
|
148
|
-
"@tutti-os/browser-node": "0.0.
|
|
149
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
150
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
151
|
-
"@tutti-os/ui-rich-text": "0.0.
|
|
152
|
-
"@tutti-os/ui-system": "0.0.
|
|
153
|
-
"@tutti-os/workbench-surface": "0.0.
|
|
154
|
-
"@tutti-os/workspace-external-core": "0.0.
|
|
155
|
-
"@tutti-os/workspace-file-manager": "0.0.
|
|
156
|
-
"@tutti-os/workspace-file-reference": "0.0.
|
|
157
|
-
"@tutti-os/workspace-issue-manager": "0.0.
|
|
158
|
-
"@tutti-os/workspace-user-project": "0.0.
|
|
147
|
+
"@tutti-os/agent-activity-core": "0.0.157",
|
|
148
|
+
"@tutti-os/browser-node": "0.0.157",
|
|
149
|
+
"@tutti-os/ui-i18n-runtime": "0.0.157",
|
|
150
|
+
"@tutti-os/ui-react-hooks": "0.0.157",
|
|
151
|
+
"@tutti-os/ui-rich-text": "0.0.157",
|
|
152
|
+
"@tutti-os/ui-system": "0.0.157",
|
|
153
|
+
"@tutti-os/workbench-surface": "0.0.157",
|
|
154
|
+
"@tutti-os/workspace-external-core": "0.0.157",
|
|
155
|
+
"@tutti-os/workspace-file-manager": "0.0.157",
|
|
156
|
+
"@tutti-os/workspace-file-reference": "0.0.157",
|
|
157
|
+
"@tutti-os/workspace-issue-manager": "0.0.157",
|
|
158
|
+
"@tutti-os/workspace-user-project": "0.0.157",
|
|
159
159
|
"clsx": "^2.1.1",
|
|
160
160
|
"framer-motion": "^12.40.0",
|
|
161
161
|
"lodash": "^4.17.21",
|