@tutti-os/agent-gui 0.0.59 → 0.0.60

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.
Files changed (97) hide show
  1. package/README.md +1 -1
  2. package/dist/@-bold-lined-BLLFKBFI.svg +10 -0
  3. package/dist/add-lined-bold-5QPUDZCU.svg +3 -0
  4. package/dist/agent-conversation/index.d.ts +2 -2
  5. package/dist/agent-conversation/index.js +7 -7
  6. package/dist/agent-message-center/index.js +17 -11
  7. package/dist/agent-message-center/index.js.map +1 -1
  8. package/dist/{agentGuiNodeTypes-CupCLd9p.d.ts → agentGuiNodeTypes-CC52zXAV.d.ts} +7 -4
  9. package/dist/app/renderer/agentactivity.css +533 -56
  10. package/dist/app/renderer/assets/icons/@-bold-lined.svg +10 -0
  11. package/dist/app/renderer/assets/icons/@-lined.svg +10 -0
  12. package/dist/app/renderer/assets/icons/add-lined-bold.svg +3 -0
  13. package/dist/app/renderer/assets/icons/add-lined-icon.svg +3 -0
  14. package/dist/app/renderer/assets/icons/add-lined.svg +3 -0
  15. package/dist/app/renderer/assets/icons/agents/claudecode-flat-filled.svg +10 -0
  16. package/dist/app/renderer/assets/icons/agents/codex-flat-filled.svg +10 -0
  17. package/dist/app/renderer/assets/icons/agents/provider-rail-claude-code-colorful.png +0 -0
  18. package/dist/app/renderer/assets/icons/agents/provider-rail-codex-colorful.png +0 -0
  19. package/dist/app/renderer/assets/icons/agents/provider-rail-hermes-colorful.png +0 -0
  20. package/dist/app/renderer/assets/icons/agents/provider-rail-tutti.png +0 -0
  21. package/dist/app/renderer/assets/icons/handoff-lined.png +0 -0
  22. package/dist/app/renderer/assets/icons/handoff-lined.svg +11 -0
  23. package/dist/{chunk-5SRRKWE4.js → chunk-24CUBQKJ.js} +2 -2
  24. package/dist/{chunk-NX6T3DDS.js → chunk-2LGUBUEJ.js} +3 -3
  25. package/dist/{chunk-UCCUIUGK.js → chunk-4OPTXOOZ.js} +2 -2
  26. package/dist/{chunk-Q75AK47T.js → chunk-5WB3NGIN.js} +2 -2
  27. package/dist/{chunk-2WUDORCV.js → chunk-6TEPDMX6.js} +2 -2
  28. package/dist/{chunk-IS6JUDDY.js → chunk-6VVBG4BF.js} +44 -20
  29. package/dist/chunk-6VVBG4BF.js.map +1 -0
  30. package/dist/{chunk-OLI2A3EM.js → chunk-74TIEA6X.js} +2 -2
  31. package/dist/{chunk-N756UO52.js → chunk-AWIZJQXW.js} +68 -65
  32. package/dist/chunk-AWIZJQXW.js.map +1 -0
  33. package/dist/{chunk-SLT5Q37C.js → chunk-B6YDXIZW.js} +5 -3
  34. package/dist/{chunk-SLT5Q37C.js.map → chunk-B6YDXIZW.js.map} +1 -1
  35. package/dist/{chunk-7GM7UQXD.js → chunk-BB2SVMEV.js} +46 -8
  36. package/dist/chunk-BB2SVMEV.js.map +1 -0
  37. package/dist/{chunk-BT5WEZO5.js → chunk-CUMZV32B.js} +5 -5
  38. package/dist/chunk-CUMZV32B.js.map +1 -0
  39. package/dist/{chunk-OFMORNBO.js → chunk-CZSMZRAV.js} +23 -6
  40. package/dist/chunk-CZSMZRAV.js.map +1 -0
  41. package/dist/{chunk-HVU46DDA.js → chunk-FRCIPTUD.js} +13 -2
  42. package/dist/chunk-FRCIPTUD.js.map +1 -0
  43. package/dist/{chunk-CEMXB7LA.js → chunk-I5ZIKJVN.js} +2 -2
  44. package/dist/{chunk-4PSDYKZQ.js → chunk-K3UBSTJ5.js} +12 -9
  45. package/dist/chunk-K3UBSTJ5.js.map +1 -0
  46. package/dist/{chunk-Z2BTIAOC.js → chunk-MPZ3CW5C.js} +1 -1
  47. package/dist/chunk-MPZ3CW5C.js.map +1 -0
  48. package/dist/{chunk-MTFSQWZ6.js → chunk-V4JGVBUN.js} +22 -2
  49. package/dist/chunk-V4JGVBUN.js.map +1 -0
  50. package/dist/{chunk-OQJSZSYB.js → chunk-WNVIKTJK.js} +2 -2
  51. package/dist/{chunk-BEFNWUOZ.js → chunk-YZ3POK7G.js} +374 -316
  52. package/dist/chunk-YZ3POK7G.js.map +1 -0
  53. package/dist/claudecode-flat-filled-NHO4JCVK.svg +10 -0
  54. package/dist/codex-flat-filled-WYHCF5VR.svg +10 -0
  55. package/dist/context-mention-palette/index.js +8 -8
  56. package/dist/handoff-lined-4WQUBVG3.svg +11 -0
  57. package/dist/i18n/index.d.ts +43 -19
  58. package/dist/i18n/index.js +2 -2
  59. package/dist/index.d.ts +40 -16
  60. package/dist/index.js +1357 -501
  61. package/dist/index.js.map +1 -1
  62. package/dist/queued-prompt-runtime.d.ts +2 -2
  63. package/dist/{types-BsHvTjIZ.d.ts → types-DSc2ta3s.d.ts} +1 -1
  64. package/dist/workbench/contribution.d.ts +4 -8
  65. package/dist/workbench/contribution.js +9 -7
  66. package/dist/workbench/index.d.ts +4 -4
  67. package/dist/workbench/index.js +10 -12
  68. package/dist/workbench/launch.d.ts +6 -7
  69. package/dist/workbench/launch.js +2 -4
  70. package/dist/workbench/providerCatalog.d.ts +1 -1
  71. package/dist/workbench/sessionTitle.d.ts +1 -1
  72. package/dist/workbench/sessionTitle.js +3 -3
  73. package/dist/workbench/state.d.ts +1 -1
  74. package/dist/workbench/state.js +2 -2
  75. package/dist/workbench/types.d.ts +3 -1
  76. package/dist/workbench/types.js +1 -1
  77. package/dist/workspace-agent-generated-files.js +3 -3
  78. package/package.json +12 -12
  79. package/dist/@-lined-14px-64O2KKB4.svg +0 -3
  80. package/dist/chunk-4PSDYKZQ.js.map +0 -1
  81. package/dist/chunk-7GM7UQXD.js.map +0 -1
  82. package/dist/chunk-BEFNWUOZ.js.map +0 -1
  83. package/dist/chunk-BT5WEZO5.js.map +0 -1
  84. package/dist/chunk-HVU46DDA.js.map +0 -1
  85. package/dist/chunk-IS6JUDDY.js.map +0 -1
  86. package/dist/chunk-MTFSQWZ6.js.map +0 -1
  87. package/dist/chunk-N756UO52.js.map +0 -1
  88. package/dist/chunk-OFMORNBO.js.map +0 -1
  89. package/dist/chunk-Z2BTIAOC.js.map +0 -1
  90. /package/dist/{chunk-5SRRKWE4.js.map → chunk-24CUBQKJ.js.map} +0 -0
  91. /package/dist/{chunk-NX6T3DDS.js.map → chunk-2LGUBUEJ.js.map} +0 -0
  92. /package/dist/{chunk-UCCUIUGK.js.map → chunk-4OPTXOOZ.js.map} +0 -0
  93. /package/dist/{chunk-Q75AK47T.js.map → chunk-5WB3NGIN.js.map} +0 -0
  94. /package/dist/{chunk-2WUDORCV.js.map → chunk-6TEPDMX6.js.map} +0 -0
  95. /package/dist/{chunk-OLI2A3EM.js.map → chunk-74TIEA6X.js.map} +0 -0
  96. /package/dist/{chunk-CEMXB7LA.js.map → chunk-I5ZIKJVN.js.map} +0 -0
  97. /package/dist/{chunk-OQJSZSYB.js.map → chunk-WNVIKTJK.js.map} +0 -0
package/dist/index.js CHANGED
@@ -9,20 +9,21 @@ import {
9
9
  resolveAgentGUIExpandedWindowFrame,
10
10
  resolveNextAgentGUIConversationRailWidthPx,
11
11
  shouldAutoCollapseAgentGUIConversationRail
12
- } from "./chunk-Q75AK47T.js";
12
+ } from "./chunk-5WB3NGIN.js";
13
13
  import {
14
14
  agentGUIDefaultTargetProviders,
15
15
  agentGUIProviderTargetRefsEqual,
16
+ createDisabledPlaceholderAgentGUIProviderTarget,
16
17
  createLocalAgentGUIProviderTarget,
17
18
  createLocalAgentGUIProviderTargets,
18
19
  localAgentGUIProviderTargetId,
19
20
  normalizeAgentGUIProviderTargets,
20
21
  resolveAgentGUIProviderTarget
21
- } from "./chunk-7GM7UQXD.js";
22
+ } from "./chunk-BB2SVMEV.js";
22
23
  import {
23
24
  AgentInteractivePromptSurface,
24
25
  approvalOptionDisplayLabel
25
- } from "./chunk-OFMORNBO.js";
26
+ } from "./chunk-CZSMZRAV.js";
26
27
  import {
27
28
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
28
29
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -41,7 +42,7 @@ import {
41
42
  resolveAgentGUIExplicitConversationTitle,
42
43
  resolveAgentGUIProviderDisplayLabel,
43
44
  resolveAgentGUIProviderIdentity
44
- } from "./chunk-UCCUIUGK.js";
45
+ } from "./chunk-4OPTXOOZ.js";
45
46
  import {
46
47
  AgentConversationFlow,
47
48
  Button,
@@ -62,14 +63,14 @@ import {
62
63
  skillTriggerForPrefix,
63
64
  toLocalShortDateTime,
64
65
  useProjectedAgentConversation
65
- } from "./chunk-BEFNWUOZ.js";
66
+ } from "./chunk-YZ3POK7G.js";
66
67
  import {
67
68
  AgentMessageMarkdown,
68
69
  AgentTargetPresentationProvider,
69
70
  ZoomableImage,
70
71
  cn,
71
72
  resolveWorkspaceLinkAction
72
- } from "./chunk-SLT5Q37C.js";
73
+ } from "./chunk-B6YDXIZW.js";
73
74
  import {
74
75
  openAgentEnvPanel
75
76
  } from "./chunk-PSLAWU25.js";
@@ -80,7 +81,7 @@ import {
80
81
  DEFAULT_AGENT_MENTION_FILTER,
81
82
  agentMentionItemKey,
82
83
  preloadAgentMentionBrowse
83
- } from "./chunk-BT5WEZO5.js";
84
+ } from "./chunk-CUMZV32B.js";
84
85
  import {
85
86
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
86
87
  buildWorkspaceAgentActivityListViewModel,
@@ -90,10 +91,10 @@ import {
90
91
  isWorkspaceAgentUntitledTask,
91
92
  mergeWorkspaceAgentActivityDurableAndOverlayMessages,
92
93
  selectWorkspaceAgentActivityOverlayMessages
93
- } from "./chunk-CEMXB7LA.js";
94
+ } from "./chunk-I5ZIKJVN.js";
94
95
  import {
95
96
  Spinner
96
- } from "./chunk-OLI2A3EM.js";
97
+ } from "./chunk-74TIEA6X.js";
97
98
  import {
98
99
  resolveWorkspaceAgentSessionSortTimeUnixMs
99
100
  } from "./chunk-IBIMGLCD.js";
@@ -104,7 +105,7 @@ import {
104
105
  mentionItemToAttrs,
105
106
  normalizeAgentSessionMentionTitle,
106
107
  parseMentionItemFromHref
107
- } from "./chunk-NX6T3DDS.js";
108
+ } from "./chunk-2LGUBUEJ.js";
108
109
  import "./chunk-Y35GDLP2.js";
109
110
  import "./chunk-LUGELG5V.js";
110
111
  import {
@@ -112,6 +113,7 @@ import {
112
113
  AgentActivityRuntimeProvider,
113
114
  MANAGED_AGENT_ICON_FALLBACK_URL,
114
115
  MANAGED_AGENT_ICON_URLS,
116
+ MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS,
115
117
  getAgentActivityRuntime,
116
118
  getAgentCustomMentionKind,
117
119
  getOptionalAgentActivityRuntime,
@@ -126,7 +128,7 @@ import {
126
128
  useAgentHostApi,
127
129
  useOptionalAgentActivityRuntime,
128
130
  useOptionalAgentHostApi
129
- } from "./chunk-HVU46DDA.js";
131
+ } from "./chunk-FRCIPTUD.js";
130
132
  import "./chunk-TYGL25EL.js";
131
133
  import {
132
134
  AgentGuiI18nProvider,
@@ -134,10 +136,10 @@ import {
134
136
  agentGuiI18nResources,
135
137
  translate,
136
138
  useTranslation
137
- } from "./chunk-5SRRKWE4.js";
139
+ } from "./chunk-24CUBQKJ.js";
138
140
  import "./chunk-PJP5BUU6.js";
139
- import "./chunk-MTFSQWZ6.js";
140
- import "./chunk-IS6JUDDY.js";
141
+ import "./chunk-V4JGVBUN.js";
142
+ import "./chunk-6VVBG4BF.js";
141
143
  import {
142
144
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
143
145
  } from "./chunk-JM24HADP.js";
@@ -310,7 +312,7 @@ import { memo as memo3 } from "react";
310
312
  import { TooltipProvider as TooltipProvider3 } from "@tutti-os/ui-system";
311
313
 
312
314
  // agent-gui/agentGuiNode/AgentGUINode.tsx
313
- import { memo as memo2, useCallback as useCallback12, useEffect as useEffect14, useMemo as useMemo11 } from "react";
315
+ import { memo as memo2, useCallback as useCallback12, useEffect as useEffect15, useMemo as useMemo11 } from "react";
314
316
  import { createWorkspaceUserProjectI18nRuntime } from "@tutti-os/workspace-user-project/i18n";
315
317
  import { createWorkspaceFileManagerI18nRuntime } from "@tutti-os/workspace-file-manager";
316
318
 
@@ -6653,6 +6655,28 @@ function nodeDataFromComposerSettings(current, settings) {
6653
6655
  };
6654
6656
  }
6655
6657
 
6658
+ // agent-gui/agentGuiNode/controller/agentGuiController.sessionHelpers.ts
6659
+ function mergeAgentSessionControlStateSnapshot(current, snapshot3) {
6660
+ const incomingUsage = recordValue2(snapshot3.runtimeContext?.usage);
6661
+ if (incomingUsage || !current) {
6662
+ return snapshot3;
6663
+ }
6664
+ const previousUsage = recordValue2(current.runtimeContext?.usage);
6665
+ if (!previousUsage) {
6666
+ return snapshot3;
6667
+ }
6668
+ return {
6669
+ ...snapshot3,
6670
+ runtimeContext: {
6671
+ ...snapshot3.runtimeContext ?? {},
6672
+ usage: previousUsage
6673
+ }
6674
+ };
6675
+ }
6676
+ function recordValue2(value) {
6677
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
6678
+ }
6679
+
6656
6680
  // agent-gui/agentGuiNode/controller/useAgentGUINodeController.ts
6657
6681
  var EMPTY_AGENT_GUI_MESSAGES = [];
6658
6682
  var EMPTY_AGENT_GUI_AVAILABLE_COMMANDS = [];
@@ -7849,7 +7873,7 @@ function hasRejectedApprovalDecision(timelineItems) {
7849
7873
  if (status !== "completed") {
7850
7874
  return false;
7851
7875
  }
7852
- const output = recordValue2(payload.output);
7876
+ const output = recordValue3(payload.output);
7853
7877
  return isRejectedApprovalDecision(output);
7854
7878
  });
7855
7879
  }
@@ -7982,7 +8006,7 @@ function normalizeAgentGUIOpenSessionRequest(request) {
7982
8006
  sequence: request.sequence
7983
8007
  };
7984
8008
  }
7985
- function recordValue2(value) {
8009
+ function recordValue3(value) {
7986
8010
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
7987
8011
  }
7988
8012
  function numberValue(value) {
@@ -7996,7 +8020,7 @@ function numberValue(value) {
7996
8020
  return null;
7997
8021
  }
7998
8022
  function activeBackgroundAgentCount(runtimeContext) {
7999
- const backgroundAgents = recordValue2(runtimeContext?.backgroundAgents);
8023
+ const backgroundAgents = recordValue3(runtimeContext?.backgroundAgents);
8000
8024
  if (!backgroundAgents) {
8001
8025
  return 0;
8002
8026
  }
@@ -8006,7 +8030,7 @@ function activeBackgroundAgentCount(runtimeContext) {
8006
8030
  return count === null ? 0 : Math.max(0, Math.floor(count));
8007
8031
  }
8008
8032
  return items.filter((item) => {
8009
- const record = recordValue2(item);
8033
+ const record = recordValue3(item);
8010
8034
  if (!record) {
8011
8035
  return false;
8012
8036
  }
@@ -8021,7 +8045,7 @@ function activeBackgroundAgentCount(runtimeContext) {
8021
8045
  }).length;
8022
8046
  }
8023
8047
  function appServerStartupMetadata(runtimeContext) {
8024
- return recordValue2(runtimeContext?.appServerStartup);
8048
+ return recordValue3(runtimeContext?.appServerStartup);
8025
8049
  }
8026
8050
  function isAppServerStartupLoading(runtimeContext, key) {
8027
8051
  return appServerStartupMetadata(runtimeContext)?.[key] === "loading";
@@ -8043,6 +8067,24 @@ function modelSelectionFromComposerOptions(options, currentValue) {
8043
8067
  currentValue
8044
8068
  };
8045
8069
  }
8070
+ function configOptionCurrentValue(runtimeContext, ids) {
8071
+ const rawConfigOptions = Array.isArray(runtimeContext?.configOptions) ? runtimeContext.configOptions : [];
8072
+ const idSet = new Set(ids);
8073
+ for (const rawOption of rawConfigOptions) {
8074
+ const option = recordValue3(rawOption);
8075
+ if (!option) {
8076
+ continue;
8077
+ }
8078
+ const id = normalizeOptionalText2(option.id);
8079
+ if (!id || !idSet.has(id)) {
8080
+ continue;
8081
+ }
8082
+ return normalizeOptionalText2(
8083
+ option.currentValue ?? option.current_value
8084
+ );
8085
+ }
8086
+ return null;
8087
+ }
8046
8088
  function reasoningSelectionFromComposerOptions(options, currentValue) {
8047
8089
  if (!options) {
8048
8090
  return null;
@@ -8741,7 +8783,6 @@ function useAgentGUINodeController({
8741
8783
  workspacePath,
8742
8784
  avoidGroupingEdits,
8743
8785
  data,
8744
- conversationScope = "single-provider",
8745
8786
  providerTargets,
8746
8787
  providerTargetsLoading = false,
8747
8788
  providerReadinessGates = null,
@@ -8759,23 +8800,35 @@ function useAgentGUINodeController({
8759
8800
  const agentActivitySnapshot = useAgentActivitySnapshot(workspaceId);
8760
8801
  const normalizedExplicitProviderTargets = useMemo4(
8761
8802
  () => normalizeAgentGUIProviderTargets(providerTargets, {
8762
- fallbackToLocal: false
8803
+ includeDisabledPlaceholders: true,
8804
+ useStaticCatalog: false
8763
8805
  }),
8764
8806
  [providerTargets]
8765
8807
  );
8766
- const normalizedProviderTargets = useMemo4(
8767
- () => providerTargetsLoading ? [] : providerTargets === void 0 ? normalizeAgentGUIProviderTargets(null) : normalizedExplicitProviderTargets,
8768
- [normalizedExplicitProviderTargets, providerTargets, providerTargetsLoading]
8769
- );
8770
- const shouldFallbackToLocalProviderTargets = providerTargets === void 0 && !providerTargetsLoading;
8808
+ const normalizedProviderTargets = useMemo4(() => {
8809
+ if (providerTargetsLoading) {
8810
+ return [];
8811
+ }
8812
+ if (providerTargets === void 0 || normalizedExplicitProviderTargets.length === 0) {
8813
+ return normalizeAgentGUIProviderTargets(null, {
8814
+ includeDisabledPlaceholders: true
8815
+ });
8816
+ }
8817
+ return normalizedExplicitProviderTargets;
8818
+ }, [
8819
+ normalizedExplicitProviderTargets,
8820
+ providerTargets,
8821
+ providerTargetsLoading
8822
+ ]);
8823
+ const shouldUseStaticProviderTargets = !providerTargetsLoading && (providerTargets === void 0 || normalizedExplicitProviderTargets.length === 0);
8771
8824
  const selectedProviderTarget = useMemo4(() => {
8772
8825
  const resolved = resolveAgentGUIProviderTarget({
8773
8826
  agentTargetId: data.agentTargetId,
8774
8827
  defaultProviderTargetId,
8775
- fallbackToLocal: shouldFallbackToLocalProviderTargets,
8776
8828
  provider: data.provider,
8777
8829
  providerTargetId: data.providerTargetId,
8778
- providerTargets: normalizedProviderTargets
8830
+ providerTargets: normalizedProviderTargets,
8831
+ useStaticCatalog: shouldUseStaticProviderTargets
8779
8832
  });
8780
8833
  return resolved ?? {
8781
8834
  targetId: data.agentTargetId ?? "__loading__",
@@ -8793,7 +8846,7 @@ function useAgentGUINodeController({
8793
8846
  data.providerTargetId,
8794
8847
  defaultProviderTargetId,
8795
8848
  normalizedProviderTargets,
8796
- shouldFallbackToLocalProviderTargets
8849
+ shouldUseStaticProviderTargets
8797
8850
  ]);
8798
8851
  const selectedProviderTargetIsExplicit = useMemo4(
8799
8852
  () => normalizedExplicitProviderTargets.some(
@@ -8870,14 +8923,6 @@ function useAgentGUINodeController({
8870
8923
  );
8871
8924
  const conversationFilterRef = useRef4(conversationFilter);
8872
8925
  conversationFilterRef.current = conversationFilter;
8873
- const canUseConversationTargetFilter = conversationScope === "multi-provider";
8874
- const queryConversationFilter = canUseConversationTargetFilter ? conversationFilter : null;
8875
- useEffect4(() => {
8876
- if (canUseConversationTargetFilter || conversationFilter.kind === "all") {
8877
- return;
8878
- }
8879
- setConversationFilter({ kind: "all" });
8880
- }, [canUseConversationTargetFilter, conversationFilter]);
8881
8926
  const conversationListQuery = useMemo4(() => {
8882
8927
  const userId = currentUserId?.trim() ?? "";
8883
8928
  const provider = data.provider?.trim() ?? "";
@@ -8885,13 +8930,13 @@ function useAgentGUINodeController({
8885
8930
  return null;
8886
8931
  }
8887
8932
  return {
8888
- ...queryConversationFilter ? { conversationFilter: queryConversationFilter } : {},
8933
+ conversationFilter,
8889
8934
  workspaceId,
8890
8935
  userId,
8891
8936
  provider: data.provider,
8892
8937
  sessionOrigin: AGENT_GUI_RUNTIME_SESSION_ORIGIN
8893
8938
  };
8894
- }, [currentUserId, data.provider, queryConversationFilter, workspaceId]);
8939
+ }, [currentUserId, data.provider, conversationFilter, workspaceId]);
8895
8940
  const conversationListState = useAgentGuiConversationList(
8896
8941
  conversationListQuery
8897
8942
  );
@@ -9002,6 +9047,10 @@ function useAgentGUINodeController({
9002
9047
  composerOptions: providerComposerOptions,
9003
9048
  sessionRuntimeContext: activeSessionState?.runtimeContext
9004
9049
  });
9050
+ const goalPauseSupported = resolveAgentActivityCapability2("goalPause", {
9051
+ composerOptions: providerComposerOptions,
9052
+ sessionRuntimeContext: activeSessionState?.runtimeContext
9053
+ }) ?? false;
9005
9054
  const activeSessionRuntimeContext = activeSessionState?.runtimeContext;
9006
9055
  const backgroundAgentCount = useMemo4(
9007
9056
  () => activeBackgroundAgentCount(activeSessionRuntimeContext),
@@ -10253,9 +10302,9 @@ function useAgentGUINodeController({
10253
10302
  ...sessionStateSnapshotCauseBySessionIdRef.current,
10254
10303
  [agentSessionId]: cause ? { source: cause.source } : void 0
10255
10304
  };
10256
- setAgentSessionViewControlState(
10305
+ updateAgentSessionViewControlState(
10257
10306
  sessionViewRef(agentSessionId),
10258
- snapshot3
10307
+ (current) => mergeAgentSessionControlStateSnapshot(current, snapshot3)
10259
10308
  );
10260
10309
  } catch (error) {
10261
10310
  if (!isMountedRef.current || cause?.allowInactive !== true && activeConversationIdRef.current !== agentSessionId) {
@@ -11924,13 +11973,13 @@ function useAgentGUINodeController({
11924
11973
  setDetailError(null);
11925
11974
  persistActiveConversation(null);
11926
11975
  const filter = conversationFilterRef.current;
11927
- if (canUseConversationTargetFilter && filter.kind === "agentTarget") {
11976
+ if (filter.kind === "agentTarget") {
11928
11977
  const filterTarget = resolveAgentGUIProviderTarget({
11929
11978
  agentTargetId: filter.agentTargetId,
11930
11979
  defaultProviderTargetId,
11931
- fallbackToLocal: false,
11932
11980
  provider: dataRef.current.provider,
11933
- providerTargets: normalizedProviderTargets
11981
+ providerTargets: normalizedProviderTargets,
11982
+ useStaticCatalog: false
11934
11983
  });
11935
11984
  if (filterTarget && filterTarget.disabled !== true && (filterTarget.agentTargetId?.trim() ?? "") === filter.agentTargetId) {
11936
11985
  setHomeComposerTargetOverride(filterTarget);
@@ -11941,7 +11990,6 @@ function useAgentGUINodeController({
11941
11990
  [
11942
11991
  activation,
11943
11992
  agentActivityRuntime,
11944
- canUseConversationTargetFilter,
11945
11993
  defaultProviderTargetId,
11946
11994
  loadDraftComposerOptions,
11947
11995
  normalizedProviderTargets,
@@ -11987,13 +12035,12 @@ function useAgentGUINodeController({
11987
12035
  setActiveConversationId(null);
11988
12036
  setIsLoadingMessages(false);
11989
12037
  setDetailError(null);
11990
- const targetData = selectedComposerTargetDataRef.current;
12038
+ const selectedTargetData = selectedComposerTargetDataRef.current;
12039
+ const targetProvider = prefillPromptRequest.provider ?? selectedTargetData.provider;
12040
+ const targetAgentTargetId = prefillPromptRequest.agentTargetId ?? selectedTargetData.agentTargetId;
11991
12041
  setDraftBySessionId((current) => ({
11992
12042
  ...current,
11993
- [nodeDefaultDraftContentKey(
11994
- targetData.provider,
11995
- targetData.agentTargetId
11996
- )]: {
12043
+ [nodeDefaultDraftContentKey(targetProvider, targetAgentTargetId)]: {
11997
12044
  ...emptyAgentComposerDraft(),
11998
12045
  prompt: draftPrompt2
11999
12046
  }
@@ -12514,6 +12561,36 @@ function useAgentGUINodeController({
12514
12561
  shouldQueuePromptLocally
12515
12562
  ]
12516
12563
  );
12564
+ const goalControl = useCallback4(
12565
+ (action, objective) => {
12566
+ if (previewMode) {
12567
+ return;
12568
+ }
12569
+ const agentSessionId = activeConversationIdRef.current;
12570
+ if (!agentSessionId) {
12571
+ return;
12572
+ }
12573
+ setDetailError(null);
12574
+ void agentActivityRuntime.goalControl({
12575
+ workspaceId,
12576
+ agentSessionId,
12577
+ action,
12578
+ ...objective !== void 0 ? { objective } : {}
12579
+ }).catch((error) => {
12580
+ if (!isCurrentConversation(agentSessionId)) {
12581
+ return;
12582
+ }
12583
+ setDetailError(getAgentGUIErrorMessage(error));
12584
+ });
12585
+ },
12586
+ [
12587
+ agentActivityRuntime,
12588
+ isCurrentConversation,
12589
+ previewMode,
12590
+ setDetailError,
12591
+ workspaceId
12592
+ ]
12593
+ );
12517
12594
  const submitPrompt = useCallback4(
12518
12595
  (content, displayPrompt) => {
12519
12596
  if (previewMode) {
@@ -12875,10 +12952,12 @@ function useAgentGUINodeController({
12875
12952
  }).then((result) => {
12876
12953
  const queuedUpdate = queuedComposerSettingsUpdatesRef.current[agentSessionId] ?? null;
12877
12954
  const optimisticSettings = queuedUpdate?.sessionSettingsPatch ?? null;
12878
- const nextAppliedSettings = optimisticSettings ? {
12955
+ const pendingClaudeModelRefreshSettings = dataRef.current.provider === "claude-code" && sessionSettingsPatch.model !== void 0 ? { model: sessionSettingsPatch.model } : null;
12956
+ const nextAppliedSettings = {
12879
12957
  ...result.settings,
12880
- ...optimisticSettings
12881
- } : result.settings;
12958
+ ...pendingClaudeModelRefreshSettings ?? {},
12959
+ ...optimisticSettings ?? {}
12960
+ };
12882
12961
  updateAgentSessionViewControlState(
12883
12962
  sessionViewRef(agentSessionId),
12884
12963
  (existing) => existing ? {
@@ -13787,9 +13866,9 @@ function useAgentGUINodeController({
13787
13866
  const sessionTarget = resolveAgentGUIProviderTarget({
13788
13867
  agentTargetId: summaryAgentTargetId,
13789
13868
  defaultProviderTargetId,
13790
- fallbackToLocal: shouldFallbackToLocalProviderTargets,
13791
13869
  provider: summary.provider,
13792
- providerTargets: normalizedProviderTargets
13870
+ providerTargets: normalizedProviderTargets,
13871
+ useStaticCatalog: shouldUseStaticProviderTargets
13793
13872
  });
13794
13873
  if (!sessionTarget || sessionTarget.provider !== summary.provider) {
13795
13874
  return;
@@ -13824,7 +13903,7 @@ function useAgentGUINodeController({
13824
13903
  normalizedProviderTargets,
13825
13904
  previewMode,
13826
13905
  providerTargetsLoading,
13827
- shouldFallbackToLocalProviderTargets
13906
+ shouldUseStaticProviderTargets
13828
13907
  ]);
13829
13908
  const visibleConversationsRef = useRef4(
13830
13909
  null
@@ -14148,7 +14227,8 @@ function useAgentGUINodeController({
14148
14227
  )
14149
14228
  });
14150
14229
  const draftSettings = activeConversationId ? sessionSettings ?? defaultConversationDraftSettings : homeComposerSettings;
14151
- const draftModel = normalizeOptionalText2(draftSettings.model);
14230
+ const liveConfigModel = activeConversationId !== null ? configOptionCurrentValue(activeSessionRuntimeContext, ["model"]) : null;
14231
+ const draftModel = liveConfigModel ?? normalizeOptionalText2(draftSettings.model);
14152
14232
  const draftReasoningEffort = normalizeOptionalText2(
14153
14233
  draftSettings.reasoningEffort
14154
14234
  );
@@ -14411,15 +14491,11 @@ function useAgentGUINodeController({
14411
14491
  const stableComposerSettings = useStableComposerSettingsVM(composerSettings);
14412
14492
  const updateConversationFilter = useCallback4(
14413
14493
  (filter) => {
14414
- if (!canUseConversationTargetFilter) {
14415
- setConversationFilter({ kind: "all" });
14416
- return;
14417
- }
14418
14494
  setConversationFilter(normalizeAgentGUIConversationFilter(filter));
14419
14495
  },
14420
- [canUseConversationTargetFilter]
14496
+ []
14421
14497
  );
14422
- const selectProvider = useCallback4(
14498
+ const selectHomeComposerAgentTarget = useCallback4(
14423
14499
  (input) => {
14424
14500
  if (previewMode) {
14425
14501
  return;
@@ -14427,17 +14503,14 @@ function useAgentGUINodeController({
14427
14503
  const nextProvider = input.provider;
14428
14504
  const nextTarget = resolveAgentGUIProviderTarget({
14429
14505
  defaultProviderTargetId,
14430
- fallbackToLocal: shouldFallbackToLocalProviderTargets,
14431
14506
  provider: nextProvider,
14432
14507
  providerTargetId: input.providerTargetId,
14433
- providerTargets: normalizedProviderTargets
14508
+ providerTargets: normalizedProviderTargets,
14509
+ useStaticCatalog: shouldUseStaticProviderTargets
14434
14510
  });
14435
14511
  if (!nextTarget) {
14436
14512
  return;
14437
14513
  }
14438
- if (nextTarget.disabled === true) {
14439
- return;
14440
- }
14441
14514
  const nextTargetIsExplicit = normalizedExplicitProviderTargets.some(
14442
14515
  (target) => target.provider === nextTarget.provider && target.targetId === nextTarget.targetId && agentGUIProviderTargetRefsEqual(target.ref, nextTarget.ref)
14443
14516
  );
@@ -14481,7 +14554,9 @@ function useAgentGUINodeController({
14481
14554
  dataRef.current = nextData;
14482
14555
  return nextData;
14483
14556
  });
14484
- loadComposerOptionsForTarget(nextTargetData, { force: true });
14557
+ if (nextTarget.disabled !== true) {
14558
+ loadComposerOptionsForTarget(nextTargetData, { force: true });
14559
+ }
14485
14560
  },
14486
14561
  [
14487
14562
  activation,
@@ -14491,21 +14566,17 @@ function useAgentGUINodeController({
14491
14566
  normalizedProviderTargets,
14492
14567
  persistActiveConversation,
14493
14568
  previewMode,
14494
- shouldFallbackToLocalProviderTargets
14569
+ shouldUseStaticProviderTargets
14495
14570
  ]
14496
14571
  );
14497
14572
  const selectConversationFilterTarget = useCallback4(
14498
14573
  (input) => {
14499
- if (!canUseConversationTargetFilter) {
14500
- setConversationFilter({ kind: "all" });
14501
- return;
14502
- }
14503
14574
  const nextTarget = resolveAgentGUIProviderTarget({
14504
14575
  defaultProviderTargetId,
14505
- fallbackToLocal: shouldFallbackToLocalProviderTargets,
14506
14576
  provider: input.provider,
14507
14577
  providerTargetId: input.providerTargetId,
14508
- providerTargets: normalizedProviderTargets
14578
+ providerTargets: normalizedProviderTargets,
14579
+ useStaticCatalog: shouldUseStaticProviderTargets
14509
14580
  });
14510
14581
  if (!nextTarget || nextTarget.disabled === true) {
14511
14582
  reportAgentGUIConversationFilterTargetUnresolved({
@@ -14518,29 +14589,32 @@ function useAgentGUINodeController({
14518
14589
  });
14519
14590
  return;
14520
14591
  }
14521
- if (activeConversationIdRef.current === null) {
14522
- setHomeComposerTargetOverride(nextTarget);
14523
- }
14524
14592
  const agentTargetId = nextTarget.agentTargetId?.trim() ?? "";
14525
14593
  const nextFilter = agentTargetId ? { kind: "agentTarget", agentTargetId } : { kind: "all" };
14526
14594
  setConversationFilter(nextFilter);
14595
+ if (activeConversationIdRef.current === null) {
14596
+ selectHomeComposerAgentTarget(input);
14597
+ }
14527
14598
  },
14528
14599
  [
14529
14600
  agentActivityRuntime,
14530
- canUseConversationTargetFilter,
14531
14601
  defaultProviderTargetId,
14532
14602
  normalizedProviderTargets,
14533
- shouldFallbackToLocalProviderTargets,
14603
+ selectHomeComposerAgentTarget,
14604
+ shouldUseStaticProviderTargets,
14534
14605
  workspaceId
14535
14606
  ]
14536
14607
  );
14537
14608
  const stableCreateConversation = useStableControllerEventCallback(createConversation);
14538
- const stableSelectProvider = useStableControllerEventCallback(selectProvider);
14609
+ const stableSelectHomeComposerAgentTarget = useStableControllerEventCallback(
14610
+ selectHomeComposerAgentTarget
14611
+ );
14539
14612
  const stableSelectConversationFilterTarget = useStableControllerEventCallback(
14540
14613
  selectConversationFilterTarget
14541
14614
  );
14542
14615
  const stableSelectConversation = useStableControllerEventCallback(selectConversation);
14543
14616
  const stableSubmitPrompt = useStableControllerEventCallback(submitPrompt);
14617
+ const stableGoalControl = useStableControllerEventCallback(goalControl);
14544
14618
  const stableSubmitGuidancePrompt = useStableControllerEventCallback(submitGuidancePrompt);
14545
14619
  const stableShowPromptImagesUnsupported = useStableControllerEventCallback(
14546
14620
  showPromptImagesUnsupported
@@ -14598,10 +14672,11 @@ function useAgentGUINodeController({
14598
14672
  () => ({
14599
14673
  updateConversationFilter: stableUpdateConversationFilter,
14600
14674
  selectConversationFilterTarget: stableSelectConversationFilterTarget,
14601
- selectProvider: stableSelectProvider,
14675
+ selectHomeComposerAgentTarget: stableSelectHomeComposerAgentTarget,
14602
14676
  createConversation: stableCreateConversation,
14603
14677
  selectConversation: stableSelectConversation,
14604
14678
  submitPrompt: stableSubmitPrompt,
14679
+ goalControl: stableGoalControl,
14605
14680
  submitGuidancePrompt: stableSubmitGuidancePrompt,
14606
14681
  loadOlderConversationMessages: stableLoadOlderConversationMessages,
14607
14682
  showPromptImagesUnsupported: stableShowPromptImagesUnsupported,
@@ -14646,13 +14721,14 @@ function useAgentGUINodeController({
14646
14721
  stableRetryOpenclawGateway,
14647
14722
  stableSelectConversation,
14648
14723
  stableSelectConversationFilterTarget,
14649
- stableSelectProvider,
14724
+ stableSelectHomeComposerAgentTarget,
14650
14725
  stableSendQueuedPromptNext,
14651
14726
  stableSubmitGuidancePrompt,
14652
14727
  stableShowPromptImagesUnsupported,
14653
14728
  stableSubmitApprovalOption,
14654
14729
  stableSubmitInteractivePrompt,
14655
14730
  stableSubmitPrompt,
14731
+ stableGoalControl,
14656
14732
  stableToggleConversationPinned,
14657
14733
  stableUpdateConversationFilter,
14658
14734
  stableUpdateComposerSettings,
@@ -14670,7 +14746,6 @@ function useAgentGUINodeController({
14670
14746
  selectedProviderTarget: effectiveSelectedProviderTarget,
14671
14747
  providerTargets: normalizedProviderTargets,
14672
14748
  providerTargetsLoading,
14673
- conversationScope,
14674
14749
  conversationFilter,
14675
14750
  conversations: visibleConversations,
14676
14751
  userProjects,
@@ -14691,6 +14766,7 @@ function useAgentGUINodeController({
14691
14766
  isRespondingApproval,
14692
14767
  promptImagesSupported,
14693
14768
  compactSupported,
14769
+ goalPauseSupported,
14694
14770
  usage,
14695
14771
  backgroundAgentCount,
14696
14772
  listError,
@@ -14735,7 +14811,6 @@ function useAgentGUINodeController({
14735
14811
  canSubmit,
14736
14812
  canQueueWhileBusy,
14737
14813
  conversation,
14738
- conversationScope,
14739
14814
  conversationFilter,
14740
14815
  conversationDetail,
14741
14816
  controllerActions,
@@ -14751,6 +14826,7 @@ function useAgentGUINodeController({
14751
14826
  openclawGateway,
14752
14827
  promptImagesSupported,
14753
14828
  compactSupported,
14829
+ goalPauseSupported,
14754
14830
  usage,
14755
14831
  backgroundAgentCount,
14756
14832
  isInterrupting,
@@ -14967,19 +15043,19 @@ import {
14967
15043
  Fragment as Fragment7,
14968
15044
  memo,
14969
15045
  useCallback as useCallback10,
14970
- useEffect as useEffect12,
15046
+ useEffect as useEffect13,
14971
15047
  useLayoutEffect as useLayoutEffect4,
14972
15048
  useMemo as useMemo10,
14973
15049
  useRef as useRef12,
14974
- useState as useState11
15050
+ useState as useState12
14975
15051
  } from "react";
14976
15052
  import { useSnapshot } from "valtio";
14977
15053
  import { proxy as proxy2 } from "valtio/vanilla";
14978
15054
  import {
14979
15055
  ChevronRight as ChevronRight2,
15056
+ ChevronsDown,
14980
15057
  ExternalLink,
14981
15058
  Info as Info2,
14982
- LayoutGrid,
14983
15059
  Wrench
14984
15060
  } from "lucide-react";
14985
15061
 
@@ -15051,6 +15127,10 @@ import {
15051
15127
  TooltipContent as TooltipContent3,
15052
15128
  TooltipProvider as TooltipProvider2,
15053
15129
  TooltipTrigger as TooltipTrigger3,
15130
+ Select as Select3,
15131
+ SelectContent as SelectContent3,
15132
+ SelectItem as SelectItem3,
15133
+ SelectTrigger as SelectTrigger3,
15054
15134
  NewWorkspaceLinedIcon as NewWorkspaceLinedIcon2,
15055
15135
  ConfirmationDialog,
15056
15136
  toastVariants,
@@ -15730,7 +15810,9 @@ var styles2 = {
15730
15810
  chromeActions: "agent-gui-chrome__actions",
15731
15811
  chromeMetaRow: "agent-gui-chrome__meta-row",
15732
15812
  chromeDangerGhostButton: "agent-gui-chrome__danger-ghost-button",
15733
- chromeGoalHint: "agent-gui-chrome__goal-hint"
15813
+ chromeGoalHint: "agent-gui-chrome__goal-hint",
15814
+ chromeGoalActions: "agent-gui-chrome__goal-actions",
15815
+ chromeGoalEditInput: "agent-gui-chrome__goal-edit-input"
15734
15816
  };
15735
15817
  var AgentGUIChrome_styles_default = styles2;
15736
15818
 
@@ -15931,8 +16013,15 @@ function AgentSessionChrome({
15931
16013
  }
15932
16014
 
15933
16015
  // agent-gui/agentGuiNode/AgentGoalBanner.tsx
15934
- import { Target } from "lucide-react";
16016
+ import { useEffect as useEffect6, useState as useState5 } from "react";
16017
+ import { CirclePause, CirclePlay, Pencil, Target, Trash2 } from "lucide-react";
15935
16018
  import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
16019
+ var RESUMABLE_GOAL_STATUSES = /* @__PURE__ */ new Set([
16020
+ "paused",
16021
+ "blocked",
16022
+ "usagelimited",
16023
+ "budgetlimited"
16024
+ ]);
15936
16025
  var TERMINAL_GOAL_STATUSES = /* @__PURE__ */ new Set(["complete", "completed", "done"]);
15937
16026
  function normalizeGoalStatus(status) {
15938
16027
  return (status ?? "").trim().toLowerCase();
@@ -15943,49 +16032,98 @@ function isGoalBannerVisible(objective, status) {
15943
16032
  }
15944
16033
  return !TERMINAL_GOAL_STATUSES.has(normalizeGoalStatus(status));
15945
16034
  }
15946
- function goalStatusLabel(status, labels) {
16035
+ function goalStatusTitle(status, labels) {
15947
16036
  switch (normalizeGoalStatus(status)) {
15948
16037
  case "paused":
15949
- return labels.statusPaused;
16038
+ return labels.titlePaused;
15950
16039
  case "blocked":
15951
- return labels.statusBlocked;
16040
+ return labels.titleBlocked;
15952
16041
  case "usagelimited":
15953
- return labels.statusUsageLimited;
16042
+ return labels.titleUsageLimited;
15954
16043
  case "budgetlimited":
15955
- return labels.statusBudgetLimited;
16044
+ return labels.titleBudgetLimited;
15956
16045
  case "complete":
15957
16046
  case "completed":
15958
16047
  case "done":
15959
- return labels.statusComplete;
16048
+ return labels.titleComplete;
15960
16049
  default:
15961
- return labels.statusActive;
16050
+ return labels.titleActive;
16051
+ }
16052
+ }
16053
+ function formatGoalElapsed(totalSeconds) {
16054
+ const seconds = Math.max(0, Math.floor(totalSeconds));
16055
+ if (seconds < 60) {
16056
+ return `${seconds}s`;
16057
+ }
16058
+ const minutes = Math.floor(seconds / 60);
16059
+ if (minutes < 60) {
16060
+ const rest = seconds % 60;
16061
+ return rest > 0 ? `${minutes}m ${rest}s` : `${minutes}m`;
15962
16062
  }
16063
+ const hours = Math.floor(minutes / 60);
16064
+ const restMinutes = minutes % 60;
16065
+ return restMinutes > 0 ? `${hours}h ${restMinutes}m` : `${hours}h`;
15963
16066
  }
15964
16067
  function describeGoal(input) {
15965
- const trimmedObjective = input.objective.trim();
15966
- const detailParts = [goalStatusLabel(input.status, input.labels)];
16068
+ const detailParts = [input.objective.trim()];
16069
+ if (typeof input.elapsedSeconds === "number") {
16070
+ detailParts.push(formatGoalElapsed(input.elapsedSeconds));
16071
+ }
15967
16072
  if (typeof input.tokenBudget === "number" && input.tokenBudget > 0) {
15968
16073
  const used = typeof input.tokensUsed === "number" && input.tokensUsed >= 0 ? input.tokensUsed : 0;
15969
16074
  detailParts.push(input.labels.budgetUsage(used, input.tokenBudget));
15970
16075
  }
15971
- return `${trimmedObjective} \xB7 ${detailParts.join(" \xB7 ")}`;
16076
+ return detailParts.join(" \xB7 ");
15972
16077
  }
15973
16078
  function AgentGoalBanner({
15974
16079
  objective,
15975
16080
  status,
15976
16081
  tokenBudget,
15977
16082
  tokensUsed,
15978
- labels
16083
+ timeUsedSeconds,
16084
+ labels,
16085
+ onEditObjective,
16086
+ onPauseGoal,
16087
+ onResumeGoal,
16088
+ onClearGoal
15979
16089
  }) {
15980
16090
  "use memo";
16091
+ const [editDraft, setEditDraft] = useState5(null);
16092
+ const normalizedStatus = normalizeGoalStatus(status);
16093
+ const isActive = normalizedStatus === "" || normalizedStatus === "active";
16094
+ const serverSeconds = typeof timeUsedSeconds === "number" && timeUsedSeconds >= 0 ? Math.floor(timeUsedSeconds) : null;
16095
+ const [localElapsed, setLocalElapsed] = useState5(0);
16096
+ useEffect6(() => {
16097
+ setLocalElapsed(0);
16098
+ if (!isActive || serverSeconds === null) {
16099
+ return;
16100
+ }
16101
+ const startedAtMs = Date.now();
16102
+ const timer = window.setInterval(() => {
16103
+ setLocalElapsed(Math.floor((Date.now() - startedAtMs) / 1e3));
16104
+ }, 1e3);
16105
+ return () => window.clearInterval(timer);
16106
+ }, [isActive, serverSeconds]);
16107
+ const elapsedSeconds = serverSeconds === null ? null : serverSeconds + (isActive ? localElapsed : 0);
16108
+ const title = goalStatusTitle(status, labels);
15981
16109
  const description = describeGoal({
15982
16110
  objective,
15983
- status,
16111
+ elapsedSeconds,
15984
16112
  tokenBudget,
15985
16113
  tokensUsed,
15986
16114
  labels
15987
16115
  });
15988
- const fullMessage = `${labels.goalLabel} ${description}`;
16116
+ const fullMessage = `${title} ${description}`;
16117
+ const showPause = onPauseGoal !== void 0 && isActive;
16118
+ const showResume = onResumeGoal !== void 0 && RESUMABLE_GOAL_STATUSES.has(normalizedStatus);
16119
+ const hasActions = onEditObjective !== void 0 || showPause || showResume || onClearGoal !== void 0;
16120
+ const commitEdit = () => {
16121
+ const next = (editDraft ?? "").trim();
16122
+ setEditDraft(null);
16123
+ if (next !== "" && next !== objective.trim()) {
16124
+ onEditObjective?.(next);
16125
+ }
16126
+ };
15989
16127
  return /* @__PURE__ */ jsx20("div", { className: AgentGUIChrome_styles_default.sessionChrome, children: /* @__PURE__ */ jsx20(
15990
16128
  "section",
15991
16129
  {
@@ -15995,19 +16133,91 @@ function AgentGoalBanner({
15995
16133
  children: /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
15996
16134
  /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
15997
16135
  /* @__PURE__ */ jsx20("span", { className: AgentGUIChrome_styles_default.chromeIcon, children: /* @__PURE__ */ jsx20(Target, { "aria-hidden": true, className: "size-3.5" }) }),
15998
- /* @__PURE__ */ jsxs8(
16136
+ editDraft !== null ? /* @__PURE__ */ jsx20(
16137
+ "input",
16138
+ {
16139
+ className: AgentGUIChrome_styles_default.chromeGoalEditInput,
16140
+ value: editDraft,
16141
+ autoFocus: true,
16142
+ "aria-label": labels.editAction,
16143
+ "data-testid": "agent-gui-goal-banner-edit-input",
16144
+ onChange: (event) => setEditDraft(event.target.value),
16145
+ onKeyDown: (event) => {
16146
+ if (event.key === "Enter") {
16147
+ event.preventDefault();
16148
+ commitEdit();
16149
+ } else if (event.key === "Escape") {
16150
+ event.preventDefault();
16151
+ setEditDraft(null);
16152
+ }
16153
+ },
16154
+ onBlur: () => setEditDraft(null)
16155
+ }
16156
+ ) : /* @__PURE__ */ jsxs8(
15999
16157
  "p",
16000
16158
  {
16001
16159
  className: cn(AgentGUIChrome_styles_default.chromeMessage, AgentGUIChrome_styles_default.chromeNoticeMessage),
16002
16160
  title: fullMessage,
16003
16161
  children: [
16004
- /* @__PURE__ */ jsx20("span", { className: AgentGUIChrome_styles_default.chromeNoticeTitle, children: labels.goalLabel }),
16005
- /* @__PURE__ */ jsx20("span", { className: AgentGUIChrome_styles_default.chromeNoticeDescription, children: description })
16162
+ /* @__PURE__ */ jsx20("span", { className: AgentGUIChrome_styles_default.chromeNoticeTitle, children: title }),
16163
+ /* @__PURE__ */ jsx20(
16164
+ "span",
16165
+ {
16166
+ className: AgentGUIChrome_styles_default.chromeNoticeDescription,
16167
+ "data-testid": "agent-gui-goal-banner-description",
16168
+ children: description
16169
+ }
16170
+ )
16006
16171
  ]
16007
16172
  }
16008
16173
  )
16009
16174
  ] }),
16010
- /* @__PURE__ */ jsx20(
16175
+ hasActions ? /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeGoalActions, children: [
16176
+ onEditObjective !== void 0 && editDraft === null ? /* @__PURE__ */ jsx20(
16177
+ "button",
16178
+ {
16179
+ type: "button",
16180
+ onClick: () => setEditDraft(objective),
16181
+ title: labels.editAction,
16182
+ "aria-label": labels.editAction,
16183
+ "data-testid": "agent-gui-goal-banner-edit",
16184
+ children: /* @__PURE__ */ jsx20(Pencil, { "aria-hidden": true, className: "size-3.5" })
16185
+ }
16186
+ ) : null,
16187
+ showPause ? /* @__PURE__ */ jsx20(
16188
+ "button",
16189
+ {
16190
+ type: "button",
16191
+ onClick: onPauseGoal,
16192
+ title: labels.pauseAction,
16193
+ "aria-label": labels.pauseAction,
16194
+ "data-testid": "agent-gui-goal-banner-pause",
16195
+ children: /* @__PURE__ */ jsx20(CirclePause, { "aria-hidden": true, className: "size-3.5" })
16196
+ }
16197
+ ) : null,
16198
+ showResume ? /* @__PURE__ */ jsx20(
16199
+ "button",
16200
+ {
16201
+ type: "button",
16202
+ onClick: onResumeGoal,
16203
+ title: labels.resumeAction,
16204
+ "aria-label": labels.resumeAction,
16205
+ "data-testid": "agent-gui-goal-banner-resume",
16206
+ children: /* @__PURE__ */ jsx20(CirclePlay, { "aria-hidden": true, className: "size-3.5" })
16207
+ }
16208
+ ) : null,
16209
+ onClearGoal !== void 0 ? /* @__PURE__ */ jsx20(
16210
+ "button",
16211
+ {
16212
+ type: "button",
16213
+ onClick: onClearGoal,
16214
+ title: labels.clearAction,
16215
+ "aria-label": labels.clearAction,
16216
+ "data-testid": "agent-gui-goal-banner-clear",
16217
+ children: /* @__PURE__ */ jsx20(Trash2, { "aria-hidden": true, className: "size-3.5" })
16218
+ }
16219
+ ) : null
16220
+ ] }) : /* @__PURE__ */ jsx20(
16011
16221
  "span",
16012
16222
  {
16013
16223
  className: AgentGUIChrome_styles_default.chromeGoalHint,
@@ -16023,21 +16233,19 @@ function AgentGoalBanner({
16023
16233
  // agent-gui/agentGuiNode/AgentComposer.tsx
16024
16234
  import {
16025
16235
  useCallback as useCallback9,
16026
- useEffect as useEffect11,
16236
+ useEffect as useEffect12,
16027
16237
  useLayoutEffect as useLayoutEffect3,
16028
16238
  useMemo as useMemo9,
16029
16239
  useRef as useRef11,
16030
- useState as useState10
16240
+ useState as useState11
16031
16241
  } from "react";
16032
16242
  import { createPortal as createPortal3, flushSync } from "react-dom";
16033
16243
  import {
16034
- AddIcon,
16035
16244
  Button as Button3,
16036
16245
  Select as Select2,
16037
16246
  SelectContent as SelectContent2,
16038
16247
  SelectItem as SelectItem2,
16039
- SelectTrigger as SelectTrigger2,
16040
- SelectValue
16248
+ SelectTrigger as SelectTrigger2
16041
16249
  } from "@tutti-os/ui-system";
16042
16250
  import { ListChecks as ListChecks2, Target as Target3, X } from "lucide-react";
16043
16251
  import {
@@ -16481,7 +16689,7 @@ function filterUnavailableSlashCommands(commands, input) {
16481
16689
  }
16482
16690
 
16483
16691
  // agent-gui/agentGuiNode/AgentSlashCommandPalette.tsx
16484
- import { Fragment as Fragment3, useEffect as useEffect6, useRef as useRef6 } from "react";
16692
+ import { Fragment as Fragment3, useEffect as useEffect7, useRef as useRef6 } from "react";
16485
16693
  import {
16486
16694
  Globe,
16487
16695
  Info,
@@ -16525,7 +16733,7 @@ function AgentSlashCommandPalette({
16525
16733
  }) {
16526
16734
  "use memo";
16527
16735
  const highlightedOptionRef = useRef6(null);
16528
- useEffect6(() => {
16736
+ useEffect7(() => {
16529
16737
  highlightedOptionRef.current?.scrollIntoView({ block: "nearest" });
16530
16738
  }, [highlightedIndex]);
16531
16739
  if (entries.length === 0) {
@@ -16683,7 +16891,7 @@ function slashPaletteEntryIcon(entry) {
16683
16891
  import {
16684
16892
  useLayoutEffect,
16685
16893
  useRef as useRef7,
16686
- useState as useState5
16894
+ useState as useState6
16687
16895
  } from "react";
16688
16896
  import { ChevronRight } from "lucide-react";
16689
16897
 
@@ -16691,6 +16899,7 @@ import { ChevronRight } from "lucide-react";
16691
16899
  var styles3 = {
16692
16900
  bottomDock: "agent-gui-node__bottom-dock",
16693
16901
  bottomDockPrompt: "agent-gui-node__bottom-dock-prompt",
16902
+ bottomDockScrollToBottom: "agent-gui-node__bottom-dock-scroll-to-bottom",
16694
16903
  body: "agent-gui-node__body",
16695
16904
  composer: "agent-gui-node__composer",
16696
16905
  composerChip: "agent-gui-node__composer-chip",
@@ -16700,6 +16909,10 @@ var styles3 = {
16700
16909
  composerFooterRight: "agent-gui-node__composer-footer-right",
16701
16910
  composerHero: "agent-gui-node__composer-hero",
16702
16911
  composerFloatingPrompt: "agent-gui-node__composer-floating-prompt",
16912
+ composerHandoffIcon: "agent-gui-node__composer-handoff-icon",
16913
+ composerHandoffMenuContent: "agent-gui-node__composer-handoff-menu-content",
16914
+ composerHandoffStaticIcon: "agent-gui-node__composer-handoff-icon-static",
16915
+ composerHandoffTrigger: "agent-gui-node__composer-handoff-trigger",
16703
16916
  composerQueuedPromptFloating: "agent-gui-node__composer-floating-prompt--queued",
16704
16917
  composerInputGroup: "agent-gui-node__composer-input-group",
16705
16918
  composerInputGroupHero: "agent-gui-node__composer-input-group-hero",
@@ -16745,6 +16958,7 @@ var styles3 = {
16745
16958
  conversationItem: "agent-gui-node__conversation-item",
16746
16959
  conversationList: "agent-gui-node__conversation-list",
16747
16960
  conversationMeta: "agent-gui-node__conversation-meta",
16961
+ conversationProviderIcon: "agent-gui-node__conversation-provider-icon",
16748
16962
  conversationOpenWindowButton: "agent-gui-node__conversation-open-window-button",
16749
16963
  conversationPinButton: "agent-gui-node__conversation-pin-button",
16750
16964
  conversationSection: "agent-gui-node__conversation-section",
@@ -16766,6 +16980,7 @@ var styles3 = {
16766
16980
  conversationStatusGlyph: "agent-gui-node__conversation-status-glyph",
16767
16981
  conversationTime: "agent-gui-node__conversation-time",
16768
16982
  conversationTitle: "agent-gui-node__conversation-title",
16983
+ conversationTitleRow: "agent-gui-node__conversation-title-row",
16769
16984
  conversationUnreadLamp: "agent-gui-node__conversation-unread-lamp",
16770
16985
  detailHeader: "agent-gui-node__detail-header",
16771
16986
  detailHeaderPathInfo: "agent-gui-node__detail-header-path-info",
@@ -16781,7 +16996,11 @@ var styles3 = {
16781
16996
  emptyHero: "agent-gui-node__empty-hero",
16782
16997
  emptyHeroBody: "agent-gui-node__empty-hero-body",
16783
16998
  emptyHeroIconEffect: "agent-gui-node__empty-hero-icon-effect",
16999
+ emptyHeroIconRail: "agent-gui-node__empty-hero-icon-rail",
17000
+ emptyHeroIconRailItem: "agent-gui-node__empty-hero-icon-rail-item",
17001
+ emptyHeroIconRailScroller: "agent-gui-node__empty-hero-icon-rail-scroller",
16784
17002
  emptyHeroProvider: "agent-gui-node__empty-hero-provider",
17003
+ emptyHeroProviderSelect: "agent-gui-node__empty-hero-provider-select",
16785
17004
  emptyHeroTitle: "agent-gui-node__empty-hero-title",
16786
17005
  emptyProviderGate: "agent-gui-node__empty-provider-gate",
16787
17006
  emptyProviderGateAction: "agent-gui-node__empty-provider-gate-action",
@@ -16805,6 +17024,11 @@ var styles3 = {
16805
17024
  providerRailAvatar: "agent-gui-node__provider-rail-avatar",
16806
17025
  providerRailAvatarIcon: "agent-gui-node__provider-rail-avatar-icon",
16807
17026
  providerRailAvatarImage: "agent-gui-node__provider-rail-avatar-image",
17027
+ providerRailLaunchpadIcon: "agent-gui-node__provider-rail-launchpad-icon",
17028
+ emptyHeroLaunchpadIcon: "agent-gui-node__empty-hero-launchpad-icon",
17029
+ providerRailLaunchpadItem: "agent-gui-node__provider-rail-launchpad-item",
17030
+ providerRailPanel: "agent-gui-node__provider-rail-panel",
17031
+ providerRailSeparator: "agent-gui-node__provider-rail-separator",
16808
17032
  providerRailTile: "agent-gui-node__provider-rail-tile",
16809
17033
  providerRailTileLabel: "agent-gui-node__provider-rail-tile-label",
16810
17034
  rail: "agent-gui-node__rail",
@@ -16860,12 +17084,12 @@ function AgentQueuedPromptPanel({
16860
17084
  workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS
16861
17085
  }) {
16862
17086
  "use memo";
16863
- const [isExpanded, setIsExpanded] = useState5(false);
17087
+ const [isExpanded, setIsExpanded] = useState6(false);
16864
17088
  const singlePromptTextRef = useRef7(null);
16865
17089
  const queuedPromptListRef = useRef7(null);
16866
17090
  const pointerHandledEditPromptIdRef = useRef7(null);
16867
- const [isSinglePromptOverflowing, setIsSinglePromptOverflowing] = useState5(false);
16868
- const [expandedListMaxHeightPx, setExpandedListMaxHeightPx] = useState5(280);
17091
+ const [isSinglePromptOverflowing, setIsSinglePromptOverflowing] = useState6(false);
17092
+ const [expandedListMaxHeightPx, setExpandedListMaxHeightPx] = useState6(280);
16869
17093
  const singlePromptHasImages = queuedPrompts.length === 1 && queuedPromptImages(queuedPrompts[0]).length > 0;
16870
17094
  const canExpand = queuedPrompts.length > 1 || singlePromptHasImages || isSinglePromptOverflowing;
16871
17095
  const panelStyle = {
@@ -17104,9 +17328,9 @@ function AgentQueuedPromptPanel({
17104
17328
  // agent-gui/agentGuiNode/AgentComposerSettingsMenus.tsx
17105
17329
  import {
17106
17330
  cloneElement,
17107
- useEffect as useEffect7,
17331
+ useEffect as useEffect8,
17108
17332
  useMemo as useMemo5,
17109
- useState as useState6
17333
+ useState as useState7
17110
17334
  } from "react";
17111
17335
  import { ChevronDown, ZapIcon as ZapIcon2 } from "lucide-react";
17112
17336
  import {
@@ -17579,7 +17803,7 @@ function AgentPermissionModeDropdown({
17579
17803
  onSettingsChange
17580
17804
  }) {
17581
17805
  "use memo";
17582
- const [isSelectOpen, setIsSelectOpen] = useState6(false);
17806
+ const [isSelectOpen, setIsSelectOpen] = useState7(false);
17583
17807
  const isLoading = composerSettings.isSettingsLoading || composerSettings.isModelOptionsLoading === true;
17584
17808
  const availableOptions = composerSettings.availablePermissionModes ?? [];
17585
17809
  const selectedValue = composerSettings.selectedPermissionModeValue ?? composerSettings.draftSettings.permissionModeId;
@@ -17718,7 +17942,7 @@ function AgentProjectMissingStatusProbe({
17718
17942
  "use memo";
17719
17943
  const agentHostApi = useAgentHostApi();
17720
17944
  const selectedPath = composerSettings.selectedProjectPath?.trim() ?? "";
17721
- useEffect7(() => {
17945
+ useEffect8(() => {
17722
17946
  let canceled = false;
17723
17947
  const userProjects = agentHostApi.userProjects;
17724
17948
  if (!userProjects || !composerSettings.projectLocked || !selectedPath) {
@@ -17809,7 +18033,7 @@ function AgentModelReasoningDropdown({
17809
18033
  onSettingsChange
17810
18034
  }) {
17811
18035
  "use memo";
17812
- const [menuOpen, setMenuOpen] = useState6(false);
18036
+ const [menuOpen, setMenuOpen] = useState7(false);
17813
18037
  const menu = buildComposerModelMenuModel(composerSettings, labels);
17814
18038
  const menuDisabled = disabled || menu.disabled;
17815
18039
  const isModelLoading = composerSettings.isModelOptionsLoading || composerSettings.isSettingsLoading;
@@ -18064,7 +18288,7 @@ function ComposerModelOptionTooltip({
18064
18288
  "data-agent-model-option-tooltip": "true",
18065
18289
  children: [
18066
18290
  /* @__PURE__ */ jsx23("span", { className: "block text-[15px] font-semibold leading-[1.2]", children: option.tooltip.title }),
18067
- option.tooltip.description ? /* @__PURE__ */ jsx23("span", { className: "mt-1.5 block text-[13px] leading-[1.35]", children: option.tooltip.description }) : null,
18291
+ option.tooltip.description ? /* @__PURE__ */ jsx23("span", { className: "mt-1.5 block text-[13px] leading-[1.35] text-[var(--text-tertiary)]", children: option.tooltip.description }) : null,
18068
18292
  option.tooltip.contextWindow ? /* @__PURE__ */ jsx23("span", { className: "mt-4 block", children: option.tooltip.contextWindow }) : null,
18069
18293
  option.tooltip.version ? /* @__PURE__ */ jsx23("span", { className: "mt-4 block italic", children: option.tooltip.version }) : null
18070
18294
  ]
@@ -18077,11 +18301,11 @@ function ComposerModelOptionTooltip({
18077
18301
  import {
18078
18302
  forwardRef as forwardRef3,
18079
18303
  useCallback as useCallback6,
18080
- useEffect as useEffect8,
18304
+ useEffect as useEffect9,
18081
18305
  useImperativeHandle as useImperativeHandle2,
18082
18306
  useMemo as useMemo6,
18083
18307
  useRef as useRef8,
18084
- useState as useState7
18308
+ useState as useState8
18085
18309
  } from "react";
18086
18310
  import { createPortal } from "react-dom";
18087
18311
  import { Extension } from "@tiptap/core";
@@ -18677,7 +18901,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
18677
18901
  const availableCapabilitiesRef = useRef8(availableCapabilities);
18678
18902
  const suppressPastedAtSuggestionRef = useRef8(false);
18679
18903
  const scrollFrameRef = useRef8(null);
18680
- const [contextMenu, setContextMenu] = useState7(null);
18904
+ const [contextMenu, setContextMenu] = useState8(null);
18681
18905
  const closeContextMenu = useCallback6(() => {
18682
18906
  setContextMenu(null);
18683
18907
  }, []);
@@ -19150,10 +19374,10 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
19150
19374
  }
19151
19375
  onSubmitRef.current();
19152
19376
  };
19153
- useEffect8(() => {
19377
+ useEffect9(() => {
19154
19378
  editorRef.current = editor;
19155
19379
  }, [editor]);
19156
- useEffect8(
19380
+ useEffect9(
19157
19381
  () => () => {
19158
19382
  if (scrollFrameRef.current !== null && typeof window.cancelAnimationFrame === "function") {
19159
19383
  window.cancelAnimationFrame(scrollFrameRef.current);
@@ -19161,7 +19385,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
19161
19385
  },
19162
19386
  []
19163
19387
  );
19164
- useEffect8(() => {
19388
+ useEffect9(() => {
19165
19389
  if (!contextMenu) {
19166
19390
  return;
19167
19391
  }
@@ -19267,7 +19491,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
19267
19491
  }),
19268
19492
  []
19269
19493
  );
19270
- useEffect8(() => {
19494
+ useEffect9(() => {
19271
19495
  if (!editor) {
19272
19496
  return;
19273
19497
  }
@@ -19278,7 +19502,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
19278
19502
  editor.state.tr.setMeta("agentRichTextPlaceholder", placeholder)
19279
19503
  );
19280
19504
  }, [disabled, editor, placeholder]);
19281
- useEffect8(() => {
19505
+ useEffect9(() => {
19282
19506
  if (!editor || editor.isDestroyed) {
19283
19507
  return;
19284
19508
  }
@@ -19520,7 +19744,7 @@ function AgentSlashStatusPanel({
19520
19744
  }
19521
19745
 
19522
19746
  // agent-gui/agentGuiNode/AgentReviewPickerPanel.tsx
19523
- import { useCallback as useCallback7, useEffect as useEffect9, useMemo as useMemo7, useRef as useRef9, useState as useState8 } from "react";
19747
+ import { useCallback as useCallback7, useEffect as useEffect10, useMemo as useMemo7, useRef as useRef9, useState as useState9 } from "react";
19524
19748
  import { menuItemClassName } from "@tutti-os/ui-system";
19525
19749
 
19526
19750
  // agent-gui/agentGuiNode/AgentReviewBranchController.ts
@@ -19635,21 +19859,21 @@ function AgentReviewPickerPanel({
19635
19859
  onSubmitReview,
19636
19860
  onClose
19637
19861
  }) {
19638
- const [stage, setStage] = useState8("root");
19639
- const [query, setQuery] = useState8("");
19640
- const [highlightedIndex, setHighlightedIndex] = useState8(0);
19862
+ const [stage, setStage] = useState9("root");
19863
+ const [query, setQuery] = useState9("");
19864
+ const [highlightedIndex, setHighlightedIndex] = useState9(0);
19641
19865
  const searchInputRef = useRef9(null);
19642
19866
  const highlightedOptionRef = useRef9(null);
19643
19867
  const reviewBranchControllerRef = useRef9(
19644
19868
  null
19645
19869
  );
19646
- const [branchState, setBranchState] = useState8({
19870
+ const [branchState, setBranchState] = useState9({
19647
19871
  status: "idle",
19648
19872
  branches: [],
19649
19873
  currentBranch: null,
19650
19874
  error: null
19651
19875
  });
19652
- useEffect9(() => {
19876
+ useEffect10(() => {
19653
19877
  const controller = new AgentReviewBranchController();
19654
19878
  reviewBranchControllerRef.current = controller;
19655
19879
  const unsubscribe = controller.subscribe(setBranchState);
@@ -19659,7 +19883,7 @@ function AgentReviewPickerPanel({
19659
19883
  reviewBranchControllerRef.current = null;
19660
19884
  };
19661
19885
  }, []);
19662
- useEffect9(() => {
19886
+ useEffect10(() => {
19663
19887
  const controller = reviewBranchControllerRef.current;
19664
19888
  if (!controller) {
19665
19889
  return;
@@ -19669,7 +19893,7 @@ function AgentReviewPickerPanel({
19669
19893
  controller.ensureLoaded();
19670
19894
  }
19671
19895
  }, [onRequestGitBranches, stage]);
19672
- useEffect9(() => {
19896
+ useEffect10(() => {
19673
19897
  searchInputRef.current?.focus();
19674
19898
  }, [stage]);
19675
19899
  const submit = useCallback7(
@@ -19759,7 +19983,7 @@ function AgentReviewPickerPanel({
19759
19983
  goToStage
19760
19984
  ]);
19761
19985
  const safeHighlightedIndex = entries.length === 0 ? -1 : Math.min(highlightedIndex, entries.length - 1);
19762
- useEffect9(() => {
19986
+ useEffect10(() => {
19763
19987
  highlightedOptionRef.current?.scrollIntoView({ block: "nearest" });
19764
19988
  }, [safeHighlightedIndex]);
19765
19989
  const searchPlaceholder = stage === "base" ? labels.branchPlaceholder : stage === "commit" ? labels.commitPlaceholder : stage === "custom" ? labels.customPlaceholder : labels.searchPlaceholder;
@@ -19882,11 +20106,11 @@ function AgentReviewPickerPanel({
19882
20106
  import {
19883
20107
  forwardRef as forwardRef4,
19884
20108
  useCallback as useCallback8,
19885
- useEffect as useEffect10,
20109
+ useEffect as useEffect11,
19886
20110
  useLayoutEffect as useLayoutEffect2,
19887
20111
  useMemo as useMemo8,
19888
20112
  useRef as useRef10,
19889
- useState as useState9
20113
+ useState as useState10
19890
20114
  } from "react";
19891
20115
  import { createPortal as createPortal2 } from "react-dom";
19892
20116
  import { jsx as jsx27 } from "react/jsx-runtime";
@@ -19963,7 +20187,7 @@ function useComposerAnchoredMenuFrame({
19963
20187
  maxHeight,
19964
20188
  open
19965
20189
  }) {
19966
- const [frame, setFrame] = useState9(null);
20190
+ const [frame, setFrame] = useState10(null);
19967
20191
  const syncFrame = useCallback8(() => {
19968
20192
  const anchor = anchorRef.current;
19969
20193
  if (!anchor || typeof window === "undefined") {
@@ -20035,7 +20259,7 @@ var ComposerFloatingMenuSurface = forwardRef4(function ComposerFloatingMenuSurfa
20035
20259
  },
20036
20260
  [forwardedRef, surfaceRef]
20037
20261
  );
20038
- useEffect10(() => {
20262
+ useEffect11(() => {
20039
20263
  if (!open || !onDismiss) {
20040
20264
  return;
20041
20265
  }
@@ -20125,8 +20349,14 @@ var ComposerFloatingMenuSurface = forwardRef4(function ComposerFloatingMenuSurfa
20125
20349
  );
20126
20350
  });
20127
20351
 
20128
- // app/renderer/assets/icons/@-lined-14px.svg
20129
- var lined_14px_default = "./@-lined-14px-64O2KKB4.svg";
20352
+ // app/renderer/assets/icons/add-lined-bold.svg
20353
+ var add_lined_bold_default = "./add-lined-bold-5QPUDZCU.svg";
20354
+
20355
+ // app/renderer/assets/icons/@-bold-lined.svg
20356
+ var bold_lined_default = "./@-bold-lined-BLLFKBFI.svg";
20357
+
20358
+ // app/renderer/assets/icons/handoff-lined.svg
20359
+ var handoff_lined_default = "./handoff-lined-4WQUBVG3.svg";
20130
20360
 
20131
20361
  // agent-gui/agentGuiNode/AgentComposer.tsx
20132
20362
  import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -20168,7 +20398,7 @@ function AgentUsageChip({
20168
20398
  compactDisabled
20169
20399
  }) {
20170
20400
  "use memo";
20171
- const [usagePopoverOpen, setUsagePopoverOpen] = useState10(false);
20401
+ const [usagePopoverOpen, setUsagePopoverOpen] = useState11(false);
20172
20402
  const usagePopoverHoverTimerRef = useRef11(null);
20173
20403
  const usagePopoverContentRef = useRef11(null);
20174
20404
  const clampedPercent = Math.max(0, Math.min(100, percentUsed));
@@ -20241,7 +20471,7 @@ function AgentUsageChip({
20241
20471
  closeUsagePopover
20242
20472
  ]
20243
20473
  );
20244
- useEffect11(
20474
+ useEffect12(
20245
20475
  () => () => {
20246
20476
  clearUsagePopoverHoverTimer();
20247
20477
  clearUsagePopoverCloseTimer();
@@ -20364,6 +20594,12 @@ var MENTION_PALETTE_DISMISS_INTERACTION_SELECTOR = [
20364
20594
  ".workbench-window__resize-handle",
20365
20595
  "#agent-gui-conversation-rail-resize"
20366
20596
  ].join(",");
20597
+ function resolveComposerProviderIconUrl(provider) {
20598
+ return MANAGED_AGENT_ICON_URLS[normalizeManagedAgentProvider(provider)] ?? MANAGED_AGENT_ICON_FALLBACK_URL;
20599
+ }
20600
+ function resolveComposerProviderTargetIconUrl(target) {
20601
+ return target.iconUrl ?? resolveComposerProviderIconUrl(target.provider);
20602
+ }
20367
20603
  function resolveMentionPalettePortalTarget(anchor) {
20368
20604
  return anchor.closest('[data-slot="viewport-menu-boundary"]') ?? anchor.closest(
20369
20605
  "[data-workbench-window-id], [data-workspace-node-window-root='true']"
@@ -20393,21 +20629,53 @@ function hasInlineOverflow(element) {
20393
20629
  }
20394
20630
  return element.scrollWidth > element.clientWidth + 1;
20395
20631
  }
20396
- function resolveComposerProviderIconUrl(provider) {
20397
- const normalizedProvider = normalizeManagedAgentProvider(provider);
20398
- return MANAGED_AGENT_ICON_URLS[normalizedProvider] ?? MANAGED_AGENT_ICON_FALLBACK_URL;
20632
+ function AgentComposerMaskIcon({
20633
+ iconUrl,
20634
+ marker
20635
+ }) {
20636
+ return /* @__PURE__ */ jsx28(
20637
+ "span",
20638
+ {
20639
+ "aria-hidden": true,
20640
+ className: "inline-block size-3.5 bg-[var(--text-secondary)] transition-colors group-hover:bg-[var(--text-primary)] group-focus-visible:bg-[var(--text-primary)]",
20641
+ "data-agent-reference-add-icon": marker === "reference-add" ? "true" : void 0,
20642
+ style: {
20643
+ WebkitMaskImage: `url("${iconUrl}")`,
20644
+ WebkitMaskPosition: "center",
20645
+ WebkitMaskRepeat: "no-repeat",
20646
+ WebkitMaskSize: "contain",
20647
+ maskImage: `url("${iconUrl}")`,
20648
+ maskPosition: "center",
20649
+ maskRepeat: "no-repeat",
20650
+ maskSize: "contain"
20651
+ }
20652
+ }
20653
+ );
20399
20654
  }
20400
- function resolveComposerProviderTargetIconUrl(target) {
20401
- return target.iconUrl?.trim() || resolveComposerProviderIconUrl(target.provider);
20655
+ var HANDOFF_SELECT_IDLE_VALUE = "__agent-handoff-idle__";
20656
+ function AgentComposerHandoffIcon() {
20657
+ return /* @__PURE__ */ jsx28("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.composerHandoffIcon, children: /* @__PURE__ */ jsx28(
20658
+ "span",
20659
+ {
20660
+ className: AgentGUINode_styles_default.composerHandoffStaticIcon,
20661
+ style: {
20662
+ WebkitMaskImage: `url("${handoff_lined_default}")`,
20663
+ WebkitMaskPosition: "center",
20664
+ WebkitMaskRepeat: "no-repeat",
20665
+ WebkitMaskSize: "contain",
20666
+ maskImage: `url("${handoff_lined_default}")`,
20667
+ maskPosition: "center",
20668
+ maskRepeat: "no-repeat",
20669
+ maskSize: "contain"
20670
+ }
20671
+ }
20672
+ ) });
20402
20673
  }
20403
20674
  function AgentComposer({
20404
20675
  workspaceId,
20405
20676
  workspacePath,
20406
20677
  currentUserId,
20407
20678
  provider,
20408
- selectedProviderTarget = null,
20409
- providerTargets = [],
20410
- providerSelectReadonly = false,
20411
20679
  slashStatus = null,
20412
20680
  usage = null,
20413
20681
  draftContent,
@@ -20417,12 +20685,18 @@ function AgentComposer({
20417
20685
  availableSkills = EMPTY_PROVIDER_SKILLS,
20418
20686
  disabled,
20419
20687
  disabledReason,
20688
+ hasActiveConversation = true,
20420
20689
  submitDisabled,
20421
20690
  placeholder,
20422
20691
  composerSettings,
20423
20692
  queuedPrompts,
20424
20693
  drainingQueuedPromptId,
20425
20694
  workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS2,
20695
+ selectedProviderTarget = null,
20696
+ providerTargets = [],
20697
+ providerSelectReadonly = false,
20698
+ onProviderSelect,
20699
+ onHandoffConversation,
20426
20700
  canQueueWhileBusy,
20427
20701
  showStopButton,
20428
20702
  activePrompt,
@@ -20439,13 +20713,15 @@ function AgentComposer({
20439
20713
  promptImagesSupported = true,
20440
20714
  composerFocusRequestSequence = null,
20441
20715
  layoutMode = "dock",
20716
+ providerSelectLabel = "",
20717
+ handoffLabel,
20718
+ handoffMenuLabel,
20442
20719
  labels,
20443
20720
  workspaceUserProjectI18n,
20444
20721
  onDraftContentChange,
20445
20722
  onProjectPathChange = () => {
20446
20723
  },
20447
20724
  onSettingsChange,
20448
- onProviderSelect,
20449
20725
  capabilityMenuState,
20450
20726
  onSubmit,
20451
20727
  onSubmitGuidance,
@@ -20478,28 +20754,28 @@ function AgentComposer({
20478
20754
  const promptFilesSupported = Boolean(
20479
20755
  resolveDroppedFileReferences && promptFileUploadSupported
20480
20756
  );
20481
- const [isPaletteOpen, setIsPaletteOpen] = useState10(true);
20482
- const [isReviewPickerOpen, setIsReviewPickerOpen] = useState10(false);
20483
- const [highlightedIndex, setHighlightedIndex] = useState10(0);
20484
- const [mentionHighlightedKey, setMentionHighlightedKey] = useState10(null);
20485
- const [shouldCenterMentionHighlight, setShouldCenterMentionHighlight] = useState10(false);
20757
+ const [isPaletteOpen, setIsPaletteOpen] = useState11(true);
20758
+ const [isReviewPickerOpen, setIsReviewPickerOpen] = useState11(false);
20759
+ const [highlightedIndex, setHighlightedIndex] = useState11(0);
20760
+ const [mentionHighlightedKey, setMentionHighlightedKey] = useState11(null);
20761
+ const [shouldCenterMentionHighlight, setShouldCenterMentionHighlight] = useState11(false);
20486
20762
  const [
20487
20763
  shouldResetMentionHighlightToFilter,
20488
20764
  setShouldResetMentionHighlightToFilter
20489
- ] = useState10(false);
20490
- const [paletteDraftPrompt, setPaletteDraftPrompt] = useState10(
20765
+ ] = useState11(false);
20766
+ const [paletteDraftPrompt, setPaletteDraftPrompt] = useState11(
20491
20767
  goalDraftObjective ?? draftPrompt
20492
20768
  );
20493
- const [fileMentionSuggestion, setFileMentionSuggestion] = useState10(null);
20494
- const [isSelectedProjectMissing, setIsSelectedProjectMissing] = useState10(false);
20495
- const [isSlashStatusPanelOpen, setIsSlashStatusPanelOpen] = useState10(false);
20769
+ const [fileMentionSuggestion, setFileMentionSuggestion] = useState11(null);
20770
+ const [isSelectedProjectMissing, setIsSelectedProjectMissing] = useState11(false);
20771
+ const [isSlashStatusPanelOpen, setIsSlashStatusPanelOpen] = useState11(false);
20496
20772
  const slashStatusAgentSessionId = slashStatus?.agentSessionId ?? null;
20497
20773
  const previousSlashStatusAgentSessionIdRef = useRef11(
20498
20774
  slashStatusAgentSessionId
20499
20775
  );
20500
20776
  const selectedProjectPath = composerSettings.selectedProjectPath?.trim() ?? "";
20501
20777
  const previousSelectedProjectPathRef = useRef11(selectedProjectPath);
20502
- const [mentionSearchState, setMentionSearchState] = useState10({
20778
+ const [mentionSearchState, setMentionSearchState] = useState11({
20503
20779
  status: "idle",
20504
20780
  query: "",
20505
20781
  mode: "browse",
@@ -20523,15 +20799,15 @@ function AgentComposer({
20523
20799
  const wasActiveRef = useRef11(isActive);
20524
20800
  const lastComposerFocusRequestRef = useRef11(null);
20525
20801
  const autoMentionHighlightedKeyRef = useRef11(null);
20526
- const [isPromptTipOverflowing, setIsPromptTipOverflowing] = useState10(false);
20527
- const [dockComposerInputHeight, setDockComposerInputHeight] = useState10(
20802
+ const [isPromptTipOverflowing, setIsPromptTipOverflowing] = useState11(false);
20803
+ const [dockComposerInputHeight, setDockComposerInputHeight] = useState11(
20528
20804
  DOCK_COMPOSER_INPUT_MIN_HEIGHT
20529
20805
  );
20530
- const [dockComposerInputMaxHeight, setDockComposerInputMaxHeight] = useState10(
20806
+ const [dockComposerInputMaxHeight, setDockComposerInputMaxHeight] = useState11(
20531
20807
  DOCK_COMPOSER_INPUT_MAX_HEIGHT
20532
20808
  );
20533
- const [dockComposerAttachmentHeight, setDockComposerAttachmentHeight] = useState10(0);
20534
- const [dockComposerTextHeight, setDockComposerTextHeight] = useState10(
20809
+ const [dockComposerAttachmentHeight, setDockComposerAttachmentHeight] = useState11(0);
20810
+ const [dockComposerTextHeight, setDockComposerTextHeight] = useState11(
20535
20811
  DOCK_COMPOSER_INPUT_MIN_HEIGHT
20536
20812
  );
20537
20813
  const slashQuery = isGoalModeActive ? null : getPromptStartSlashCommandQuery(paletteDraftPrompt);
@@ -20691,11 +20967,11 @@ function AgentComposer({
20691
20967
  highlightedIndex,
20692
20968
  slashPaletteEntries.length
20693
20969
  );
20694
- const [mentionPaletteFrame, setMentionPaletteFrame] = useState10(null);
20695
- useEffect11(() => {
20970
+ const [mentionPaletteFrame, setMentionPaletteFrame] = useState11(null);
20971
+ useEffect12(() => {
20696
20972
  setHighlightedIndex(0);
20697
20973
  }, [skillQueryMatch?.prefix, skillQueryMatch?.query, slashQuery]);
20698
- useEffect11(() => {
20974
+ useEffect12(() => {
20699
20975
  const preferredKey = shouldResetMentionHighlightToFilter && mentionSearchState.mode === "browse" ? `category:${mentionSearchState.filter}` : null;
20700
20976
  if (shouldResetMentionHighlightToFilter) {
20701
20977
  const nextKey = repairMentionPaletteHighlight({
@@ -20727,7 +21003,7 @@ function AgentComposer({
20727
21003
  mentionSearchState,
20728
21004
  shouldResetMentionHighlightToFilter
20729
21005
  ]);
20730
- useEffect11(() => {
21006
+ useEffect12(() => {
20731
21007
  const controller = new AgentMentionSearchController({
20732
21008
  contextMentionProviders
20733
21009
  });
@@ -20739,7 +21015,7 @@ function AgentComposer({
20739
21015
  mentionControllerRef.current = null;
20740
21016
  };
20741
21017
  }, [contextMentionProviders]);
20742
- useEffect11(() => {
21018
+ useEffect12(() => {
20743
21019
  const isExternalDraftReplacement = draftPromptRef.current !== draftPrompt;
20744
21020
  draftPromptRef.current = draftPrompt;
20745
21021
  setPaletteDraftPrompt(goalDraftObjective ?? draftPrompt);
@@ -20751,13 +21027,13 @@ function AgentComposer({
20751
21027
  });
20752
21028
  }
20753
21029
  }, [draftPrompt, goalDraftObjective]);
20754
- useEffect11(() => {
21030
+ useEffect12(() => {
20755
21031
  draftImagesRef.current = draftImages;
20756
21032
  }, [draftImages]);
20757
- useEffect11(() => {
21033
+ useEffect12(() => {
20758
21034
  draftFilesRef.current = draftFiles;
20759
21035
  }, [draftFiles]);
20760
- useEffect11(() => {
21036
+ useEffect12(() => {
20761
21037
  if (previousSlashStatusAgentSessionIdRef.current === slashStatusAgentSessionId) {
20762
21038
  return;
20763
21039
  }
@@ -21013,11 +21289,13 @@ function AgentComposer({
21013
21289
  } else {
21014
21290
  onSubmit(submitContent);
21015
21291
  }
21016
- draftPromptRef.current = "";
21017
- draftImagesRef.current = [];
21018
- draftFilesRef.current = [];
21019
- setPaletteDraftPrompt("");
21020
- onDraftContentChange(emptyAgentComposerDraft());
21292
+ if (hasActiveConversation) {
21293
+ draftPromptRef.current = "";
21294
+ draftImagesRef.current = [];
21295
+ draftFilesRef.current = [];
21296
+ setPaletteDraftPrompt("");
21297
+ onDraftContentChange(emptyAgentComposerDraft());
21298
+ }
21021
21299
  }
21022
21300
  );
21023
21301
  const submit = useCallback9(
@@ -21201,7 +21479,10 @@ function AgentComposer({
21201
21479
  return makeAtPanelKeyDown({
21202
21480
  close: closeFileMentionPalette,
21203
21481
  commitSelection: () => {
21204
- createFileMentionPaletteAdapter().commitHighlighted();
21482
+ const result = createFileMentionPaletteAdapter().commitHighlighted();
21483
+ if (result.type === "none") {
21484
+ closeFileMentionPalette();
21485
+ }
21205
21486
  },
21206
21487
  cycleFilter: cycleFileMentionFilter,
21207
21488
  moveSelection: moveFileMentionSelection,
@@ -21242,7 +21523,7 @@ function AgentComposer({
21242
21523
  const handlePaletteKeyDown = useStableEventCallback(
21243
21524
  (event) => handleFileMentionKeyDown(event) || handleSlashPaletteKeyDown(event) || handleSlashCommandMenuKeyDown(event) || handlePlanModeToggleKeyDown(event)
21244
21525
  );
21245
- useEffect11(() => {
21526
+ useEffect12(() => {
21246
21527
  if (!showPalette || workspaceReferencePickerOpen) {
21247
21528
  return;
21248
21529
  }
@@ -21308,12 +21589,12 @@ function AgentComposer({
21308
21589
  },
21309
21590
  [onLinkAction, workspacePath]
21310
21591
  );
21311
- useEffect11(() => {
21592
+ useEffect12(() => {
21312
21593
  if (!showFileMentionPalette && shouldCenterMentionHighlight) {
21313
21594
  setShouldCenterMentionHighlight(false);
21314
21595
  }
21315
21596
  }, [shouldCenterMentionHighlight, showFileMentionPalette]);
21316
- useEffect11(() => {
21597
+ useEffect12(() => {
21317
21598
  if (!showFileMentionPalette) {
21318
21599
  return;
21319
21600
  }
@@ -21559,17 +21840,6 @@ function AgentComposer({
21559
21840
  }
21560
21841
  await applyReferencePickResult(await onRequestWorkspaceReferences());
21561
21842
  }, [applyReferencePickResult, onRequestWorkspaceReferences]);
21562
- const providerSwitchTargets = useMemo9(
21563
- () => providerTargets.filter((target) => target.disabled !== true),
21564
- [providerTargets]
21565
- );
21566
- const showProviderSelect = providerSwitchTargets.length > 1;
21567
- const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
21568
- const selectedProviderSwitchTarget = providerSwitchTargets.find(
21569
- (target) => target.targetId === selectedProviderTargetId
21570
- ) ?? selectedProviderTarget ?? providerSwitchTargets.find((target) => target.provider === provider) ?? null;
21571
- const selectedProviderLabel = selectedProviderSwitchTarget?.label ?? provider;
21572
- const providerSelectDisabled = previewMode || providerSelectReadonly || !onProviderSelect;
21573
21843
  const applyDroppedFileReferences = useCallback9(
21574
21844
  async (files) => {
21575
21845
  if (!promptFilesSupported || !resolveDroppedFileReferences || files.length === 0) {
@@ -21685,11 +21955,40 @@ function AgentComposer({
21685
21955
  const mentionPaletteHeightPx = mentionPaletteFrame?.height ?? MENTION_PALETTE_MIN_HEIGHT_PX;
21686
21956
  const isHeroLayout = layoutMode === "hero";
21687
21957
  const composerClassName = isHeroLayout ? AgentGUINode_styles_default.composerHero : AgentGUINode_styles_default.composer;
21958
+ const providerSwitchTargets = useMemo9(
21959
+ () => providerTargets.filter(Boolean),
21960
+ [providerTargets]
21961
+ );
21962
+ const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
21963
+ const selectedProviderSwitchTarget = providerSwitchTargets.find(
21964
+ (target) => target.targetId === selectedProviderTargetId
21965
+ ) ?? providerSwitchTargets.find((target) => target.provider === provider) ?? selectedProviderTarget;
21966
+ const providerMenuTargets = selectedProviderSwitchTarget && !providerSwitchTargets.some(
21967
+ (target) => target.targetId === selectedProviderSwitchTarget.targetId
21968
+ ) ? [selectedProviderSwitchTarget, ...providerSwitchTargets] : providerSwitchTargets;
21969
+ const handoffMenuTargets = selectedProviderSwitchTarget ? providerMenuTargets.filter((target) => {
21970
+ if (target.disabled === true) {
21971
+ return false;
21972
+ }
21973
+ if (target.targetId === selectedProviderSwitchTarget.targetId) {
21974
+ return false;
21975
+ }
21976
+ const selectedAgentTargetId = selectedProviderSwitchTarget.agentTargetId ?? selectedProviderSwitchTarget.targetId;
21977
+ const targetAgentTargetId = target.agentTargetId ?? target.targetId;
21978
+ return targetAgentTargetId !== selectedAgentTargetId;
21979
+ }) : providerMenuTargets;
21980
+ const selectedProviderLabel = selectedProviderSwitchTarget?.label ?? selectedProviderTarget?.label ?? provider;
21981
+ const effectiveHandoffLabel = handoffLabel || labels.handoffConversation;
21982
+ const effectiveHandoffMenuLabel = handoffMenuLabel || labels.handoffConversationMenu;
21688
21983
  const inputShellClassName = cn(
21689
21984
  AgentGUINode_styles_default.composerInputShell,
21690
21985
  isHeroLayout && AgentGUINode_styles_default.composerInputShellHero
21691
21986
  );
21692
21987
  const inputDisabled = isSelectedProjectMissing || disabled && !canQueueWhileBusy;
21988
+ const providerSelectDisabled = providerSelectReadonly || composerControlsHardDisabled || inputDisabled;
21989
+ const handoffDisabled = composerControlsHardDisabled || inputDisabled || !onHandoffConversation || handoffMenuTargets.length === 0;
21990
+ const showProviderSelect = !isHeroLayout && selectedProviderSwitchTarget !== null && providerMenuTargets.length > 0;
21991
+ const showHandoffSelect = showProviderSelect && providerSelectReadonly && !previewMode;
21693
21992
  const handleMentionPaletteButton = useCallback9(() => {
21694
21993
  if (composerControlsHardDisabled || inputDisabled) {
21695
21994
  return;
@@ -21713,7 +22012,7 @@ function AgentComposer({
21713
22012
  },
21714
22013
  [addDraftImages, scheduleComposerFocus]
21715
22014
  );
21716
- useEffect11(() => {
22015
+ useEffect12(() => {
21717
22016
  const composer = composerRef.current;
21718
22017
  const dropTarget = composer?.closest("#agent-gui-detail") ?? composer;
21719
22018
  if (!dropTarget) {
@@ -21815,7 +22114,7 @@ function AgentComposer({
21815
22114
  promptImagesSupported,
21816
22115
  scheduleComposerFocus
21817
22116
  ]);
21818
- useEffect11(() => {
22117
+ useEffect12(() => {
21819
22118
  if (!isActive) {
21820
22119
  wasActiveRef.current = false;
21821
22120
  return;
@@ -21825,7 +22124,7 @@ function AgentComposer({
21825
22124
  }
21826
22125
  wasActiveRef.current = true;
21827
22126
  }, [isActive, scheduleComposerFocus]);
21828
- useEffect11(() => {
22127
+ useEffect12(() => {
21829
22128
  if (composerFocusRequestSequence === null || composerFocusRequestSequence === lastComposerFocusRequestRef.current) {
21830
22129
  return;
21831
22130
  }
@@ -22026,12 +22325,12 @@ function AgentComposer({
22026
22325
  const sendButtonState = isQueueMode ? "queue" : shouldShowStopButton ? isInterrupting ? "stopping" : "interrupt" : isSendingTurn ? "loading" : "send";
22027
22326
  const sendButtonBusy = isSendingTurn && !isQueueMode;
22028
22327
  const activePromptRequestId = activePrompt?.requestId ?? null;
22029
- const [dismissedPromptRequestId, setDismissedPromptRequestId] = useState10(null);
22328
+ const [dismissedPromptRequestId, setDismissedPromptRequestId] = useState11(null);
22030
22329
  const visibleActivePrompt = activePrompt && dismissedPromptRequestId !== activePromptRequestId ? activePrompt : null;
22031
22330
  const disabledReasonText = disabledReason?.trim() ?? "";
22032
22331
  const effectivePlaceholder = disabledReasonText || placeholder;
22033
22332
  const visibleDraftFiles = draftFiles;
22034
- useEffect11(() => {
22333
+ useEffect12(() => {
22035
22334
  if (previousSelectedProjectPathRef.current === selectedProjectPath) {
22036
22335
  return;
22037
22336
  }
@@ -22047,7 +22346,7 @@ function AgentComposer({
22047
22346
  sessionCwd: selectedProjectPath || null
22048
22347
  });
22049
22348
  }, [currentUserId, fileMentionSuggestion, selectedProjectPath, workspaceId]);
22050
- useEffect11(() => {
22349
+ useEffect12(() => {
22051
22350
  setDismissedPromptRequestId(null);
22052
22351
  }, [activePromptRequestId]);
22053
22352
  const submitInteractivePromptAndDismiss = useCallback9(
@@ -22523,14 +22822,13 @@ function AgentComposer({
22523
22822
  className: cn(
22524
22823
  AgentGUINode_styles_default.composerMenuTrigger,
22525
22824
  AgentGUINode_styles_default.composerReferenceTrigger,
22526
- "w-auto justify-center text-[var(--agent-gui-text-secondary)] [&_svg]:shrink-0"
22825
+ "group w-auto justify-center text-[var(--agent-gui-text-secondary)]"
22527
22826
  ),
22528
22827
  children: /* @__PURE__ */ jsx28(
22529
- AddIcon,
22828
+ AgentComposerMaskIcon,
22530
22829
  {
22531
- "aria-hidden": true,
22532
- className: "size-3.5",
22533
- "data-agent-reference-add-icon": "true"
22830
+ iconUrl: add_lined_bold_default,
22831
+ marker: "reference-add"
22534
22832
  }
22535
22833
  )
22536
22834
  }
@@ -22558,17 +22856,17 @@ function AgentComposer({
22558
22856
  {
22559
22857
  size: "sm",
22560
22858
  "aria-label": labels.referenceWorkspaceFiles,
22859
+ title: labels.referenceWorkspaceFiles,
22561
22860
  className: cn(
22562
22861
  AgentGUINode_styles_default.composerMenuTrigger,
22563
22862
  AgentGUINode_styles_default.composerReferenceTrigger,
22564
- "w-auto justify-center text-[var(--agent-gui-text-secondary)] [&>svg:last-child]:hidden [&_svg]:shrink-0"
22863
+ "group w-auto justify-center text-[var(--agent-gui-text-secondary)] [&>svg:last-child]:hidden"
22565
22864
  ),
22566
22865
  children: /* @__PURE__ */ jsx28(
22567
- AddIcon,
22866
+ AgentComposerMaskIcon,
22568
22867
  {
22569
- "aria-hidden": true,
22570
- className: "size-3.5",
22571
- "data-agent-reference-add-icon": "true"
22868
+ iconUrl: add_lined_bold_default,
22869
+ marker: "reference-add"
22572
22870
  }
22573
22871
  )
22574
22872
  }
@@ -22577,50 +22875,120 @@ function AgentComposer({
22577
22875
  ),
22578
22876
  /* @__PURE__ */ jsx28(TooltipContent, { side: "top", children: labels.addContent })
22579
22877
  ] }) }),
22580
- /* @__PURE__ */ jsx28(
22581
- "button",
22582
- {
22583
- type: "button",
22584
- "aria-label": labels.mentionPalette,
22585
- title: labels.mentionPalette,
22586
- disabled: composerControlsHardDisabled || inputDisabled,
22587
- className: cn(
22588
- AgentGUINode_styles_default.composerMenuTrigger,
22589
- AgentGUINode_styles_default.composerReferenceTrigger,
22590
- "group w-auto justify-center text-[var(--agent-gui-text-secondary)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0"
22591
- ),
22592
- onMouseDown: (event) => event.preventDefault(),
22593
- onClick: handleMentionPaletteButton,
22594
- children: /* @__PURE__ */ jsx28(
22595
- "span",
22596
- {
22597
- "aria-hidden": true,
22598
- className: "inline-block size-3.5 bg-[var(--text-secondary)] transition-colors group-hover:bg-[var(--text-primary)] group-focus-visible:bg-[var(--text-primary)]",
22599
- style: {
22600
- WebkitMaskImage: `url("${lined_14px_default}")`,
22601
- WebkitMaskPosition: "center",
22602
- WebkitMaskRepeat: "no-repeat",
22603
- WebkitMaskSize: "contain",
22604
- maskImage: `url("${lined_14px_default}")`,
22605
- maskPosition: "center",
22606
- maskRepeat: "no-repeat",
22607
- maskSize: "contain"
22608
- }
22609
- }
22610
- )
22611
- }
22612
- )
22878
+ /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs15(Tooltip, { children: [
22879
+ /* @__PURE__ */ jsx28(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx28(
22880
+ "button",
22881
+ {
22882
+ type: "button",
22883
+ "aria-label": labels.mentionPalette,
22884
+ disabled: composerControlsHardDisabled || inputDisabled,
22885
+ className: cn(
22886
+ AgentGUINode_styles_default.composerMenuTrigger,
22887
+ AgentGUINode_styles_default.composerReferenceTrigger,
22888
+ "group w-auto justify-center text-[var(--agent-gui-text-secondary)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:shrink-0"
22889
+ ),
22890
+ onMouseDown: (event) => event.preventDefault(),
22891
+ onClick: handleMentionPaletteButton,
22892
+ children: /* @__PURE__ */ jsx28(
22893
+ "span",
22894
+ {
22895
+ "aria-hidden": true,
22896
+ className: "inline-block size-3.5 bg-[var(--text-secondary)] transition-colors group-hover:bg-[var(--text-primary)] group-focus-visible:bg-[var(--text-primary)]",
22897
+ style: {
22898
+ WebkitMaskImage: `url("${bold_lined_default}")`,
22899
+ WebkitMaskPosition: "center",
22900
+ WebkitMaskRepeat: "no-repeat",
22901
+ WebkitMaskSize: "contain",
22902
+ maskImage: `url("${bold_lined_default}")`,
22903
+ maskPosition: "center",
22904
+ maskRepeat: "no-repeat",
22905
+ maskSize: "contain"
22906
+ }
22907
+ }
22908
+ )
22909
+ }
22910
+ ) }),
22911
+ /* @__PURE__ */ jsx28(TooltipContent, { side: "top", children: labels.mentionPalette })
22912
+ ] }) })
22613
22913
  ] }),
22614
- showProviderSelect && selectedProviderSwitchTarget ? /* @__PURE__ */ jsxs15(
22914
+ showHandoffSelect ? /* @__PURE__ */ jsxs15(
22915
+ Select2,
22916
+ {
22917
+ value: HANDOFF_SELECT_IDLE_VALUE,
22918
+ disabled: handoffDisabled,
22919
+ onValueChange: (nextTargetId) => {
22920
+ const target = handoffMenuTargets.find(
22921
+ (candidate) => candidate.targetId === nextTargetId
22922
+ );
22923
+ if (!target || target.disabled === true) {
22924
+ return;
22925
+ }
22926
+ onHandoffConversation?.(target);
22927
+ },
22928
+ children: [
22929
+ /* @__PURE__ */ jsx28(
22930
+ SelectTrigger2,
22931
+ {
22932
+ size: "sm",
22933
+ "aria-label": effectiveHandoffLabel,
22934
+ title: effectiveHandoffLabel,
22935
+ className: cn(
22936
+ AgentGUINode_styles_default.composerMenuTrigger,
22937
+ AgentGUINode_styles_default.composerProviderSelect,
22938
+ AgentGUINode_styles_default.composerHandoffTrigger,
22939
+ "w-auto max-w-[180px] [&>svg:last-child]:hidden"
22940
+ ),
22941
+ children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
22942
+ /* @__PURE__ */ jsx28(AgentComposerHandoffIcon, {}),
22943
+ /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: effectiveHandoffLabel })
22944
+ ] })
22945
+ }
22946
+ ),
22947
+ /* @__PURE__ */ jsx28(
22948
+ SelectContent2,
22949
+ {
22950
+ align: "start",
22951
+ className: cn(
22952
+ AgentGUINode_styles_default.composerMenuContent,
22953
+ AgentGUINode_styles_default.composerHandoffMenuContent,
22954
+ "min-w-[190px]"
22955
+ ),
22956
+ "aria-label": effectiveHandoffMenuLabel,
22957
+ children: handoffMenuTargets.map((target) => /* @__PURE__ */ jsx28(
22958
+ SelectItem2,
22959
+ {
22960
+ value: target.targetId,
22961
+ className: cn(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
22962
+ disabled: target.disabled === true,
22963
+ children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
22964
+ /* @__PURE__ */ jsx28(
22965
+ "img",
22966
+ {
22967
+ alt: "",
22968
+ "aria-hidden": "true",
22969
+ className: "size-4 shrink-0 rounded-[4px]",
22970
+ src: resolveComposerProviderTargetIconUrl(target)
22971
+ }
22972
+ ),
22973
+ /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: target.label })
22974
+ ] })
22975
+ },
22976
+ `${target.provider}:${target.targetId}`
22977
+ ))
22978
+ }
22979
+ )
22980
+ ]
22981
+ }
22982
+ ) : showProviderSelect && selectedProviderSwitchTarget ? /* @__PURE__ */ jsxs15(
22615
22983
  Select2,
22616
22984
  {
22617
- value: selectedProviderTargetId,
22985
+ value: selectedProviderSwitchTarget.targetId,
22618
22986
  disabled: providerSelectDisabled,
22619
22987
  onValueChange: (nextTargetId) => {
22620
- const target = providerSwitchTargets.find(
22988
+ const target = providerMenuTargets.find(
22621
22989
  (candidate) => candidate.targetId === nextTargetId
22622
22990
  );
22623
- if (!target) {
22991
+ if (!target || target.disabled === true) {
22624
22992
  return;
22625
22993
  }
22626
22994
  onProviderSelect?.({
@@ -22633,14 +23001,27 @@ function AgentComposer({
22633
23001
  SelectTrigger2,
22634
23002
  {
22635
23003
  size: "sm",
22636
- "aria-label": labels.providerSwitchLabel,
22637
- title: labels.providerSwitchLabel,
23004
+ "aria-label": providerSelectLabel,
23005
+ title: providerSelectLabel,
22638
23006
  className: cn(
22639
23007
  AgentGUINode_styles_default.composerMenuTrigger,
22640
23008
  AgentGUINode_styles_default.composerProviderSelect,
22641
- "max-w-[160px] text-[var(--agent-gui-text-secondary)]"
23009
+ "w-auto max-w-[180px]"
22642
23010
  ),
22643
- children: /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: /* @__PURE__ */ jsx28(SelectValue, { placeholder: selectedProviderLabel }) })
23011
+ children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23012
+ /* @__PURE__ */ jsx28(
23013
+ "img",
23014
+ {
23015
+ alt: "",
23016
+ "aria-hidden": "true",
23017
+ className: "size-4 shrink-0 rounded-[4px]",
23018
+ src: resolveComposerProviderTargetIconUrl(
23019
+ selectedProviderSwitchTarget
23020
+ )
23021
+ }
23022
+ ),
23023
+ /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: selectedProviderLabel })
23024
+ ] })
22644
23025
  }
22645
23026
  ),
22646
23027
  /* @__PURE__ */ jsx28(
@@ -22648,12 +23029,13 @@ function AgentComposer({
22648
23029
  {
22649
23030
  align: "start",
22650
23031
  className: cn(AgentGUINode_styles_default.composerMenuContent, "min-w-[190px]"),
22651
- children: providerSwitchTargets.map((target) => /* @__PURE__ */ jsx28(
23032
+ children: providerMenuTargets.map((target) => /* @__PURE__ */ jsx28(
22652
23033
  SelectItem2,
22653
23034
  {
22654
23035
  value: target.targetId,
22655
23036
  className: cn(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
22656
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-2", children: [
23037
+ disabled: target.disabled === true,
23038
+ children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
22657
23039
  /* @__PURE__ */ jsx28(
22658
23040
  "img",
22659
23041
  {
@@ -22767,7 +23149,7 @@ function AgentComposer({
22767
23149
  totalTokens: usage.totalTokens,
22768
23150
  tooltipsEnabled: !previewMode,
22769
23151
  compactSupported: compactSupported ?? false,
22770
- compactDisabled: !hasCompactableContext || composerControlsHardDisabled,
23152
+ compactDisabled: !hasCompactableContext || composerControlsHardDisabled || isSendingTurn,
22771
23153
  onCompact: () => onSubmit(textPromptContent("/compact")),
22772
23154
  labels: {
22773
23155
  usageChipLabel: labels.usageChipLabel,
@@ -22888,7 +23270,7 @@ function AgentComposerDraftImagePreview({
22888
23270
  removeLabel,
22889
23271
  onRemove
22890
23272
  }) {
22891
- const [aspectRatio, setAspectRatio] = useState10(1);
23273
+ const [aspectRatio, setAspectRatio] = useState11(1);
22892
23274
  const previewWidth = Math.round(
22893
23275
  Math.min(
22894
23276
  DRAFT_IMAGE_PREVIEW_MAX_WIDTH_PX,
@@ -23384,6 +23766,14 @@ function AttentionGlyph() {
23384
23766
 
23385
23767
  // agent-gui/agentGuiNode/AgentGUINodeView.tsx
23386
23768
  import { createRichTextMentionHref as createRichTextMentionHref2 } from "@tutti-os/ui-rich-text/core";
23769
+
23770
+ // app/renderer/assets/icons/agents/claudecode-flat-filled.svg
23771
+ var claudecode_flat_filled_default = "./claudecode-flat-filled-NHO4JCVK.svg";
23772
+
23773
+ // app/renderer/assets/icons/agents/codex-flat-filled.svg
23774
+ var codex_flat_filled_default = "./codex-flat-filled-WYHCF5VR.svg";
23775
+
23776
+ // agent-gui/agentGuiNode/AgentGUINodeView.tsx
23387
23777
  import { Fragment as Fragment8, jsx as jsx31, jsxs as jsxs17 } from "react/jsx-runtime";
23388
23778
  var AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX = 24;
23389
23779
  var AGENT_GUI_TOP_HISTORY_PREFETCH_THRESHOLD_PX = 240;
@@ -23404,8 +23794,22 @@ function resolveAgentGUIHeroIconUrl(provider) {
23404
23794
  const normalizedProvider = normalizeManagedAgentProvider(provider);
23405
23795
  return MANAGED_AGENT_ICON_URLS[normalizedProvider] ?? MANAGED_AGENT_ICON_FALLBACK_URL;
23406
23796
  }
23797
+ function agentGUIProviderIconPresentation(provider, iconUrl) {
23798
+ const normalizedProvider = normalizeManagedAgentProvider(provider);
23799
+ return {
23800
+ provider: normalizedProvider,
23801
+ iconUrl: iconUrl?.trim() || resolveAgentGUIHeroIconUrl(normalizedProvider)
23802
+ };
23803
+ }
23804
+ function agentGUIProviderRailIconPresentation(provider, iconUrl) {
23805
+ const normalizedProvider = normalizeManagedAgentProvider(provider);
23806
+ return {
23807
+ provider: normalizedProvider,
23808
+ iconUrl: iconUrl?.trim() || MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS[normalizedProvider] || resolveAgentGUIHeroIconUrl(normalizedProvider)
23809
+ };
23810
+ }
23407
23811
  function shouldEmphasizeEmptyHeroProvider(label) {
23408
- return !/[\u3400-\u9fff]/u.test(label);
23812
+ return label.trim().length > 0;
23409
23813
  }
23410
23814
  var fallbackWorkspaceFileReferenceCopy = {
23411
23815
  t(key, values) {
@@ -23586,9 +23990,45 @@ function conversationPlainTitle(conversation, labels, uiLanguage) {
23586
23990
  language: uiLanguage
23587
23991
  });
23588
23992
  }
23993
+ function buildAgentConversationHandoffPrompt(input) {
23994
+ const conversation = input.activeConversation;
23995
+ if (!conversation) {
23996
+ return "";
23997
+ }
23998
+ const sourceAgentLabel = input.selectedProviderTarget?.label?.trim() || conversation.provider;
23999
+ const title = conversationPlainTitle(
24000
+ conversation,
24001
+ input.labels,
24002
+ input.uiLanguage
24003
+ );
24004
+ const mentionLabel = `${sourceAgentLabel}${title ? ` ${title}` : ""}`.trim();
24005
+ const href = createRichTextMentionHref2({
24006
+ providerId: "agent-session",
24007
+ entityId: conversation.id,
24008
+ label: mentionLabel,
24009
+ scope: { workspaceId: input.workspaceId }
24010
+ });
24011
+ return `${formatAgentMentionMarkdown({
24012
+ kind: "session",
24013
+ href,
24014
+ workspaceId: input.workspaceId,
24015
+ targetId: conversation.id,
24016
+ name: mentionLabel,
24017
+ title: title || sourceAgentLabel,
24018
+ scope: "my_sessions",
24019
+ initiatorName: input.currentUserId?.trim() || sourceAgentLabel,
24020
+ agentName: sourceAgentLabel,
24021
+ status: conversation.status,
24022
+ updatedAtUnixMs: conversation.updatedAtUnixMs
24023
+ })} `;
24024
+ }
24025
+ function handoffProjectPathForConversation(conversation) {
24026
+ return conversation?.project?.path?.trim() || conversation?.cwd?.trim() || null;
24027
+ }
23589
24028
  function AgentGUINodeView({
23590
24029
  viewModel,
23591
24030
  onLinkAction,
24031
+ onHandoffConversation,
23592
24032
  capabilityMenuState,
23593
24033
  onCapabilitySettingsRequest,
23594
24034
  isActive = true,
@@ -23629,16 +24069,16 @@ function AgentGUINodeView({
23629
24069
  "use memo";
23630
24070
  const layoutElementRef = useRef12(null);
23631
24071
  const railResizeInteractionRef = useRef12(null);
23632
- const [isRailResizing, setIsRailResizing] = useState11(false);
23633
- const [railResizeWidthPx, setRailResizeWidthPx] = useState11(
24072
+ const [isRailResizing, setIsRailResizing] = useState12(false);
24073
+ const [railResizeWidthPx, setRailResizeWidthPx] = useState12(
23634
24074
  null
23635
24075
  );
23636
- const [workspaceReferencePickerOpen, setWorkspaceReferencePickerOpen] = useState11(false);
23637
- const [workspaceReferencePickerTarget, setWorkspaceReferencePickerTarget] = useState11(null);
24076
+ const [workspaceReferencePickerOpen, setWorkspaceReferencePickerOpen] = useState12(false);
24077
+ const [workspaceReferencePickerTarget, setWorkspaceReferencePickerTarget] = useState12(null);
23638
24078
  const [
23639
24079
  localComposerFocusRequestSequence,
23640
24080
  setLocalComposerFocusRequestSequence
23641
- ] = useState11(0);
24081
+ ] = useState12(0);
23642
24082
  const handledNewConversationRequestSequenceRef = useRef12(
23643
24083
  newConversationRequestSequence
23644
24084
  );
@@ -23806,7 +24246,7 @@ function AgentGUINodeView({
23806
24246
  viewModel.composerSettings.selectedProjectPath
23807
24247
  ]
23808
24248
  );
23809
- useEffect12(() => {
24249
+ useEffect13(() => {
23810
24250
  if (newConversationRequestSequence === null || handledNewConversationRequestSequenceRef.current === newConversationRequestSequence) {
23811
24251
  return;
23812
24252
  }
@@ -23896,7 +24336,7 @@ function AgentGUINodeView({
23896
24336
  },
23897
24337
  [onConversationRailWidthChanged]
23898
24338
  );
23899
- useEffect12(() => {
24339
+ useEffect13(() => {
23900
24340
  if (isRailResizing || railResizeWidthPx === null) {
23901
24341
  return;
23902
24342
  }
@@ -23936,13 +24376,22 @@ function AgentGUINodeView({
23936
24376
  ]
23937
24377
  );
23938
24378
  const visualConversationRailWidthPx = isRailResizing ? railResizeInteractionRef.current?.lastWidthPx ?? conversationRailWidthPx : railResizeWidthPx ?? conversationRailWidthPx;
24379
+ const effectiveConversationRailWidthPx = conversationRailCollapsed ? 0 : visualConversationRailWidthPx;
24380
+ const showProviderRail = true;
24381
+ const renderProviderRail = showProviderRail && !conversationRailCollapsed;
23939
24382
  const layoutStyle = {
23940
- "--agent-gui-conversation-rail-width": `${visualConversationRailWidthPx}px`,
24383
+ "--agent-gui-conversation-rail-width": `${effectiveConversationRailWidthPx}px`,
24384
+ "--agent-gui-conversation-rail-content-width": `${visualConversationRailWidthPx}px`,
23941
24385
  "--agent-gui-detail-min-width": `${detailMinWidthPx}px`,
23942
- gridTemplateColumns: conversationRailCollapsed ? "0 minmax(var(--agent-gui-detail-min-width), 1fr)" : "var(--agent-gui-conversation-rail-width) minmax(var(--agent-gui-detail-min-width), 1fr)"
24386
+ "--agent-gui-provider-rail-width": renderProviderRail ? "52px" : "0px",
24387
+ gridTemplateColumns: showProviderRail ? "var(--agent-gui-provider-rail-width) var(--agent-gui-conversation-rail-width) minmax(var(--agent-gui-detail-min-width), 1fr)" : "var(--agent-gui-conversation-rail-width) minmax(var(--agent-gui-detail-min-width), 1fr)"
23943
24388
  };
23944
24389
  const effectiveRailConfigProvider = railConfigProvider === void 0 ? viewModel.data.provider : railConfigProvider;
23945
24390
  const effectiveRailSlashStatusLimits = railSlashStatusLimits ?? slashStatusLimits;
24391
+ const enabledProviderTargets = viewModel.providerTargets.filter(
24392
+ (target) => target.disabled !== true && ((target.agentTargetId?.trim() ?? "") || (target.targetId?.trim() ?? ""))
24393
+ );
24394
+ const sectionAgentTargetFallbackId = enabledProviderTargets.length <= 1 ? viewModel.selectedProviderTarget.agentTargetId?.trim() || viewModel.selectedProviderTarget.targetId?.trim() || null : null;
23946
24395
  const openAgentEnvSetup = useCallback10(() => {
23947
24396
  if (!effectiveRailConfigProvider) {
23948
24397
  return;
@@ -23968,8 +24417,8 @@ function AgentGUINodeView({
23968
24417
  selectedProviderTarget: viewModel.selectedProviderTarget,
23969
24418
  providerTargets: viewModel.providerTargets,
23970
24419
  providerTargetsLoading: viewModel.providerTargetsLoading,
23971
- conversationScope: viewModel.conversationScope,
23972
24420
  conversationFilter: viewModel.conversationFilter,
24421
+ sectionAgentTargetFallbackId,
23973
24422
  onCreateConversation: requestCreateConversation,
23974
24423
  onUpdateConversationFilter: actions.updateConversationFilter,
23975
24424
  onSelectConversationFilterTarget: actions.selectConversationFilterTarget,
@@ -24007,6 +24456,7 @@ function AgentGUINodeView({
24007
24456
  retryOpenclawGateway,
24008
24457
  selectConversation,
24009
24458
  selectProjectDirectory,
24459
+ sectionAgentTargetFallbackId,
24010
24460
  effectiveRailConfigProvider,
24011
24461
  effectiveRailSlashStatusLimits,
24012
24462
  viewModel.selectedProviderTarget,
@@ -24014,7 +24464,6 @@ function AgentGUINodeView({
24014
24464
  viewModel.providerTargetsLoading,
24015
24465
  toggleConversationPinned,
24016
24466
  uiLanguage,
24017
- viewModel.conversationScope,
24018
24467
  viewModel.conversationFilter,
24019
24468
  viewModel.activeConversationId,
24020
24469
  viewModel.isDeletingConversation,
@@ -24062,6 +24511,28 @@ function AgentGUINodeView({
24062
24511
  inert: previewMode ? true : void 0,
24063
24512
  style: layoutStyle,
24064
24513
  children: [
24514
+ showProviderRail ? /* @__PURE__ */ jsx31(
24515
+ "aside",
24516
+ {
24517
+ className: AgentGUINode_styles_default.providerRailPanel,
24518
+ "aria-label": labels.providerSwitchLabel,
24519
+ "aria-hidden": conversationRailCollapsed ? "true" : void 0,
24520
+ inert: conversationRailCollapsed ? true : void 0,
24521
+ children: /* @__PURE__ */ jsx31(
24522
+ AgentGUIProviderRail,
24523
+ {
24524
+ conversationFilter: viewModel.conversationFilter,
24525
+ labels,
24526
+ previewMode,
24527
+ selectedProviderTarget: viewModel.selectedProviderTarget,
24528
+ providerTargets: viewModel.providerTargets,
24529
+ providerTargetsLoading: viewModel.providerTargetsLoading,
24530
+ onSelectConversationFilterTarget: actions.selectConversationFilterTarget,
24531
+ onUpdateConversationFilter: actions.updateConversationFilter
24532
+ }
24533
+ )
24534
+ }
24535
+ ) : null,
24065
24536
  /* @__PURE__ */ jsx31(
24066
24537
  "aside",
24067
24538
  {
@@ -24120,6 +24591,7 @@ function AgentGUINodeView({
24120
24591
  slashStatusLimits,
24121
24592
  slashStatusLimitsLoading,
24122
24593
  onLinkAction,
24594
+ onHandoffConversation,
24123
24595
  capabilityMenuState,
24124
24596
  onCapabilitySettingsRequest,
24125
24597
  onAgentProviderLogin,
@@ -24240,6 +24712,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24240
24712
  slashStatusLimits,
24241
24713
  slashStatusLimitsLoading,
24242
24714
  onLinkAction,
24715
+ onHandoffConversation,
24243
24716
  capabilityMenuState,
24244
24717
  onCapabilitySettingsRequest,
24245
24718
  onAgentProviderLogin,
@@ -24256,18 +24729,20 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24256
24729
  const timelineScrollAnchorRef = useRef12(null);
24257
24730
  const submittedPromptScrollConversationRef = useRef12(null);
24258
24731
  const pendingPrependScrollAnchorRef = useRef12(null);
24259
- const [isTimelineScrolledToTop, setIsTimelineScrolledToTop] = useState11(true);
24732
+ const [isTimelineScrolledToTop, setIsTimelineScrolledToTop] = useState12(true);
24733
+ const [isTimelineScrolledToBottom, setIsTimelineScrolledToBottom] = useState12(true);
24260
24734
  const [
24261
24735
  bottomDockDismissedPromptRequestId,
24262
24736
  setBottomDockDismissedPromptRequestId
24263
- ] = useState11(null);
24737
+ ] = useState12(null);
24264
24738
  const conversation = useProjectedAgentConversation({
24265
24739
  conversation: viewModel.conversation,
24266
24740
  detail: viewModel.conversationDetail,
24267
24741
  avoidGroupingEdits: viewModel.avoidGroupingEdits
24268
24742
  });
24269
24743
  const hasActiveConversation = viewModel.activeConversationId !== null;
24270
- const emptyProviderReadinessGate = !hasActiveConversation ? viewModel.providerReadinessGate : null;
24744
+ const selectedProviderTargetComingSoon = viewModel.selectedProviderTarget?.disabled === true;
24745
+ const emptyProviderReadinessGate = !hasActiveConversation ? selectedProviderTargetComingSoon ? { status: "coming_soon" } : viewModel.providerReadinessGate : null;
24271
24746
  const activePrompt = viewModel.pendingInteractivePrompt ?? viewModel.pendingApproval;
24272
24747
  const activePromptRequestId = activePrompt?.requestId ?? null;
24273
24748
  const sessionChrome = useMemo10(
@@ -24414,26 +24889,32 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24414
24889
  );
24415
24890
  const goalBannerLabels = useMemo10(
24416
24891
  () => ({
24417
- goalLabel: labels.goalLabel,
24418
- statusActive: labels.goalStatusActive,
24419
- statusPaused: labels.goalStatusPaused,
24420
- statusBlocked: labels.goalStatusBlocked,
24421
- statusUsageLimited: labels.goalStatusUsageLimited,
24422
- statusBudgetLimited: labels.goalStatusBudgetLimited,
24423
- statusComplete: labels.goalStatusComplete,
24892
+ titleActive: labels.goalTitleActive,
24893
+ titlePaused: labels.goalTitlePaused,
24894
+ titleBlocked: labels.goalTitleBlocked,
24895
+ titleUsageLimited: labels.goalTitleUsageLimited,
24896
+ titleBudgetLimited: labels.goalTitleBudgetLimited,
24897
+ titleComplete: labels.goalTitleComplete,
24424
24898
  budgetUsage: labels.goalBudgetUsage,
24425
- clearHint: labels.goalClearHint
24899
+ clearHint: labels.goalClearHint,
24900
+ editAction: labels.goalEditAction,
24901
+ pauseAction: labels.goalPauseAction,
24902
+ resumeAction: labels.goalResumeAction,
24903
+ clearAction: labels.goalClearAction
24426
24904
  }),
24427
24905
  [
24428
- labels.goalLabel,
24429
- labels.goalStatusActive,
24430
- labels.goalStatusPaused,
24431
- labels.goalStatusBlocked,
24432
- labels.goalStatusUsageLimited,
24433
- labels.goalStatusBudgetLimited,
24434
- labels.goalStatusComplete,
24906
+ labels.goalTitleActive,
24907
+ labels.goalTitlePaused,
24908
+ labels.goalTitleBlocked,
24909
+ labels.goalTitleUsageLimited,
24910
+ labels.goalTitleBudgetLimited,
24911
+ labels.goalTitleComplete,
24435
24912
  labels.goalBudgetUsage,
24436
- labels.goalClearHint
24913
+ labels.goalClearHint,
24914
+ labels.goalEditAction,
24915
+ labels.goalPauseAction,
24916
+ labels.goalResumeAction,
24917
+ labels.goalClearAction
24437
24918
  ]
24438
24919
  );
24439
24920
  const interactivePromptLabels = useMemo10(
@@ -24583,6 +25064,8 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24583
25064
  addReference: labels.addReference,
24584
25065
  addContent: labels.addContent,
24585
25066
  referenceWorkspaceFiles: labels.referenceWorkspaceFiles,
25067
+ handoffConversation: labels.handoffConversation,
25068
+ handoffConversationMenu: labels.handoffConversationMenu,
24586
25069
  providerSwitchLabel: labels.providerSwitchLabel,
24587
25070
  projectLocked: labels.projectLocked,
24588
25071
  projectMissingDescription: labels.projectMissingDescription,
@@ -24602,6 +25085,8 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24602
25085
  labels.fileMentionLoading,
24603
25086
  labels.fileMentionPalette,
24604
25087
  labels.fileMentionTabHint,
25088
+ labels.handoffConversation,
25089
+ labels.handoffConversationMenu,
24605
25090
  labels.inheritedUnavailable,
24606
25091
  labels.loadingConversation,
24607
25092
  labels.modelLabel,
@@ -24720,6 +25205,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24720
25205
  actions.updateComposerSettings
24721
25206
  );
24722
25207
  const submitPrompt = useStableEventCallback2(actions.submitPrompt);
25208
+ const goalControl = useStableEventCallback2(actions.goalControl);
24723
25209
  const submitGuidancePrompt = useStableEventCallback2(
24724
25210
  actions.submitGuidancePrompt
24725
25211
  );
@@ -24781,17 +25267,22 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24781
25267
  },
24782
25268
  [submitInteractivePrompt]
24783
25269
  );
24784
- const canSwitchComposerProvider = viewModel.conversationScope === "multi-provider";
24785
- const composerProviderTargets = canSwitchComposerProvider ? viewModel.providerTargets : [viewModel.selectedProviderTarget];
25270
+ const canSwitchComposerProvider = true;
25271
+ const composerProviderTargets = viewModel.providerTargets;
25272
+ const composerProvider = viewModel.activeConversationId === null ? viewModel.selectedProviderTarget?.provider ?? viewModel.data.provider : viewModel.data.provider;
25273
+ const composerSelectedProviderTarget = viewModel.activeConversationId === null ? viewModel.selectedProviderTarget : viewModel.providerTargets.find((target) => {
25274
+ if (target.provider !== viewModel.data.provider) {
25275
+ return false;
25276
+ }
25277
+ const agentTargetId = viewModel.data.agentTargetId;
25278
+ return !agentTargetId || target.targetId === agentTargetId || target.agentTargetId === agentTargetId;
25279
+ }) ?? viewModel.selectedProviderTarget;
24786
25280
  const bottomDockComposerProps = useMemo10(
24787
25281
  () => ({
24788
25282
  workspaceId: viewModel.workspaceId,
24789
25283
  workspacePath: viewModel.workspacePath,
24790
25284
  currentUserId: viewModel.currentUserId,
24791
- provider: viewModel.data.provider,
24792
- selectedProviderTarget: viewModel.selectedProviderTarget,
24793
- providerTargets: composerProviderTargets,
24794
- providerSelectReadonly: !canSwitchComposerProvider || viewModel.activeConversationId !== null,
25285
+ provider: composerProvider,
24795
25286
  slashStatus,
24796
25287
  usage: viewModel.usage,
24797
25288
  draftContent: viewModel.draftContent,
@@ -24799,8 +25290,13 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24799
25290
  hasCompactableContext: viewModel.hasSentUserMessage,
24800
25291
  compactSupported: viewModel.compactSupported,
24801
25292
  availableSkills: viewModel.availableSkills,
25293
+ selectedProviderTarget: composerSelectedProviderTarget,
25294
+ providerTargets: composerProviderTargets,
25295
+ providerSelectReadonly: !canSwitchComposerProvider || viewModel.activeConversationId !== null,
25296
+ onProviderSelect: canSwitchComposerProvider && viewModel.activeConversationId === null ? actions.selectHomeComposerAgentTarget : void 0,
24802
25297
  disabled: composerDisabled,
24803
25298
  disabledReason: composerDisabledReason,
25299
+ hasActiveConversation: viewModel.activeConversationId !== null,
24804
25300
  submitDisabled,
24805
25301
  composerSettings: viewModel.composerSettings,
24806
25302
  queuedPrompts: viewModel.queuedPrompts,
@@ -24820,6 +25316,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24820
25316
  composerFocusRequestSequence,
24821
25317
  isActive,
24822
25318
  promptImagesSupported: viewModel.promptImagesSupported,
25319
+ providerSelectLabel: labels.providerSwitchLabel,
25320
+ handoffLabel: labels.handoffConversation,
25321
+ handoffMenuLabel: labels.handoffConversationMenu,
24823
25322
  isInterrupting: viewModel.isInterrupting,
24824
25323
  isSendingTurn: isComposerSending,
24825
25324
  isSubmittingPrompt: viewModel.isRespondingApproval,
@@ -24830,7 +25329,6 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24830
25329
  onDraftContentChange: updateDraftContent,
24831
25330
  onProjectPathChange: updateSelectedProjectPath,
24832
25331
  onSettingsChange: updateComposerSettings,
24833
- onProviderSelect: canSwitchComposerProvider ? actions.selectProvider : void 0,
24834
25332
  onSubmit: submitPromptAndScrollToBottom,
24835
25333
  onSubmitGuidance: submitGuidancePromptAndScrollToBottom,
24836
25334
  onPromptImagesUnsupported: showPromptImagesUnsupported,
@@ -24841,6 +25339,21 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24841
25339
  onSubmitInteractivePrompt: submitInteractivePrompt,
24842
25340
  onCapabilitySettingsRequest,
24843
25341
  onLinkAction: stableLinkAction,
25342
+ onHandoffConversation: onHandoffConversation && viewModel.activeConversationId !== null ? (target) => onHandoffConversation({
25343
+ agentTargetId: target.agentTargetId ?? target.targetId,
25344
+ draftPrompt: buildAgentConversationHandoffPrompt({
25345
+ activeConversation: viewModel.activeConversation,
25346
+ currentUserId: viewModel.currentUserId,
25347
+ labels,
25348
+ selectedProviderTarget: composerSelectedProviderTarget,
25349
+ uiLanguage,
25350
+ workspaceId: viewModel.workspaceId
25351
+ }),
25352
+ provider: target.provider,
25353
+ userProjectPath: handoffProjectPathForConversation(
25354
+ viewModel.activeConversation
25355
+ )
25356
+ }) : void 0,
24844
25357
  onRequestWorkspaceReferences: stableRequestWorkspaceReferences,
24845
25358
  resolveDroppedFileReferences,
24846
25359
  selectProjectDirectory: stableSelectProjectDirectory,
@@ -24850,19 +25363,26 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24850
25363
  [
24851
25364
  canQueueWhileBusy,
24852
25365
  backgroundAgentStatusText,
24853
- canSwitchComposerProvider,
25366
+ actions.selectHomeComposerAgentTarget,
24854
25367
  capabilityMenuState,
24855
- composerProviderTargets,
25368
+ canSwitchComposerProvider,
24856
25369
  composerDisabled,
24857
25370
  composerDisabledReason,
24858
25371
  composerFocusRequestSequence,
24859
25372
  composerLabels,
25373
+ composerProviderTargets,
25374
+ composerSelectedProviderTarget,
24860
25375
  handleInterruptCurrentTurn,
24861
25376
  isActive,
24862
25377
  isComposerSending,
24863
25378
  labels.followupPlaceholder,
25379
+ labels.handoffConversation,
25380
+ labels.handoffConversationMenu,
24864
25381
  labels.initialPlaceholder,
24865
25382
  labels.promptTips,
25383
+ labels.providerSwitchLabel,
25384
+ labels,
25385
+ onHandoffConversation,
24866
25386
  previewMode,
24867
25387
  workspaceReferencePickerOpen,
24868
25388
  composerActivePrompt,
@@ -24885,16 +25405,17 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24885
25405
  stableSelectProjectDirectory,
24886
25406
  stableRequestWorkspaceReferences,
24887
25407
  updateComposerSettings,
24888
- actions.selectProvider,
24889
25408
  updateDraftContent,
24890
25409
  updateSelectedProjectPath,
25410
+ viewModel.activeConversationId,
24891
25411
  viewModel.availableCommands,
24892
25412
  viewModel.availableSkills,
24893
25413
  viewModel.compactSupported,
24894
25414
  viewModel.composerSettings,
24895
25415
  viewModel.currentUserId,
24896
- viewModel.data.provider,
24897
- viewModel.selectedProviderTarget,
25416
+ viewModel.activeConversationId,
25417
+ viewModel.activeConversation,
25418
+ composerProvider,
24898
25419
  viewModel.draftContent,
24899
25420
  viewModel.draftPrompt,
24900
25421
  viewModel.drainingQueuedPromptId,
@@ -24918,6 +25439,12 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24918
25439
  [bottomDockComposerProps]
24919
25440
  );
24920
25441
  const emptyHeroProvider = viewModel.selectedProviderTarget?.provider ?? viewModel.data.provider;
25442
+ const emptyHeroProviderLabel = labels.emptyProviderForProvider?.(emptyHeroProvider) ?? labels.emptyProvider ?? "";
25443
+ const emptyHeroLabel = labels.emptyForProvider?.(emptyHeroProvider) ?? labels.empty;
25444
+ const emptyHeroIconPresentations = useMemo10(
25445
+ () => viewModel.conversationFilter.kind === "all" ? agentGUILaunchpadIconPresentations() : [agentGUIProviderIconPresentation(emptyHeroProvider)],
25446
+ [emptyHeroProvider, viewModel.conversationFilter]
25447
+ );
24921
25448
  const bottomDockStoreState = useMemo10(
24922
25449
  () => ({
24923
25450
  // The lifted prompt is rendered from props on the pane; the store still
@@ -24954,7 +25481,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24954
25481
  viewModel.drainingQueuedPromptId ?? "",
24955
25482
  viewModel.isRespondingApproval ? "1" : "0"
24956
25483
  ].join("|");
24957
- useEffect12(() => {
25484
+ useEffect13(() => {
24958
25485
  setBottomDockDismissedPromptRequestId(null);
24959
25486
  }, [activePromptRequestId]);
24960
25487
  useLayoutEffect4(() => {
@@ -24968,6 +25495,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
24968
25495
  pendingPrependScrollAnchorRef.current = null;
24969
25496
  submittedPromptScrollConversationRef.current = null;
24970
25497
  setIsTimelineScrolledToTop(true);
25498
+ setIsTimelineScrolledToBottom(true);
24971
25499
  return;
24972
25500
  }
24973
25501
  const maxScrollTop = Math.max(
@@ -25018,6 +25546,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25018
25546
  setIsTimelineScrolledToTop(
25019
25547
  nextScrollTop <= AGENT_GUI_TOP_MASK_SCROLL_EPSILON_PX
25020
25548
  );
25549
+ setIsTimelineScrolledToBottom(
25550
+ maxScrollTop - nextScrollTop <= AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX
25551
+ );
25021
25552
  }, [
25022
25553
  conversation,
25023
25554
  showTimelineSkeleton,
@@ -25036,6 +25567,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25036
25567
  const bottomDockRect = bottomDock.getBoundingClientRect();
25037
25568
  let visualTop = bottomDockRect.top;
25038
25569
  bottomDock.querySelectorAll("*").forEach((element) => {
25570
+ if (element.closest(`.${AgentGUINode_styles_default.bottomDockScrollToBottom}`)) {
25571
+ return;
25572
+ }
25039
25573
  const rect = element.getBoundingClientRect();
25040
25574
  if (rect.width > 0 && rect.height > 0) {
25041
25575
  visualTop = Math.min(visualTop, rect.top);
@@ -25049,6 +25583,10 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25049
25583
  "--agent-gui-bottom-dock-safe-area",
25050
25584
  `${overflowHeight}px`
25051
25585
  );
25586
+ bottomDock.style.setProperty(
25587
+ "--agent-gui-bottom-dock-floating-safe-area",
25588
+ `${overflowHeight}px`
25589
+ );
25052
25590
  };
25053
25591
  const syncBottomDockSpace = () => {
25054
25592
  syncBottomDockSafeArea();
@@ -25079,12 +25617,16 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25079
25617
  setIsTimelineScrolledToTop(
25080
25618
  maxScrollTop <= AGENT_GUI_TOP_MASK_SCROLL_EPSILON_PX
25081
25619
  );
25620
+ setIsTimelineScrolledToBottom(true);
25082
25621
  });
25083
25622
  };
25084
25623
  syncBottomDockSpace();
25085
25624
  if (typeof ResizeObserver === "undefined") {
25086
25625
  return () => {
25087
25626
  timeline.style.removeProperty("--agent-gui-bottom-dock-safe-area");
25627
+ bottomDock.style.removeProperty(
25628
+ "--agent-gui-bottom-dock-floating-safe-area"
25629
+ );
25088
25630
  if (animationFrameId !== null) {
25089
25631
  window.cancelAnimationFrame(animationFrameId);
25090
25632
  }
@@ -25100,13 +25642,16 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25100
25642
  }
25101
25643
  return () => {
25102
25644
  timeline.style.removeProperty("--agent-gui-bottom-dock-safe-area");
25645
+ bottomDock.style.removeProperty(
25646
+ "--agent-gui-bottom-dock-floating-safe-area"
25647
+ );
25103
25648
  if (animationFrameId !== null) {
25104
25649
  window.cancelAnimationFrame(animationFrameId);
25105
25650
  }
25106
25651
  observer.disconnect();
25107
25652
  };
25108
25653
  }, [bottomDockStoreRevision, viewModel.activeConversationId]);
25109
- useEffect12(() => {
25654
+ useEffect13(() => {
25110
25655
  const timeline = timelineRef.current;
25111
25656
  const activeConversationId = viewModel.activeConversationId;
25112
25657
  if (!timeline || !activeConversationId) {
@@ -25123,6 +25668,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25123
25668
  setIsTimelineScrolledToTop(
25124
25669
  scrollTop <= AGENT_GUI_TOP_MASK_SCROLL_EPSILON_PX
25125
25670
  );
25671
+ setIsTimelineScrolledToBottom(
25672
+ timeline.scrollHeight - scrollTop - timeline.clientHeight <= AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX
25673
+ );
25126
25674
  if (viewModel.hasOlderMessages && !viewModel.isLoadingOlderMessages && scrollTop <= AGENT_GUI_TOP_HISTORY_PREFETCH_THRESHOLD_PX) {
25127
25675
  pendingPrependScrollAnchorRef.current = {
25128
25676
  conversationId: activeConversationId,
@@ -25143,6 +25691,28 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25143
25691
  viewModel.hasOlderMessages,
25144
25692
  viewModel.isLoadingOlderMessages
25145
25693
  ]);
25694
+ const scrollTimelineToBottom = useCallback10(() => {
25695
+ const timeline = timelineRef.current;
25696
+ const activeConversationId = viewModel.activeConversationId;
25697
+ if (!timeline || !activeConversationId) {
25698
+ return;
25699
+ }
25700
+ const maxScrollTop = Math.max(
25701
+ 0,
25702
+ timeline.scrollHeight - timeline.clientHeight
25703
+ );
25704
+ setTimelineScrollTopWithUserTransition(timeline, maxScrollTop);
25705
+ timelineScrollAnchorRef.current = {
25706
+ conversationId: activeConversationId,
25707
+ scrollHeight: timeline.scrollHeight,
25708
+ scrollTop: maxScrollTop,
25709
+ clientHeight: timeline.clientHeight
25710
+ };
25711
+ setIsTimelineScrolledToTop(
25712
+ maxScrollTop <= AGENT_GUI_TOP_MASK_SCROLL_EPSILON_PX
25713
+ );
25714
+ setIsTimelineScrolledToBottom(true);
25715
+ }, [viewModel.activeConversationId]);
25146
25716
  return /* @__PURE__ */ jsxs17("main", { className: AgentGUINode_styles_default.detail, children: [
25147
25717
  /* @__PURE__ */ jsx31(
25148
25718
  AgentGUIDetailHeader,
@@ -25194,7 +25764,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25194
25764
  ScrollArea,
25195
25765
  {
25196
25766
  scrollbarMode: "native",
25197
- className: "min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100",
25767
+ className: "flex h-full min-h-0 flex-1 flex-col [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100",
25198
25768
  viewportRef: timelineRef,
25199
25769
  viewportTestId: "agent-gui-timeline",
25200
25770
  viewportClassName: `${AgentGUINode_styles_default.timeline} ${hasActiveConversation ? AgentGUINode_styles_default.timelineWithComposer : AgentGUINode_styles_default.timelineCentered} ${!isTimelineScrolledToTop ? AgentGUINode_styles_default.timelineScrolledFromTop : ""} ${showUnavailableChatEmpty ? AgentGUINode_styles_default.timelineUnavailableChatEmpty : ""}`.trim(),
@@ -25204,22 +25774,28 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25204
25774
  {
25205
25775
  provider: emptyHeroProvider,
25206
25776
  gate: emptyProviderReadinessGate,
25777
+ showAllProviders: viewModel.conversationFilter.kind === "all",
25207
25778
  labels
25208
25779
  }
25209
25780
  ) : /* @__PURE__ */ jsx31(
25210
25781
  AgentGUIEmptyHeroPane,
25211
25782
  {
25212
25783
  provider: emptyHeroProvider,
25213
- emptyLabel: labels.empty,
25214
- emptyProvider: labels.emptyProvider ?? "",
25784
+ emptyLabel: emptyHeroLabel,
25785
+ emptyProvider: emptyHeroProviderLabel,
25786
+ iconPresentations: emptyHeroIconPresentations,
25215
25787
  inlineNoticeChrome,
25216
25788
  isRespondingApproval: viewModel.isRespondingApproval,
25217
25789
  onSubmitApprovalOption: submitApprovalOption,
25218
25790
  onRetryActivation: retryActivation,
25219
25791
  onAuthLogin: authLogin,
25220
25792
  onContinueInNewConversation: continueInNewConversation,
25793
+ onProviderSelect: canSwitchComposerProvider && viewModel.activeConversationId === null ? actions.selectHomeComposerAgentTarget : void 0,
25794
+ providerTargets: composerProviderTargets,
25795
+ selectedProviderTarget: viewModel.selectedProviderTarget,
25221
25796
  chromeLabels,
25222
- composerProps: emptyHeroComposerProps
25797
+ composerProps: emptyHeroComposerProps,
25798
+ providerSelectLabel: labels.providerSwitchLabel
25223
25799
  }
25224
25800
  ) : /* @__PURE__ */ jsx31(
25225
25801
  AgentGUIConversationTimelinePane,
@@ -25243,6 +25819,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25243
25819
  AgentGUIBottomDockPane,
25244
25820
  {
25245
25821
  bottomDockRef,
25822
+ showScrollToBottom: !isTimelineScrolledToBottom,
25823
+ scrollToBottomLabel: labels.scrollToBottom,
25824
+ onScrollToBottom: scrollTimelineToBottom,
25246
25825
  bottomDockLiftedPrompt,
25247
25826
  bottomDockReplacementPrompt,
25248
25827
  store: bottomDockStore,
@@ -25255,7 +25834,9 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25255
25834
  onRetryActivation: retryActivation,
25256
25835
  onAuthLogin: authLogin,
25257
25836
  onContinueInNewConversation: continueInNewConversation,
25258
- onSubmitBottomDockInteractivePrompt: submitBottomDockInteractivePrompt
25837
+ onSubmitBottomDockInteractivePrompt: submitBottomDockInteractivePrompt,
25838
+ onGoalControl: goalControl,
25839
+ goalPauseSupported: viewModel.goalPauseSupported
25259
25840
  }
25260
25841
  ) : null
25261
25842
  ] });
@@ -25357,29 +25938,52 @@ var AgentGUIEmptyHeroPane = memo(function AgentGUIEmptyHeroPane2({
25357
25938
  provider,
25358
25939
  emptyLabel,
25359
25940
  emptyProvider,
25941
+ iconPresentations,
25360
25942
  inlineNoticeChrome,
25361
25943
  isRespondingApproval,
25362
25944
  onSubmitApprovalOption,
25363
25945
  onAuthLogin,
25364
25946
  onRetryActivation,
25365
25947
  onContinueInNewConversation,
25948
+ onProviderSelect,
25949
+ providerTargets,
25950
+ selectedProviderTarget,
25366
25951
  chromeLabels,
25367
- composerProps
25952
+ composerProps,
25953
+ providerSelectLabel
25368
25954
  }) {
25369
25955
  "use memo";
25370
- const heroIconUrl = resolveAgentGUIHeroIconUrl(provider);
25956
+ const heroIconPresentations = iconPresentations.length > 0 ? iconPresentations : [agentGUIProviderIconPresentation(provider)];
25957
+ const heroIconAnimationKey = heroIconPresentations.map((icon) => `${icon.provider}:${icon.iconUrl}`).join("|");
25371
25958
  return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.emptyHeroBody, children: [
25372
- /* @__PURE__ */ jsx31(
25373
- "img",
25959
+ heroIconPresentations.length > 1 ? /* @__PURE__ */ jsx31(
25960
+ AgentGUIAllProviderGridIcon,
25374
25961
  {
25375
- "aria-hidden": "true",
25376
- className: AgentGUINode_styles_default.emptyHeroIconEffect,
25377
- draggable: false,
25378
- src: heroIconUrl,
25379
- alt: ""
25380
- }
25962
+ activeProvider: provider,
25963
+ className: AgentGUINode_styles_default.emptyHeroLaunchpadIcon,
25964
+ icons: heroIconPresentations
25965
+ },
25966
+ heroIconAnimationKey
25967
+ ) : /* @__PURE__ */ jsx31(
25968
+ AgentGUIProviderIconVisual,
25969
+ {
25970
+ ariaHidden: true,
25971
+ imageClassName: AgentGUINode_styles_default.emptyHeroIconEffect,
25972
+ icon: heroIconPresentations[0]
25973
+ },
25974
+ heroIconAnimationKey
25381
25975
  ),
25382
- /* @__PURE__ */ jsx31("h2", { className: AgentGUINode_styles_default.emptyHeroTitle, children: /* @__PURE__ */ jsx31(EmptyHeroTitle, { label: emptyLabel, providerLabel: emptyProvider }) }),
25976
+ /* @__PURE__ */ jsx31("h2", { className: AgentGUINode_styles_default.emptyHeroTitle, children: /* @__PURE__ */ jsx31(
25977
+ EmptyHeroTitle,
25978
+ {
25979
+ label: emptyLabel,
25980
+ providerLabel: emptyProvider,
25981
+ providerSelectLabel,
25982
+ providerTargets,
25983
+ selectedProviderTarget,
25984
+ onProviderSelect
25985
+ }
25986
+ ) }),
25383
25987
  inlineNoticeChrome ? /* @__PURE__ */ jsx31(
25384
25988
  AgentSessionChrome,
25385
25989
  {
@@ -25399,13 +26003,21 @@ var AgentGUIProviderReadinessGatePane = memo(
25399
26003
  function AgentGUIProviderReadinessGatePane2({
25400
26004
  provider,
25401
26005
  gate,
26006
+ showAllProviders = false,
25402
26007
  labels
25403
26008
  }) {
25404
26009
  "use memo";
25405
26010
  const heroIconUrl = resolveAgentGUIHeroIconUrl(provider);
26011
+ const launchpadIconPresentations = useMemo10(
26012
+ () => agentGUILaunchpadIconPresentations(),
26013
+ []
26014
+ );
25406
26015
  const pendingAction = gate.pendingAction ?? null;
25407
26016
  const isPending = pendingAction !== null;
25408
- const content = providerGateContent(gate.status, labels);
26017
+ const showAllProvidersChecking = showAllProviders && gate.status === "checking";
26018
+ const content = providerGateContent(gate.status, labels, {
26019
+ showAllProviders: showAllProvidersChecking
26020
+ });
25409
26021
  const action = providerGateAction(gate.status);
25410
26022
  const pendingLabel = pendingAction === "install" ? labels.providerGatePendingInstall : pendingAction === "login" ? labels.providerGatePendingLogin : pendingAction === "refresh" ? labels.providerGatePendingRefresh : null;
25411
26023
  return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs17(
@@ -25415,7 +26027,13 @@ var AgentGUIProviderReadinessGatePane = memo(
25415
26027
  "data-testid": "agent-gui-provider-readiness-gate",
25416
26028
  role: "status",
25417
26029
  children: [
25418
- /* @__PURE__ */ jsx31(
26030
+ showAllProvidersChecking ? /* @__PURE__ */ jsx31(
26031
+ AgentGUIAllProviderGridIcon,
26032
+ {
26033
+ className: AgentGUINode_styles_default.emptyHeroLaunchpadIcon,
26034
+ icons: launchpadIconPresentations
26035
+ }
26036
+ ) : /* @__PURE__ */ jsx31(
25419
26037
  "img",
25420
26038
  {
25421
26039
  "aria-hidden": "true",
@@ -25435,7 +26053,7 @@ var AgentGUIProviderReadinessGatePane = memo(
25435
26053
  children: pendingLabel
25436
26054
  }
25437
26055
  ) : null,
25438
- action ? /* @__PURE__ */ jsxs17(
26056
+ action ? /* @__PURE__ */ jsx31(
25439
26057
  Button,
25440
26058
  {
25441
26059
  type: "button",
@@ -25452,10 +26070,20 @@ var AgentGUIProviderReadinessGatePane = memo(
25452
26070
  }
25453
26071
  gate.onAction?.(provider, action);
25454
26072
  },
25455
- children: [
25456
- /* @__PURE__ */ jsx31(Wrench, { size: 16, strokeWidth: 2, "aria-hidden": "true" }),
25457
- isPending && pendingLabel ? pendingLabel : content.actionLabel
25458
- ]
26073
+ children: isPending && pendingLabel ? pendingLabel : content.actionLabel
26074
+ }
26075
+ ) : content.actionLabel ? /* @__PURE__ */ jsx31(
26076
+ Button,
26077
+ {
26078
+ type: "button",
26079
+ className: cn3(
26080
+ AgentGUINode_styles_default.emptyProviderGateAction,
26081
+ "nodrag tsh-desktop-no-drag [-webkit-app-region:no-drag]"
26082
+ ),
26083
+ "data-testid": "agent-gui-provider-readiness-gate-action",
26084
+ disabled: true,
26085
+ onPointerDown: (event) => event.stopPropagation(),
26086
+ children: content.actionLabel
25459
26087
  }
25460
26088
  ) : null
25461
26089
  ]
@@ -25463,12 +26091,12 @@ var AgentGUIProviderReadinessGatePane = memo(
25463
26091
  ) });
25464
26092
  }
25465
26093
  );
25466
- function providerGateContent(status, labels) {
26094
+ function providerGateContent(status, labels, options = {}) {
25467
26095
  switch (status) {
25468
26096
  case "checking":
25469
26097
  return {
25470
26098
  title: labels.providerGateCheckingTitle,
25471
- description: labels.providerGateCheckingDescription
26099
+ description: options.showAllProviders === true ? labels.providerGateCheckingAgentsDescription : labels.providerGateCheckingDescription
25472
26100
  };
25473
26101
  case "not_installed":
25474
26102
  return {
@@ -25482,6 +26110,12 @@ function providerGateContent(status, labels) {
25482
26110
  description: labels.providerGateLoginDescription,
25483
26111
  actionLabel: labels.providerGateLoginAction
25484
26112
  };
26113
+ case "coming_soon":
26114
+ return {
26115
+ title: labels.providerGateComingSoonTitle,
26116
+ description: labels.providerGateComingSoonDescription,
26117
+ actionLabel: labels.providerGateComingSoonAction
26118
+ };
25485
26119
  case "unavailable":
25486
26120
  return {
25487
26121
  title: labels.providerGateUnavailableTitle,
@@ -25498,27 +26132,167 @@ function providerGateAction(status) {
25498
26132
  return "login";
25499
26133
  case "unavailable":
25500
26134
  return "refresh";
26135
+ case "coming_soon":
25501
26136
  case "checking":
25502
26137
  return null;
25503
26138
  }
25504
26139
  }
26140
+ function AgentGUIAllProviderGridIcon({
26141
+ activeProvider,
26142
+ className,
26143
+ icons
26144
+ }) {
26145
+ return /* @__PURE__ */ jsx31(
26146
+ "span",
26147
+ {
26148
+ "aria-hidden": "true",
26149
+ className: [AgentGUINode_styles_default.providerRailAvatar, className].filter(Boolean).join(" "),
26150
+ children: /* @__PURE__ */ jsx31(
26151
+ AgentGUILaunchpadIconGrid,
26152
+ {
26153
+ activeProvider,
26154
+ icons
26155
+ }
26156
+ )
26157
+ }
26158
+ );
26159
+ }
26160
+ function AgentGUILaunchpadIconGrid({
26161
+ activeProvider,
26162
+ icons
26163
+ }) {
26164
+ const normalizedActiveProvider = activeProvider ? normalizeManagedAgentProvider(activeProvider) : null;
26165
+ return /* @__PURE__ */ jsx31("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailLaunchpadIcon, children: icons.map((icon) => {
26166
+ return /* @__PURE__ */ jsx31(
26167
+ "span",
26168
+ {
26169
+ className: AgentGUINode_styles_default.providerRailLaunchpadItem,
26170
+ "data-provider-active": normalizedActiveProvider === null ? void 0 : normalizeManagedAgentProvider(icon.provider) === normalizedActiveProvider,
26171
+ children: /* @__PURE__ */ jsx31(AgentGUIProviderIconVisual, { imageClassName: "", icon })
26172
+ },
26173
+ `${icon.provider}:${icon.iconUrl}`
26174
+ );
26175
+ }) });
26176
+ }
26177
+ function AgentGUIProviderIconVisual({
26178
+ ariaHidden = false,
26179
+ icon,
26180
+ imageClassName
26181
+ }) {
26182
+ return /* @__PURE__ */ jsx31(
26183
+ "img",
26184
+ {
26185
+ alt: "",
26186
+ "aria-hidden": ariaHidden ? "true" : void 0,
26187
+ className: imageClassName,
26188
+ draggable: false,
26189
+ src: icon.iconUrl
26190
+ }
26191
+ );
26192
+ }
25505
26193
  function EmptyHeroTitle({
25506
26194
  label,
25507
- providerLabel
26195
+ providerLabel,
26196
+ providerSelectLabel,
26197
+ providerTargets = [],
26198
+ selectedProviderTarget = null,
26199
+ onProviderSelect
25508
26200
  }) {
25509
26201
  const providerStart = providerLabel ? label.indexOf(providerLabel) : -1;
25510
26202
  if (!shouldEmphasizeEmptyHeroProvider(label) || providerStart < 0) {
25511
26203
  return /* @__PURE__ */ jsx31(Fragment8, { children: label });
25512
26204
  }
25513
26205
  const providerEnd = providerStart + providerLabel.length;
26206
+ const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${selectedProviderTarget?.provider ?? ""}`;
26207
+ const canSwitchProvider = providerTargets.length > 1 && selectedProviderTarget && onProviderSelect;
26208
+ const providerName = label.slice(providerStart, providerEnd);
25514
26209
  return /* @__PURE__ */ jsxs17(Fragment8, { children: [
25515
26210
  label.slice(0, providerStart),
25516
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.emptyHeroProvider, children: label.slice(providerStart, providerEnd) }),
26211
+ canSwitchProvider ? /* @__PURE__ */ jsxs17(
26212
+ Select3,
26213
+ {
26214
+ value: selectedProviderTargetId,
26215
+ onValueChange: (nextTargetId) => {
26216
+ const target = providerTargets.find(
26217
+ (candidate) => candidate.targetId === nextTargetId
26218
+ );
26219
+ if (!target || target.disabled === true) {
26220
+ return;
26221
+ }
26222
+ onProviderSelect({
26223
+ provider: target.provider,
26224
+ providerTargetId: target.targetId
26225
+ });
26226
+ },
26227
+ children: [
26228
+ /* @__PURE__ */ jsx31(
26229
+ SelectTrigger3,
26230
+ {
26231
+ size: "sm",
26232
+ "aria-label": providerSelectLabel,
26233
+ title: providerSelectLabel,
26234
+ className: AgentGUINode_styles_default.emptyHeroProviderSelect,
26235
+ children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.emptyHeroProvider, children: providerName })
26236
+ }
26237
+ ),
26238
+ /* @__PURE__ */ jsx31(
26239
+ SelectContent3,
26240
+ {
26241
+ align: "center",
26242
+ className: cn3(AgentGUINode_styles_default.composerMenuContent, "min-w-[190px]"),
26243
+ children: providerTargets.map((target) => /* @__PURE__ */ jsx31(
26244
+ SelectItem3,
26245
+ {
26246
+ value: target.targetId,
26247
+ className: cn3(
26248
+ AgentGUINode_styles_default.composerMenuItem,
26249
+ "gap-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-30 data-[disabled]:text-[var(--text-disabled,var(--text-tertiary))]",
26250
+ target.disabled === true ? "cursor-not-allowed opacity-30" : null
26251
+ ),
26252
+ disabled: target.disabled === true,
26253
+ children: /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-1.5", children: [
26254
+ /* @__PURE__ */ jsx31(
26255
+ "img",
26256
+ {
26257
+ alt: "",
26258
+ "aria-hidden": "true",
26259
+ className: cn3(
26260
+ "size-4 shrink-0 rounded-[4px]",
26261
+ target.disabled === true ? "grayscale opacity-30" : null
26262
+ ),
26263
+ src: agentGUIProviderIconPresentation(
26264
+ target.provider,
26265
+ target.iconUrl
26266
+ ).iconUrl
26267
+ }
26268
+ ),
26269
+ /* @__PURE__ */ jsx31(
26270
+ "span",
26271
+ {
26272
+ className: cn3(
26273
+ "min-w-0 truncate",
26274
+ target.disabled === true ? "text-[var(--text-disabled,var(--text-tertiary))]" : null
26275
+ ),
26276
+ children: target.label
26277
+ }
26278
+ )
26279
+ ] })
26280
+ },
26281
+ `${target.provider}:${target.targetId}`
26282
+ ))
26283
+ }
26284
+ )
26285
+ ]
26286
+ }
26287
+ ) : /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.emptyHeroProvider, children: providerName }),
25517
26288
  label.slice(providerEnd)
25518
26289
  ] });
25519
26290
  }
25520
26291
  var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
25521
26292
  bottomDockRef,
26293
+ showScrollToBottom,
26294
+ scrollToBottomLabel,
26295
+ onScrollToBottom,
25522
26296
  bottomDockLiftedPrompt,
25523
26297
  bottomDockReplacementPrompt,
25524
26298
  store,
@@ -25531,7 +26305,9 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
25531
26305
  onAuthLogin,
25532
26306
  onRetryActivation,
25533
26307
  onContinueInNewConversation,
25534
- onSubmitBottomDockInteractivePrompt
26308
+ onSubmitBottomDockInteractivePrompt,
26309
+ onGoalControl,
26310
+ goalPauseSupported
25535
26311
  }) {
25536
26312
  "use memo";
25537
26313
  const state = useSnapshot(store);
@@ -25547,6 +26323,7 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
25547
26323
  const goalStatus = goal ? stringValue2(goal.status) : "";
25548
26324
  const goalTokenBudget = goal ? numberValue2(goal.tokenBudget) : null;
25549
26325
  const goalTokensUsed = goal ? numberValue2(goal.tokensUsed) : null;
26326
+ const goalTimeUsedSeconds = goal ? numberValue2(goal.timeUsedSeconds) : null;
25550
26327
  const showGoalBanner = isGoalBannerVisible(goalObjective, goalStatus);
25551
26328
  return /* @__PURE__ */ jsxs17(
25552
26329
  "div",
@@ -25555,6 +26332,22 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
25555
26332
  className: AgentGUINode_styles_default.bottomDock,
25556
26333
  "data-testid": "agent-gui-bottom-dock",
25557
26334
  children: [
26335
+ showScrollToBottom ? /* @__PURE__ */ jsx31(
26336
+ "button",
26337
+ {
26338
+ type: "button",
26339
+ className: cn3(
26340
+ AgentGUINode_styles_default.bottomDockScrollToBottom,
26341
+ "nodrag tsh-desktop-no-drag [-webkit-app-region:no-drag]"
26342
+ ),
26343
+ "data-testid": "agent-gui-scroll-to-bottom",
26344
+ "aria-label": scrollToBottomLabel,
26345
+ title: scrollToBottomLabel,
26346
+ onPointerDown: (event) => event.stopPropagation(),
26347
+ onClick: onScrollToBottom,
26348
+ children: /* @__PURE__ */ jsx31(ChevronsDown, { "aria-hidden": "true", size: 15, strokeWidth: 2.2 })
26349
+ }
26350
+ ) : null,
25558
26351
  bottomDockLiftedPrompt ? /* @__PURE__ */ jsx31(
25559
26352
  "div",
25560
26353
  {
@@ -25606,7 +26399,12 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
25606
26399
  status: goalStatus,
25607
26400
  tokenBudget: goalTokenBudget ?? void 0,
25608
26401
  tokensUsed: goalTokensUsed ?? void 0,
25609
- labels: goalBannerLabels
26402
+ timeUsedSeconds: goalTimeUsedSeconds ?? void 0,
26403
+ labels: goalBannerLabels,
26404
+ onEditObjective: (objective) => onGoalControl("set", objective),
26405
+ onPauseGoal: goalPauseSupported ? () => onGoalControl("pause") : void 0,
26406
+ onResumeGoal: goalPauseSupported ? () => onGoalControl("resume") : void 0,
26407
+ onClearGoal: () => onGoalControl("clear")
25610
26408
  }
25611
26409
  ) : null,
25612
26410
  bottomDockReplacementPrompt ? /* @__PURE__ */ jsx31(
@@ -25643,7 +26441,7 @@ function syncAgentGUIConversationRailStore(store, next) {
25643
26441
  Object.assign(store, next);
25644
26442
  }
25645
26443
  function agentGUIConversationRailStoreSnapshotsEqual(current, next) {
25646
- return current.activeConversationId === next.activeConversationId && current.pendingDeleteConversationId === next.pendingDeleteConversationId && current.isLoadingConversations === next.isLoadingConversations && current.isDeletingConversation === next.isDeletingConversation && current.isDeletingProjectConversations === next.isDeletingProjectConversations && current.labels === next.labels && current.workspaceUserProjectI18n === next.workspaceUserProjectI18n && current.uiLanguage === next.uiLanguage && current.previewMode === next.previewMode && current.createConversationDisabled === next.createConversationDisabled && current.openclawGateway === next.openclawGateway && current.isCollapsed === next.isCollapsed && current.railConfigProvider === next.railConfigProvider && current.slashStatusLimits === next.slashStatusLimits && current.selectedProviderTarget === next.selectedProviderTarget && current.providerTargets === next.providerTargets && current.providerTargetsLoading === next.providerTargetsLoading && current.conversationScope === next.conversationScope && current.conversationFilter === next.conversationFilter && current.onUpdateConversationFilter === next.onUpdateConversationFilter && current.onSelectConversationFilterTarget === next.onSelectConversationFilterTarget && current.onCreateConversation === next.onCreateConversation && current.onOpenAgentEnvSetup === next.onOpenAgentEnvSetup && current.onRetryOpenclawGateway === next.onRetryOpenclawGateway && current.onSelectConversation === next.onSelectConversation && current.onToggleConversationPinned === next.onToggleConversationPinned && current.onOpenProjectFiles === next.onOpenProjectFiles && current.onOpenConversationWindow === next.onOpenConversationWindow && current.selectProjectDirectory === next.selectProjectDirectory && current.onRemoveProject === next.onRemoveProject && current.onConfirmDeleteProjectConversations === next.onConfirmDeleteProjectConversations && current.onRequestDeleteConversation === next.onRequestDeleteConversation && current.onCancelDeleteConversation === next.onCancelDeleteConversation && current.onConfirmDeleteConversation === next.onConfirmDeleteConversation;
26444
+ return current.activeConversationId === next.activeConversationId && current.pendingDeleteConversationId === next.pendingDeleteConversationId && current.isLoadingConversations === next.isLoadingConversations && current.isDeletingConversation === next.isDeletingConversation && current.isDeletingProjectConversations === next.isDeletingProjectConversations && current.labels === next.labels && current.workspaceUserProjectI18n === next.workspaceUserProjectI18n && current.uiLanguage === next.uiLanguage && current.previewMode === next.previewMode && current.createConversationDisabled === next.createConversationDisabled && current.openclawGateway === next.openclawGateway && current.isCollapsed === next.isCollapsed && current.railConfigProvider === next.railConfigProvider && current.slashStatusLimits === next.slashStatusLimits && current.selectedProviderTarget === next.selectedProviderTarget && current.providerTargets === next.providerTargets && current.providerTargetsLoading === next.providerTargetsLoading && current.conversationFilter === next.conversationFilter && current.sectionAgentTargetFallbackId === next.sectionAgentTargetFallbackId && current.onUpdateConversationFilter === next.onUpdateConversationFilter && current.onSelectConversationFilterTarget === next.onSelectConversationFilterTarget && current.onCreateConversation === next.onCreateConversation && current.onOpenAgentEnvSetup === next.onOpenAgentEnvSetup && current.onRetryOpenclawGateway === next.onRetryOpenclawGateway && current.onSelectConversation === next.onSelectConversation && current.onToggleConversationPinned === next.onToggleConversationPinned && current.onOpenProjectFiles === next.onOpenProjectFiles && current.onOpenConversationWindow === next.onOpenConversationWindow && current.selectProjectDirectory === next.selectProjectDirectory && current.onRemoveProject === next.onRemoveProject && current.onConfirmDeleteProjectConversations === next.onConfirmDeleteProjectConversations && current.onRequestDeleteConversation === next.onRequestDeleteConversation && current.onCancelDeleteConversation === next.onCancelDeleteConversation && current.onConfirmDeleteConversation === next.onConfirmDeleteConversation;
25647
26445
  }
25648
26446
  var AgentGUIConversationRailStorePane = memo(
25649
26447
  function AgentGUIConversationRailStorePane2({
@@ -25868,18 +26666,51 @@ function conversationProjectsRenderEqual2(left, right) {
25868
26666
  return left === right || (!left || !right ? !left && !right : left.id === right.id && left.path === right.path && left.label === right.label && left.createdAtUnixMs === right.createdAtUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.lastUsedAtUnixMs === right.lastUsedAtUnixMs);
25869
26667
  }
25870
26668
  var agentGUIProviderRailOrder = [
25871
- "nexight",
25872
- "claude-code",
25873
26669
  "codex",
25874
- "openclaw",
26670
+ "claude-code",
26671
+ "nexight",
25875
26672
  "hermes",
26673
+ "openclaw",
25876
26674
  "gemini"
25877
26675
  ];
26676
+ var agentGUIProviderRailDefaultProviders = [
26677
+ "codex",
26678
+ "claude-code",
26679
+ "nexight",
26680
+ "hermes",
26681
+ "openclaw"
26682
+ ];
26683
+ var agentGUIProviderRailDisabledProviders = /* @__PURE__ */ new Set([
26684
+ "nexight",
26685
+ "hermes",
26686
+ "openclaw"
26687
+ ]);
25878
26688
  function agentGUIProviderRailOrderIndex(provider) {
25879
26689
  const index = agentGUIProviderRailOrder.indexOf(provider);
25880
26690
  return index < 0 ? agentGUIProviderRailOrder.length : index;
25881
26691
  }
26692
+ function agentGUILaunchpadIconPresentations() {
26693
+ return [
26694
+ agentGUIProviderRailIconPresentation("codex"),
26695
+ agentGUIProviderRailIconPresentation("claude-code"),
26696
+ agentGUIProviderRailIconPresentation("tutti"),
26697
+ agentGUIProviderRailIconPresentation("hermes")
26698
+ ];
26699
+ }
26700
+ function agentGUIConversationProviderIconUrl(provider) {
26701
+ switch (normalizeManagedAgentProvider(provider)) {
26702
+ case "claude-code":
26703
+ return claudecode_flat_filled_default;
26704
+ case "codex":
26705
+ return codex_flat_filled_default;
26706
+ default:
26707
+ return null;
26708
+ }
26709
+ }
25882
26710
  function agentGUIProviderRailLabel(provider, targetLabel, labels) {
26711
+ if (provider === "nexight" && targetLabel === "Tutti Agent") {
26712
+ return labels.conversationFilterTutti;
26713
+ }
25883
26714
  if (targetLabel.trim() && targetLabel !== provider) {
25884
26715
  return targetLabel;
25885
26716
  }
@@ -25894,21 +26725,51 @@ function agentGUIProviderRailLabel(provider, targetLabel, labels) {
25894
26725
  function agentGUIProviderTargetMatchesConversationFilter(target, filter) {
25895
26726
  return filter.kind === "agentTarget" && (target.agentTargetId?.trim() ?? "") === filter.agentTargetId;
25896
26727
  }
26728
+ function agentGUIProviderRailTargets(providerTargets, providerTargetsLoading) {
26729
+ if (providerTargetsLoading) {
26730
+ return [];
26731
+ }
26732
+ const source = providerTargets.length > 0 && !agentGUIProviderRailTargetsAreFullLocalFallback(providerTargets) ? providerTargets : [];
26733
+ const seenProviders = new Set(source.map((target) => target.provider));
26734
+ const missingDefaultProviders = agentGUIProviderRailDefaultProviders.filter(
26735
+ (provider) => !seenProviders.has(provider)
26736
+ );
26737
+ if (source.length > 0 && missingDefaultProviders.length === 0) {
26738
+ return source;
26739
+ }
26740
+ return [
26741
+ ...source,
26742
+ ...missingDefaultProviders.map(
26743
+ (provider) => agentGUIProviderRailDisabledProviders.has(provider) ? createDisabledPlaceholderAgentGUIProviderTarget(provider) : createLocalAgentGUIProviderTarget(provider)
26744
+ )
26745
+ ];
26746
+ }
26747
+ function agentGUIProviderRailTargetsAreFullLocalFallback(providerTargets) {
26748
+ if (providerTargets.length !== agentGUIProviderRailOrder.length) {
26749
+ return false;
26750
+ }
26751
+ const fallbackProviders = new Set(agentGUIProviderRailOrder);
26752
+ return providerTargets.every(
26753
+ (target) => fallbackProviders.has(target.provider) && target.ref.kind === "local" && target.ref.provider === target.provider && target.targetId === `local:${target.provider}`
26754
+ );
26755
+ }
25897
26756
  var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
25898
26757
  conversationFilter,
25899
26758
  labels,
25900
26759
  previewMode,
26760
+ selectedProviderTarget,
25901
26761
  providerTargets,
25902
26762
  providerTargetsLoading,
25903
26763
  onSelectConversationFilterTarget,
25904
26764
  onUpdateConversationFilter
25905
26765
  }) {
25906
26766
  "use memo";
26767
+ const railProviderTargets = useMemo10(
26768
+ () => agentGUIProviderRailTargets(providerTargets, providerTargetsLoading),
26769
+ [providerTargets, providerTargetsLoading]
26770
+ );
25907
26771
  const providerTiles = useMemo10(() => {
25908
- const enabledTargets = providerTargets.filter(
25909
- (target) => target.disabled !== true
25910
- );
25911
- const targets = [...enabledTargets];
26772
+ const targets = [...railProviderTargets];
25912
26773
  const originalIndexByTarget = /* @__PURE__ */ new Map();
25913
26774
  targets.forEach((target, index) => {
25914
26775
  originalIndexByTarget.set(
@@ -25925,12 +26786,31 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
25925
26786
  `${right.provider}\0${right.targetId}`
25926
26787
  ) ?? 0);
25927
26788
  });
25928
- }, [providerTargets]);
25929
- const allTileSelected = conversationFilter.kind === "all";
26789
+ }, [railProviderTargets]);
26790
+ const launchpadIconPresentations = useMemo10(
26791
+ () => agentGUILaunchpadIconPresentations(),
26792
+ []
26793
+ );
26794
+ const selectedProviderTargetIsPlaceholder = selectedProviderTarget?.disabled === true;
26795
+ const allTileSelected = conversationFilter.kind === "all" && !selectedProviderTargetIsPlaceholder;
25930
26796
  const selectAllProviders = useCallback10(() => {
25931
26797
  onUpdateConversationFilter({ kind: "all" });
25932
- }, [onUpdateConversationFilter]);
25933
- const selectProviderTile = useCallback10(
26798
+ if (selectedProviderTargetIsPlaceholder) {
26799
+ const fallbackTarget = railProviderTargets.find((target) => target.disabled !== true) ?? null;
26800
+ if (fallbackTarget) {
26801
+ onSelectConversationFilterTarget({
26802
+ provider: fallbackTarget.provider,
26803
+ providerTargetId: fallbackTarget.targetId
26804
+ });
26805
+ }
26806
+ }
26807
+ }, [
26808
+ onSelectConversationFilterTarget,
26809
+ onUpdateConversationFilter,
26810
+ railProviderTargets,
26811
+ selectedProviderTargetIsPlaceholder
26812
+ ]);
26813
+ const selectAgentTargetTile = useCallback10(
25934
26814
  (target) => {
25935
26815
  onSelectConversationFilterTarget({
25936
26816
  provider: target.provider,
@@ -25947,23 +26827,22 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
25947
26827
  "aria-label": labels.providerSwitchLabel,
25948
26828
  "aria-busy": providerTargetsLoading,
25949
26829
  children: [
25950
- /* @__PURE__ */ jsxs17(
26830
+ /* @__PURE__ */ jsx31(
25951
26831
  "button",
25952
26832
  {
25953
26833
  type: "button",
25954
26834
  role: "tab",
26835
+ "aria-label": labels.conversationFilterAll,
25955
26836
  "aria-selected": allTileSelected,
25956
26837
  className: AgentGUINode_styles_default.providerRailTile,
25957
26838
  "data-selected": allTileSelected ? "true" : "false",
25958
26839
  disabled: previewMode,
25959
26840
  onClick: selectAllProviders,
25960
- children: [
25961
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailAvatar, children: /* @__PURE__ */ jsx31(LayoutGrid, { "aria-hidden": true, className: AgentGUINode_styles_default.providerRailAvatarIcon }) }),
25962
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailTileLabel, children: labels.conversationFilterAll })
25963
- ]
26841
+ children: /* @__PURE__ */ jsx31(AgentGUIAllProviderGridIcon, { icons: launchpadIconPresentations })
25964
26842
  }
25965
26843
  ),
25966
- providerTargetsLoading ? [0, 1, 2].map((index) => /* @__PURE__ */ jsxs17(
26844
+ /* @__PURE__ */ jsx31("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailSeparator }),
26845
+ providerTargetsLoading ? [0, 1, 2].map((index) => /* @__PURE__ */ jsx31(
25967
26846
  "button",
25968
26847
  {
25969
26848
  type: "button",
@@ -25973,49 +26852,54 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
25973
26852
  "data-loading": "true",
25974
26853
  "data-selected": "false",
25975
26854
  disabled: true,
25976
- children: [
25977
- /* @__PURE__ */ jsx31("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailAvatar }),
25978
- /* @__PURE__ */ jsx31(
25979
- "span",
25980
- {
25981
- "aria-hidden": "true",
25982
- className: AgentGUINode_styles_default.providerRailTileLabel
25983
- }
25984
- )
25985
- ]
26855
+ children: /* @__PURE__ */ jsx31("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailAvatar })
25986
26856
  },
25987
26857
  `provider-target-loading-${index}`
25988
26858
  )) : null,
25989
26859
  providerTiles.map((target) => {
25990
- const providerSelected = agentGUIProviderTargetMatchesConversationFilter(
26860
+ const providerSelected = target.disabled === true ? selectedProviderTarget?.provider === target.provider && selectedProviderTarget?.targetId === target.targetId : agentGUIProviderTargetMatchesConversationFilter(
25991
26861
  target,
25992
26862
  conversationFilter
25993
26863
  );
25994
- return /* @__PURE__ */ jsxs17(
26864
+ const label = agentGUIProviderRailLabel(
26865
+ target.provider,
26866
+ target.label,
26867
+ labels
26868
+ );
26869
+ const tile = /* @__PURE__ */ jsx31(
25995
26870
  "button",
25996
26871
  {
25997
26872
  type: "button",
25998
26873
  role: "tab",
26874
+ "aria-label": label,
25999
26875
  "aria-selected": providerSelected,
26000
26876
  className: AgentGUINode_styles_default.providerRailTile,
26877
+ "data-disabled": target.disabled === true ? "true" : void 0,
26878
+ "data-provider-tile": "true",
26001
26879
  "data-selected": providerSelected ? "true" : "false",
26002
- disabled: previewMode,
26003
- onClick: () => selectProviderTile(target),
26004
- children: [
26005
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailAvatar, children: /* @__PURE__ */ jsx31(
26006
- "img",
26007
- {
26008
- alt: "",
26009
- "aria-hidden": "true",
26010
- className: AgentGUINode_styles_default.providerRailAvatarImage,
26011
- src: target.iconUrl || resolveAgentGUIHeroIconUrl(target.provider)
26012
- }
26013
- ) }),
26014
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailTileLabel, children: agentGUIProviderRailLabel(target.provider, target.label, labels) })
26015
- ]
26880
+ disabled: previewMode || target.disabled === true,
26881
+ onClick: () => selectAgentTargetTile(target),
26882
+ children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailAvatar, children: /* @__PURE__ */ jsx31(
26883
+ AgentGUIProviderIconVisual,
26884
+ {
26885
+ ariaHidden: true,
26886
+ imageClassName: AgentGUINode_styles_default.providerRailAvatarImage,
26887
+ icon: agentGUIProviderRailIconPresentation(
26888
+ target.provider,
26889
+ target.iconUrl
26890
+ )
26891
+ }
26892
+ ) })
26016
26893
  },
26017
26894
  `${target.provider}:${target.targetId}`
26018
26895
  );
26896
+ if (previewMode) {
26897
+ return tile;
26898
+ }
26899
+ return /* @__PURE__ */ jsxs17(Tooltip3, { children: [
26900
+ /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: tile }),
26901
+ /* @__PURE__ */ jsx31(TooltipContent3, { side: "right", sideOffset: -4, children: label })
26902
+ ] }, `${target.provider}:${target.targetId}:tooltip`);
26019
26903
  })
26020
26904
  ]
26021
26905
  }
@@ -26027,18 +26911,19 @@ function useAgentGUIConversationRail({
26027
26911
  conversations,
26028
26912
  labels,
26029
26913
  previewMode,
26914
+ sectionAgentTargetFallbackId,
26030
26915
  userProjects,
26031
26916
  workspaceId
26032
26917
  }) {
26033
26918
  const agentActivityRuntime = useAgentActivityRuntime();
26034
- const [runtimeRailSections, setRuntimeRailSections] = useState11(null);
26035
- const [sectionPageStates, setSectionPageStates] = useState11(() => /* @__PURE__ */ new Map());
26919
+ const [runtimeRailSections, setRuntimeRailSections] = useState12(null);
26920
+ const [sectionPageStates, setSectionPageStates] = useState12(() => /* @__PURE__ */ new Map());
26036
26921
  const pagingRequestSequenceRef = useRef12(0);
26037
26922
  const pagingAbortControllersRef = useRef12(/* @__PURE__ */ new Map());
26038
26923
  const runtimeListSessionSections = agentActivityRuntime.listSessionSections;
26039
26924
  const runtimeListSessionSectionPage = agentActivityRuntime.listSessionSectionPage;
26040
26925
  const runtimeSectionsEnabled = !previewMode && Boolean(runtimeListSessionSections) && Boolean(runtimeListSessionSectionPage);
26041
- const sectionAgentTargetId = conversationFilter.kind === "agentTarget" ? conversationFilter.agentTargetId.trim() : "";
26926
+ const sectionAgentTargetId = conversationFilter.kind === "agentTarget" ? conversationFilter.agentTargetId.trim() : sectionAgentTargetFallbackId?.trim() ?? "";
26042
26927
  const userProjectPaths = useMemo10(
26043
26928
  () => userProjects.map((project) => project.path.trim()).filter((path) => path.length > 0),
26044
26929
  [userProjects]
@@ -26054,7 +26939,7 @@ function useAgentGUIConversationRail({
26054
26939
  }),
26055
26940
  [labels.sectionConversations, labels.sectionPinned]
26056
26941
  );
26057
- useEffect12(() => {
26942
+ useEffect13(() => {
26058
26943
  pagingRequestSequenceRef.current += 1;
26059
26944
  for (const controller of pagingAbortControllersRef.current.values()) {
26060
26945
  controller.abort();
@@ -26076,7 +26961,7 @@ function useAgentGUIConversationRail({
26076
26961
  ).join("|"),
26077
26962
  [conversations]
26078
26963
  );
26079
- useEffect12(() => {
26964
+ useEffect13(() => {
26080
26965
  if (!runtimeSectionsEnabled || !runtimeListSessionSections) {
26081
26966
  return;
26082
26967
  }
@@ -26130,7 +27015,7 @@ function useAgentGUIConversationRail({
26130
27015
  userProjectPathKey,
26131
27016
  workspaceId
26132
27017
  ]);
26133
- useEffect12(() => {
27018
+ useEffect13(() => {
26134
27019
  if (!runtimeSectionsEnabled) {
26135
27020
  return;
26136
27021
  }
@@ -26269,12 +27154,8 @@ var AgentGUIConversationRailPane = memo(
26269
27154
  isCollapsed,
26270
27155
  railConfigProvider,
26271
27156
  slashStatusLimits,
26272
- providerTargets,
26273
- providerTargetsLoading,
26274
- conversationScope,
26275
27157
  conversationFilter,
26276
- onUpdateConversationFilter,
26277
- onSelectConversationFilterTarget,
27158
+ sectionAgentTargetFallbackId,
26278
27159
  onCreateConversation,
26279
27160
  onOpenAgentEnvSetup,
26280
27161
  onRetryOpenclawGateway,
@@ -26291,17 +27172,10 @@ var AgentGUIConversationRailPane = memo(
26291
27172
  onConfirmDeleteConversation
26292
27173
  }) {
26293
27174
  "use memo";
26294
- const showProviderRail = conversationScope === "multi-provider";
26295
- const [conversationQuery, setConversationQuery] = useState11("");
26296
- const updateConversationFilter = useStableEventCallback2(
26297
- onUpdateConversationFilter
26298
- );
26299
- const selectConversationFilterTarget = useStableEventCallback2(
26300
- onSelectConversationFilterTarget
26301
- );
26302
- const [collapsedProjectSectionIds, setCollapsedProjectSectionIds] = useState11(() => /* @__PURE__ */ new Set());
26303
- const [currentTimeMs, setCurrentTimeMs] = useState11(() => Date.now());
26304
- const [pendingProjectAction, setPendingProjectAction] = useState11(null);
27175
+ const [conversationQuery, setConversationQuery] = useState12("");
27176
+ const [collapsedProjectSectionIds, setCollapsedProjectSectionIds] = useState12(() => /* @__PURE__ */ new Set());
27177
+ const [currentTimeMs, setCurrentTimeMs] = useState12(() => Date.now());
27178
+ const [pendingProjectAction, setPendingProjectAction] = useState12(null);
26305
27179
  const railElementRef = useRef12(null);
26306
27180
  const conversationListRef = useRef12(null);
26307
27181
  const conversationItemElementsRef = useRef12(
@@ -26321,10 +27195,11 @@ var AgentGUIConversationRailPane = memo(
26321
27195
  conversations,
26322
27196
  labels,
26323
27197
  previewMode,
27198
+ sectionAgentTargetFallbackId,
26324
27199
  userProjects,
26325
27200
  workspaceId
26326
27201
  });
26327
- useEffect12(() => {
27202
+ useEffect13(() => {
26328
27203
  const timer = window.setInterval(() => {
26329
27204
  setCurrentTimeMs(Date.now());
26330
27205
  }, 6e4);
@@ -26476,18 +27351,6 @@ var AgentGUIConversationRailPane = memo(
26476
27351
  }
26477
27352
  )
26478
27353
  ] }),
26479
- showProviderRail ? /* @__PURE__ */ jsx31(
26480
- AgentGUIProviderRail,
26481
- {
26482
- conversationFilter,
26483
- labels,
26484
- previewMode,
26485
- providerTargets,
26486
- providerTargetsLoading,
26487
- onSelectConversationFilterTarget: selectConversationFilterTarget,
26488
- onUpdateConversationFilter: updateConversationFilter
26489
- }
26490
- ) : null,
26491
27354
  openclawGateway?.status === "starting" ? /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.gatewayStatus, "data-state": "starting", children: [
26492
27355
  /* @__PURE__ */ jsx31(
26493
27356
  StatusDot,
@@ -26721,7 +27584,7 @@ var AgentGUIConversationRailSection = memo(
26721
27584
  }) {
26722
27585
  "use memo";
26723
27586
  const isProjectSection = section.kind === "project";
26724
- const [visibleItemLimit, setVisibleItemLimit] = useState11(
27587
+ const [visibleItemLimit, setVisibleItemLimit] = useState12(
26725
27588
  AGENT_GUI_CONVERSATION_RAIL_SECTION_PAGE_SIZE
26726
27589
  );
26727
27590
  const visibleItemCount = isSectionCollapsed ? 0 : Math.min(visibleItemLimit, section.items.length);
@@ -27084,6 +27947,7 @@ var AgentGUIConversationRailItem = memo(
27084
27947
  }) {
27085
27948
  "use memo";
27086
27949
  const pinned = (item.pinnedAtUnixMs ?? 0) > 0;
27950
+ const providerIconUrl = agentGUIConversationProviderIconUrl(item.provider);
27087
27951
  const setItemElement = useCallback10(
27088
27952
  (element) => {
27089
27953
  registerItemElement(item.id, element);
@@ -27125,7 +27989,19 @@ var AgentGUIConversationRailItem = memo(
27125
27989
  className: AgentGUINode_styles_default.conversationSelect,
27126
27990
  onClick: handleSelect,
27127
27991
  children: [
27128
- /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.conversationTitle, children: conversationPlainTitle(item, labels, uiLanguage) }),
27992
+ /* @__PURE__ */ jsxs17("span", { className: AgentGUINode_styles_default.conversationTitleRow, children: [
27993
+ providerIconUrl ? /* @__PURE__ */ jsx31(
27994
+ "span",
27995
+ {
27996
+ "aria-hidden": "true",
27997
+ className: AgentGUINode_styles_default.conversationProviderIcon,
27998
+ style: {
27999
+ "--agent-gui-conversation-provider-icon-url": `url("${providerIconUrl}")`
28000
+ }
28001
+ }
28002
+ ) : null,
28003
+ /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.conversationTitle, children: conversationPlainTitle(item, labels, uiLanguage) })
28004
+ ] }),
27129
28005
  /* @__PURE__ */ jsx31(ConversationMeta, { item, nowMs: currentTimeMs, labels })
27130
28006
  ]
27131
28007
  }
@@ -27336,6 +28212,17 @@ var AgentGUIConversationTimelinePane = memo(
27336
28212
  function setTimelineScrollTopInstantly(element, top) {
27337
28213
  element.scrollTop = top;
27338
28214
  }
28215
+ function setTimelineScrollTopWithUserTransition(element, top) {
28216
+ const reducedMotion = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
28217
+ if (typeof element.scrollTo === "function") {
28218
+ element.scrollTo({
28219
+ top,
28220
+ behavior: reducedMotion ? "auto" : "smooth"
28221
+ });
28222
+ return;
28223
+ }
28224
+ element.scrollTop = top;
28225
+ }
27339
28226
 
27340
28227
  // agent-gui/workspaceDesktop/view/desktopDockAgentProbeTooltipModel.ts
27341
28228
  function findWorkspaceAgentProbeForDockProvider(snapshot3, provider) {
@@ -27344,35 +28231,6 @@ function findWorkspaceAgentProbeForDockProvider(snapshot3, provider) {
27344
28231
  }
27345
28232
  return snapshot3.providers.find((p) => p.provider === provider) ?? null;
27346
28233
  }
27347
- function quotaRenderStateEquals(left, right) {
27348
- return left?.quotaType === right?.quotaType && left?.percentRemaining === right?.percentRemaining && left?.resetsAtUnixMs === right?.resetsAtUnixMs && left?.resetText === right?.resetText && left?.dollarRemaining === right?.dollarRemaining && left?.modelName === right?.modelName;
27349
- }
27350
- function agentProbeProviderRenderStateEquals(left, right) {
27351
- if (left === right) {
27352
- return true;
27353
- }
27354
- if (!left || !right) {
27355
- return left === right;
27356
- }
27357
- return left.provider === right.provider && left.availability.status === right.availability.status && left.availability.detailsVisible === right.availability.detailsVisible && (left.availability.checks?.length ?? 0) === (right.availability.checks?.length ?? 0) && (left.availability.checks ?? []).every((check, index) => {
27358
- const next = right.availability.checks?.[index];
27359
- return check.name === next?.name && check.passed === next?.passed && check.detail === next?.detail;
27360
- }) && (left.usage?.accountTier ?? null) === (right.usage?.accountTier ?? null) && (left.usage?.costUsage?.dollarUsed ?? null) === (right.usage?.costUsage?.dollarUsed ?? null) && (left.usage?.costUsage?.dollarLimit ?? null) === (right.usage?.costUsage?.dollarLimit ?? null) && (left.usage?.quotas?.length ?? 0) === (right.usage?.quotas?.length ?? 0) && (left.usage?.quotas ?? []).every(
27361
- (quota, index) => quotaRenderStateEquals(quota, right.usage?.quotas?.[index])
27362
- ) && (left.attempts?.length ?? 0) === (right.attempts?.length ?? 0) && (left.attempts ?? []).every((attempt, index) => {
27363
- const next = right.attempts?.[index];
27364
- return attempt.strategy === next?.strategy && attempt.success === next?.success && attempt.errorCode === next?.errorCode && attempt.errorMessage === next?.errorMessage;
27365
- }) && left.lastError?.code === right.lastError?.code && left.lastError?.message === right.lastError?.message;
27366
- }
27367
- function workspaceAgentProbeRenderStateEqualsForProvider(left, right, provider) {
27368
- if (left === right) {
27369
- return true;
27370
- }
27371
- return (left?.isLoadingAvailability ?? false) === (right?.isLoadingAvailability ?? false) && (left?.isLoadingUsage ?? false) === (right?.isLoadingUsage ?? false) && agentProbeProviderRenderStateEquals(
27372
- findWorkspaceAgentProbeForDockProvider(left?.snapshot ?? null, provider),
27373
- findWorkspaceAgentProbeForDockProvider(right?.snapshot ?? null, provider)
27374
- );
27375
- }
27376
28234
  function buildDockAgentProbeTooltipLines(probe, isLoadingAvailability, t, popupOpts) {
27377
28235
  if (isLoadingAvailability && !probe) {
27378
28236
  return [t("agentHost.workspaceAgentProbeDockChecking")];
@@ -27540,10 +28398,10 @@ function appendDockProbeUsageLines(probe, lines, isLoadingUsage, t) {
27540
28398
  import { Info as Info3 } from "lucide-react";
27541
28399
  import {
27542
28400
  useCallback as useCallback11,
27543
- useEffect as useEffect13,
28401
+ useEffect as useEffect14,
27544
28402
  useLayoutEffect as useLayoutEffect5,
27545
28403
  useRef as useRef13,
27546
- useState as useState12
28404
+ useState as useState13
27547
28405
  } from "react";
27548
28406
  import { createPortal as createPortal4 } from "react-dom";
27549
28407
  import { Fragment as Fragment9, jsx as jsx32, jsxs as jsxs18 } from "react/jsx-runtime";
@@ -27582,8 +28440,8 @@ function AgentProbeInfoPopover({
27582
28440
  "use memo";
27583
28441
  const anchorRef = useRef13(null);
27584
28442
  const popoverRef = useRef13(null);
27585
- const [isOpen, setIsOpen] = useState12(false);
27586
- const [popoverStyle, setPopoverStyle] = useState12(null);
28443
+ const [isOpen, setIsOpen] = useState13(false);
28444
+ const [popoverStyle, setPopoverStyle] = useState13(null);
27587
28445
  const openPopover = useCallback11(() => {
27588
28446
  if (!isOpen) {
27589
28447
  onOpen?.();
@@ -27623,7 +28481,7 @@ function AgentProbeInfoPopover({
27623
28481
  maxWidth: availableWidth
27624
28482
  });
27625
28483
  }, []);
27626
- useEffect13(() => {
28484
+ useEffect14(() => {
27627
28485
  if (!isOpen) {
27628
28486
  return;
27629
28487
  }
@@ -28019,9 +28877,6 @@ function normalizeSlashStatusModelName(value) {
28019
28877
  return value?.trim().toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "") ?? "";
28020
28878
  }
28021
28879
  function resolveAgentGUIRailStatusProvider(input) {
28022
- if (input.conversationScope !== "multi-provider") {
28023
- return input.activeProvider;
28024
- }
28025
28880
  const filter = input.conversationFilter;
28026
28881
  if (filter.kind !== "agentTarget") {
28027
28882
  return null;
@@ -28073,11 +28928,7 @@ function composerOverridesByAgentTargetIdEqual(left, right) {
28073
28928
  return true;
28074
28929
  }
28075
28930
  function areAgentGUINodePropsEqual(previous, next) {
28076
- return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.resolveDroppedFileReferences === next.resolveDroppedFileReferences && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveWorkspaceReferenceEntryIconUrl === next.resolveWorkspaceReferenceEntryIconUrl && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.providerTargets === next.providerTargets && previous.providerTargetsLoading === next.providerTargetsLoading && previous.providerReadinessGates === next.providerReadinessGates && previous.defaultProviderTargetId === next.defaultProviderTargetId && previous.conversationScope === next.conversationScope && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onRememberComposerDefaults === next.onRememberComposerDefaults && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && (previous.conversationScope === "multi-provider" || next.conversationScope === "multi-provider" ? previous.workspaceAgentProbes === next.workspaceAgentProbes : workspaceAgentProbeRenderStateEqualsForProvider(
28077
- previous.workspaceAgentProbes,
28078
- next.workspaceAgentProbes,
28079
- previous.state.provider
28080
- )) && previous.onAgentProbeDemandChange === next.onAgentProbeDemandChange && previous.onAgentProbeRefreshRequest === next.onAgentProbeRefreshRequest && previous.managedAgentsState === next.managedAgentsState && previous.contextMentionProviders === next.contextMentionProviders && previous.workspaceAppIcons === next.workspaceAppIcons && previous.embedded === next.embedded && previous.previewMode === next.previewMode && previous.isActive === next.isActive && previous.composerFocusRequestSequence === next.composerFocusRequestSequence && previous.newConversationRequestSequence === next.newConversationRequestSequence && previous.openSessionRequest === next.openSessionRequest && previous.prefillPromptRequest === next.prefillPromptRequest;
28931
+ return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.resolveDroppedFileReferences === next.resolveDroppedFileReferences && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveWorkspaceReferenceEntryIconUrl === next.resolveWorkspaceReferenceEntryIconUrl && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onHandoffConversation === next.onHandoffConversation && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.providerTargets === next.providerTargets && previous.providerTargetsLoading === next.providerTargetsLoading && previous.providerReadinessGates === next.providerReadinessGates && previous.defaultProviderTargetId === next.defaultProviderTargetId && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onRememberComposerDefaults === next.onRememberComposerDefaults && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && previous.workspaceAgentProbes === next.workspaceAgentProbes && previous.onAgentProbeDemandChange === next.onAgentProbeDemandChange && previous.onAgentProbeRefreshRequest === next.onAgentProbeRefreshRequest && previous.managedAgentsState === next.managedAgentsState && previous.contextMentionProviders === next.contextMentionProviders && previous.workspaceAppIcons === next.workspaceAppIcons && previous.embedded === next.embedded && previous.previewMode === next.previewMode && previous.isActive === next.isActive && previous.composerFocusRequestSequence === next.composerFocusRequestSequence && previous.newConversationRequestSequence === next.newConversationRequestSequence && previous.openSessionRequest === next.openSessionRequest && previous.prefillPromptRequest === next.prefillPromptRequest;
28081
28932
  }
28082
28933
  var AgentGUINode = memo2(function AgentGUINode2({
28083
28934
  nodeId,
@@ -28100,6 +28951,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
28100
28951
  height,
28101
28952
  desktopSize,
28102
28953
  onLinkAction,
28954
+ onHandoffConversation,
28103
28955
  capabilityMenuState,
28104
28956
  onCapabilitySettingsRequest,
28105
28957
  onAgentProviderLogin,
@@ -28107,7 +28959,6 @@ var AgentGUINode = memo2(function AgentGUINode2({
28107
28959
  providerTargetsLoading = false,
28108
28960
  providerReadinessGates = null,
28109
28961
  defaultProviderTargetId = null,
28110
- conversationScope = "single-provider",
28111
28962
  onWorkspaceFileReferencesAdded,
28112
28963
  onOpenConversationWindow,
28113
28964
  onClose,
@@ -28264,7 +29115,6 @@ var AgentGUINode = memo2(function AgentGUINode2({
28264
29115
  workspacePath,
28265
29116
  avoidGroupingEdits: agentSettings.avoidGroupingEdits,
28266
29117
  data: state,
28267
- conversationScope,
28268
29118
  openSessionRequest,
28269
29119
  prefillPromptRequest,
28270
29120
  providerTargets,
@@ -28303,13 +29153,8 @@ var AgentGUINode = memo2(function AgentGUINode2({
28303
29153
  const activeReadinessProvider = viewModel.activeConversationId !== null ? activeProvider : viewModel.selectedProviderTarget.provider;
28304
29154
  const selectedProviderTargetLabel = viewModel.selectedProviderTarget?.label ?? resolveAgentGUIProviderDisplayLabel(state.provider, fallbackAgentTitle);
28305
29155
  const displayProviderLabel = viewModel.activeConversation ? resolveAgentGUIProviderDisplayLabel(activeProvider, fallbackAgentTitle) : selectedProviderTargetLabel;
28306
- const windowAgentTitle = viewModel.activeConversation ? getAgentHostManagedToolchainAgentByName(activeProvider)?.label ?? displayProviderLabel : displayProviderLabel;
28307
29156
  const activeConversationDockTitle = viewModel.activeConversation ? resolveAgentGUIDockConversationTitle(viewModel.activeConversation) : null;
28308
- const activeConversationWindowTitle = viewModel.activeConversation ? formatAgentGUIConversationPlainTitle(viewModel.activeConversation, {
28309
- fallbackAgentLabel: fallbackAgentTitle,
28310
- language: locale
28311
- }) : null;
28312
- useEffect14(() => {
29157
+ useEffect15(() => {
28313
29158
  if (previewMode || !viewModel.activeConversation) {
28314
29159
  return;
28315
29160
  }
@@ -28361,6 +29206,9 @@ var AgentGUINode = memo2(function AgentGUINode2({
28361
29206
  "agentHost.agentGui.providerGateCheckingDescription",
28362
29207
  { provider: displayProviderLabel }
28363
29208
  ),
29209
+ providerGateCheckingAgentsDescription: t(
29210
+ "agentHost.agentGui.providerGateCheckingAgentsDescription"
29211
+ ),
28364
29212
  providerGateInstallTitle: t(
28365
29213
  "agentHost.agentGui.providerGateInstallTitle",
28366
29214
  { provider: displayProviderLabel }
@@ -28380,6 +29228,17 @@ var AgentGUINode = memo2(function AgentGUINode2({
28380
29228
  { provider: displayProviderLabel }
28381
29229
  ),
28382
29230
  providerGateLoginAction: t("agentHost.agentGui.providerGateLoginAction"),
29231
+ providerGateComingSoonTitle: t(
29232
+ "agentHost.agentGui.providerGateComingSoonTitle",
29233
+ { provider: displayProviderLabel }
29234
+ ),
29235
+ providerGateComingSoonDescription: t(
29236
+ "agentHost.agentGui.providerGateComingSoonDescription",
29237
+ { provider: displayProviderLabel }
29238
+ ),
29239
+ providerGateComingSoonAction: t(
29240
+ "agentHost.agentGui.providerGateComingSoonAction"
29241
+ ),
28383
29242
  providerGateUnavailableTitle: t(
28384
29243
  "agentHost.agentGui.providerGateUnavailableTitle",
28385
29244
  { provider: displayProviderLabel }
@@ -28504,7 +29363,14 @@ var AgentGUINode = memo2(function AgentGUINode2({
28504
29363
  planImplementationSkip: t("agentHost.agentGui.planImplementationSkip"),
28505
29364
  noRunningResponse: t("agentHost.agentGui.noRunningResponse"),
28506
29365
  empty: t("agentHost.agentGui.empty", { provider: displayProviderLabel }),
29366
+ emptyForProvider: (provider) => t("agentHost.agentGui.empty", {
29367
+ provider: resolveAgentGUIProviderDisplayLabel(
29368
+ provider,
29369
+ fallbackAgentTitle
29370
+ )
29371
+ }),
28507
29372
  emptyProvider: displayProviderLabel,
29373
+ emptyProviderForProvider: (provider) => resolveAgentGUIProviderDisplayLabel(provider, fallbackAgentTitle),
28508
29374
  conversations: t("agentHost.agentGui.conversations"),
28509
29375
  newConversation: t("agentHost.agentGui.newConversation"),
28510
29376
  agentConfig: t("agentHost.agentGui.agentConfig"),
@@ -28518,11 +29384,13 @@ var AgentGUINode = memo2(function AgentGUINode2({
28518
29384
  conversationFilterClaudeCode: t(
28519
29385
  "agentHost.agentGui.conversationFilterClaudeCode"
28520
29386
  ),
29387
+ conversationFilterTutti: t("agentHost.agentGui.conversationFilterTutti"),
28521
29388
  providerSwitchLabel: t("agentHost.agentGui.providerSwitchLabel"),
28522
29389
  startConversation: t("agentHost.agentGui.startConversation"),
28523
29390
  selectConversation: t("agentHost.agentGui.selectConversation"),
28524
29391
  loadingConversations: t("agentHost.agentGui.loadingConversations"),
28525
29392
  loadingConversation: t("agentHost.agentGui.loadingConversation"),
29393
+ scrollToBottom: t("agentHost.agentGui.scrollToBottom"),
28526
29394
  searchNoConversations: t("agentHost.agentGui.searchNoConversations"),
28527
29395
  conversationUnavailable: t("agentHost.agentGui.conversationUnavailable"),
28528
29396
  fallbackAgentTitle,
@@ -28591,14 +29459,18 @@ var AgentGUINode = memo2(function AgentGUINode2({
28591
29459
  "agentHost.agentGui.continueInNewConversation"
28592
29460
  ),
28593
29461
  goalLabel: t("agentHost.agentGui.goalLabel"),
28594
- goalStatusActive: t("agentHost.agentGui.goalStatusActive"),
28595
- goalStatusPaused: t("agentHost.agentGui.goalStatusPaused"),
28596
- goalStatusBlocked: t("agentHost.agentGui.goalStatusBlocked"),
28597
- goalStatusUsageLimited: t("agentHost.agentGui.goalStatusUsageLimited"),
28598
- goalStatusBudgetLimited: t("agentHost.agentGui.goalStatusBudgetLimited"),
28599
- goalStatusComplete: t("agentHost.agentGui.goalStatusComplete"),
29462
+ goalTitleActive: t("agentHost.agentGui.goalTitleActive"),
29463
+ goalTitlePaused: t("agentHost.agentGui.goalTitlePaused"),
29464
+ goalTitleBlocked: t("agentHost.agentGui.goalTitleBlocked"),
29465
+ goalTitleUsageLimited: t("agentHost.agentGui.goalTitleUsageLimited"),
29466
+ goalTitleBudgetLimited: t("agentHost.agentGui.goalTitleBudgetLimited"),
29467
+ goalTitleComplete: t("agentHost.agentGui.goalTitleComplete"),
28600
29468
  goalBudgetUsage: (used, budget) => t("agentHost.agentGui.goalBudgetUsage", { used, budget }),
28601
29469
  goalClearHint: t("agentHost.agentGui.goalClearHint"),
29470
+ goalEditAction: t("agentHost.agentGui.goalEditAction"),
29471
+ goalPauseAction: t("agentHost.agentGui.goalPauseAction"),
29472
+ goalResumeAction: t("agentHost.agentGui.goalResumeAction"),
29473
+ goalClearAction: t("agentHost.agentGui.goalClearAction"),
28602
29474
  processing: t("agentHost.agentGui.processing"),
28603
29475
  turnSummary: t("agentHost.agentGui.turnSummary"),
28604
29476
  userMessageLocator: t("agentHost.agentGui.userMessageLocator"),
@@ -28836,7 +29708,9 @@ var AgentGUINode = memo2(function AgentGUINode2({
28836
29708
  removeMention: t("common.remove"),
28837
29709
  addReference: t("agentHost.agentGui.addReference"),
28838
29710
  addContent: t("agentHost.agentGui.addContent"),
28839
- referenceWorkspaceFiles: t("agentHost.issue.referenceWorkspaceFiles")
29711
+ referenceWorkspaceFiles: t("agentHost.issue.referenceWorkspaceFiles"),
29712
+ handoffConversation: t("agentHost.agentGui.handoffConversation"),
29713
+ handoffConversationMenu: t("agentHost.agentGui.handoffConversationMenu")
28840
29714
  }),
28841
29715
  [displayProviderLabel, fallbackAgentTitle, t]
28842
29716
  );
@@ -28849,23 +29723,14 @@ var AgentGUINode = memo2(function AgentGUINode2({
28849
29723
  }),
28850
29724
  [t]
28851
29725
  );
28852
- const collapsedWindowConversationTitle = isConversationRailCollapsed ? activeConversationDockTitle : null;
28853
- const windowTitle = collapsedWindowConversationTitle || (isConversationRailCollapsed ? activeConversationWindowTitle : null) || windowAgentTitle || title;
28854
- const windowTitleIconUrl = agentGuiDockIconUrls[activeProvider] ?? null;
29726
+ const windowTitle = title;
28855
29727
  const activeProbeProvider = activeProvider;
28856
29728
  const railStatusProvider = useMemo11(
28857
29729
  () => resolveAgentGUIRailStatusProvider({
28858
- activeProvider: activeProbeProvider,
28859
29730
  conversationFilter: viewModel.conversationFilter,
28860
- conversationScope: viewModel.conversationScope,
28861
29731
  providerTargets: viewModel.providerTargets
28862
29732
  }),
28863
- [
28864
- activeProbeProvider,
28865
- viewModel.conversationFilter,
28866
- viewModel.conversationScope,
28867
- viewModel.providerTargets
28868
- ]
29733
+ [viewModel.conversationFilter, viewModel.providerTargets]
28869
29734
  );
28870
29735
  const activeAgentProbe = useMemo11(
28871
29736
  () => findWorkspaceAgentProbeForDockProvider(
@@ -28937,7 +29802,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
28937
29802
  workspaceAgentProbes?.isLoadingUsage,
28938
29803
  t
28939
29804
  ]);
28940
- useEffect14(() => {
29805
+ useEffect15(() => {
28941
29806
  if (previewMode || !onAgentProbeDemandChange) {
28942
29807
  return;
28943
29808
  }
@@ -28947,7 +29812,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
28947
29812
  onAgentProbeDemandChange(null, probeSourceId);
28948
29813
  };
28949
29814
  }, [activeProbeProvider, nodeId, onAgentProbeDemandChange, previewMode]);
28950
- useEffect14(() => {
29815
+ useEffect15(() => {
28951
29816
  if (previewMode || !onAgentProbeDemandChange || !railStatusProvider || railStatusProvider === activeProbeProvider) {
28952
29817
  return;
28953
29818
  }
@@ -28975,17 +29840,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
28975
29840
  nodeId,
28976
29841
  kind: "agentGui",
28977
29842
  title: windowTitle,
28978
- titleIcon: windowTitleIconUrl ? /* @__PURE__ */ jsx33(
28979
- "img",
28980
- {
28981
- src: windowTitleIconUrl,
28982
- alt: "",
28983
- draggable: false,
28984
- "aria-hidden": "true",
28985
- className: "size-4 rounded-[4px]",
28986
- "data-agent-gui-window-provider-icon": "true"
28987
- }
28988
- ) : null,
29843
+ titleIcon: null,
28989
29844
  position,
28990
29845
  width,
28991
29846
  height,
@@ -29053,6 +29908,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
29053
29908
  railSlashStatusLimits,
29054
29909
  previewMode,
29055
29910
  onLinkAction: handleLinkAction,
29911
+ onHandoffConversation,
29056
29912
  capabilityMenuState,
29057
29913
  onCapabilitySettingsRequest,
29058
29914
  onAgentProviderLogin: onAgentProviderLogin ? handleAgentProviderLogin : void 0,