@tutti-os/agent-gui 0.0.130 → 0.0.131

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.
@@ -174,7 +174,7 @@ import { memo as memo15 } from "react";
174
174
  import { TooltipProvider as TooltipProvider6 } from "@tutti-os/ui-system";
175
175
 
176
176
  // agent-gui/agentGuiNode/AgentGUINode.tsx
177
- import { memo as memo14, useCallback as useCallback57, useEffect as useEffect38, useMemo as useMemo41 } from "react";
177
+ import { memo as memo14, useCallback as useCallback58, useEffect as useEffect38, useMemo as useMemo41 } from "react";
178
178
  import { createWorkspaceUserProjectI18nRuntime } from "@tutti-os/workspace-user-project/i18n";
179
179
  import { createWorkspaceFileManagerI18nRuntime } from "@tutti-os/workspace-file-manager";
180
180
  import { useReferenceProvenanceFilterCatalog } from "@tutti-os/workspace-file-reference/react";
@@ -13302,11 +13302,11 @@ function useAgentGUINodeController({
13302
13302
 
13303
13303
  // agent-gui/agentGuiNode/AgentGUINodeView.tsx
13304
13304
  import {
13305
- useCallback as useCallback55,
13305
+ useCallback as useCallback56,
13306
13306
  useEffect as useEffect36,
13307
13307
  useMemo as useMemo39,
13308
13308
  useRef as useRef47,
13309
- useState as useState36
13309
+ useState as useState37
13310
13310
  } from "react";
13311
13311
  import { TooltipProvider as TooltipProvider5 } from "@tutti-os/ui-system";
13312
13312
 
@@ -27789,17 +27789,17 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
27789
27789
  });
27790
27790
 
27791
27791
  // agent-gui/agentGuiNode/controller/AgentGUIConversationRailController.tsx
27792
- import { memo as memo8, useState as useState28 } from "react";
27792
+ import { memo as memo8, useState as useState29 } from "react";
27793
27793
 
27794
27794
  // agent-gui/agentGuiNode/view/AgentGUIConversationRailPane.tsx
27795
27795
  import {
27796
27796
  Fragment as Fragment15,
27797
27797
  memo as memo7,
27798
- useCallback as useCallback49,
27798
+ useCallback as useCallback50,
27799
27799
  useEffect as useEffect29,
27800
27800
  useMemo as useMemo33,
27801
27801
  useRef as useRef38,
27802
- useState as useState27
27802
+ useState as useState28
27803
27803
  } from "react";
27804
27804
  import { Button as SystemButton } from "@tutti-os/ui-system";
27805
27805
  import { ScrollArea } from "@tutti-os/ui-system/components";
@@ -29456,6 +29456,10 @@ var AgentGUIConversationRailSection = memo6(
29456
29456
  const isProjectSection = section.kind === "project";
29457
29457
  const projectPinned = (section.project?.pinnedAtUnixMs ?? 0) > 0;
29458
29458
  const projectId = section.project?.id?.trim() ?? "";
29459
+ const handleProjectMenuOpenChange = useCallback47(
29460
+ (open) => onProjectMenuOpenChange(section.id, open),
29461
+ [onProjectMenuOpenChange, section.id]
29462
+ );
29459
29463
  const pageableItems = section.items.filter(
29460
29464
  (item) => item.projectionSource !== "pending_activation"
29461
29465
  );
@@ -29640,7 +29644,7 @@ var AgentGUIConversationRailSection = memo6(
29640
29644
  }
29641
29645
  )
29642
29646
  ] }),
29643
- projectPath ? /* @__PURE__ */ jsxs37(DropdownMenu4, { onOpenChange: onProjectMenuOpenChange, children: [
29647
+ projectPath ? /* @__PURE__ */ jsxs37(DropdownMenu4, { onOpenChange: handleProjectMenuOpenChange, children: [
29644
29648
  previewMode ? /* @__PURE__ */ jsx52(DropdownMenuTrigger4, { asChild: true, children: /* @__PURE__ */ jsx52(
29645
29649
  "span",
29646
29650
  {
@@ -30068,10 +30072,33 @@ function useAgentGUIConversationRailViewState(input) {
30068
30072
  };
30069
30073
  }
30070
30074
 
30075
+ // agent-gui/agentGuiNode/view/useAgentGUIProjectMenuState.ts
30076
+ import { useCallback as useCallback49, useState as useState27 } from "react";
30077
+ function useAgentGUIProjectMenuState(isRailInteractionLocked, isUserProjectMutationPending) {
30078
+ const [openSectionId, setOpenSectionId] = useState27(null);
30079
+ const isProjectActionLocked = useCallback49(
30080
+ () => isRailInteractionLocked() || isUserProjectMutationPending,
30081
+ [isRailInteractionLocked, isUserProjectMutationPending]
30082
+ );
30083
+ const onProjectMenuOpenChange = useCallback49(
30084
+ (sectionId, open) => {
30085
+ setOpenSectionId(
30086
+ (current) => open ? sectionId : current === sectionId ? null : current
30087
+ );
30088
+ },
30089
+ []
30090
+ );
30091
+ return {
30092
+ isProjectActionLocked,
30093
+ onProjectMenuOpenChange,
30094
+ projectMenuOpen: openSectionId !== null
30095
+ };
30096
+ }
30097
+
30071
30098
  // agent-gui/agentGuiNode/view/AgentGUIConversationRailPane.tsx
30072
30099
  import { jsx as jsx54, jsxs as jsxs38 } from "react/jsx-runtime";
30073
30100
  function useDelayedBoolean(value, delayMs) {
30074
- const [delayedValue, setDelayedValue] = useState27(false);
30101
+ const [delayedValue, setDelayedValue] = useState28(false);
30075
30102
  useEffect29(() => {
30076
30103
  if (!value) {
30077
30104
  setDelayedValue(false);
@@ -30125,10 +30152,9 @@ var AgentGUIConversationRailPane = memo7(
30125
30152
  onConversationQueryChange
30126
30153
  }) {
30127
30154
  "use memo";
30128
- const [currentTimeMs, setCurrentTimeMs] = useState27(() => Date.now());
30129
- const [pendingProjectAction, setPendingProjectAction] = useState27(null);
30130
- const [isRequestingBatchDeletion, setIsRequestingBatchDeletion] = useState27(false);
30131
- const [openProjectMenuSectionId, setOpenProjectMenuSectionId] = useState27(null);
30155
+ const [currentTimeMs, setCurrentTimeMs] = useState28(() => Date.now());
30156
+ const [pendingProjectAction, setPendingProjectAction] = useState28(null);
30157
+ const [isRequestingBatchDeletion, setIsRequestingBatchDeletion] = useState28(false);
30132
30158
  const { railSearch } = railQuery;
30133
30159
  const railElementRef = useRef38(null);
30134
30160
  const railActiveConversationRef = useRef38([]);
@@ -30144,6 +30170,10 @@ var AgentGUIConversationRailPane = memo7(
30144
30170
  runtimeRailSectionsPending,
30145
30171
  sectionPageStates
30146
30172
  } = railQuery;
30173
+ const { isProjectActionLocked, onProjectMenuOpenChange, projectMenuOpen } = useAgentGUIProjectMenuState(
30174
+ isInteractionLocked,
30175
+ isUserProjectMutationPending
30176
+ );
30147
30177
  const railConversationEntitiesById = new Map(
30148
30178
  runtimeRailConversations.map((conversation) => [
30149
30179
  conversation.id,
@@ -30157,7 +30187,7 @@ var AgentGUIConversationRailPane = memo7(
30157
30187
  const hasConversationQuery = conversationQuery.trim().length > 0;
30158
30188
  const backendSearchActive = hasConversationQuery && railSearch.enabled;
30159
30189
  const railInteractionsLocked = isInteractionLocked();
30160
- const projectDragBaseLocked = railInteractionsLocked || isDeletingConversation || isDeletingProjectConversations || isRequestingBatchDeletion || isUserProjectMutationPending || pendingDeleteConversationId !== null || pendingProjectAction !== null || openProjectMenuSectionId !== null || previewMode;
30190
+ const projectDragBaseLocked = railInteractionsLocked || isDeletingConversation || isDeletingProjectConversations || isRequestingBatchDeletion || isUserProjectMutationPending || pendingDeleteConversationId !== null || pendingProjectAction !== null || projectMenuOpen || previewMode;
30161
30191
  const backendSearchConversations = backendSearchActive ? railSearch.sessionIds.flatMap((id) => {
30162
30192
  const conversation = railConversationEntitiesById.get(id);
30163
30193
  return conversation ? [conversation] : [];
@@ -30294,7 +30324,7 @@ var AgentGUIConversationRailPane = memo7(
30294
30324
  [groupedConversations, railActiveOverlay]
30295
30325
  );
30296
30326
  const sectionAgentTargetId = conversationFilter.kind === "agentTarget" ? conversationFilter.agentTargetId.trim() : sectionAgentTargetFallbackId?.trim() ?? "";
30297
- const requestSectionBatchDeletion = useCallback49(
30327
+ const requestSectionBatchDeletion = useCallback50(
30298
30328
  (section) => {
30299
30329
  if (isInteractionLocked() || isDeletingProjectConversations || isRequestingBatchDeletion) {
30300
30330
  return;
@@ -30485,7 +30515,7 @@ var AgentGUIConversationRailPane = memo7(
30485
30515
  ),
30486
30516
  isLoadingMoreConversations: backendSearchActive ? railSearch.loadingMore : sectionPageState?.isLoading ?? false,
30487
30517
  isRailInteractionLocked: isInteractionLocked,
30488
- isProjectActionLocked: () => isInteractionLocked() || isUserProjectMutationPending,
30518
+ isProjectActionLocked,
30489
30519
  projectDragDisabled: projectDragLocked,
30490
30520
  projectDragging: projectDragState !== null && projectDragState.projectId === section.project?.id,
30491
30521
  projectDropIndicator: projectDragState?.indicatorSectionId === section.id ? projectDragState.indicator : null,
@@ -30524,11 +30554,7 @@ var AgentGUIConversationRailPane = memo7(
30524
30554
  onProjectDragEnd: clearProjectDrag,
30525
30555
  onProjectDragOver: updateProjectDropTarget,
30526
30556
  onProjectDrop: dropProject,
30527
- onProjectMenuOpenChange: (open) => {
30528
- setOpenProjectMenuSectionId(
30529
- (current) => open ? section.id : current === section.id ? null : current
30530
- );
30531
- }
30557
+ onProjectMenuOpenChange
30532
30558
  }
30533
30559
  )
30534
30560
  ] }, section.id);
@@ -31734,7 +31760,7 @@ function identitySnapshot(snapshot) {
31734
31760
  import { jsx as jsx55 } from "react/jsx-runtime";
31735
31761
  var AgentGUIConversationRailController = memo8(
31736
31762
  function AgentGUIConversationRailController2(props) {
31737
- const [conversationQuery, setConversationQuery] = useState28("");
31763
+ const [conversationQuery, setConversationQuery] = useState29("");
31738
31764
  const railQuery = useAgentGUIConversationRailQuery({
31739
31765
  activeConversationId: props.activeConversationId,
31740
31766
  conversationFilter: props.conversationFilter,
@@ -31759,11 +31785,11 @@ var AgentGUIConversationRailController = memo8(
31759
31785
  // agent-gui/agentGuiNode/view/AgentGUIDetailPane.tsx
31760
31786
  import {
31761
31787
  memo as memo12,
31762
- useCallback as useCallback51,
31788
+ useCallback as useCallback52,
31763
31789
  useEffect as useEffect33,
31764
31790
  useMemo as useMemo36,
31765
31791
  useRef as useRef42,
31766
- useState as useState33
31792
+ useState as useState34
31767
31793
  } from "react";
31768
31794
  import { ScrollArea as ScrollArea2 } from "@tutti-os/ui-system/components";
31769
31795
 
@@ -31938,7 +31964,7 @@ import { ChevronsDown } from "lucide-react";
31938
31964
  import { cn as cn8 } from "@tutti-os/ui-system";
31939
31965
 
31940
31966
  // agent-gui/agentGuiNode/AgentGoalBanner.tsx
31941
- import { useEffect as useEffect31, useState as useState29 } from "react";
31967
+ import { useEffect as useEffect31, useState as useState30 } from "react";
31942
31968
  import { CirclePause, CirclePlay, Pencil as Pencil2, Target as Target3, Trash2 } from "lucide-react";
31943
31969
  import { jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
31944
31970
  var RESUMABLE_GOAL_STATUSES = /* @__PURE__ */ new Set([
@@ -32014,11 +32040,11 @@ function AgentGoalBanner({
32014
32040
  onClearGoal
32015
32041
  }) {
32016
32042
  "use memo";
32017
- const [editDraft, setEditDraft] = useState29(null);
32043
+ const [editDraft, setEditDraft] = useState30(null);
32018
32044
  const normalizedStatus = normalizeGoalStatus(status);
32019
32045
  const isActive = normalizedStatus === "" || normalizedStatus === "active";
32020
32046
  const serverSeconds = optimistic ? null : typeof durationMs === "number" && durationMs >= 0 ? Math.floor(durationMs / 1e3) : isActive ? 0 : null;
32021
- const [localElapsed, setLocalElapsed] = useState29(0);
32047
+ const [localElapsed, setLocalElapsed] = useState30(0);
32022
32048
  useEffect31(() => {
32023
32049
  setLocalElapsed(0);
32024
32050
  if (!isActive || serverSeconds === null) {
@@ -32352,7 +32378,7 @@ function AgentRunPathInfo({
32352
32378
  }
32353
32379
 
32354
32380
  // agent-gui/agentGuiNode/view/AgentGUIContentToast.tsx
32355
- import { useState as useState30 } from "react";
32381
+ import { useState as useState31 } from "react";
32356
32382
  import {
32357
32383
  ToastProvider,
32358
32384
  ToastRoot,
@@ -32364,7 +32390,7 @@ function AgentGUIContentToast({
32364
32390
  insetTopPx,
32365
32391
  message
32366
32392
  }) {
32367
- const [open, setOpen] = useState30(true);
32393
+ const [open, setOpen] = useState31(true);
32368
32394
  return /* @__PURE__ */ jsxs42(ToastProvider, { children: [
32369
32395
  /* @__PURE__ */ jsx59(
32370
32396
  ToastRoot,
@@ -32452,11 +32478,11 @@ function setTimelineScrollTopWithUserTransition(element, top) {
32452
32478
 
32453
32479
  // agent-gui/agentGuiNode/view/useAgentGUIDetailScroll.ts
32454
32480
  import {
32455
- useCallback as useCallback50,
32481
+ useCallback as useCallback51,
32456
32482
  useEffect as useEffect32,
32457
32483
  useLayoutEffect as useLayoutEffect7,
32458
32484
  useRef as useRef41,
32459
- useState as useState31
32485
+ useState as useState32
32460
32486
  } from "react";
32461
32487
  var AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX = 24;
32462
32488
  var AGENT_GUI_TOP_HISTORY_PREFETCH_THRESHOLD_PX = 240;
@@ -32475,8 +32501,8 @@ function useAgentGUIDetailScroll(input) {
32475
32501
  timelineScrollAnchorRef,
32476
32502
  viewModel
32477
32503
  } = input;
32478
- const [isTimelineScrolledToTop, setIsTimelineScrolledToTop] = useState31(true);
32479
- const [isTimelineScrolledToBottom, setIsTimelineScrolledToBottom] = useState31(true);
32504
+ const [isTimelineScrolledToTop, setIsTimelineScrolledToTop] = useState32(true);
32505
+ const [isTimelineScrolledToBottom, setIsTimelineScrolledToBottom] = useState32(true);
32480
32506
  const bottomLockOwnerRef = useRef41(null);
32481
32507
  const userScrollAwayIntentConversationRef = useRef41(null);
32482
32508
  useLayoutEffect7(() => {
@@ -32760,7 +32786,7 @@ function useAgentGUIDetailScroll(input) {
32760
32786
  viewModel.detail.hasOlderMessages,
32761
32787
  viewModel.detail.isLoadingOlderMessages
32762
32788
  ]);
32763
- const scrollTimelineToBottom = useCallback50(() => {
32789
+ const scrollTimelineToBottom = useCallback51(() => {
32764
32790
  const timeline = timelineRef.current;
32765
32791
  const activeConversationId = timelineConversationId;
32766
32792
  if (!timeline || !activeConversationId) {
@@ -32815,15 +32841,15 @@ function UnavailableChatIcon(props) {
32815
32841
  }
32816
32842
 
32817
32843
  // agent-gui/agentGuiNode/view/useAgentGUITimelineTransition.ts
32818
- import { useLayoutEffect as useLayoutEffect8, useState as useState32 } from "react";
32844
+ import { useLayoutEffect as useLayoutEffect8, useState as useState33 } from "react";
32819
32845
  var AGENT_GUI_TIMELINE_SKELETON_DELAY_MS = 300;
32820
32846
  function useAgentGUITimelineTransition(input) {
32821
32847
  const activeConversationId = input.activeConversationId;
32822
- const [committedTimeline, setCommittedTimeline] = useState32(() => ({
32848
+ const [committedTimeline, setCommittedTimeline] = useState33(() => ({
32823
32849
  conversation: input.conversation,
32824
32850
  conversationId: activeConversationId
32825
32851
  }));
32826
- const [revealedSkeletonConversationId, setRevealedSkeletonConversationId] = useState32(null);
32852
+ const [revealedSkeletonConversationId, setRevealedSkeletonConversationId] = useState33(null);
32827
32853
  const transitionPending = activeConversationId !== null && input.availability === "loading" && (!input.conversation || input.conversation.rows.length === 0);
32828
32854
  useLayoutEffect8(() => {
32829
32855
  if (!transitionPending || activeConversationId === null) {
@@ -33481,7 +33507,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33481
33507
  const [
33482
33508
  bottomDockDismissedPromptRequestId,
33483
33509
  setBottomDockDismissedPromptRequestId
33484
- ] = useState33(null);
33510
+ ] = useState34(null);
33485
33511
  const {
33486
33512
  activePromptRequestId,
33487
33513
  bottomDockLiftedPrompt,
@@ -33518,7 +33544,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33518
33544
  slashStatusLimitsUnavailable,
33519
33545
  viewModel
33520
33546
  });
33521
- const handleInterruptCurrentTurn = useCallback51(() => {
33547
+ const handleInterruptCurrentTurn = useCallback52(() => {
33522
33548
  actions.interruptCurrentTurn(labels.noRunningResponse);
33523
33549
  }, [actions.interruptCurrentTurn, labels.noRunningResponse]);
33524
33550
  const submitApprovalOption = useStableEventCallback(
@@ -33538,14 +33564,14 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33538
33564
  const selectHomeComposerAgentTarget = useStableEventCallback(
33539
33565
  actions.selectHomeComposerAgentTarget
33540
33566
  );
33541
- const selectHomeComposerAgentTargetAndFocus = useCallback51(
33567
+ const selectHomeComposerAgentTargetAndFocus = useCallback52(
33542
33568
  (input) => {
33543
33569
  selectHomeComposerAgentTarget(input);
33544
33570
  onRequestComposerFocus();
33545
33571
  },
33546
33572
  [onRequestComposerFocus, selectHomeComposerAgentTarget]
33547
33573
  );
33548
- const handleSelectHomeSuggestion = useCallback51(
33574
+ const handleSelectHomeSuggestion = useCallback52(
33549
33575
  (prompt) => {
33550
33576
  updateDraftContent(
33551
33577
  updateAgentComposerDraft(viewModel.composer.draftContent, { prompt })
@@ -33553,7 +33579,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33553
33579
  },
33554
33580
  [updateDraftContent, viewModel.composer.draftContent]
33555
33581
  );
33556
- const handleHomeSuggestionAction = useCallback51(
33582
+ const handleHomeSuggestionAction = useCallback52(
33557
33583
  (action) => {
33558
33584
  if (action === "import-session") {
33559
33585
  window.dispatchEvent(
@@ -33568,7 +33594,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33568
33594
  const submitGuidancePrompt = useStableEventCallback(
33569
33595
  actions.submitGuidancePrompt
33570
33596
  );
33571
- const requestSubmittedPromptScrollToBottom = useCallback51(() => {
33597
+ const requestSubmittedPromptScrollToBottom = useCallback52(() => {
33572
33598
  const activeConversationId = viewModel.rail.activeConversationId;
33573
33599
  if (!activeConversationId) {
33574
33600
  return;
@@ -33576,7 +33602,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33576
33602
  submittedPromptScrollConversationRef.current = activeConversationId;
33577
33603
  pendingPrependScrollAnchorRef.current = null;
33578
33604
  }, [viewModel.rail.activeConversationId]);
33579
- const submitPromptAndScrollToBottom = useCallback51(
33605
+ const submitPromptAndScrollToBottom = useCallback52(
33580
33606
  (content, displayPrompt, options) => {
33581
33607
  requestSubmittedPromptScrollToBottom();
33582
33608
  if (displayPrompt === void 0) {
@@ -33587,7 +33613,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33587
33613
  },
33588
33614
  [requestSubmittedPromptScrollToBottom, submitPrompt]
33589
33615
  );
33590
- const submitGuidancePromptAndScrollToBottom = useCallback51(
33616
+ const submitGuidancePromptAndScrollToBottom = useCallback52(
33591
33617
  (content, displayPrompt) => {
33592
33618
  requestSubmittedPromptScrollToBottom();
33593
33619
  if (displayPrompt === void 0) {
@@ -33618,7 +33644,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33618
33644
  );
33619
33645
  const stableRequestGitBranches = useOptionalStableEventCallback(onRequestGitBranches);
33620
33646
  const authLogin = useOptionalStableEventCallback(onAgentProviderLogin);
33621
- const submitBottomDockInteractivePrompt = useCallback51(
33647
+ const submitBottomDockInteractivePrompt = useCallback52(
33622
33648
  (input) => {
33623
33649
  submitInteractivePrompt(input);
33624
33650
  setBottomDockDismissedPromptRequestId(input.requestId);
@@ -33966,7 +33992,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
33966
33992
  });
33967
33993
 
33968
33994
  // agent-gui/agentGuiNode/view/AgentGUIRenameConversationDialog.tsx
33969
- import { memo as memo13, useCallback as useCallback52, useEffect as useEffect34, useRef as useRef43, useState as useState34 } from "react";
33995
+ import { memo as memo13, useCallback as useCallback53, useEffect as useEffect34, useRef as useRef43, useState as useState35 } from "react";
33970
33996
  import { ConfirmationDialog as ConfirmationDialog3, Input as Input2 } from "@tutti-os/ui-system";
33971
33997
  import { jsx as jsx64, jsxs as jsxs46 } from "react/jsx-runtime";
33972
33998
  var AgentGUIRenameConversationDialog = memo13(
@@ -33978,8 +34004,8 @@ var AgentGUIRenameConversationDialog = memo13(
33978
34004
  onRename
33979
34005
  }) {
33980
34006
  "use memo";
33981
- const [title, setTitle] = useState34("");
33982
- const [isSaving, setIsSaving] = useState34(false);
34007
+ const [title, setTitle] = useState35("");
34008
+ const [isSaving, setIsSaving] = useState35(false);
33983
34009
  const isSavingRef = useRef43(false);
33984
34010
  const armedPointerActionRef = useRef43(null);
33985
34011
  const inputRef = useRef43(null);
@@ -34004,12 +34030,12 @@ var AgentGUIRenameConversationDialog = memo13(
34004
34030
  }, 0);
34005
34031
  return () => window.clearTimeout(timer);
34006
34032
  }, [open, conversation?.id]);
34007
- const closeRenameDialog = useCallback52(() => {
34033
+ const closeRenameDialog = useCallback53(() => {
34008
34034
  if (!isSavingRef.current) {
34009
34035
  onOpenChange(false);
34010
34036
  }
34011
34037
  }, [onOpenChange]);
34012
- const confirmRename = useCallback52(() => {
34038
+ const confirmRename = useCallback53(() => {
34013
34039
  if (!conversation || isSavingRef.current || !trimmedTitle) {
34014
34040
  return;
34015
34041
  }
@@ -34211,7 +34237,7 @@ function AgentGUIReferencePickerSurface({
34211
34237
  }
34212
34238
 
34213
34239
  // agent-gui/agentGuiNode/view/AgentTargetSetupRoot.tsx
34214
- import { useCallback as useCallback53, useMemo as useMemo37 } from "react";
34240
+ import { useCallback as useCallback54, useMemo as useMemo37 } from "react";
34215
34241
  import { jsx as jsx66, jsxs as jsxs47 } from "react/jsx-runtime";
34216
34242
  function useAgentTargetSetupRoot(input) {
34217
34243
  const { preferences } = useAgentGUIProviderRailPreferences();
@@ -34229,7 +34255,7 @@ function useAgentTargetSetupRoot(input) {
34229
34255
  );
34230
34256
  const targetRuntimeSetupVisible = effectiveSelectedTarget.ref.setupKind === "target_runtime";
34231
34257
  const environmentSetupVisible = targetRuntimeSetupVisible || !!resolveAgentGUIProviderCatalogIdentity(input.environmentProvider ?? "");
34232
- const openAgentEnvSetup = useCallback53(() => {
34258
+ const openAgentEnvSetup = useCallback54(() => {
34233
34259
  if (targetRuntimeSetupVisible) {
34234
34260
  controller.setDialogOpen(true);
34235
34261
  return;
@@ -34261,7 +34287,7 @@ function AgentTargetSetupRoot({
34261
34287
  }
34262
34288
 
34263
34289
  // agent-gui/agentGuiNode/view/useAgentGUIWorkspaceReferencePicker.ts
34264
- import { useCallback as useCallback54, useMemo as useMemo38, useRef as useRef44, useState as useState35 } from "react";
34290
+ import { useCallback as useCallback55, useMemo as useMemo38, useRef as useRef44, useState as useState36 } from "react";
34265
34291
  import { createRichTextMentionHref } from "@tutti-os/ui-rich-text/core";
34266
34292
  function useAgentGUIWorkspaceReferencePicker(input) {
34267
34293
  const {
@@ -34274,19 +34300,19 @@ function useAgentGUIWorkspaceReferencePicker(input) {
34274
34300
  workspaceFileReferenceAdapter,
34275
34301
  workspaceFileReferenceCopy
34276
34302
  } = input;
34277
- const [workspaceReferencePickerOpen, setWorkspaceReferencePickerOpen] = useState35(false);
34278
- const [workspaceReferencePickerTarget, setWorkspaceReferencePickerTarget] = useState35(null);
34303
+ const [workspaceReferencePickerOpen, setWorkspaceReferencePickerOpen] = useState36(false);
34304
+ const [workspaceReferencePickerTarget, setWorkspaceReferencePickerTarget] = useState36(null);
34279
34305
  const workspaceReferencePickerResolverRef = useRef44(null);
34280
34306
  const emptyReferencePickResult = useMemo38(
34281
34307
  () => ({ files: [], mentionItems: [] }),
34282
34308
  []
34283
34309
  );
34284
34310
  const hostLocalFileSourceId = "host-local-file";
34285
- const isWorkspaceReferencePickerNodeSelectable = useCallback54(
34311
+ const isWorkspaceReferencePickerNodeSelectable = useCallback55(
34286
34312
  (node) => node.ref.sourceId !== hostLocalFileSourceId || node.kind === "file",
34287
34313
  [hostLocalFileSourceId]
34288
34314
  );
34289
- const requestWorkspaceReferences = useCallback54(
34315
+ const requestWorkspaceReferences = useCallback55(
34290
34316
  async (entity) => {
34291
34317
  if (previewMode) {
34292
34318
  return emptyReferencePickResult;
@@ -34318,13 +34344,13 @@ function useAgentGUIWorkspaceReferencePicker(input) {
34318
34344
  workspaceFileReferenceCopy
34319
34345
  ]
34320
34346
  );
34321
- const closeWorkspaceReferencePicker = useCallback54(() => {
34347
+ const closeWorkspaceReferencePicker = useCallback55(() => {
34322
34348
  workspaceReferencePickerResolverRef.current?.(emptyReferencePickResult);
34323
34349
  workspaceReferencePickerResolverRef.current = null;
34324
34350
  setWorkspaceReferencePickerOpen(false);
34325
34351
  setWorkspaceReferencePickerTarget(null);
34326
34352
  }, [emptyReferencePickResult]);
34327
- const settleReferencePicker = useCallback54(
34353
+ const settleReferencePicker = useCallback55(
34328
34354
  (result, addedFiles) => {
34329
34355
  workspaceReferencePickerResolverRef.current?.(result);
34330
34356
  workspaceReferencePickerResolverRef.current = null;
@@ -34336,13 +34362,13 @@ function useAgentGUIWorkspaceReferencePicker(input) {
34336
34362
  },
34337
34363
  [onWorkspaceFileReferencesAdded]
34338
34364
  );
34339
- const confirmWorkspaceReferencePicker = useCallback54(
34365
+ const confirmWorkspaceReferencePicker = useCallback55(
34340
34366
  (refs) => {
34341
34367
  settleReferencePicker({ files: refs, mentionItems: [] }, refs);
34342
34368
  },
34343
34369
  [settleReferencePicker]
34344
34370
  );
34345
- const confirmWorkspaceReferenceBundles = useCallback54(
34371
+ const confirmWorkspaceReferenceBundles = useCallback55(
34346
34372
  (result) => {
34347
34373
  const workspaceRefs = result.files.filter(
34348
34374
  (ref) => ref.sourceId !== hostLocalFileSourceId
@@ -34708,16 +34734,16 @@ function AgentGUINodeView({
34708
34734
  previewMode,
34709
34735
  viewModel
34710
34736
  });
34711
- const [providerManagerOpen, setProviderManagerOpen] = useState36(false);
34737
+ const [providerManagerOpen, setProviderManagerOpen] = useState37(false);
34712
34738
  const railResizeInteractionRef = useRef47(null);
34713
- const [isRailResizing, setIsRailResizing] = useState36(false);
34714
- const [railResizeWidthPx, setRailResizeWidthPx] = useState36(
34739
+ const [isRailResizing, setIsRailResizing] = useState37(false);
34740
+ const [railResizeWidthPx, setRailResizeWidthPx] = useState37(
34715
34741
  null
34716
34742
  );
34717
34743
  const [
34718
34744
  localComposerFocusRequestSequence,
34719
34745
  setLocalComposerFocusRequestSequence
34720
- ] = useState36(0);
34746
+ ] = useState37(0);
34721
34747
  const handledNewConversationRequestSequenceRef = useRef47(
34722
34748
  newConversationRequestSequence
34723
34749
  );
@@ -34772,10 +34798,10 @@ function AgentGUINodeView({
34772
34798
  );
34773
34799
  const openProjectFiles = useOptionalStableEventCallback(onLinkAction);
34774
34800
  const detailComposerFocusRequestSequence = localComposerFocusRequestSequence === 0 ? composerFocusRequestSequence : (composerFocusRequestSequence ?? 0) + localComposerFocusRequestSequence;
34775
- const requestComposerFocus = useCallback55(() => {
34801
+ const requestComposerFocus = useCallback56(() => {
34776
34802
  setLocalComposerFocusRequestSequence((current) => current + 1);
34777
34803
  }, []);
34778
- const requestCreateConversation = useCallback55(
34804
+ const requestCreateConversation = useCallback56(
34779
34805
  (options) => {
34780
34806
  if (previewMode) {
34781
34807
  return;
@@ -34825,14 +34851,14 @@ function AgentGUINodeView({
34825
34851
  workspaceAppIcons
34826
34852
  ]
34827
34853
  );
34828
- const clampConversationRailWidth = useCallback55(
34854
+ const clampConversationRailWidth = useCallback56(
34829
34855
  (widthPx) => Math.min(
34830
34856
  conversationRailMaxWidthPx,
34831
34857
  Math.max(conversationRailMinWidthPx, widthPx)
34832
34858
  ),
34833
34859
  [conversationRailMaxWidthPx, conversationRailMinWidthPx]
34834
34860
  );
34835
- const handleConversationRailResizePointerDown = useCallback55(
34861
+ const handleConversationRailResizePointerDown = useCallback56(
34836
34862
  (event) => {
34837
34863
  if (previewMode) {
34838
34864
  return;
@@ -34853,7 +34879,7 @@ function AgentGUINodeView({
34853
34879
  },
34854
34880
  [conversationRailCollapsed, conversationRailWidthPx, previewMode]
34855
34881
  );
34856
- const handleConversationRailResizePointerMove = useCallback55(
34882
+ const handleConversationRailResizePointerMove = useCallback56(
34857
34883
  (event) => {
34858
34884
  if (previewMode) {
34859
34885
  return;
@@ -34876,7 +34902,7 @@ function AgentGUINodeView({
34876
34902
  },
34877
34903
  [clampConversationRailWidth, previewMode]
34878
34904
  );
34879
- const endConversationRailResize = useCallback55(
34905
+ const endConversationRailResize = useCallback56(
34880
34906
  (event) => {
34881
34907
  const resizeState = railResizeInteractionRef.current;
34882
34908
  if (event && resizeState?.pointerId === event.pointerId && event.currentTarget.hasPointerCapture?.(event.pointerId)) {
@@ -34907,7 +34933,7 @@ function AgentGUINodeView({
34907
34933
  isRailResizing,
34908
34934
  railResizeWidthPx
34909
34935
  ]);
34910
- const handleConversationRailResizeKeyDown = useCallback55(
34936
+ const handleConversationRailResizeKeyDown = useCallback56(
34911
34937
  (event) => {
34912
34938
  if (previewMode) {
34913
34939
  return;
@@ -34973,12 +34999,12 @@ function AgentGUINodeView({
34973
34999
  environmentProvider: effectiveRailConfigProvider,
34974
35000
  selectedAgentTarget: viewModel.rail.selectedAgentTarget
34975
35001
  });
34976
- const openAgentSettings = useCallback55(() => {
35002
+ const openAgentSettings = useCallback56(() => {
34977
35003
  openWorkspaceSettingsPanel({ section: "agent" });
34978
35004
  }, []);
34979
- const [renameConversationTarget, setRenameConversationTarget] = useState36(null);
34980
- const [renameConversationDialogOpen, setRenameConversationDialogOpen] = useState36(false);
34981
- const requestRenameConversation = useCallback55(
35005
+ const [renameConversationTarget, setRenameConversationTarget] = useState37(null);
35006
+ const [renameConversationDialogOpen, setRenameConversationDialogOpen] = useState37(false);
35007
+ const requestRenameConversation = useCallback56(
34982
35008
  (conversation) => {
34983
35009
  setRenameConversationTarget(conversation);
34984
35010
  setRenameConversationDialogOpen(true);
@@ -35062,6 +35088,14 @@ function AgentGUINodeView({
35062
35088
  workspaceUserProjectI18n
35063
35089
  ]
35064
35090
  );
35091
+ const agentTargetPresentationKey = JSON.stringify(
35092
+ viewModel.rail.agentTargets.map((target) => [
35093
+ target.agentTargetId ?? null,
35094
+ target.iconUrl ?? null,
35095
+ target.label,
35096
+ target.provider
35097
+ ])
35098
+ );
35065
35099
  const agentTargetPresentations = useMemo39(
35066
35100
  () => viewModel.rail.agentTargets.flatMap(
35067
35101
  (target) => target.agentTargetId ? [
@@ -35074,7 +35108,7 @@ function AgentGUINodeView({
35074
35108
  }
35075
35109
  ] : []
35076
35110
  ),
35077
- [viewModel.rail.agentTargets, viewModel.shell.workspaceId]
35111
+ [agentTargetPresentationKey, viewModel.shell.workspaceId]
35078
35112
  );
35079
35113
  const content = /* @__PURE__ */ jsx67(AgentTargetPresentationProvider, { agentTargets: agentTargetPresentations, children: /* @__PURE__ */ jsxs48(AgentTargetSetupRoot, { controller: targetSetupController, children: [
35080
35114
  /* @__PURE__ */ jsxs48(
@@ -35458,11 +35492,11 @@ function appendDockProbeUsageLines(probe, lines, isLoadingUsage, t) {
35458
35492
  // agent-gui/workspaceDesktop/view/AgentProbeInfoPopover.tsx
35459
35493
  import { Info as Info3 } from "lucide-react";
35460
35494
  import {
35461
- useCallback as useCallback56,
35495
+ useCallback as useCallback57,
35462
35496
  useEffect as useEffect37,
35463
35497
  useLayoutEffect as useLayoutEffect9,
35464
35498
  useRef as useRef48,
35465
- useState as useState37
35499
+ useState as useState38
35466
35500
  } from "react";
35467
35501
  import { createPortal as createPortal5 } from "react-dom";
35468
35502
  import { Fragment as Fragment19, jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
@@ -35501,22 +35535,22 @@ function AgentProbeInfoPopover({
35501
35535
  "use memo";
35502
35536
  const anchorRef = useRef48(null);
35503
35537
  const popoverRef = useRef48(null);
35504
- const [isOpen, setIsOpen] = useState37(false);
35505
- const [popoverStyle, setPopoverStyle] = useState37(null);
35506
- const openPopover = useCallback56(() => {
35538
+ const [isOpen, setIsOpen] = useState38(false);
35539
+ const [popoverStyle, setPopoverStyle] = useState38(null);
35540
+ const openPopover = useCallback57(() => {
35507
35541
  if (!isOpen) {
35508
35542
  onOpen?.();
35509
35543
  }
35510
35544
  setIsOpen(true);
35511
35545
  }, [isOpen, onOpen]);
35512
- const closeIfPointerLeavesPopover = useCallback56((event) => {
35546
+ const closeIfPointerLeavesPopover = useCallback57((event) => {
35513
35547
  const nextTarget = event.relatedTarget;
35514
35548
  if (nextTarget instanceof Node && (anchorRef.current?.contains(nextTarget) || popoverRef.current?.contains(nextTarget))) {
35515
35549
  return;
35516
35550
  }
35517
35551
  setIsOpen(false);
35518
35552
  }, []);
35519
- const updatePopoverPosition = useCallback56(() => {
35553
+ const updatePopoverPosition = useCallback57(() => {
35520
35554
  const anchor = anchorRef.current;
35521
35555
  if (!anchor) {
35522
35556
  return;
@@ -36703,13 +36737,13 @@ var AgentGUINode = memo14(function AgentGUINode2({
36703
36737
  () => typeof i18n?.t === "function" ? createWorkspaceFileManagerI18nRuntime(i18n) : null,
36704
36738
  [i18n]
36705
36739
  );
36706
- const handleLinkAction = useCallback57(
36740
+ const handleLinkAction = useCallback58(
36707
36741
  (action) => {
36708
36742
  onLinkAction?.(action);
36709
36743
  },
36710
36744
  [onLinkAction]
36711
36745
  );
36712
- const handleAgentProviderLogin = useCallback57(
36746
+ const handleAgentProviderLogin = useCallback58(
36713
36747
  (provider) => {
36714
36748
  const resolvedProvider = normalizeAgentGUIProviderIdentity(provider);
36715
36749
  onAgentProviderLogin?.(
@@ -36718,7 +36752,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36718
36752
  },
36719
36753
  [onAgentProviderLogin, state.provider]
36720
36754
  );
36721
- const handleWorkspaceFileReferencesAdded = useCallback57(
36755
+ const handleWorkspaceFileReferencesAdded = useCallback58(
36722
36756
  (references) => {
36723
36757
  onWorkspaceFileReferencesAdded?.({
36724
36758
  provider: state.provider,
@@ -36727,7 +36761,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36727
36761
  },
36728
36762
  [onWorkspaceFileReferencesAdded, state.provider]
36729
36763
  );
36730
- const handleDataChange = useCallback57(
36764
+ const handleDataChange = useCallback58(
36731
36765
  (updater) => {
36732
36766
  if (previewMode) {
36733
36767
  return;
@@ -36736,7 +36770,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36736
36770
  },
36737
36771
  [onUpdateNode, previewMode]
36738
36772
  );
36739
- const handleConversationRailWidthChanged = useCallback57(
36773
+ const handleConversationRailWidthChanged = useCallback58(
36740
36774
  (widthPx) => {
36741
36775
  if (previewMode) {
36742
36776
  return;
@@ -36768,7 +36802,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36768
36802
  }),
36769
36803
  []
36770
36804
  );
36771
- const toggleConversationRailCollapsed = useCallback57(() => {
36805
+ const toggleConversationRailCollapsed = useCallback58(() => {
36772
36806
  if (previewMode) {
36773
36807
  return;
36774
36808
  }
@@ -36777,7 +36811,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36777
36811
  conversationRailCollapsed: current.conversationRailCollapsed !== true
36778
36812
  }));
36779
36813
  }, [onUpdateNode, previewMode]);
36780
- const handleConversationRailToggle = useCallback57(() => {
36814
+ const handleConversationRailToggle = useCallback58(() => {
36781
36815
  if (previewMode) {
36782
36816
  return;
36783
36817
  }
@@ -36838,7 +36872,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36838
36872
  onRememberComposerDefaults,
36839
36873
  onShowMessage
36840
36874
  });
36841
- const handleCreateConversation = useCallback57(
36875
+ const handleCreateConversation = useCallback58(
36842
36876
  (...args) => {
36843
36877
  if (!previewMode) {
36844
36878
  onUpdateNode(
@@ -36962,13 +36996,13 @@ var AgentGUINode = memo14(function AgentGUINode2({
36962
36996
  previewMode,
36963
36997
  railStatusProvider
36964
36998
  ]);
36965
- const handleAgentProbeInfoOpen = useCallback57(() => {
36999
+ const handleAgentProbeInfoOpen = useCallback58(() => {
36966
37000
  if (previewMode || !onAgentProbeRefreshRequest) {
36967
37001
  return;
36968
37002
  }
36969
37003
  onAgentProbeRefreshRequest(activeProbeProvider, `agent-gui:${nodeId}`);
36970
37004
  }, [activeProbeProvider, nodeId, onAgentProbeRefreshRequest, previewMode]);
36971
- const handleAgentConfigMenuOpen = useCallback57(() => {
37005
+ const handleAgentConfigMenuOpen = useCallback58(() => {
36972
37006
  if (previewMode || !onAgentProbeRefreshRequest) {
36973
37007
  return;
36974
37008
  }
@@ -36983,7 +37017,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
36983
37017
  previewMode,
36984
37018
  railStatusProvider
36985
37019
  ]);
36986
- const handleAgentUsageRefresh = useCallback57(() => {
37020
+ const handleAgentUsageRefresh = useCallback58(() => {
36987
37021
  if (previewMode || !onAgentProbeRefreshRequest) {
36988
37022
  return;
36989
37023
  }
@@ -37197,4 +37231,4 @@ export {
37197
37231
  resolveAgentGUIAgentTarget,
37198
37232
  AgentGUI
37199
37233
  };
37200
- //# sourceMappingURL=chunk-GX5HPHPL.js.map
37234
+ //# sourceMappingURL=chunk-WVWSFGBU.js.map