@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
- declare function AgentToolBrowserPanel({ browserApi, chromeCookieImportPrompt, defaultUrl, hidden, i18n, loadingFallback, navigationActions, nodeIdPrefix, profileId, sessionMode, sessionPartition }: AgentToolBrowserPanelProps): ReactNode;
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 useCallback2,
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 = useCallback(
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 = useCallback(
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 = useCallback(() => {
760
+ const resetContainerResizeBaseline = useCallback2(() => {
698
761
  baselineContainerWidthRef.current = null;
699
762
  }, []);
700
- const updatePanelWidth = useCallback(
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 = useCallback(
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 = useCallback(() => {
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 = useCallback(
805
+ const bindLayoutRoot = useCallback2(
743
806
  (node) => {
744
807
  if (!node) stopResizing();
745
808
  },
746
809
  [stopResizing]
747
810
  );
748
- const handleResizePointerDown = useCallback(
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 = useCallback(
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 = useCallback(
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 = useCallback2(
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 = useCallback2(() => {
955
+ const showSidebar = useCallback3(() => {
893
956
  setIsEmptySidebarClosing(false);
894
957
  setIsSidebarOpen(true);
895
958
  }, []);
896
- const markContentReady = useCallback2((tabId) => {
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 = useCallback2(() => {
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 = useCallback2(
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 = useCallback2(
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 closePanelTab = useCallback2(
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 = useCallback2(
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 = useCallback2(() => {
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 = useCallback2(
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 = useCallback2(
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 = useCallback2(
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 = useCallback2((node) => {
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.156",
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.156",
148
- "@tutti-os/browser-node": "0.0.156",
149
- "@tutti-os/ui-i18n-runtime": "0.0.156",
150
- "@tutti-os/ui-react-hooks": "0.0.156",
151
- "@tutti-os/ui-rich-text": "0.0.156",
152
- "@tutti-os/ui-system": "0.0.156",
153
- "@tutti-os/workbench-surface": "0.0.156",
154
- "@tutti-os/workspace-external-core": "0.0.156",
155
- "@tutti-os/workspace-file-manager": "0.0.156",
156
- "@tutti-os/workspace-file-reference": "0.0.156",
157
- "@tutti-os/workspace-issue-manager": "0.0.156",
158
- "@tutti-os/workspace-user-project": "0.0.156",
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",