@tutti-os/agent-gui 0.0.64 → 0.0.65

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 (57) hide show
  1. package/dist/agent-conversation/index.js +6 -6
  2. package/dist/agent-message-center/index.js +8 -8
  3. package/dist/app/renderer/agentactivity.css +3 -3
  4. package/dist/{chunk-F6GDUU4X.js → chunk-6OYLLPPN.js} +5 -5
  5. package/dist/{chunk-PVVM7MZZ.js → chunk-DL6BMEHI.js} +2 -2
  6. package/dist/{chunk-C465B7WK.js → chunk-EIPQGFAE.js} +2 -2
  7. package/dist/{chunk-52VZ54WH.js → chunk-HKKC2U6J.js} +5 -5
  8. package/dist/{chunk-TT2YJNEP.js → chunk-IDTB6OID.js} +3 -3
  9. package/dist/{chunk-FUJ73PTH.js → chunk-LJE2W4EM.js} +3 -5
  10. package/dist/chunk-LJE2W4EM.js.map +1 -0
  11. package/dist/{chunk-YFTQK2G4.js → chunk-LQHYHF36.js} +7 -7
  12. package/dist/chunk-LQHYHF36.js.map +1 -0
  13. package/dist/{chunk-ERWDRI3F.js → chunk-N4I3TD4G.js} +2 -2
  14. package/dist/{chunk-ERWDRI3F.js.map → chunk-N4I3TD4G.js.map} +1 -1
  15. package/dist/{chunk-RDRKIMAC.js → chunk-N7BGNAA2.js} +5 -5
  16. package/dist/{chunk-YUMHFZ5A.js → chunk-P5C3ED3V.js} +3 -2
  17. package/dist/chunk-P5C3ED3V.js.map +1 -0
  18. package/dist/{chunk-ZTZ6STJZ.js → chunk-QULZNKPA.js} +2 -2
  19. package/dist/{chunk-TFPKI4XJ.js → chunk-R7PSPKBD.js} +2 -2
  20. package/dist/{chunk-3NSUJ7OF.js → chunk-UI3YDJTC.js} +39 -5
  21. package/dist/chunk-UI3YDJTC.js.map +1 -0
  22. package/dist/{chunk-IIXCU2UU.js → chunk-UWBX3DZK.js} +2 -2
  23. package/dist/{chunk-76GTKO4Q.js → chunk-W3Q7B3DV.js} +2 -2
  24. package/dist/{chunk-MQ6RKXXW.js → chunk-XLBJHHDX.js} +5 -3
  25. package/dist/chunk-XLBJHHDX.js.map +1 -0
  26. package/dist/{chunk-FLTLZGIN.js → chunk-XZPAU7FC.js} +3 -3
  27. package/dist/context-mention-palette/index.js +7 -7
  28. package/dist/i18n/index.d.ts +4 -2
  29. package/dist/i18n/index.js +2 -2
  30. package/dist/index.d.ts +18 -1
  31. package/dist/index.js +515 -299
  32. package/dist/index.js.map +1 -1
  33. package/dist/workbench/contribution.js +5 -5
  34. package/dist/workbench/index.js +8 -8
  35. package/dist/workbench/launch.d.ts +2 -0
  36. package/dist/workbench/launch.js +1 -1
  37. package/dist/workbench/sessionTitle.js +3 -3
  38. package/dist/workbench/state.js +2 -2
  39. package/dist/workspace-agent-generated-files.js +3 -3
  40. package/package.json +12 -12
  41. package/dist/chunk-3NSUJ7OF.js.map +0 -1
  42. package/dist/chunk-FUJ73PTH.js.map +0 -1
  43. package/dist/chunk-MQ6RKXXW.js.map +0 -1
  44. package/dist/chunk-YFTQK2G4.js.map +0 -1
  45. package/dist/chunk-YUMHFZ5A.js.map +0 -1
  46. package/dist/cursor-flat-filled-CL7N3BTZ.svg +0 -3
  47. /package/dist/{chunk-F6GDUU4X.js.map → chunk-6OYLLPPN.js.map} +0 -0
  48. /package/dist/{chunk-PVVM7MZZ.js.map → chunk-DL6BMEHI.js.map} +0 -0
  49. /package/dist/{chunk-C465B7WK.js.map → chunk-EIPQGFAE.js.map} +0 -0
  50. /package/dist/{chunk-52VZ54WH.js.map → chunk-HKKC2U6J.js.map} +0 -0
  51. /package/dist/{chunk-TT2YJNEP.js.map → chunk-IDTB6OID.js.map} +0 -0
  52. /package/dist/{chunk-RDRKIMAC.js.map → chunk-N7BGNAA2.js.map} +0 -0
  53. /package/dist/{chunk-ZTZ6STJZ.js.map → chunk-QULZNKPA.js.map} +0 -0
  54. /package/dist/{chunk-TFPKI4XJ.js.map → chunk-R7PSPKBD.js.map} +0 -0
  55. /package/dist/{chunk-IIXCU2UU.js.map → chunk-UWBX3DZK.js.map} +0 -0
  56. /package/dist/{chunk-76GTKO4Q.js.map → chunk-W3Q7B3DV.js.map} +0 -0
  57. /package/dist/{chunk-FLTLZGIN.js.map → chunk-XZPAU7FC.js.map} +0 -0
package/dist/index.js CHANGED
@@ -10,22 +10,23 @@ import {
10
10
  resolveAgentGuiSessionProviderIconUrl,
11
11
  resolveNextAgentGUIConversationRailWidthPx,
12
12
  shouldAutoCollapseAgentGUIConversationRail
13
- } from "./chunk-FUJ73PTH.js";
13
+ } from "./chunk-LJE2W4EM.js";
14
14
  import {
15
15
  agentGUIDefaultTargetProviders,
16
16
  agentGUIProviderTargetRefsEqual,
17
17
  createDisabledPlaceholderAgentGUIProviderTarget,
18
18
  createLocalAgentGUIProviderTarget,
19
19
  createLocalAgentGUIProviderTargets,
20
+ createSharedAgentGUIProviderTarget,
20
21
  localAgentGUIAgentTargetId,
21
22
  localAgentGUIProviderTargetId,
22
23
  normalizeAgentGUIProviderTargets,
23
24
  resolveAgentGUIProviderTarget
24
- } from "./chunk-3NSUJ7OF.js";
25
+ } from "./chunk-UI3YDJTC.js";
25
26
  import {
26
27
  AgentInteractivePromptSurface,
27
28
  approvalOptionDisplayLabel
28
- } from "./chunk-RDRKIMAC.js";
29
+ } from "./chunk-N7BGNAA2.js";
29
30
  import {
30
31
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
31
32
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -44,7 +45,7 @@ import {
44
45
  resolveAgentGUIExplicitConversationTitle,
45
46
  resolveAgentGUIProviderDisplayLabel,
46
47
  resolveAgentGUIProviderIdentity
47
- } from "./chunk-76GTKO4Q.js";
48
+ } from "./chunk-W3Q7B3DV.js";
48
49
  import {
49
50
  AgentConversationFlow,
50
51
  Button,
@@ -65,14 +66,14 @@ import {
65
66
  skillTriggerForPrefix,
66
67
  toLocalShortDateTime,
67
68
  useProjectedAgentConversation
68
- } from "./chunk-F6GDUU4X.js";
69
+ } from "./chunk-6OYLLPPN.js";
69
70
  import {
70
71
  AgentMessageMarkdown,
71
72
  AgentTargetPresentationProvider,
72
73
  ZoomableImage,
73
74
  cn,
74
75
  resolveWorkspaceLinkAction
75
- } from "./chunk-TT2YJNEP.js";
76
+ } from "./chunk-IDTB6OID.js";
76
77
  import {
77
78
  openAgentEnvPanel
78
79
  } from "./chunk-PSLAWU25.js";
@@ -83,7 +84,7 @@ import {
83
84
  DEFAULT_AGENT_MENTION_FILTER,
84
85
  agentMentionItemKey,
85
86
  preloadAgentMentionBrowse
86
- } from "./chunk-52VZ54WH.js";
87
+ } from "./chunk-HKKC2U6J.js";
87
88
  import {
88
89
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
89
90
  buildWorkspaceAgentActivityListViewModel,
@@ -93,10 +94,10 @@ import {
93
94
  isWorkspaceAgentUntitledTask,
94
95
  mergeWorkspaceAgentActivityDurableAndOverlayMessages,
95
96
  selectWorkspaceAgentActivityOverlayMessages
96
- } from "./chunk-ZTZ6STJZ.js";
97
+ } from "./chunk-QULZNKPA.js";
97
98
  import {
98
99
  Spinner
99
- } from "./chunk-TFPKI4XJ.js";
100
+ } from "./chunk-R7PSPKBD.js";
100
101
  import {
101
102
  resolveWorkspaceAgentSessionSortTimeUnixMs
102
103
  } from "./chunk-IBIMGLCD.js";
@@ -107,7 +108,7 @@ import {
107
108
  mentionItemToAttrs,
108
109
  normalizeAgentSessionMentionTitle,
109
110
  parseMentionItemFromHref
110
- } from "./chunk-FLTLZGIN.js";
111
+ } from "./chunk-XZPAU7FC.js";
111
112
  import "./chunk-Y35GDLP2.js";
112
113
  import "./chunk-LUGELG5V.js";
113
114
  import {
@@ -129,7 +130,7 @@ import {
129
130
  useAgentHostApi,
130
131
  useOptionalAgentActivityRuntime,
131
132
  useOptionalAgentHostApi
132
- } from "./chunk-ERWDRI3F.js";
133
+ } from "./chunk-N4I3TD4G.js";
133
134
  import "./chunk-TYGL25EL.js";
134
135
  import {
135
136
  AgentGuiI18nProvider,
@@ -137,14 +138,14 @@ import {
137
138
  agentGuiI18nResources,
138
139
  translate,
139
140
  useTranslation
140
- } from "./chunk-IIXCU2UU.js";
141
+ } from "./chunk-UWBX3DZK.js";
141
142
  import "./chunk-PJP5BUU6.js";
142
143
  import {
143
144
  agentColorfulUrl,
144
145
  cursorColorfulUrl,
145
146
  normalizeManagedAgentProvider
146
147
  } from "./chunk-R2NGSPQS.js";
147
- import "./chunk-MQ6RKXXW.js";
148
+ import "./chunk-XLBJHHDX.js";
148
149
  import {
149
150
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
150
151
  } from "./chunk-JM24HADP.js";
@@ -2766,7 +2767,7 @@ function resolveConversationProject(session, projectResolver) {
2766
2767
  }
2767
2768
  function isExternalImportNoProjectSession(session) {
2768
2769
  const runtimeContext = session && "runtimeContext" in session ? session.runtimeContext : void 0;
2769
- return runtimeContext?.externalImportNoProject === true;
2770
+ return runtimeContext?.noProject === true || runtimeContext?.externalImportNoProject === true;
2770
2771
  }
2771
2772
  function isImportedWorkspaceAgentSession(session) {
2772
2773
  return session?.runtimeContext?.imported === true;
@@ -9395,6 +9396,8 @@ function useAgentGUINodeController({
9395
9396
  );
9396
9397
  const handledOpenSessionSequenceRef = useRef4(null);
9397
9398
  const pendingOpenSessionRequestRef = useRef4(null);
9399
+ const explicitlyOpenedConversationIdsRef = useRef4(/* @__PURE__ */ new Set());
9400
+ const railPinnedTransientConversationIdsRef = useRef4(/* @__PURE__ */ new Set());
9398
9401
  const selectedConversationNotFoundRetryIdsRef = useRef4(/* @__PURE__ */ new Set());
9399
9402
  const selectedConversationNotFoundRetryTimerRef = useRef4(null);
9400
9403
  const sessionStateSnapshotCauseBySessionIdRef = useRef4({});
@@ -9496,6 +9499,78 @@ function useAgentGUINodeController({
9496
9499
  },
9497
9500
  []
9498
9501
  );
9502
+ const conversationSummaryFromRuntimeSession = useCallback4(
9503
+ (session) => {
9504
+ const updatedAtUnixMs = session.updatedAtUnixMs ?? Date.now();
9505
+ const projectedSession = {
9506
+ workspaceId: session.workspaceId,
9507
+ agentSessionId: session.agentSessionId,
9508
+ agentTargetId: session.agentTargetId ?? null,
9509
+ provider: session.provider,
9510
+ providerSessionId: session.providerSessionId ?? session.agentSessionId,
9511
+ resumable: session.resumable,
9512
+ cwd: session.cwd,
9513
+ status: session.status,
9514
+ title: session.title,
9515
+ pinnedAtUnixMs: session.pinnedAtUnixMs ?? null,
9516
+ createdAtUnixMs: session.createdAtUnixMs ?? updatedAtUnixMs,
9517
+ updatedAtUnixMs
9518
+ };
9519
+ return conversationSummaryFromAgentSession(projectedSession, {
9520
+ isNoProjectPath: isNoProjectPathRef.current,
9521
+ userProjects: userProjectsRef.current
9522
+ });
9523
+ },
9524
+ []
9525
+ );
9526
+ const ensureTransientOpenSessionConversation = useCallback4(
9527
+ (agentSessionId) => {
9528
+ const normalizedAgentSessionId = agentSessionId.trim();
9529
+ if (!normalizedAgentSessionId) {
9530
+ return;
9531
+ }
9532
+ if (resolveConversationSummaryById(
9533
+ conversationsRef.current,
9534
+ normalizedAgentSessionId,
9535
+ transientConversationRef.current
9536
+ )) {
9537
+ return;
9538
+ }
9539
+ const snapshotSession = agentActivitySnapshotRef.current.sessions.find(
9540
+ (session) => session.agentSessionId.trim() === normalizedAgentSessionId && session.visible !== false
9541
+ );
9542
+ if (snapshotSession) {
9543
+ setTransientConversation(
9544
+ conversationSummaryFromRuntimeSession(snapshotSession)
9545
+ );
9546
+ return;
9547
+ }
9548
+ void agentActivityRuntime.getSession(workspaceId, normalizedAgentSessionId).then((session) => {
9549
+ const shouldKeepTransient = explicitlyOpenedConversationIdsRef.current.has(
9550
+ normalizedAgentSessionId
9551
+ ) || railPinnedTransientConversationIdsRef.current.has(
9552
+ normalizedAgentSessionId
9553
+ );
9554
+ if (!isMountedRef.current || activeConversationIdRef.current !== normalizedAgentSessionId || !shouldKeepTransient || resolveConversationSummaryById(
9555
+ conversationsRef.current,
9556
+ normalizedAgentSessionId,
9557
+ transientConversationRef.current
9558
+ )) {
9559
+ return;
9560
+ }
9561
+ setTransientConversation(
9562
+ conversationSummaryFromRuntimeSession(session)
9563
+ );
9564
+ }).catch(() => {
9565
+ });
9566
+ },
9567
+ [
9568
+ agentActivityRuntime,
9569
+ conversationSummaryFromRuntimeSession,
9570
+ setTransientConversation,
9571
+ workspaceId
9572
+ ]
9573
+ );
9499
9574
  const ensureOpenclawGateway = useCallback4(() => {
9500
9575
  if (dataRef.current.provider !== "openclaw") {
9501
9576
  setOpenclawGateway(null);
@@ -9909,6 +9984,8 @@ function useAgentGUINodeController({
9909
9984
  setTransientConversation(
9910
9985
  (current) => current?.id === normalized ? { ...current, hasUnreadCompletion: false } : current
9911
9986
  );
9987
+ } else if (transientConversationRef.current) {
9988
+ setTransientConversation(null);
9912
9989
  }
9913
9990
  persistActiveConversation(normalized);
9914
9991
  },
@@ -9917,7 +9994,8 @@ function useAgentGUINodeController({
9917
9994
  clearSelectedConversationNotFoundRetry,
9918
9995
  conversationListQuery,
9919
9996
  markSelectedConversationDetailPending,
9920
- persistActiveConversation
9997
+ persistActiveConversation,
9998
+ setTransientConversation
9921
9999
  ]
9922
10000
  );
9923
10001
  const syncConversationListProjection = useCallback4(
@@ -10050,42 +10128,41 @@ function useAgentGUINodeController({
10050
10128
  id,
10051
10129
  transientConversationRef.current
10052
10130
  ) !== null;
10131
+ const resolveCanonicalId = (id) => resolveConversationSummaryById(conversations, id, null) !== null;
10053
10132
  const inSnapshot = (id) => agentActivitySnapshotRef.current.sessions.some(
10054
10133
  (s) => s.agentSessionId.trim() === id && s.visible !== false
10055
10134
  );
10056
10135
  if (hasExplicitOpenSessionRequest) {
10057
10136
  const requestedId = pendingOpenSessionRequest.agentSessionId.trim();
10058
- if (resolveId(requestedId)) {
10059
- pendingOpenSessionRequestRef.current = null;
10060
- selectConversation(requestedId, { reloadConversations: false });
10061
- return;
10062
- }
10063
10137
  if (!hasLoadedConversations) return;
10064
- if (inSnapshot(requestedId)) return;
10065
- if (intent.tag !== "resolving" || intent.id !== requestedId) {
10066
- setIntent({ tag: "resolving", id: requestedId });
10067
- void syncConversationListProjection(requestedId);
10068
- return;
10069
- }
10070
- if (!isAgentGUIConversationListRefreshing(conversationListQuery)) {
10071
- pendingOpenSessionRequestRef.current = null;
10072
- const fallback = selectAgentGUIConversationId(
10073
- conversations,
10074
- activeConversationIdRef.current
10075
- );
10076
- if (fallback) {
10077
- selectConversation(fallback, { reloadConversations: false });
10078
- } else {
10079
- setIntent({ tag: "home" });
10080
- }
10081
- }
10138
+ explicitlyOpenedConversationIdsRef.current.add(requestedId);
10139
+ railPinnedTransientConversationIdsRef.current.add(requestedId);
10140
+ pendingOpenSessionRequestRef.current = null;
10141
+ selectConversation(requestedId, { reloadConversations: false });
10142
+ ensureTransientOpenSessionConversation(requestedId);
10082
10143
  return;
10083
10144
  }
10084
10145
  switch (intent.tag) {
10085
10146
  case "home":
10086
10147
  return;
10087
10148
  case "active":
10088
- if (resolveId(intent.id) || !hasLoadedConversations) return;
10149
+ if (resolveCanonicalId(intent.id)) {
10150
+ explicitlyOpenedConversationIdsRef.current.delete(intent.id);
10151
+ railPinnedTransientConversationIdsRef.current.delete(intent.id);
10152
+ return;
10153
+ }
10154
+ if (resolveId(intent.id)) {
10155
+ return;
10156
+ }
10157
+ if (!hasLoadedConversations) return;
10158
+ if (inSnapshot(intent.id) && activeConversationIdRef.current === intent.id) {
10159
+ railPinnedTransientConversationIdsRef.current.add(intent.id);
10160
+ ensureTransientOpenSessionConversation(intent.id);
10161
+ return;
10162
+ }
10163
+ if (explicitlyOpenedConversationIdsRef.current.has(intent.id) && activeConversationIdRef.current === intent.id) {
10164
+ return;
10165
+ }
10089
10166
  setIntent({ tag: "requested", id: intent.id });
10090
10167
  return;
10091
10168
  case "requested": {
@@ -10098,7 +10175,14 @@ function useAgentGUINodeController({
10098
10175
  selectConversation(intent.id, { reloadConversations: false });
10099
10176
  return;
10100
10177
  }
10101
- if (inSnapshot(intent.id)) return;
10178
+ if (inSnapshot(intent.id)) {
10179
+ if (activeConversationIdRef.current === intent.id) {
10180
+ railPinnedTransientConversationIdsRef.current.add(intent.id);
10181
+ ensureTransientOpenSessionConversation(intent.id);
10182
+ setIntent({ tag: "active", id: intent.id });
10183
+ }
10184
+ return;
10185
+ }
10102
10186
  setIntent({ tag: "resolving", id: intent.id });
10103
10187
  void syncConversationListProjection(intent.id);
10104
10188
  return;
@@ -10125,6 +10209,7 @@ function useAgentGUINodeController({
10125
10209
  intent,
10126
10210
  conversations,
10127
10211
  hasLoadedConversations,
10212
+ ensureTransientOpenSessionConversation,
10128
10213
  openSessionRequest,
10129
10214
  previewMode,
10130
10215
  syncConversationListProjection,
@@ -14146,10 +14231,8 @@ function useAgentGUINodeController({
14146
14231
  null
14147
14232
  );
14148
14233
  const visibleConversations = useMemo4(() => {
14149
- const source = mergeVisibleConversations(
14150
- conversations,
14151
- transientConversationRef.current
14152
- );
14234
+ const transient = transientConversationRef.current;
14235
+ const source = transient && (isLoadingConversations || explicitlyOpenedConversationIdsRef.current.has(transient.id) || railPinnedTransientConversationIdsRef.current.has(transient.id)) ? mergeVisibleConversations(conversations, transient) : conversations;
14153
14236
  const mapped = source.map((conversation2) => {
14154
14237
  const withRuntime = mergeConversationSummaryWithRuntimeSession({
14155
14238
  conversation: conversation2,
@@ -15385,8 +15468,8 @@ import {
15385
15468
  useRef as useRef12,
15386
15469
  useState as useState12
15387
15470
  } from "react";
15388
- import { useSnapshot } from "valtio";
15389
- import { proxy as proxy2 } from "valtio/vanilla";
15471
+ import { useSnapshot as useSnapshot2 } from "valtio";
15472
+ import { proxy as proxy3 } from "valtio/vanilla";
15390
15473
  import {
15391
15474
  ChevronRight as ChevronRight2,
15392
15475
  ChevronsDown,
@@ -15453,6 +15536,18 @@ function AgentUsageMeter({
15453
15536
  ] });
15454
15537
  }
15455
15538
 
15539
+ // shared/workspaceSettingsPanel/workspaceSettingsPanelStore.ts
15540
+ import { useSnapshot } from "valtio";
15541
+ import { proxy } from "valtio/vanilla";
15542
+ var workspaceSettingsPanelStore = proxy({
15543
+ section: null,
15544
+ requestSequence: 0
15545
+ });
15546
+ function openWorkspaceSettingsPanel(input) {
15547
+ workspaceSettingsPanelStore.section = input?.section ?? null;
15548
+ workspaceSettingsPanelStore.requestSequence += 1;
15549
+ }
15550
+
15456
15551
  // agent-gui/agentGuiNode/AgentGUINodeView.tsx
15457
15552
  import {
15458
15553
  ReferenceSourcePicker,
@@ -15532,11 +15627,11 @@ function UnavailableChatIcon(props) {
15532
15627
  );
15533
15628
  }
15534
15629
 
15535
- // app/renderer/components/icons/EnvironmentLinedIcon.tsx
15536
- import { jsx as jsx16 } from "react/jsx-runtime";
15537
- function EnvironmentLinedIcon(props) {
15630
+ // app/renderer/components/icons/SettingsLinedIcon.tsx
15631
+ import { jsx as jsx16, jsxs as jsxs5 } from "react/jsx-runtime";
15632
+ function SettingsLinedIcon(props) {
15538
15633
  "use memo";
15539
- return /* @__PURE__ */ jsx16(
15634
+ return /* @__PURE__ */ jsxs5(
15540
15635
  "svg",
15541
15636
  {
15542
15637
  width: "24",
@@ -15545,13 +15640,26 @@ function EnvironmentLinedIcon(props) {
15545
15640
  fill: "none",
15546
15641
  xmlns: "http://www.w3.org/2000/svg",
15547
15642
  ...props,
15548
- children: /* @__PURE__ */ jsx16(
15549
- "path",
15550
- {
15551
- d: "M2.0094 19.0001C2.56169 19.0001 3.0094 19.4478 3.0094 20.0001C3.0094 20.5523 2.56169 21.0001 2.0094 21.0001H1.99964C1.44752 20.9999 0.999635 20.5522 0.999635 20.0001C0.999635 19.4479 1.44752 19.0002 1.99964 19.0001H2.0094ZM1.01624 15.8174C1.1173 15.2748 1.63961 14.9161 2.18225 15.0166C3.37336 15.2385 4.47004 15.8162 5.32679 16.6729C6.18355 17.5297 6.76118 18.6263 6.98304 19.8174C7.08384 20.3602 6.72504 20.8824 6.18226 20.9835C5.63962 21.084 5.11731 20.7253 5.01624 20.1827C4.86826 19.3888 4.48377 18.658 3.91272 18.087C3.34169 17.516 2.61086 17.1314 1.81702 16.9834C1.27446 16.8822 0.915501 16.3601 1.01624 15.8174ZM2.1051 11.0059C4.37989 11.2473 6.50315 12.2614 8.12074 13.8789C9.73833 15.4965 10.7524 17.6197 10.9938 19.8946C11.052 20.4438 10.6543 20.9359 10.1051 20.9942C9.55607 21.0523 9.06377 20.6546 9.0055 20.1055C8.81236 18.2857 8.00074 16.5871 6.70667 15.293C5.41262 13.999 3.71397 13.1873 1.89417 12.9942C1.34517 12.9357 0.947265 12.4436 1.00549 11.8946C1.06376 11.3455 1.55606 10.9478 2.1051 11.0059ZM19.9997 3C20.7952 3 21.5582 3.31641 22.1208 3.87891C22.6834 4.44152 22.9997 5.20436 22.9997 6.00001V18.0001C22.9997 18.7957 22.6834 19.5585 22.1208 20.1212C21.5582 20.6837 20.7952 21.0001 19.9997 21.0001H13.9996C13.4475 20.9999 12.9996 20.5522 12.9996 20.0001C12.9996 19.4479 13.4475 19.0002 13.9996 19.0001H19.9997C20.2648 19.0001 20.5192 18.8945 20.7067 18.7071C20.8942 18.5195 20.9997 18.2653 20.9997 18.0001V6.00001C20.9997 5.73479 20.8942 5.48051 20.7067 5.29298C20.5192 5.10555 20.2648 5.00001 19.9997 5.00001H3.99964C3.73455 5.0001 3.48006 5.10552 3.29261 5.29298C3.10518 5.4805 2.99964 5.73488 2.99964 6.00001V8.00002C2.99964 8.5523 2.55192 9.00002 1.99964 9.00002C1.44752 8.99983 0.999635 8.55218 0.999635 8.00002V6.00001C0.999635 5.20444 1.31605 4.4415 1.87854 3.87891C2.44107 3.31638 3.20412 3.0001 3.99964 3H19.9997Z",
15552
- fill: "currentColor"
15553
- }
15554
- )
15643
+ children: [
15644
+ /* @__PURE__ */ jsx16(
15645
+ "path",
15646
+ {
15647
+ fillRule: "evenodd",
15648
+ clipRule: "evenodd",
15649
+ d: "M12 8C9.79088 8 8.00002 9.79086 8.00002 12C8.00002 14.2091 9.79088 16 12 16C14.2092 16 16 14.2091 16 12C16 9.79086 14.2092 8 12 8ZM10 12C10 10.8954 10.8955 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14C10.8955 14 10 13.1046 10 12Z",
15650
+ fill: "currentColor"
15651
+ }
15652
+ ),
15653
+ /* @__PURE__ */ jsx16(
15654
+ "path",
15655
+ {
15656
+ fillRule: "evenodd",
15657
+ clipRule: "evenodd",
15658
+ d: "M12.5147 2.08484C12.1951 1.90505 11.8048 1.90505 11.4852 2.08484L3.48518 6.58484C3.15456 6.77082 2.94995 7.12066 2.94995 7.5V16.5C2.94995 16.8793 3.15456 17.2292 3.48518 17.4152L11.4852 21.9152C11.8048 22.0949 12.1951 22.0949 12.5147 21.9152L20.5147 17.4152C20.8453 17.2292 21.0499 16.8793 21.0499 16.5V7.5C21.0499 7.12066 20.8453 6.77082 20.5147 6.58484L12.5147 2.08484ZM5.04995 15.8859V8.11409L12 4.20471L18.95 8.11409V15.8859L12 19.7953L5.04995 15.8859Z",
15659
+ fill: "currentColor"
15660
+ }
15661
+ )
15662
+ ]
15555
15663
  }
15556
15664
  );
15557
15665
  }
@@ -15905,7 +16013,7 @@ var styles = {
15905
16013
  var RoomIssueNode_styles_default = styles;
15906
16014
 
15907
16015
  // agent-gui/RoomIssueNode/TaskSearchField.tsx
15908
- import { jsx as jsx17, jsxs as jsxs5 } from "react/jsx-runtime";
16016
+ import { jsx as jsx17, jsxs as jsxs6 } from "react/jsx-runtime";
15909
16017
  function TaskSearchField({
15910
16018
  ariaLabel,
15911
16019
  className,
@@ -15919,7 +16027,7 @@ function TaskSearchField({
15919
16027
  "use memo";
15920
16028
  const { t } = useTranslation();
15921
16029
  const searchInput = useComposedInputValue({ onCommit: onChange, value });
15922
- return /* @__PURE__ */ jsxs5(
16030
+ return /* @__PURE__ */ jsxs6(
15923
16031
  "div",
15924
16032
  {
15925
16033
  className: `${RoomIssueNode_styles_default.searchField} ${className ?? ""}`.trim(),
@@ -15989,7 +16097,7 @@ import {
15989
16097
  useAnimation,
15990
16098
  useReducedMotion
15991
16099
  } from "framer-motion";
15992
- import { jsx as jsx18, jsxs as jsxs6 } from "react/jsx-runtime";
16100
+ import { jsx as jsx18, jsxs as jsxs7 } from "react/jsx-runtime";
15993
16101
  var CAST_VARIANTS = {
15994
16102
  normal: { opacity: 1 },
15995
16103
  animate: (custom) => ({
@@ -16064,7 +16172,7 @@ var CastIcon = forwardRef2(
16064
16172
  onMouseEnter: handleMouseEnter,
16065
16173
  onMouseLeave: handleMouseLeave,
16066
16174
  ...props,
16067
- children: /* @__PURE__ */ jsxs6(
16175
+ children: /* @__PURE__ */ jsxs7(
16068
16176
  "svg",
16069
16177
  {
16070
16178
  fill: "none",
@@ -16154,7 +16262,7 @@ var styles2 = {
16154
16262
  var AgentGUIChrome_styles_default = styles2;
16155
16263
 
16156
16264
  // agent-gui/agentGuiNode/AgentSessionChrome.tsx
16157
- import { Fragment as Fragment2, jsx as jsx19, jsxs as jsxs7 } from "react/jsx-runtime";
16265
+ import { Fragment as Fragment2, jsx as jsx19, jsxs as jsxs8 } from "react/jsx-runtime";
16158
16266
  function splitTrailingEllipsis(message) {
16159
16267
  const match = message.match(/^(.*?)(\.{3}|…)\s*$/);
16160
16268
  if (!match) {
@@ -16167,7 +16275,7 @@ function splitTrailingEllipsis(message) {
16167
16275
  }
16168
16276
  function LoadingEllipsis() {
16169
16277
  "use memo";
16170
- return /* @__PURE__ */ jsxs7("span", { className: "tsh-inline-loading-ellipsis", "aria-hidden": "true", children: [
16278
+ return /* @__PURE__ */ jsxs8("span", { className: "tsh-inline-loading-ellipsis", "aria-hidden": "true", children: [
16171
16279
  /* @__PURE__ */ jsx19("span", {}),
16172
16280
  /* @__PURE__ */ jsx19("span", {}),
16173
16281
  /* @__PURE__ */ jsx19("span", {})
@@ -16178,7 +16286,7 @@ function ChromeMessageTooltip({
16178
16286
  children
16179
16287
  }) {
16180
16288
  "use memo";
16181
- return /* @__PURE__ */ jsx19(TooltipProvider, { delayDuration: 250, children: /* @__PURE__ */ jsxs7(Tooltip, { children: [
16289
+ return /* @__PURE__ */ jsx19(TooltipProvider, { delayDuration: 250, children: /* @__PURE__ */ jsxs8(Tooltip, { children: [
16182
16290
  /* @__PURE__ */ jsx19(TooltipTrigger, { asChild: true, children }),
16183
16291
  /* @__PURE__ */ jsx19(
16184
16292
  TooltipContent,
@@ -16208,9 +16316,9 @@ function AgentChromeNotice({
16208
16316
  className: cn(AgentGUIChrome_styles_default.chromeCard, toneClassName),
16209
16317
  role,
16210
16318
  "data-testid": testId,
16211
- children: /* @__PURE__ */ jsx19("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16319
+ children: /* @__PURE__ */ jsx19("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16212
16320
  icon ? /* @__PURE__ */ jsx19("span", { className: AgentGUIChrome_styles_default.chromeIcon, children: icon }) : null,
16213
- /* @__PURE__ */ jsxs7(
16321
+ /* @__PURE__ */ jsxs8(
16214
16322
  "p",
16215
16323
  {
16216
16324
  className: cn(AgentGUIChrome_styles_default.chromeMessage, AgentGUIChrome_styles_default.chromeNoticeMessage),
@@ -16244,10 +16352,10 @@ function AgentSessionChrome({
16244
16352
  if (!hasContent) {
16245
16353
  return null;
16246
16354
  }
16247
- return /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.sessionChrome, children: [
16248
- visibleAuth ? /* @__PURE__ */ jsx19("section", { className: cn(AgentGUIChrome_styles_default.chromeCard, AgentGUIChrome_styles_default.chromeCardWarning), children: /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16355
+ return /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.sessionChrome, children: [
16356
+ visibleAuth ? /* @__PURE__ */ jsx19("section", { className: cn(AgentGUIChrome_styles_default.chromeCard, AgentGUIChrome_styles_default.chromeCardWarning), children: /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16249
16357
  /* @__PURE__ */ jsx19("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: /* @__PURE__ */ jsx19(ChromeMessageTooltip, { message: visibleAuth.message, children: /* @__PURE__ */ jsx19("p", { className: AgentGUIChrome_styles_default.chromeMessage, tabIndex: 0, children: visibleAuth.message }) }) }),
16250
- /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.chromeInlineActions, children: [
16358
+ /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeInlineActions, children: [
16251
16359
  onAuthLogin ? /* @__PURE__ */ jsx19(
16252
16360
  Button2,
16253
16361
  {
@@ -16270,7 +16378,7 @@ function AgentSessionChrome({
16270
16378
  )
16271
16379
  ] })
16272
16380
  ] }) }) : null,
16273
- chrome.approval ? /* @__PURE__ */ jsxs7("section", { className: cn(AgentGUIChrome_styles_default.chromeCard, AgentGUIChrome_styles_default.chromeCardAction), children: [
16381
+ chrome.approval ? /* @__PURE__ */ jsxs8("section", { className: cn(AgentGUIChrome_styles_default.chromeCard, AgentGUIChrome_styles_default.chromeCardAction), children: [
16274
16382
  /* @__PURE__ */ jsx19("div", { className: AgentGUIChrome_styles_default.chromeTitle, children: labels.approvalRequired }),
16275
16383
  /* @__PURE__ */ jsx19("p", { className: AgentGUIChrome_styles_default.chromeMessage, children: chrome.approval.title }),
16276
16384
  /* @__PURE__ */ jsx19("div", { className: AgentGUIChrome_styles_default.chromeActions, children: chrome.approval.options.map((option) => /* @__PURE__ */ jsx19(
@@ -16297,8 +16405,8 @@ function AgentSessionChrome({
16297
16405
  AgentGUIChrome_styles_default.chromeCard,
16298
16406
  visibleRecovery.kind === "failed" ? AgentGUIChrome_styles_default.chromeCardDanger : visibleRecovery.kind === "warning" ? AgentGUIChrome_styles_default.chromeCardDanger : visibleRecovery.kind === "activating" ? AgentGUIChrome_styles_default.chromeCardConnecting : AgentGUIChrome_styles_default.chromeCardMuted
16299
16407
  ),
16300
- children: /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16301
- /* @__PURE__ */ jsxs7("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16408
+ children: /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16409
+ /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16302
16410
  visibleRecovery.kind === "activating" ? /* @__PURE__ */ jsx19(
16303
16411
  CastIcon,
16304
16412
  {
@@ -16315,7 +16423,7 @@ function AgentSessionChrome({
16315
16423
  className: AgentGUIChrome_styles_default.chromeMessage,
16316
16424
  "aria-label": visibleRecovery.kind === "activating" ? recoveryMessage : void 0,
16317
16425
  tabIndex: 0,
16318
- children: visibleRecovery.kind === "activating" ? /* @__PURE__ */ jsxs7(Fragment2, { children: [
16426
+ children: visibleRecovery.kind === "activating" ? /* @__PURE__ */ jsxs8(Fragment2, { children: [
16319
16427
  /* @__PURE__ */ jsx19("span", { className: "tsh-inline-loading-label", children: activatingMessage.label }),
16320
16428
  activatingMessage.ellipsis ? /* @__PURE__ */ jsx19(LoadingEllipsis, {}) : null
16321
16429
  ] }) : recoveryMessage
@@ -16352,7 +16460,7 @@ function AgentSessionChrome({
16352
16460
  // agent-gui/agentGuiNode/AgentGoalBanner.tsx
16353
16461
  import { useEffect as useEffect6, useState as useState5 } from "react";
16354
16462
  import { CirclePause, CirclePlay, Pencil, Target, Trash2 } from "lucide-react";
16355
- import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
16463
+ import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
16356
16464
  var RESUMABLE_GOAL_STATUSES = /* @__PURE__ */ new Set([
16357
16465
  "paused",
16358
16466
  "blocked",
@@ -16467,8 +16575,8 @@ function AgentGoalBanner({
16467
16575
  className: cn(AgentGUIChrome_styles_default.chromeCard, AgentGUIChrome_styles_default.chromeCardMuted),
16468
16576
  role: "status",
16469
16577
  "data-testid": "agent-gui-goal-banner",
16470
- children: /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16471
- /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16578
+ children: /* @__PURE__ */ jsxs9("div", { className: AgentGUIChrome_styles_default.chromeMetaRow, children: [
16579
+ /* @__PURE__ */ jsxs9("div", { className: AgentGUIChrome_styles_default.chromeMessageSlot, children: [
16472
16580
  /* @__PURE__ */ jsx20("span", { className: AgentGUIChrome_styles_default.chromeIcon, children: /* @__PURE__ */ jsx20(Target, { "aria-hidden": true, className: "size-3.5" }) }),
16473
16581
  editDraft !== null ? /* @__PURE__ */ jsx20(
16474
16582
  "input",
@@ -16490,7 +16598,7 @@ function AgentGoalBanner({
16490
16598
  },
16491
16599
  onBlur: () => setEditDraft(null)
16492
16600
  }
16493
- ) : /* @__PURE__ */ jsxs8(
16601
+ ) : /* @__PURE__ */ jsxs9(
16494
16602
  "p",
16495
16603
  {
16496
16604
  className: cn(AgentGUIChrome_styles_default.chromeMessage, AgentGUIChrome_styles_default.chromeNoticeMessage),
@@ -16509,7 +16617,7 @@ function AgentGoalBanner({
16509
16617
  }
16510
16618
  )
16511
16619
  ] }),
16512
- hasActions ? /* @__PURE__ */ jsxs8("div", { className: AgentGUIChrome_styles_default.chromeGoalActions, children: [
16620
+ hasActions ? /* @__PURE__ */ jsxs9("div", { className: AgentGUIChrome_styles_default.chromeGoalActions, children: [
16513
16621
  onEditObjective !== void 0 && editDraft === null ? /* @__PURE__ */ jsx20(
16514
16622
  "button",
16515
16623
  {
@@ -17046,7 +17154,7 @@ import {
17046
17154
  Target as Target2,
17047
17155
  ZapIcon
17048
17156
  } from "lucide-react";
17049
- import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
17157
+ import { jsx as jsx21, jsxs as jsxs10 } from "react/jsx-runtime";
17050
17158
  var paletteStyles = {
17051
17159
  palette: "nodrag agent-gui-node__mention-palette flex h-full min-h-0 flex-col gap-1 overflow-y-auto px-1 pb-1 pt-2 [-webkit-app-region:no-drag]",
17052
17160
  option: "nodrag relative flex min-h-9 w-full min-w-0 cursor-pointer select-none items-center gap-2 overflow-hidden rounded-[6px] border-0 bg-transparent px-2.5 py-2 text-left text-[13px] text-[var(--text-primary)] outline-hidden transition-colors duration-200 [-webkit-app-region:no-drag] hover:bg-[var(--transparency-block)] focus-visible:bg-[var(--transparency-block)] focus-visible:outline-none active:bg-[var(--transparency-active)] data-[highlighted]:bg-[var(--transparency-block)] data-[highlighted]:text-[var(--text-primary)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
@@ -17116,9 +17224,9 @@ function AgentSlashCommandPalette({
17116
17224
  })
17117
17225
  }
17118
17226
  ) : null;
17119
- return /* @__PURE__ */ jsxs9(Fragment3, { children: [
17227
+ return /* @__PURE__ */ jsxs10(Fragment3, { children: [
17120
17228
  groupHeader,
17121
- /* @__PURE__ */ jsxs9(
17229
+ /* @__PURE__ */ jsxs10(
17122
17230
  "div",
17123
17231
  {
17124
17232
  ref: isHighlighted ? highlightedOptionRef : null,
@@ -17148,8 +17256,8 @@ function AgentSlashCommandPalette({
17148
17256
  },
17149
17257
  children: [
17150
17258
  entryIcon ? /* @__PURE__ */ jsx21("span", { "aria-hidden": "true", className: paletteStyles.icon, children: entryIcon }) : null,
17151
- /* @__PURE__ */ jsxs9("span", { className: paletteStyles.copy, children: [
17152
- /* @__PURE__ */ jsxs9("span", { className: paletteStyles.name, children: [
17259
+ /* @__PURE__ */ jsxs10("span", { className: paletteStyles.copy, children: [
17260
+ /* @__PURE__ */ jsxs10("span", { className: paletteStyles.name, children: [
17153
17261
  /* @__PURE__ */ jsx21("span", { className: paletteStyles.primaryName, children: entry.type === "command" ? entry.primaryLabel ?? entry.label : entry.label }),
17154
17262
  entry.type === "command" && entry.secondaryLabel ? /* @__PURE__ */ jsx21("span", { className: paletteStyles.secondaryName, children: entry.secondaryLabel }) : null
17155
17263
  ] }),
@@ -17406,7 +17514,7 @@ var styles3 = {
17406
17514
  var AgentGUINode_styles_default = styles3;
17407
17515
 
17408
17516
  // agent-gui/agentGuiNode/AgentQueuedPromptPanel.tsx
17409
- import { jsx as jsx22, jsxs as jsxs10 } from "react/jsx-runtime";
17517
+ import { jsx as jsx22, jsxs as jsxs11 } from "react/jsx-runtime";
17410
17518
  var EMPTY_WORKSPACE_APP_ICONS = [];
17411
17519
  function queuedPromptImages(queuedPrompt) {
17412
17520
  return agentPromptContentImageBlocks(
@@ -17521,7 +17629,7 @@ function AgentQueuedPromptPanel({
17521
17629
  window.removeEventListener("resize", measure);
17522
17630
  };
17523
17631
  }, [queuedPrompts]);
17524
- return /* @__PURE__ */ jsxs10(
17632
+ return /* @__PURE__ */ jsxs11(
17525
17633
  "div",
17526
17634
  {
17527
17635
  className: AgentGUINode_styles_default.composerQueuedPromptPanel,
@@ -17532,7 +17640,7 @@ function AgentQueuedPromptPanel({
17532
17640
  onClick: toggleExpanded,
17533
17641
  onKeyDown: handleKeyDown,
17534
17642
  children: [
17535
- /* @__PURE__ */ jsxs10("div", { className: AgentGUINode_styles_default.composerQueuedPromptHeader, children: [
17643
+ /* @__PURE__ */ jsxs11("div", { className: AgentGUINode_styles_default.composerQueuedPromptHeader, children: [
17536
17644
  /* @__PURE__ */ jsx22("span", { className: AgentGUINode_styles_default.composerQueuedPromptLabel, children: labels.queuedLabel }),
17537
17645
  /* @__PURE__ */ jsx22("span", { className: AgentGUINode_styles_default.composerQueuedPromptCount, children: queuedPrompts.length }),
17538
17646
  canExpand ? /* @__PURE__ */ jsx22(
@@ -17558,14 +17666,14 @@ function AgentQueuedPromptPanel({
17558
17666
  queuedPrompt.content
17559
17667
  );
17560
17668
  const title = queuedPromptTitle(queuedPrompt);
17561
- return /* @__PURE__ */ jsxs10(
17669
+ return /* @__PURE__ */ jsxs11(
17562
17670
  "div",
17563
17671
  {
17564
17672
  className: AgentGUINode_styles_default.composerQueuedPromptRow,
17565
17673
  "data-testid": `agent-gui-composer-queued-prompt-${queuedPrompt.id}`,
17566
17674
  "data-draining": isDraining ? "true" : "false",
17567
17675
  children: [
17568
- /* @__PURE__ */ jsx22("div", { className: AgentGUINode_styles_default.composerQueuedPromptMain, children: /* @__PURE__ */ jsxs10("div", { className: AgentGUINode_styles_default.composerQueuedPromptBody, title, children: [
17676
+ /* @__PURE__ */ jsx22("div", { className: AgentGUINode_styles_default.composerQueuedPromptMain, children: /* @__PURE__ */ jsxs11("div", { className: AgentGUINode_styles_default.composerQueuedPromptBody, title, children: [
17569
17677
  displayText ? /* @__PURE__ */ jsx22(
17570
17678
  "div",
17571
17679
  {
@@ -17603,7 +17711,7 @@ function AgentQueuedPromptPanel({
17603
17711
  );
17604
17712
  }) }) : null
17605
17713
  ] }) }),
17606
- /* @__PURE__ */ jsxs10("div", { className: AgentGUINode_styles_default.composerQueuedPromptActions, children: [
17714
+ /* @__PURE__ */ jsxs11("div", { className: AgentGUINode_styles_default.composerQueuedPromptActions, children: [
17607
17715
  /* @__PURE__ */ jsx22(
17608
17716
  CanvasNodeGhostIconButton,
17609
17717
  {
@@ -17622,7 +17730,7 @@ function AgentQueuedPromptPanel({
17622
17730
  children: /* @__PURE__ */ jsx22(CanvasNodeTrashLinedIcon, { "aria-hidden": "true" })
17623
17731
  }
17624
17732
  ),
17625
- /* @__PURE__ */ jsxs10(DropdownMenu, { children: [
17733
+ /* @__PURE__ */ jsxs11(DropdownMenu, { children: [
17626
17734
  /* @__PURE__ */ jsx22(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx22(
17627
17735
  CanvasNodeGhostIconButton,
17628
17736
  {
@@ -18163,7 +18271,7 @@ function optionsWithSelectedValue(options, selectedValue) {
18163
18271
  }
18164
18272
 
18165
18273
  // agent-gui/agentGuiNode/AgentComposerSettingsMenus.tsx
18166
- import { Fragment as Fragment5, jsx as jsx23, jsxs as jsxs11 } from "react/jsx-runtime";
18274
+ import { Fragment as Fragment5, jsx as jsx23, jsxs as jsxs12 } from "react/jsx-runtime";
18167
18275
  function basenameProjectPath(path) {
18168
18276
  const normalized = path.trim().replaceAll("\\", "/").replace(/\/+$/, "");
18169
18277
  return normalized.split("/").filter(Boolean).at(-1) ?? path;
@@ -18198,7 +18306,7 @@ function AgentProjectDropdown({
18198
18306
  if (previewMode) {
18199
18307
  const selectedPath = composerSettings.selectedProjectPath?.trim() ?? "";
18200
18308
  const triggerLabel = selectedPath ? basenameProjectPath(selectedPath) : resolvedLabels.noProject;
18201
- return /* @__PURE__ */ jsxs11(
18309
+ return /* @__PURE__ */ jsxs12(
18202
18310
  "button",
18203
18311
  {
18204
18312
  type: "button",
@@ -18209,7 +18317,7 @@ function AgentProjectDropdown({
18209
18317
  "text-[var(--agent-gui-text-tertiary)]"
18210
18318
  ),
18211
18319
  children: [
18212
- /* @__PURE__ */ jsxs11(
18320
+ /* @__PURE__ */ jsxs12(
18213
18321
  "span",
18214
18322
  {
18215
18323
  className: "workspace-user-project-trigger-label",
@@ -18304,7 +18412,7 @@ function AgentPermissionModeDropdown({
18304
18412
  }
18305
18413
  applyPermissionModeId(permissionModeId);
18306
18414
  };
18307
- const trigger = /* @__PURE__ */ jsxs11(
18415
+ const trigger = /* @__PURE__ */ jsxs12(
18308
18416
  "button",
18309
18417
  {
18310
18418
  type: "button",
@@ -18339,7 +18447,7 @@ function AgentPermissionModeDropdown({
18339
18447
  children: /* @__PURE__ */ jsx23("span", { className: "flex min-w-0 flex-1 items-center", children: /* @__PURE__ */ jsx23("span", { className: "truncate", children: triggerLabel }) })
18340
18448
  }
18341
18449
  );
18342
- return /* @__PURE__ */ jsxs11(
18450
+ return /* @__PURE__ */ jsxs12(
18343
18451
  Select,
18344
18452
  {
18345
18453
  open: isSelectOpen,
@@ -18352,7 +18460,7 @@ function AgentPermissionModeDropdown({
18352
18460
  // The trigger is disabled while loading, so pointer events never reach
18353
18461
  // it. Target the tooltip at a focusable wrapper span (Radix's pattern
18354
18462
  // for disabled triggers) so hover/focus reliably surfaces the hint.
18355
- /* @__PURE__ */ jsxs11(Tooltip2, { children: [
18463
+ /* @__PURE__ */ jsxs12(Tooltip2, { children: [
18356
18464
  /* @__PURE__ */ jsx23(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ jsx23("span", { className: "inline-flex", tabIndex: 0, children: selectTrigger }) }),
18357
18465
  /* @__PURE__ */ jsx23(TooltipContent2, { side: "top", children: labels.loadingOptions })
18358
18466
  ] })
@@ -18375,7 +18483,7 @@ function AgentPermissionModeDropdown({
18375
18483
  disabled: selectDisabled,
18376
18484
  className: cn2(AgentGUINode_styles_default.composerMenuItem, "group/composer-option"),
18377
18485
  onPointerDown: (event) => handleSelectedItemPointerDown(event, option.value),
18378
- children: /* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 items-center gap-1.5", children: [
18486
+ children: /* @__PURE__ */ jsxs12("span", { className: "flex min-w-0 items-center gap-1.5", children: [
18379
18487
  /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate", children: option.label }),
18380
18488
  option.description ? /* @__PURE__ */ jsx23(
18381
18489
  ComposerOptionInfoTooltip,
@@ -18471,7 +18579,7 @@ function ComposerOptionInfoTooltip({
18471
18579
  if (!tooltipsEnabled) {
18472
18580
  return trigger;
18473
18581
  }
18474
- return /* @__PURE__ */ jsxs11(Tooltip2, { children: [
18582
+ return /* @__PURE__ */ jsxs12(Tooltip2, { children: [
18475
18583
  /* @__PURE__ */ jsx23(TooltipTrigger2, { asChild: true, children: trigger }),
18476
18584
  /* @__PURE__ */ jsx23(TooltipContent2, { side: "right", className: "max-w-[240px] whitespace-normal", children: description })
18477
18585
  ] });
@@ -18514,7 +18622,7 @@ function AgentModelReasoningDropdown({
18514
18622
  onSettingsChange(patch);
18515
18623
  setMenuOpen(false);
18516
18624
  };
18517
- const trigger = /* @__PURE__ */ jsxs11(
18625
+ const trigger = /* @__PURE__ */ jsxs12(
18518
18626
  "button",
18519
18627
  {
18520
18628
  type: "button",
@@ -18527,7 +18635,7 @@ function AgentModelReasoningDropdown({
18527
18635
  "aria-label": `${labels.modelLabel} / ${labels.reasoningLabel}`,
18528
18636
  "data-agent-model-reasoning-trigger": "true",
18529
18637
  children: [
18530
- /* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 flex-1 items-center gap-2 overflow-hidden", children: [
18638
+ /* @__PURE__ */ jsxs12("span", { className: "flex min-w-0 flex-1 items-center gap-2 overflow-hidden", children: [
18531
18639
  menu.speed.show && menu.trigger.isFast ? /* @__PURE__ */ jsx23(
18532
18640
  ZapIcon2,
18533
18641
  {
@@ -18537,7 +18645,7 @@ function AgentModelReasoningDropdown({
18537
18645
  strokeWidth: 2.5
18538
18646
  }
18539
18647
  ) : null,
18540
- menu.trigger.showCombined ? /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate", children: menu.trigger.combinedLabel }) : /* @__PURE__ */ jsxs11(Fragment5, { children: [
18648
+ menu.trigger.showCombined ? /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate", children: menu.trigger.combinedLabel }) : /* @__PURE__ */ jsxs12(Fragment5, { children: [
18541
18649
  /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate", children: menu.trigger.modelLabel }),
18542
18650
  /* @__PURE__ */ jsx23("span", { className: "shrink-0", children: menu.trigger.reasoningLabel })
18543
18651
  ] })
@@ -18549,17 +18657,17 @@ function AgentModelReasoningDropdown({
18549
18657
  if (previewMode) {
18550
18658
  return trigger;
18551
18659
  }
18552
- return /* @__PURE__ */ jsxs11(DropdownMenu2, { open: menuOpen, onOpenChange: setMenuOpen, children: [
18660
+ return /* @__PURE__ */ jsxs12(DropdownMenu2, { open: menuOpen, onOpenChange: setMenuOpen, children: [
18553
18661
  isModelLoading ? (
18554
18662
  // The trigger is disabled while loading, so pointer events never reach
18555
18663
  // it. Target the tooltip at a focusable wrapper span (Radix's pattern
18556
18664
  // for disabled triggers) so hover/focus reliably surfaces the hint.
18557
- /* @__PURE__ */ jsxs11(Tooltip2, { children: [
18665
+ /* @__PURE__ */ jsxs12(Tooltip2, { children: [
18558
18666
  /* @__PURE__ */ jsx23(TooltipTrigger2, { asChild: true, children: /* @__PURE__ */ jsx23("span", { className: "inline-flex", tabIndex: 0, children: /* @__PURE__ */ jsx23(DropdownMenuTrigger2, { asChild: true, disabled: menuDisabled, children: trigger }) }) }),
18559
18667
  /* @__PURE__ */ jsx23(TooltipContent2, { side: "top", children: labels.loadingOptions })
18560
18668
  ] })
18561
18669
  ) : /* @__PURE__ */ jsx23(DropdownMenuTrigger2, { asChild: true, disabled: menuDisabled, children: trigger }),
18562
- /* @__PURE__ */ jsxs11(
18670
+ /* @__PURE__ */ jsxs12(
18563
18671
  DropdownMenuContent2,
18564
18672
  {
18565
18673
  align: "end",
@@ -18572,9 +18680,9 @@ function AgentModelReasoningDropdown({
18572
18680
  ),
18573
18681
  "data-agent-composer-settings-layout": "model-primary",
18574
18682
  children: [
18575
- menu.model.show ? /* @__PURE__ */ jsxs11(Fragment5, { children: [
18683
+ menu.model.show ? /* @__PURE__ */ jsxs12(Fragment5, { children: [
18576
18684
  /* @__PURE__ */ jsx23(DropdownMenuLabel2, { children: labels.modelSelectionLabel }),
18577
- menu.model.groups.length > 0 ? menu.model.groups.map((group, index) => /* @__PURE__ */ jsxs11(Fragment4, { children: [
18685
+ menu.model.groups.length > 0 ? menu.model.groups.map((group, index) => /* @__PURE__ */ jsxs12(Fragment4, { children: [
18578
18686
  group.label !== null ? /* @__PURE__ */ jsx23(DropdownMenuLabel2, { className: "text-xs text-[var(--agent-gui-text-tertiary)]", children: group.label }) : null,
18579
18687
  /* @__PURE__ */ jsx23(
18580
18688
  ComposerMenuOptionItems,
@@ -18598,8 +18706,8 @@ function AgentModelReasoningDropdown({
18598
18706
  )
18599
18707
  ] }) : null,
18600
18708
  menu.model.show && (menu.reasoning.show || menu.speed.show) ? /* @__PURE__ */ jsx23(DropdownMenuSeparator2, {}) : null,
18601
- menu.reasoning.show ? /* @__PURE__ */ jsxs11(DropdownMenuSub2, { children: [
18602
- /* @__PURE__ */ jsxs11(
18709
+ menu.reasoning.show ? /* @__PURE__ */ jsxs12(DropdownMenuSub2, { children: [
18710
+ /* @__PURE__ */ jsxs12(
18603
18711
  DropdownMenuSubTrigger2,
18604
18712
  {
18605
18713
  className: cn2(AgentGUINode_styles_default.composerMenuItem, "[&>svg]:!ml-0.5"),
@@ -18627,8 +18735,8 @@ function AgentModelReasoningDropdown({
18627
18735
  }
18628
18736
  )
18629
18737
  ] }) : null,
18630
- menu.speed.show ? /* @__PURE__ */ jsxs11(DropdownMenuSub2, { children: [
18631
- /* @__PURE__ */ jsxs11(
18738
+ menu.speed.show ? /* @__PURE__ */ jsxs12(DropdownMenuSub2, { children: [
18739
+ /* @__PURE__ */ jsxs12(
18632
18740
  DropdownMenuSubTrigger2,
18633
18741
  {
18634
18742
  className: cn2(AgentGUINode_styles_default.composerMenuItem, "[&>svg]:!ml-0.5"),
@@ -18674,7 +18782,7 @@ function ComposerMenuOptionItems({
18674
18782
  const showInlineDescription = descriptionPresentation === "inline" && hasDescription;
18675
18783
  const showModelTooltip = descriptionPresentation === "model-tooltip";
18676
18784
  const showTooltipDescription = descriptionPresentation === "tooltip" && hasDescription;
18677
- const item = /* @__PURE__ */ jsxs11(
18785
+ const item = /* @__PURE__ */ jsxs12(
18678
18786
  DropdownMenuItem2,
18679
18787
  {
18680
18788
  className: cn2(
@@ -18694,7 +18802,7 @@ function ComposerMenuOptionItems({
18694
18802
  onSelect(option.value);
18695
18803
  },
18696
18804
  children: [
18697
- showModelTooltip ? /* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 flex-1 items-baseline gap-2 overflow-hidden", children: [
18805
+ showModelTooltip ? /* @__PURE__ */ jsxs12("span", { className: "flex min-w-0 flex-1 items-baseline gap-2 overflow-hidden", children: [
18698
18806
  /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate leading-[1.15]", children: option.label }),
18699
18807
  option.summary && option.summary.length > 0 ? /* @__PURE__ */ jsx23("span", { className: "flex min-w-0 shrink-0 items-baseline gap-1.5 overflow-hidden text-[var(--agent-gui-text-tertiary)]", children: option.summary.map((summary) => /* @__PURE__ */ jsx23(
18700
18808
  "span",
@@ -18704,7 +18812,7 @@ function ComposerMenuOptionItems({
18704
18812
  },
18705
18813
  summary
18706
18814
  )) }) : null
18707
- ] }) : /* @__PURE__ */ jsxs11(
18815
+ ] }) : /* @__PURE__ */ jsxs12(
18708
18816
  "span",
18709
18817
  {
18710
18818
  className: cn2(
@@ -18712,7 +18820,7 @@ function ComposerMenuOptionItems({
18712
18820
  showInlineDescription ? "gap-0.5" : "gap-0"
18713
18821
  ),
18714
18822
  children: [
18715
- /* @__PURE__ */ jsxs11("span", { className: "flex min-w-0 items-center gap-1.5", children: [
18823
+ /* @__PURE__ */ jsxs12("span", { className: "flex min-w-0 items-center gap-1.5", children: [
18716
18824
  /* @__PURE__ */ jsx23("span", { className: "min-w-0 truncate leading-[1.15]", children: option.label }),
18717
18825
  showTooltipDescription && option.description ? /* @__PURE__ */ jsx23(
18718
18826
  ComposerOptionInfoTooltip,
@@ -18759,11 +18867,11 @@ function ComposerModelOptionTooltip({
18759
18867
  if (!tooltipsEnabled || !option.tooltip) {
18760
18868
  return children;
18761
18869
  }
18762
- return /* @__PURE__ */ jsxs11(Tooltip2, { children: [
18870
+ return /* @__PURE__ */ jsxs12(Tooltip2, { children: [
18763
18871
  /* @__PURE__ */ jsx23(TooltipTrigger2, { asChild: true, children: cloneElement(children, {
18764
18872
  "data-agent-model-option-tooltip-trigger": "true"
18765
18873
  }) }),
18766
- /* @__PURE__ */ jsxs11(
18874
+ /* @__PURE__ */ jsxs12(
18767
18875
  TooltipContent2,
18768
18876
  {
18769
18877
  side: "right",
@@ -19071,7 +19179,7 @@ function fileToBase64(file) {
19071
19179
  }
19072
19180
 
19073
19181
  // agent-gui/agentGuiNode/agentRichText/AgentRichTextEditor.tsx
19074
- import { jsx as jsx24, jsxs as jsxs12 } from "react/jsx-runtime";
19182
+ import { jsx as jsx24, jsxs as jsxs13 } from "react/jsx-runtime";
19075
19183
  function buildWorkspaceFileMentionDropContent(entries, options = {}) {
19076
19184
  return entries.flatMap((entry, index) => [
19077
19185
  ...index === 0 && options.prefixCaretAnchor ? [
@@ -20006,7 +20114,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
20006
20114
  editor.commands.setTextSelection(editor.state.doc.content.size);
20007
20115
  lastEmittedPromptRef.current = value;
20008
20116
  }, [availableCapabilities, availableSkills, editor, value]);
20009
- return /* @__PURE__ */ jsxs12("div", { className: "relative min-w-0", onKeyDownCapture: handleKeyDownCapture, children: [
20117
+ return /* @__PURE__ */ jsxs13("div", { className: "relative min-w-0", onKeyDownCapture: handleKeyDownCapture, children: [
20010
20118
  editor ? /* @__PURE__ */ jsx24(EditorContent, { editor }) : /* @__PURE__ */ jsx24(
20011
20119
  "div",
20012
20120
  {
@@ -20021,7 +20129,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
20021
20129
  }
20022
20130
  ),
20023
20131
  contextMenu ? createPortal(
20024
- /* @__PURE__ */ jsxs12(
20132
+ /* @__PURE__ */ jsxs13(
20025
20133
  "div",
20026
20134
  {
20027
20135
  role: "menu",
@@ -20106,7 +20214,7 @@ function AgentRichTextContextMenuButton({
20106
20214
 
20107
20215
  // agent-gui/agentGuiNode/AgentSlashStatusPanel.tsx
20108
20216
  import { Fragment as Fragment6 } from "react";
20109
- import { Fragment as Fragment7, jsx as jsx25, jsxs as jsxs13 } from "react/jsx-runtime";
20217
+ import { Fragment as Fragment7, jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
20110
20218
  function formatSlashStatusTokenCount(value) {
20111
20219
  if (typeof value !== "number" || !Number.isFinite(value)) {
20112
20220
  return "";
@@ -20140,14 +20248,14 @@ function AgentSlashStatusPanel({
20140
20248
  const agentSessionId = status?.agentSessionId?.trim() ?? "";
20141
20249
  const baseUrl = status?.baseUrl?.trim() ?? "";
20142
20250
  const showSessionDetails = agentSessionId.length > 0;
20143
- return /* @__PURE__ */ jsxs13(
20251
+ return /* @__PURE__ */ jsxs14(
20144
20252
  "section",
20145
20253
  {
20146
20254
  className: "agent-gui-node__slash-status-panel",
20147
20255
  "data-testid": "agent-gui-slash-status-panel",
20148
20256
  role: "status",
20149
20257
  children: [
20150
- /* @__PURE__ */ jsxs13("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
20258
+ /* @__PURE__ */ jsxs14("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
20151
20259
  /* @__PURE__ */ jsx25("h3", { className: "truncate text-[11px] font-semibold leading-4", children: labels.slashStatusTitle }),
20152
20260
  /* @__PURE__ */ jsx25(
20153
20261
  "button",
@@ -20159,32 +20267,32 @@ function AgentSlashStatusPanel({
20159
20267
  }
20160
20268
  )
20161
20269
  ] }),
20162
- /* @__PURE__ */ jsxs13("dl", { className: "grid grid-cols-[max-content_minmax(0,1fr)] gap-x-3 gap-y-1 font-mono text-[11px] leading-4", children: [
20163
- showSessionDetails ? /* @__PURE__ */ jsxs13(Fragment7, { children: [
20164
- /* @__PURE__ */ jsxs13("dt", { className: "text-muted-foreground", children: [
20270
+ /* @__PURE__ */ jsxs14("dl", { className: "grid grid-cols-[max-content_minmax(0,1fr)] gap-x-3 gap-y-1 font-mono text-[11px] leading-4", children: [
20271
+ showSessionDetails ? /* @__PURE__ */ jsxs14(Fragment7, { children: [
20272
+ /* @__PURE__ */ jsxs14("dt", { className: "text-muted-foreground", children: [
20165
20273
  labels.slashStatusSession,
20166
20274
  ":"
20167
20275
  ] }),
20168
20276
  /* @__PURE__ */ jsx25("dd", { className: "min-w-0 truncate", children: agentSessionId }),
20169
- baseUrl ? /* @__PURE__ */ jsxs13(Fragment7, { children: [
20170
- /* @__PURE__ */ jsxs13("dt", { className: "text-muted-foreground", children: [
20277
+ baseUrl ? /* @__PURE__ */ jsxs14(Fragment7, { children: [
20278
+ /* @__PURE__ */ jsxs14("dt", { className: "text-muted-foreground", children: [
20171
20279
  labels.slashStatusBaseUrl,
20172
20280
  ":"
20173
20281
  ] }),
20174
20282
  /* @__PURE__ */ jsx25("dd", { className: "min-w-0 truncate", children: baseUrl })
20175
20283
  ] }) : null,
20176
- /* @__PURE__ */ jsxs13("dt", { className: "text-muted-foreground", children: [
20284
+ /* @__PURE__ */ jsxs14("dt", { className: "text-muted-foreground", children: [
20177
20285
  labels.slashStatusContext,
20178
20286
  ":"
20179
20287
  ] }),
20180
20288
  /* @__PURE__ */ jsx25("dd", { className: "min-w-0", children: slashStatusContextText(status, labels) })
20181
20289
  ] }) : null,
20182
- limits.map((limit) => /* @__PURE__ */ jsxs13(Fragment6, { children: [
20183
- /* @__PURE__ */ jsxs13("dt", { className: "text-muted-foreground", children: [
20290
+ limits.map((limit) => /* @__PURE__ */ jsxs14(Fragment6, { children: [
20291
+ /* @__PURE__ */ jsxs14("dt", { className: "text-muted-foreground", children: [
20184
20292
  limit.label,
20185
20293
  ":"
20186
20294
  ] }),
20187
- /* @__PURE__ */ jsx25("dd", { className: "min-w-0", children: /* @__PURE__ */ jsxs13("span", { className: "agent-gui-node__slash-status-limit", children: [
20295
+ /* @__PURE__ */ jsx25("dd", { className: "min-w-0", children: /* @__PURE__ */ jsxs14("span", { className: "agent-gui-node__slash-status-limit", children: [
20188
20296
  typeof limit.percentRemaining === "number" && Number.isFinite(limit.percentRemaining) ? /* @__PURE__ */ jsx25(
20189
20297
  "span",
20190
20298
  {
@@ -20204,9 +20312,9 @@ function AgentSlashStatusPanel({
20204
20312
  )
20205
20313
  }
20206
20314
  ) : null,
20207
- /* @__PURE__ */ jsxs13("span", { className: "agent-gui-node__slash-status-limit-value", children: [
20315
+ /* @__PURE__ */ jsxs14("span", { className: "agent-gui-node__slash-status-limit-value", children: [
20208
20316
  limit.value,
20209
- limit.reset ? /* @__PURE__ */ jsxs13("span", { className: "text-muted-foreground", children: [
20317
+ limit.reset ? /* @__PURE__ */ jsxs14("span", { className: "text-muted-foreground", children: [
20210
20318
  " ",
20211
20319
  "(",
20212
20320
  limit.reset,
@@ -20215,8 +20323,8 @@ function AgentSlashStatusPanel({
20215
20323
  ] })
20216
20324
  ] }) })
20217
20325
  ] }, limit.id)),
20218
- limits.length === 0 && status?.limitsLoading ? /* @__PURE__ */ jsxs13(Fragment7, { children: [
20219
- /* @__PURE__ */ jsxs13("dt", { className: "text-muted-foreground", children: [
20326
+ limits.length === 0 && status?.limitsLoading ? /* @__PURE__ */ jsxs14(Fragment7, { children: [
20327
+ /* @__PURE__ */ jsxs14("dt", { className: "text-muted-foreground", children: [
20220
20328
  labels.slashStatusLimits,
20221
20329
  ":"
20222
20330
  ] }),
@@ -20324,7 +20432,7 @@ var AgentReviewBranchController = class {
20324
20432
  };
20325
20433
 
20326
20434
  // agent-gui/agentGuiNode/AgentReviewPickerPanel.tsx
20327
- import { jsx as jsx26, jsxs as jsxs14 } from "react/jsx-runtime";
20435
+ import { jsx as jsx26, jsxs as jsxs15 } from "react/jsx-runtime";
20328
20436
  var reviewMenuStyles = {
20329
20437
  panel: "agent-gui-node__slash-status-panel nodrag flex max-h-[280px] flex-col gap-1 overflow-hidden [-webkit-app-region:no-drag]",
20330
20438
  search: "nodrag h-8 w-full shrink-0 rounded-[6px] border-0 bg-transparent px-2.5 text-[11px] leading-4 text-[var(--text-primary)] placeholder:text-[var(--text-secondary)] focus-visible:outline-none [-webkit-app-region:no-drag]",
@@ -20520,7 +20628,7 @@ function AgentReviewPickerPanel({
20520
20628
  },
20521
20629
  [entries, safeHighlightedIndex, stage, query, onClose, goBackToRoot]
20522
20630
  );
20523
- return /* @__PURE__ */ jsxs14(
20631
+ return /* @__PURE__ */ jsxs15(
20524
20632
  "section",
20525
20633
  {
20526
20634
  className: reviewMenuStyles.panel,
@@ -20572,7 +20680,7 @@ function AgentReviewPickerPanel({
20572
20680
  entry.onSelect();
20573
20681
  }
20574
20682
  },
20575
- children: /* @__PURE__ */ jsxs14("span", { className: reviewMenuStyles.copy, children: [
20683
+ children: /* @__PURE__ */ jsxs15("span", { className: reviewMenuStyles.copy, children: [
20576
20684
  /* @__PURE__ */ jsx26("span", { className: reviewMenuStyles.name, children: entry.label }),
20577
20685
  entry.description ? /* @__PURE__ */ jsx26("span", { className: reviewMenuStyles.description, children: entry.description }) : null
20578
20686
  ] })
@@ -20859,7 +20967,7 @@ var bold_lined_default = "./@-bold-lined-BLLFKBFI.svg";
20859
20967
  var handoff_lined_default = "./handoff-lined-4WQUBVG3.svg";
20860
20968
 
20861
20969
  // agent-gui/agentGuiNode/AgentComposer.tsx
20862
- import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
20970
+ import { jsx as jsx28, jsxs as jsxs16 } from "react/jsx-runtime";
20863
20971
  var USAGE_POPOVER_HOVER_DELAY_MS = 120;
20864
20972
  var HANDOFF_LOTTIE_PLAYER_SCRIPT_SRC = "https://unpkg.com/@lottiefiles/dotlottie-wc@0.9.14/dist/dotlottie-wc.js";
20865
20973
  var HANDOFF_LOTTIE_ANIMATION_SRC = "https://lottie.host/03d75946-52e5-4ccf-97df-174919a13ced/Av6piqVmPa.lottie";
@@ -21015,7 +21123,7 @@ function AgentUsageChip({
21015
21123
  if (!tooltipsEnabled) {
21016
21124
  return trigger;
21017
21125
  }
21018
- return /* @__PURE__ */ jsxs15(
21126
+ return /* @__PURE__ */ jsxs16(
21019
21127
  Popover,
21020
21128
  {
21021
21129
  open: usagePopoverOpen,
@@ -21033,7 +21141,7 @@ function AgentUsageChip({
21033
21141
  onOpenAutoFocus: (event) => event.preventDefault(),
21034
21142
  onPointerEnter: openUsagePopover,
21035
21143
  onPointerLeave: scheduleUsagePopoverClose,
21036
- children: /* @__PURE__ */ jsxs15("div", { className: "flex min-w-0 flex-col gap-3", children: [
21144
+ children: /* @__PURE__ */ jsxs16("div", { className: "flex min-w-0 flex-col gap-3", children: [
21037
21145
  /* @__PURE__ */ jsx28("span", { className: "text-[13px] font-semibold leading-4", children: labels.usagePopoverTitle }),
21038
21146
  showTokens ? /* @__PURE__ */ jsx28(
21039
21147
  AgentUsageMeter,
@@ -21208,7 +21316,7 @@ function AgentComposerHandoffIcon({
21208
21316
  };
21209
21317
  }, []);
21210
21318
  const shouldShowAnimation = !disabled && isPlaying && isLottieReady;
21211
- return /* @__PURE__ */ jsxs15(
21319
+ return /* @__PURE__ */ jsxs16(
21212
21320
  "span",
21213
21321
  {
21214
21322
  "aria-hidden": "true",
@@ -22942,7 +23050,7 @@ function AgentComposer({
22942
23050
  },
22943
23051
  [onSubmitInteractivePrompt]
22944
23052
  );
22945
- const composerActionButton = shouldShowStopButton ? /* @__PURE__ */ jsxs15(
23053
+ const composerActionButton = shouldShowStopButton ? /* @__PURE__ */ jsxs16(
22946
23054
  "button",
22947
23055
  {
22948
23056
  type: "button",
@@ -23002,7 +23110,7 @@ function AgentComposer({
23002
23110
  "data-rotating": promptTips.length > 1 ? "true" : void 0,
23003
23111
  "data-testid": "agent-gui-prompt-tip",
23004
23112
  style: promptTipStyle,
23005
- children: /* @__PURE__ */ jsx28("span", { className: AgentGUINode_styles_default.composerPromptTipTrack, children: rotatingPromptTips.map((tip, index) => /* @__PURE__ */ jsxs15(
23113
+ children: /* @__PURE__ */ jsx28("span", { className: AgentGUINode_styles_default.composerPromptTipTrack, children: rotatingPromptTips.map((tip, index) => /* @__PURE__ */ jsxs16(
23006
23114
  "span",
23007
23115
  {
23008
23116
  className: AgentGUINode_styles_default.composerPromptTipItem,
@@ -23010,7 +23118,7 @@ function AgentComposer({
23010
23118
  children: [
23011
23119
  /* @__PURE__ */ jsx28("span", { className: AgentGUINode_styles_default.composerPromptTipPrefix, children: labels.promptTipsPrefix }),
23012
23120
  /* @__PURE__ */ jsx28("span", { className: AgentGUINode_styles_default.composerPromptTipLabel, children: tip.label }),
23013
- /* @__PURE__ */ jsxs15("span", { className: AgentGUINode_styles_default.composerPromptTipText, children: [
23121
+ /* @__PURE__ */ jsxs16("span", { className: AgentGUINode_styles_default.composerPromptTipText, children: [
23014
23122
  " \xB7 ",
23015
23123
  tip.prompt
23016
23124
  ] })
@@ -23021,7 +23129,7 @@ function AgentComposer({
23021
23129
  },
23022
23130
  activePromptTip.id
23023
23131
  ) : null;
23024
- return /* @__PURE__ */ jsxs15(
23132
+ return /* @__PURE__ */ jsxs16(
23025
23133
  "form",
23026
23134
  {
23027
23135
  ref: composerRef,
@@ -23102,7 +23210,7 @@ function AgentComposer({
23102
23210
  onProjectMissingChange: setIsSelectedProjectMissing
23103
23211
  }
23104
23212
  ) : null,
23105
- /* @__PURE__ */ jsxs15(
23213
+ /* @__PURE__ */ jsxs16(
23106
23214
  "div",
23107
23215
  {
23108
23216
  className: cn(
@@ -23133,7 +23241,7 @@ function AgentComposer({
23133
23241
  description: labels.projectMissingDescription
23134
23242
  }
23135
23243
  ) : null,
23136
- /* @__PURE__ */ jsxs15(
23244
+ /* @__PURE__ */ jsxs16(
23137
23245
  "div",
23138
23246
  {
23139
23247
  ref: inputShellRef,
@@ -23143,14 +23251,14 @@ function AgentComposer({
23143
23251
  title: inputDisabled && disabledReasonText ? disabledReasonText : void 0,
23144
23252
  style: inputShellStyle,
23145
23253
  children: [
23146
- /* @__PURE__ */ jsxs15(
23254
+ /* @__PURE__ */ jsxs16(
23147
23255
  Popover,
23148
23256
  {
23149
23257
  open: showFileMentionPalette,
23150
23258
  onOpenChange: setIsPaletteOpen,
23151
23259
  modal: false,
23152
23260
  children: [
23153
- /* @__PURE__ */ jsx28(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs15(
23261
+ /* @__PURE__ */ jsx28(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs16(
23154
23262
  "div",
23155
23263
  {
23156
23264
  ref: promptInputAreaRef,
@@ -23182,7 +23290,7 @@ function AgentComposer({
23182
23290
  {
23183
23291
  className: "mb-2 flex max-w-[520px] flex-wrap gap-2",
23184
23292
  "data-testid": "agent-gui-composer-file-drafts",
23185
- children: visibleDraftFiles.map((file) => /* @__PURE__ */ jsxs15(
23293
+ children: visibleDraftFiles.map((file) => /* @__PURE__ */ jsxs16(
23186
23294
  "div",
23187
23295
  {
23188
23296
  className: cn(
@@ -23227,7 +23335,7 @@ function AgentComposer({
23227
23335
  ))
23228
23336
  }
23229
23337
  ) : null,
23230
- /* @__PURE__ */ jsxs15(
23338
+ /* @__PURE__ */ jsxs16(
23231
23339
  "div",
23232
23340
  {
23233
23341
  className: cn(
@@ -23396,10 +23504,10 @@ function AgentComposer({
23396
23504
  ]
23397
23505
  }
23398
23506
  ),
23399
- /* @__PURE__ */ jsxs15("div", { className: AgentGUINode_styles_default.composerFooter, children: [
23400
- /* @__PURE__ */ jsxs15("div", { className: composerStyles.footerGroup, children: [
23401
- /* @__PURE__ */ jsxs15("div", { className: "inline-flex shrink-0 items-center gap-1", children: [
23402
- previewMode ? /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs15(Tooltip, { children: [
23507
+ /* @__PURE__ */ jsxs16("div", { className: AgentGUINode_styles_default.composerFooter, children: [
23508
+ /* @__PURE__ */ jsxs16("div", { className: composerStyles.footerGroup, children: [
23509
+ /* @__PURE__ */ jsxs16("div", { className: "inline-flex shrink-0 items-center gap-1", children: [
23510
+ previewMode ? /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs16(Tooltip, { children: [
23403
23511
  /* @__PURE__ */ jsx28(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx28(
23404
23512
  "button",
23405
23513
  {
@@ -23420,7 +23528,7 @@ function AgentComposer({
23420
23528
  }
23421
23529
  ) }),
23422
23530
  /* @__PURE__ */ jsx28(TooltipContent, { side: "top", children: labels.addContent })
23423
- ] }) }) : /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs15(Tooltip, { children: [
23531
+ ] }) }) : /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs16(Tooltip, { children: [
23424
23532
  /* @__PURE__ */ jsx28(
23425
23533
  Select2,
23426
23534
  {
@@ -23461,7 +23569,7 @@ function AgentComposer({
23461
23569
  ),
23462
23570
  /* @__PURE__ */ jsx28(TooltipContent, { side: "top", children: labels.addContent })
23463
23571
  ] }) }),
23464
- /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs15(Tooltip, { children: [
23572
+ /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 120, children: /* @__PURE__ */ jsxs16(Tooltip, { children: [
23465
23573
  /* @__PURE__ */ jsx28(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx28(
23466
23574
  "button",
23467
23575
  {
@@ -23497,7 +23605,7 @@ function AgentComposer({
23497
23605
  /* @__PURE__ */ jsx28(TooltipContent, { side: "top", children: labels.mentionPalette })
23498
23606
  ] }) })
23499
23607
  ] }),
23500
- showHandoffSelect ? /* @__PURE__ */ jsxs15(
23608
+ showHandoffSelect ? /* @__PURE__ */ jsxs16(
23501
23609
  Select2,
23502
23610
  {
23503
23611
  value: HANDOFF_SELECT_IDLE_VALUE,
@@ -23536,7 +23644,7 @@ function AgentComposer({
23536
23644
  AgentGUINode_styles_default.composerHandoffTrigger,
23537
23645
  "w-auto max-w-[180px] [&>svg:last-child]:hidden"
23538
23646
  ),
23539
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23647
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23540
23648
  /* @__PURE__ */ jsx28(
23541
23649
  AgentComposerHandoffIcon,
23542
23650
  {
@@ -23564,7 +23672,7 @@ function AgentComposer({
23564
23672
  value: target.targetId,
23565
23673
  className: cn(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
23566
23674
  disabled: target.disabled === true,
23567
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23675
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23568
23676
  /* @__PURE__ */ jsx28(
23569
23677
  "img",
23570
23678
  {
@@ -23583,7 +23691,7 @@ function AgentComposer({
23583
23691
  )
23584
23692
  ]
23585
23693
  }
23586
- ) : showProviderSelect && selectedProviderSwitchTarget ? /* @__PURE__ */ jsxs15(
23694
+ ) : showProviderSelect && selectedProviderSwitchTarget ? /* @__PURE__ */ jsxs16(
23587
23695
  Select2,
23588
23696
  {
23589
23697
  value: selectedProviderSwitchTarget.targetId,
@@ -23612,7 +23720,7 @@ function AgentComposer({
23612
23720
  AgentGUINode_styles_default.composerProviderSelect,
23613
23721
  "w-auto max-w-[180px]"
23614
23722
  ),
23615
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23723
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23616
23724
  /* @__PURE__ */ jsx28(
23617
23725
  "img",
23618
23726
  {
@@ -23639,7 +23747,7 @@ function AgentComposer({
23639
23747
  value: target.targetId,
23640
23748
  className: cn(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
23641
23749
  disabled: target.disabled === true,
23642
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23750
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5", children: [
23643
23751
  /* @__PURE__ */ jsx28(
23644
23752
  "img",
23645
23753
  {
@@ -23673,8 +23781,8 @@ function AgentComposer({
23673
23781
  "disabled:cursor-not-allowed disabled:opacity-60"
23674
23782
  ),
23675
23783
  onClick: () => onSettingsChange({ planMode: false }),
23676
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5 overflow-hidden", children: [
23677
- /* @__PURE__ */ jsxs15("span", { className: "relative flex size-3.5 shrink-0 items-center justify-center", children: [
23784
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5 overflow-hidden", children: [
23785
+ /* @__PURE__ */ jsxs16("span", { className: "relative flex size-3.5 shrink-0 items-center justify-center", children: [
23678
23786
  /* @__PURE__ */ jsx28(
23679
23787
  ListChecks2,
23680
23788
  {
@@ -23715,8 +23823,8 @@ function AgentComposer({
23715
23823
  "disabled:cursor-not-allowed disabled:opacity-60"
23716
23824
  ),
23717
23825
  onClick: clearGoalModeBadge,
23718
- children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5 overflow-hidden", children: [
23719
- /* @__PURE__ */ jsxs15("span", { className: "relative flex size-3.5 shrink-0 items-center justify-center", children: [
23826
+ children: /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 items-center gap-1.5 overflow-hidden", children: [
23827
+ /* @__PURE__ */ jsxs16("span", { className: "relative flex size-3.5 shrink-0 items-center justify-center", children: [
23720
23828
  /* @__PURE__ */ jsx28(
23721
23829
  Target3,
23722
23830
  {
@@ -23744,7 +23852,7 @@ function AgentComposer({
23744
23852
  }
23745
23853
  ) : null
23746
23854
  ] }),
23747
- /* @__PURE__ */ jsxs15("div", { className: composerStyles.footerGroupRight, children: [
23855
+ /* @__PURE__ */ jsxs16("div", { className: composerStyles.footerGroupRight, children: [
23748
23856
  usage && usage.percentUsed !== null ? /* @__PURE__ */ jsx28(
23749
23857
  AgentUsageChip,
23750
23858
  {
@@ -23819,7 +23927,7 @@ function AgentComposer({
23819
23927
  ]
23820
23928
  }
23821
23929
  ),
23822
- showProjectRow ? /* @__PURE__ */ jsxs15(
23930
+ showProjectRow ? /* @__PURE__ */ jsxs16(
23823
23931
  "div",
23824
23932
  {
23825
23933
  className: AgentGUINode_styles_default.composerProjectRow,
@@ -23845,7 +23953,7 @@ function AgentComposer({
23845
23953
  {
23846
23954
  className: AgentGUINode_styles_default.composerPromptTips,
23847
23955
  "data-testid": "agent-gui-prompt-tips",
23848
- children: !previewMode && isPromptTipOverflowing && promptTipNode ? /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxs15(Tooltip, { children: [
23956
+ children: !previewMode && isPromptTipOverflowing && promptTipNode ? /* @__PURE__ */ jsx28(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxs16(Tooltip, { children: [
23849
23957
  /* @__PURE__ */ jsx28(TooltipTrigger, { asChild: true, children: promptTipNode }),
23850
23958
  /* @__PURE__ */ jsx28(
23851
23959
  TooltipContent,
@@ -23888,7 +23996,7 @@ function AgentComposerDraftImagePreview({
23888
23996
  aspectRatio: String(aspectRatio),
23889
23997
  width: `${previewWidth}px`
23890
23998
  };
23891
- return /* @__PURE__ */ jsxs15(
23999
+ return /* @__PURE__ */ jsxs16(
23892
24000
  "div",
23893
24001
  {
23894
24002
  className: cn(
@@ -24050,9 +24158,9 @@ function SendFilledIcon() {
24050
24158
  }
24051
24159
 
24052
24160
  // agent-gui/agentGuiNode/AgentGUIBottomDockStore.ts
24053
- import { proxy } from "valtio/vanilla";
24161
+ import { proxy as proxy2 } from "valtio/vanilla";
24054
24162
  function createAgentGUIBottomDockStore(initialState) {
24055
- return proxy(initialState);
24163
+ return proxy2(initialState);
24056
24164
  }
24057
24165
  function syncAgentGUIBottomDockStore(store, next) {
24058
24166
  if (agentGUIBottomDockStoreSnapshotsEqual(store, next)) {
@@ -24065,7 +24173,7 @@ function agentGUIBottomDockStoreSnapshotsEqual(current, next) {
24065
24173
  }
24066
24174
 
24067
24175
  // agent-gui/agentGuiNode/AgentConversationListSkeleton.tsx
24068
- import { jsx as jsx29, jsxs as jsxs16 } from "react/jsx-runtime";
24176
+ import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
24069
24177
  var SKELETON_ROWS = [
24070
24178
  { id: "first", size: "long" },
24071
24179
  { id: "second", size: "medium" },
@@ -24084,7 +24192,7 @@ function AgentConversationListSkeleton({
24084
24192
  role: "status",
24085
24193
  "aria-label": label,
24086
24194
  "data-testid": "agent-gui-conversation-list-loading-skeleton",
24087
- children: SKELETON_ROWS.map((row) => /* @__PURE__ */ jsxs16(
24195
+ children: SKELETON_ROWS.map((row) => /* @__PURE__ */ jsxs17(
24088
24196
  "div",
24089
24197
  {
24090
24198
  className: "agent-gui-node__conversation-list-skeleton-row",
@@ -24370,7 +24478,7 @@ function AttentionGlyph() {
24370
24478
 
24371
24479
  // agent-gui/agentGuiNode/AgentGUINodeView.tsx
24372
24480
  import { createRichTextMentionHref as createRichTextMentionHref2 } from "@tutti-os/ui-rich-text/core";
24373
- import { Fragment as Fragment9, jsx as jsx31, jsxs as jsxs17 } from "react/jsx-runtime";
24481
+ import { Fragment as Fragment9, jsx as jsx31, jsxs as jsxs18 } from "react/jsx-runtime";
24374
24482
  var AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX = 24;
24375
24483
  var AGENT_GUI_TOP_HISTORY_PREFETCH_THRESHOLD_PX = 240;
24376
24484
  var AGENT_GUI_TOP_MASK_SCROLL_EPSILON_PX = 1;
@@ -24625,6 +24733,7 @@ function handoffProjectPathForConversation(conversation) {
24625
24733
  }
24626
24734
  function AgentGUINodeView({
24627
24735
  viewModel,
24736
+ renderSidebarFooter,
24628
24737
  onLinkAction,
24629
24738
  onHandoffConversation,
24630
24739
  capabilityMenuState,
@@ -24992,11 +25101,11 @@ function AgentGUINodeView({
24992
25101
  );
24993
25102
  const sectionAgentTargetFallbackId = enabledProviderTargets.length <= 1 ? viewModel.selectedProviderTarget.agentTargetId?.trim() || viewModel.selectedProviderTarget.targetId?.trim() || null : null;
24994
25103
  const openAgentEnvSetup = useCallback10(() => {
24995
- if (!effectiveRailConfigProvider) {
24996
- return;
24997
- }
24998
25104
  openAgentEnvPanel({ provider: effectiveRailConfigProvider, focus: null });
24999
25105
  }, [effectiveRailConfigProvider]);
25106
+ const openAgentSettings = useCallback10(() => {
25107
+ openWorkspaceSettingsPanel({ section: "agent" });
25108
+ }, []);
25000
25109
  const conversationRailStoreState = useMemo10(
25001
25110
  () => ({
25002
25111
  activeConversationId: viewModel.activeConversationId,
@@ -25022,6 +25131,7 @@ function AgentGUINodeView({
25022
25131
  onUpdateConversationFilter: actions.updateConversationFilter,
25023
25132
  onSelectConversationFilterTarget: actions.selectConversationFilterTarget,
25024
25133
  onOpenAgentEnvSetup: openAgentEnvSetup,
25134
+ onOpenAgentSettings: openAgentSettings,
25025
25135
  onAgentConfigMenuOpen,
25026
25136
  onRetryOpenclawGateway: retryOpenclawGateway,
25027
25137
  onSelectConversation: selectConversation,
@@ -25046,6 +25156,7 @@ function AgentGUINodeView({
25046
25156
  labels,
25047
25157
  onAgentConfigMenuOpen,
25048
25158
  openAgentEnvSetup,
25159
+ openAgentSettings,
25049
25160
  openConversationWindow,
25050
25161
  openProjectFiles,
25051
25162
  openclawGateway,
@@ -25101,8 +25212,8 @@ function AgentGUINodeView({
25101
25212
  ),
25102
25213
  [viewModel.providerTargets, viewModel.workspaceId]
25103
25214
  );
25104
- const content = /* @__PURE__ */ jsxs17(AgentTargetPresentationProvider, { agentTargets: agentTargetPresentations, children: [
25105
- /* @__PURE__ */ jsxs17(
25215
+ const content = /* @__PURE__ */ jsxs18(AgentTargetPresentationProvider, { agentTargets: agentTargetPresentations, children: [
25216
+ /* @__PURE__ */ jsxs18(
25106
25217
  "div",
25107
25218
  {
25108
25219
  ref: layoutElementRef,
@@ -25146,6 +25257,9 @@ function AgentGUINodeView({
25146
25257
  AgentGUIConversationRailStorePane,
25147
25258
  {
25148
25259
  conversations: viewModel.conversations,
25260
+ currentUserId: viewModel.currentUserId,
25261
+ activeConversation: viewModel.activeConversation,
25262
+ renderSidebarFooter,
25149
25263
  store: conversationRailStore,
25150
25264
  storeState: conversationRailStoreState,
25151
25265
  userProjects: viewModel.userProjects,
@@ -25455,7 +25569,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
25455
25569
  ]
25456
25570
  );
25457
25571
  const conversationFlowEmpty = useMemo10(
25458
- () => /* @__PURE__ */ jsxs17(
25572
+ () => /* @__PURE__ */ jsxs18(
25459
25573
  "div",
25460
25574
  {
25461
25575
  className: AgentGUINode_styles_default.unavailableChatEmpty,
@@ -26315,7 +26429,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
26315
26429
  );
26316
26430
  setIsTimelineScrolledToBottom(true);
26317
26431
  }, [viewModel.activeConversationId]);
26318
- return /* @__PURE__ */ jsxs17("main", { className: AgentGUINode_styles_default.detail, children: [
26432
+ return /* @__PURE__ */ jsxs18("main", { className: AgentGUINode_styles_default.detail, children: [
26319
26433
  /* @__PURE__ */ jsx31(
26320
26434
  AgentGUIDetailHeader,
26321
26435
  {
@@ -26330,7 +26444,7 @@ var AgentGUIDetailPane = memo(function AgentGUIDetailPane2({
26330
26444
  previewMode
26331
26445
  }
26332
26446
  ),
26333
- showProviderSetupNotice ? /* @__PURE__ */ jsxs17(
26447
+ showProviderSetupNotice ? /* @__PURE__ */ jsxs18(
26334
26448
  "div",
26335
26449
  {
26336
26450
  className: cn3(
@@ -26460,12 +26574,12 @@ var AgentGUIDetailHeader = memo(function AgentGUIDetailHeader2({
26460
26574
  }
26461
26575
  const runPath = activeConversation.cwd.trim();
26462
26576
  const statusTitle = showSyncIndicator ? syncLabel : void 0;
26463
- return /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.detailHeader, children: [
26464
- /* @__PURE__ */ jsxs17("span", { className: AgentGUINode_styles_default.detailHeaderTitleGroup, children: [
26577
+ return /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.detailHeader, children: [
26578
+ /* @__PURE__ */ jsxs18("span", { className: AgentGUINode_styles_default.detailHeaderTitleGroup, children: [
26465
26579
  /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.detailHeaderTitle, children: conversationPlainTitle(activeConversation, labels, uiLanguage) }),
26466
26580
  runPath ? /* @__PURE__ */ jsx31(AgentRunPathInfo, { path: runPath, previewMode }) : null
26467
26581
  ] }),
26468
- /* @__PURE__ */ jsxs17(
26582
+ /* @__PURE__ */ jsxs18(
26469
26583
  "span",
26470
26584
  {
26471
26585
  className: "inline-flex flex-none items-center gap-2 whitespace-nowrap",
@@ -26504,7 +26618,7 @@ function AgentRunPathInfo({
26504
26618
  if (previewMode) {
26505
26619
  return trigger;
26506
26620
  }
26507
- return /* @__PURE__ */ jsxs17(Tooltip3, { children: [
26621
+ return /* @__PURE__ */ jsxs18(Tooltip3, { children: [
26508
26622
  /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: trigger }),
26509
26623
  /* @__PURE__ */ jsx31(
26510
26624
  TooltipContent3,
@@ -26557,7 +26671,7 @@ var AgentGUIEmptyHeroPane = memo(function AgentGUIEmptyHeroPane2({
26557
26671
  "use memo";
26558
26672
  const heroIconPresentations = iconPresentations.length > 0 ? iconPresentations : [agentGUIProviderIconPresentation(provider)];
26559
26673
  const heroIconAnimationKey = heroIconPresentations.map((icon) => `${icon.provider}:${icon.iconUrl}`).join("|");
26560
- return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.emptyHeroBody, children: [
26674
+ return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.emptyHeroBody, children: [
26561
26675
  heroIconPresentations.length > 1 ? /* @__PURE__ */ jsx31(
26562
26676
  AgentGUIAllProviderGridIcon,
26563
26677
  {
@@ -26622,7 +26736,7 @@ var AgentGUIProviderReadinessGatePane = memo(
26622
26736
  });
26623
26737
  const action = providerGateAction(gate.status);
26624
26738
  const pendingLabel = pendingAction === "install" ? labels.providerGatePendingInstall : pendingAction === "login" ? labels.providerGatePendingLogin : pendingAction === "refresh" ? labels.providerGatePendingRefresh : null;
26625
- return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs17(
26739
+ return /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.emptyHero, children: /* @__PURE__ */ jsxs18(
26626
26740
  "div",
26627
26741
  {
26628
26742
  className: cn3(AgentGUINode_styles_default.emptyHeroBody, AgentGUINode_styles_default.emptyProviderGate),
@@ -26822,9 +26936,9 @@ function EmptyHeroTitle({
26822
26936
  );
26823
26937
  const canSwitchProvider = enabledProviderTargets.length > 1 && selectedProviderTarget && onProviderSelect;
26824
26938
  const providerName = label.slice(providerStart, providerEnd);
26825
- return /* @__PURE__ */ jsxs17(Fragment9, { children: [
26939
+ return /* @__PURE__ */ jsxs18(Fragment9, { children: [
26826
26940
  label.slice(0, providerStart),
26827
- canSwitchProvider ? /* @__PURE__ */ jsxs17(
26941
+ canSwitchProvider ? /* @__PURE__ */ jsxs18(
26828
26942
  Select3,
26829
26943
  {
26830
26944
  value: selectedProviderTargetId,
@@ -26861,7 +26975,7 @@ function EmptyHeroTitle({
26861
26975
  {
26862
26976
  value: target.targetId,
26863
26977
  className: cn3(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
26864
- children: /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-1.5", children: [
26978
+ children: /* @__PURE__ */ jsxs18("span", { className: "flex min-w-0 items-center gap-1.5", children: [
26865
26979
  /* @__PURE__ */ jsx31(
26866
26980
  "img",
26867
26981
  {
@@ -26909,7 +27023,7 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
26909
27023
  goalPauseSupported
26910
27024
  }) {
26911
27025
  "use memo";
26912
- const state = useSnapshot(store);
27026
+ const state = useSnapshot2(store);
26913
27027
  const {
26914
27028
  composerProps,
26915
27029
  inlineNoticeChrome,
@@ -26924,7 +27038,7 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
26924
27038
  const goalTokensUsed = goal ? numberValue2(goal.tokensUsed) : null;
26925
27039
  const goalTimeUsedSeconds = goal ? numberValue2(goal.timeUsedSeconds) : null;
26926
27040
  const showGoalBanner = isGoalBannerVisible(goalObjective, goalStatus);
26927
- return /* @__PURE__ */ jsxs17(
27041
+ return /* @__PURE__ */ jsxs18(
26928
27042
  "div",
26929
27043
  {
26930
27044
  ref: bottomDockRef,
@@ -27031,7 +27145,7 @@ var AgentGUIBottomDockPane = memo(function AgentGUIBottomDockPane2({
27031
27145
  );
27032
27146
  });
27033
27147
  function createAgentGUIConversationRailStore(initialState) {
27034
- return proxy2(initialState);
27148
+ return proxy3(initialState);
27035
27149
  }
27036
27150
  function syncAgentGUIConversationRailStore(store, next) {
27037
27151
  if (agentGUIConversationRailStoreSnapshotsEqual(store, next)) {
@@ -27040,23 +27154,29 @@ function syncAgentGUIConversationRailStore(store, next) {
27040
27154
  Object.assign(store, next);
27041
27155
  }
27042
27156
  function agentGUIConversationRailStoreSnapshotsEqual(current, next) {
27043
- 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.onAgentConfigMenuOpen === next.onAgentConfigMenuOpen && 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;
27157
+ 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.onOpenAgentSettings === next.onOpenAgentSettings && current.onAgentConfigMenuOpen === next.onAgentConfigMenuOpen && 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;
27044
27158
  }
27045
27159
  var AgentGUIConversationRailStorePane = memo(
27046
27160
  function AgentGUIConversationRailStorePane2({
27161
+ activeConversation,
27047
27162
  conversations,
27163
+ currentUserId,
27164
+ renderSidebarFooter,
27048
27165
  store,
27049
27166
  storeState: _storeState,
27050
27167
  userProjects,
27051
27168
  workspaceId
27052
27169
  }) {
27053
27170
  "use memo";
27054
- const state = useSnapshot(store);
27171
+ const state = useSnapshot2(store);
27055
27172
  return /* @__PURE__ */ jsx31(
27056
27173
  AgentGUIConversationRailPane,
27057
27174
  {
27058
27175
  ...state,
27176
+ activeConversation,
27059
27177
  conversations,
27178
+ currentUserId,
27179
+ renderSidebarFooter,
27060
27180
  userProjects,
27061
27181
  workspaceId
27062
27182
  }
@@ -27171,37 +27291,81 @@ function updateConversationSectionsFromSummaries(previous, conversations, option
27171
27291
  const summariesById = new Map(
27172
27292
  conversations.map((conversation) => [conversation.id, conversation])
27173
27293
  );
27294
+ const summarySectionItemsById = /* @__PURE__ */ new Map();
27295
+ for (const conversation of conversations) {
27296
+ if ((conversation.pinnedAtUnixMs ?? 0) > 0) {
27297
+ continue;
27298
+ }
27299
+ const sectionId = conversation.project ? `project:${normalizeConversationProjectPath(conversation.project.path)}` : "conversations";
27300
+ const items = summarySectionItemsById.get(sectionId) ?? [];
27301
+ items.push(conversation);
27302
+ summarySectionItemsById.set(sectionId, items);
27303
+ }
27174
27304
  const seenIds = /* @__PURE__ */ new Set();
27175
27305
  let changed = false;
27176
27306
  const nextSections = previous.map((section) => {
27177
27307
  let sectionChanged = false;
27308
+ const summaryItems = summarySectionItemsById.get(section.id) ?? [];
27309
+ const summaryIdsForSection = new Set(summaryItems.map((item) => item.id));
27178
27310
  const items = section.items.map((item) => {
27179
27311
  seenIds.add(item.id);
27180
27312
  const summary = summariesById.get(item.id);
27181
27313
  if (!summary) {
27182
27314
  return item;
27183
27315
  }
27184
- const nextItem = {
27316
+ const nextItem = section.project ? {
27185
27317
  ...summary,
27186
- project: item.project
27187
- };
27318
+ project: section.project
27319
+ } : summary;
27188
27320
  if (conversationSummariesRenderEqual2(item, nextItem)) {
27189
27321
  return item;
27190
27322
  }
27191
27323
  sectionChanged = true;
27192
27324
  return nextItem;
27325
+ }).filter((item) => {
27326
+ const summary = summariesById.get(item.id);
27327
+ if (!summary || summaryIdsForSection.has(item.id)) {
27328
+ return true;
27329
+ }
27330
+ sectionChanged = true;
27331
+ return false;
27193
27332
  });
27194
- if (!sectionChanged) {
27195
- return section;
27333
+ const nextSection = sectionChanged ? {
27334
+ ...section,
27335
+ items
27336
+ } : section;
27337
+ if (section.kind === "pinned" || summaryItems.length === 0) {
27338
+ if (sectionChanged) {
27339
+ changed = true;
27340
+ }
27341
+ return nextSection;
27342
+ }
27343
+ const summaryIds = new Set(summaryItems.map((item) => item.id));
27344
+ const mergedItems = [
27345
+ ...summaryItems.map(
27346
+ (item) => section.project ? { ...item, project: section.project } : item
27347
+ ),
27348
+ ...items.filter((item) => !summaryIds.has(item.id))
27349
+ ];
27350
+ const stableItems = stabilizeConversationSectionItems(
27351
+ section.items,
27352
+ mergedItems
27353
+ );
27354
+ if (stableItems === section.items) {
27355
+ if (sectionChanged) {
27356
+ changed = true;
27357
+ }
27358
+ return nextSection;
27196
27359
  }
27197
27360
  changed = true;
27198
27361
  return {
27199
- ...section,
27200
- items
27362
+ ...nextSection,
27363
+ items: stableItems
27201
27364
  };
27202
27365
  });
27203
- const newConversations = conversations.filter(
27204
- (conversation) => !seenIds.has(conversation.id) && (conversation.pinnedAtUnixMs ?? 0) <= 0
27366
+ const existingSectionIds = new Set(nextSections.map((section) => section.id));
27367
+ const newConversations = [...summarySectionItemsById.entries()].flatMap(
27368
+ ([sectionId, items]) => existingSectionIds.has(sectionId) ? [] : items.filter((conversation) => !seenIds.has(conversation.id))
27205
27369
  );
27206
27370
  if (newConversations.length === 0) {
27207
27371
  return changed ? nextSections : previous;
@@ -27216,7 +27380,7 @@ function updateConversationSectionsFromSummaries(previous, conversations, option
27216
27380
  if (targetIndex !== -1 && target) {
27217
27381
  sectionsWithInsertions[targetIndex] = {
27218
27382
  ...target,
27219
- items: [conversation, ...target.items]
27383
+ items: [...target.items, conversation]
27220
27384
  };
27221
27385
  continue;
27222
27386
  }
@@ -27445,7 +27609,7 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
27445
27609
  },
27446
27610
  [onSelectConversationFilterTarget]
27447
27611
  );
27448
- return /* @__PURE__ */ jsxs17(
27612
+ return /* @__PURE__ */ jsxs18(
27449
27613
  "div",
27450
27614
  {
27451
27615
  className: AgentGUINode_styles_default.providerRail,
@@ -27453,7 +27617,7 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
27453
27617
  "aria-label": labels.providerSwitchLabel,
27454
27618
  "aria-busy": providerTargetsLoading,
27455
27619
  children: [
27456
- /* @__PURE__ */ jsxs17(
27620
+ /* @__PURE__ */ jsxs18(
27457
27621
  "button",
27458
27622
  {
27459
27623
  type: "button",
@@ -27525,7 +27689,7 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
27525
27689
  if (previewMode) {
27526
27690
  return tile;
27527
27691
  }
27528
- return /* @__PURE__ */ jsxs17(Tooltip3, { children: [
27692
+ return /* @__PURE__ */ jsxs18(Tooltip3, { children: [
27529
27693
  /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: tile }),
27530
27694
  /* @__PURE__ */ jsx31(TooltipContent3, { side: "right", sideOffset: -4, children: label })
27531
27695
  ] }, `${target.provider}:${target.targetId}:tooltip`);
@@ -27547,6 +27711,7 @@ function useAgentGUIConversationRail({
27547
27711
  const agentActivityRuntime = useAgentActivityRuntime();
27548
27712
  const [runtimeRailSections, setRuntimeRailSections] = useState12(null);
27549
27713
  const [sectionPageStates, setSectionPageStates] = useState12(() => /* @__PURE__ */ new Map());
27714
+ const conversationsRef = useRef12(conversations);
27550
27715
  const pagingRequestSequenceRef = useRef12(0);
27551
27716
  const pagingAbortControllersRef = useRef12(/* @__PURE__ */ new Map());
27552
27717
  const runtimeListSessionSections = agentActivityRuntime.listSessionSections;
@@ -27568,6 +27733,9 @@ function useAgentGUIConversationRail({
27568
27733
  }),
27569
27734
  [labels.sectionConversations, labels.sectionPinned]
27570
27735
  );
27736
+ useEffect13(() => {
27737
+ conversationsRef.current = conversations;
27738
+ }, [conversations]);
27571
27739
  useEffect13(() => {
27572
27740
  pagingRequestSequenceRef.current += 1;
27573
27741
  for (const controller of pagingAbortControllersRef.current.values()) {
@@ -27611,8 +27779,16 @@ function useAgentGUIConversationRail({
27611
27779
  sections: page.sections,
27612
27780
  workspaceId: page.workspaceId
27613
27781
  });
27782
+ const sectionsWithSummaries = updateConversationSectionsFromSummaries(
27783
+ sections,
27784
+ conversationsRef.current,
27785
+ { sectionConversationsLabel: labels.sectionConversations }
27786
+ );
27614
27787
  setRuntimeRailSections(
27615
- (current) => stabilizeConversationSections(current, sections)
27788
+ (current) => stabilizeConversationSections(
27789
+ current,
27790
+ sectionsWithSummaries ?? sections
27791
+ )
27616
27792
  );
27617
27793
  setSectionPageStates(() => {
27618
27794
  const next = /* @__PURE__ */ new Map();
@@ -27637,6 +27813,7 @@ function useAgentGUIConversationRail({
27637
27813
  }, [
27638
27814
  conversationFilter,
27639
27815
  conversationMembershipKey,
27816
+ labels.sectionConversations,
27640
27817
  runtimeListSessionSections,
27641
27818
  runtimeSectionsEnabled,
27642
27819
  sectionProjectionLabels,
@@ -27771,6 +27948,9 @@ var AgentGUIConversationRailPane = memo(
27771
27948
  conversations,
27772
27949
  workspaceId,
27773
27950
  userProjects,
27951
+ currentUserId,
27952
+ activeConversation,
27953
+ renderSidebarFooter,
27774
27954
  activeConversationId,
27775
27955
  pendingDeleteConversationId,
27776
27956
  isLoadingConversations,
@@ -27783,12 +27963,13 @@ var AgentGUIConversationRailPane = memo(
27783
27963
  createConversationDisabled,
27784
27964
  openclawGateway,
27785
27965
  isCollapsed,
27786
- railConfigProvider,
27787
27966
  slashStatusLimits,
27967
+ selectedProviderTarget,
27788
27968
  conversationFilter,
27789
27969
  sectionAgentTargetFallbackId,
27790
27970
  onCreateConversation,
27791
27971
  onOpenAgentEnvSetup,
27972
+ onOpenAgentSettings,
27792
27973
  onAgentConfigMenuOpen,
27793
27974
  onRetryOpenclawGateway,
27794
27975
  onSelectConversation,
@@ -27950,14 +28131,14 @@ var AgentGUIConversationRailPane = memo(
27950
28131
  activeElement.scrollIntoView({ block: "nearest" });
27951
28132
  activeConversationScrollCompletedRef.current = activeId;
27952
28133
  }, [activeConversationId, groupedConversationIdentityKey]);
27953
- return /* @__PURE__ */ jsxs17(
28134
+ return /* @__PURE__ */ jsxs18(
27954
28135
  "aside",
27955
28136
  {
27956
28137
  ref: railElementRef,
27957
28138
  className: AgentGUINode_styles_default.rail,
27958
28139
  "aria-hidden": isCollapsed ? "true" : void 0,
27959
28140
  children: [
27960
- /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.railToolbar, children: [
28141
+ /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.railToolbar, children: [
27961
28142
  /* @__PURE__ */ jsx31(
27962
28143
  TaskSearchField,
27963
28144
  {
@@ -27966,7 +28147,7 @@ var AgentGUIConversationRailPane = memo(
27966
28147
  onChange: setConversationQuery
27967
28148
  }
27968
28149
  ),
27969
- /* @__PURE__ */ jsxs17(
28150
+ /* @__PURE__ */ jsxs18(
27970
28151
  Button,
27971
28152
  {
27972
28153
  type: "button",
@@ -27983,7 +28164,7 @@ var AgentGUIConversationRailPane = memo(
27983
28164
  }
27984
28165
  )
27985
28166
  ] }),
27986
- openclawGateway?.status === "starting" ? /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.gatewayStatus, "data-state": "starting", children: [
28167
+ openclawGateway?.status === "starting" ? /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.gatewayStatus, "data-state": "starting", children: [
27987
28168
  /* @__PURE__ */ jsx31(
27988
28169
  StatusDot,
27989
28170
  {
@@ -27994,7 +28175,7 @@ var AgentGUIConversationRailPane = memo(
27994
28175
  }
27995
28176
  ),
27996
28177
  /* @__PURE__ */ jsx31("span", { children: labels.openclawGatewayStarting })
27997
- ] }) : openclawGateway?.status === "failed" ? /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.gatewayStatus, "data-state": "failed", children: [
28178
+ ] }) : openclawGateway?.status === "failed" ? /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.gatewayStatus, "data-state": "failed", children: [
27998
28179
  /* @__PURE__ */ jsx31("span", { children: openclawGateway.error || labels.openclawGatewayFailed }),
27999
28180
  /* @__PURE__ */ jsx31(
28000
28181
  "button",
@@ -28028,7 +28209,7 @@ var AgentGUIConversationRailPane = memo(
28028
28209
  const projectConversationCount = normalizedProjectPath ? projectConversationCountsByPath.get(normalizedProjectPath) ?? 0 : 0;
28029
28210
  const sectionPageState = sectionPageStates.get(section.id);
28030
28211
  const sectionHasMore = !conversationQuery.trim() && section.kind !== "pinned" && sectionPageState?.hasMore === true;
28031
- return /* @__PURE__ */ jsxs17(Fragment8, { children: [
28212
+ return /* @__PURE__ */ jsxs18(Fragment8, { children: [
28032
28213
  showProjectRailHeader ? /* @__PURE__ */ jsx31(
28033
28214
  AgentGUIProjectRailHeader,
28034
28215
  {
@@ -28073,7 +28254,7 @@ var AgentGUIConversationRailPane = memo(
28073
28254
  })
28074
28255
  }
28075
28256
  ),
28076
- railConfigProvider ? /* @__PURE__ */ jsx31("div", { className: "shrink-0 px-2 py-1.5", children: slashStatusLimits.length > 0 ? /* @__PURE__ */ jsxs17(
28257
+ selectedProviderTarget?.disabled === true ? null : /* @__PURE__ */ jsx31("div", { className: "shrink-0 px-2 py-1.5", children: /* @__PURE__ */ jsxs18(
28077
28258
  Popover,
28078
28259
  {
28079
28260
  onOpenChange: (open) => {
@@ -28082,7 +28263,7 @@ var AgentGUIConversationRailPane = memo(
28082
28263
  }
28083
28264
  },
28084
28265
  children: [
28085
- /* @__PURE__ */ jsx31(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs17(
28266
+ /* @__PURE__ */ jsx31(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs18(
28086
28267
  Button,
28087
28268
  {
28088
28269
  type: "button",
@@ -28092,7 +28273,7 @@ var AgentGUIConversationRailPane = memo(
28092
28273
  disabled: previewMode,
28093
28274
  children: [
28094
28275
  /* @__PURE__ */ jsx31(
28095
- EnvironmentLinedIcon,
28276
+ SettingsLinedIcon,
28096
28277
  {
28097
28278
  "aria-hidden": "true",
28098
28279
  width: 16,
@@ -28110,61 +28291,76 @@ var AgentGUIConversationRailPane = memo(
28110
28291
  align: "start",
28111
28292
  className: "w-[300px] max-w-[calc(100vw-32px)] gap-3 p-1 text-xs",
28112
28293
  "data-testid": "agent-gui-config-menu",
28113
- children: /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-col gap-3", children: [
28114
- /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-col gap-2 p-2", children: [
28115
- /* @__PURE__ */ jsx31("span", { className: "text-[13px] font-semibold leading-4", children: labels.slashStatusLimits }),
28116
- slashStatusLimits.map((limit) => /* @__PURE__ */ jsx31(
28117
- AgentUsageMeter,
28294
+ children: /* @__PURE__ */ jsxs18("div", { className: "flex min-w-0 flex-col gap-3", children: [
28295
+ slashStatusLimits.length > 0 ? /* @__PURE__ */ jsxs18(Fragment9, { children: [
28296
+ /* @__PURE__ */ jsxs18("div", { className: "flex min-w-0 flex-col gap-2 p-2", children: [
28297
+ /* @__PURE__ */ jsx31("span", { className: "text-[13px] font-semibold leading-4", children: labels.slashStatusLimits }),
28298
+ slashStatusLimits.map((limit) => /* @__PURE__ */ jsx31(
28299
+ AgentUsageMeter,
28300
+ {
28301
+ label: limit.label,
28302
+ value: `${limit.value}${limit.reset ? ` (${limit.reset})` : ""}`,
28303
+ percent: typeof limit.percentRemaining === "number" && Number.isFinite(limit.percentRemaining) ? limit.percentRemaining : null
28304
+ },
28305
+ limit.id
28306
+ ))
28307
+ ] }),
28308
+ /* @__PURE__ */ jsx31("div", { className: "px-2", children: /* @__PURE__ */ jsx31("span", { className: "block h-px bg-[var(--border-1)]" }) })
28309
+ ] }) : null,
28310
+ /* @__PURE__ */ jsxs18("div", { className: "flex min-w-0 flex-col gap-1", children: [
28311
+ /* @__PURE__ */ jsxs18(
28312
+ "button",
28118
28313
  {
28119
- label: limit.label,
28120
- value: `${limit.value}${limit.reset ? ` (${limit.reset})` : ""}`,
28121
- percent: typeof limit.percentRemaining === "number" && Number.isFinite(limit.percentRemaining) ? limit.percentRemaining : null
28122
- },
28123
- limit.id
28124
- ))
28125
- ] }),
28126
- /* @__PURE__ */ jsx31("div", { className: "px-2", children: /* @__PURE__ */ jsx31("span", { className: "block h-px bg-[var(--border-1)]" }) }),
28127
- /* @__PURE__ */ jsxs17(
28128
- "button",
28129
- {
28130
- type: "button",
28131
- "data-testid": "agent-gui-config-env-setup",
28132
- className: "nodrag flex h-7 w-full items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] disabled:text-[var(--text-tertiary)] [-webkit-app-region:no-drag]",
28133
- disabled: previewMode,
28134
- onClick: () => onOpenAgentEnvSetup(),
28135
- children: [
28136
- /* @__PURE__ */ jsx31(Wrench, { "aria-hidden": "true", size: 16, strokeWidth: 1.8 }),
28137
- /* @__PURE__ */ jsx31("span", { children: labels.agentEnvSetup })
28138
- ]
28139
- }
28140
- )
28314
+ type: "button",
28315
+ "data-testid": "agent-gui-config-settings",
28316
+ className: "nodrag flex h-7 w-full items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] disabled:text-[var(--text-tertiary)] [-webkit-app-region:no-drag]",
28317
+ disabled: previewMode,
28318
+ onClick: () => onOpenAgentSettings(),
28319
+ children: [
28320
+ /* @__PURE__ */ jsx31(
28321
+ SettingsLinedIcon,
28322
+ {
28323
+ "aria-hidden": "true",
28324
+ width: 16,
28325
+ height: 16
28326
+ }
28327
+ ),
28328
+ /* @__PURE__ */ jsx31("span", { children: labels.agentSettingsMenu })
28329
+ ]
28330
+ }
28331
+ ),
28332
+ /* @__PURE__ */ jsxs18(
28333
+ "button",
28334
+ {
28335
+ type: "button",
28336
+ "data-testid": "agent-gui-config-env-setup",
28337
+ className: "nodrag flex h-7 w-full items-center gap-2 rounded-[6px] px-2 text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--border-focus)] disabled:text-[var(--text-tertiary)] [-webkit-app-region:no-drag]",
28338
+ disabled: previewMode,
28339
+ onClick: () => onOpenAgentEnvSetup(),
28340
+ children: [
28341
+ /* @__PURE__ */ jsx31(Wrench, { "aria-hidden": "true", size: 16, strokeWidth: 1.8 }),
28342
+ /* @__PURE__ */ jsx31("span", { children: labels.agentEnvSetup })
28343
+ ]
28344
+ }
28345
+ )
28346
+ ] })
28141
28347
  ] })
28142
28348
  }
28143
28349
  )
28144
28350
  ]
28145
28351
  }
28146
- ) : /* @__PURE__ */ jsxs17(
28147
- Button,
28352
+ ) }),
28353
+ renderSidebarFooter ? /* @__PURE__ */ jsx31(
28354
+ "div",
28148
28355
  {
28149
- type: "button",
28150
- variant: "ghost",
28151
- className: "flex w-full items-center justify-start gap-2 text-[13px] text-[var(--text-secondary)] hover:text-[var(--text-primary)]",
28152
- title: labels.agentEnvSetup,
28153
- disabled: previewMode,
28154
- onClick: () => onOpenAgentEnvSetup(),
28155
- children: [
28156
- /* @__PURE__ */ jsx31(
28157
- EnvironmentLinedIcon,
28158
- {
28159
- "aria-hidden": "true",
28160
- width: 16,
28161
- height: 16
28162
- }
28163
- ),
28164
- /* @__PURE__ */ jsx31("span", { children: labels.agentEnvSetup })
28165
- ]
28356
+ className: "shrink-0 px-2 py-1.5",
28357
+ "data-testid": "agent-gui-sidebar-footer-slot",
28358
+ children: renderSidebarFooter({
28359
+ currentUserId,
28360
+ activeConversation
28361
+ })
28166
28362
  }
28167
- ) }) : null,
28363
+ ) : null,
28168
28364
  /* @__PURE__ */ jsx31(
28169
28365
  ConfirmationDialog,
28170
28366
  {
@@ -28249,7 +28445,23 @@ var AgentGUIConversationRailSection = memo(
28249
28445
  AGENT_GUI_CONVERSATION_RAIL_SECTION_PAGE_SIZE
28250
28446
  );
28251
28447
  const visibleItemCount = isSectionCollapsed ? 0 : Math.min(visibleItemLimit, section.items.length);
28252
- const visibleItems = isSectionCollapsed ? [] : section.items.slice(0, visibleItemCount);
28448
+ const visibleItems = useMemo10(() => {
28449
+ if (isSectionCollapsed) {
28450
+ return [];
28451
+ }
28452
+ const baseItems = section.items.slice(0, visibleItemCount);
28453
+ const activeId = activeConversationId?.trim() ?? "";
28454
+ if (!activeId || baseItems.some((item) => item.id === activeId)) {
28455
+ return baseItems;
28456
+ }
28457
+ const activeItem = section.items.find((item) => item.id === activeId);
28458
+ return activeItem ? [...baseItems, activeItem] : baseItems;
28459
+ }, [
28460
+ activeConversationId,
28461
+ isSectionCollapsed,
28462
+ section.items,
28463
+ visibleItemCount
28464
+ ]);
28253
28465
  const canShowMore = !isSectionCollapsed && (visibleItemCount < section.items.length || sectionHasMore);
28254
28466
  const canShowLess = !isSectionCollapsed && visibleItemCount > AGENT_GUI_CONVERSATION_RAIL_SECTION_PAGE_SIZE;
28255
28467
  const showMoreConversations = useCallback10(() => {
@@ -28288,15 +28500,15 @@ var AgentGUIConversationRailSection = memo(
28288
28500
  source: "unscoped_section"
28289
28501
  });
28290
28502
  }, [onCreateConversation, projectPath]);
28291
- return /* @__PURE__ */ jsxs17(
28503
+ return /* @__PURE__ */ jsxs18(
28292
28504
  "section",
28293
28505
  {
28294
28506
  className: AgentGUINode_styles_default.conversationSection,
28295
28507
  "data-collapsed": isSectionCollapsed,
28296
28508
  "data-kind": section.kind,
28297
28509
  children: [
28298
- /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.conversationSectionHeader, children: [
28299
- isProjectSection ? /* @__PURE__ */ jsxs17(
28510
+ /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.conversationSectionHeader, children: [
28511
+ isProjectSection ? /* @__PURE__ */ jsxs18(
28300
28512
  "button",
28301
28513
  {
28302
28514
  type: "button",
@@ -28311,7 +28523,7 @@ var AgentGUIConversationRailSection = memo(
28311
28523
  className: AgentGUINode_styles_default.conversationSectionChevron
28312
28524
  }
28313
28525
  ),
28314
- /* @__PURE__ */ jsxs17("span", { className: AgentGUINode_styles_default.conversationSectionLabel, children: [
28526
+ /* @__PURE__ */ jsxs18("span", { className: AgentGUINode_styles_default.conversationSectionLabel, children: [
28315
28527
  isSectionCollapsed ? /* @__PURE__ */ jsx31(
28316
28528
  FolderIcon2,
28317
28529
  {
@@ -28330,7 +28542,7 @@ var AgentGUIConversationRailSection = memo(
28330
28542
  ]
28331
28543
  }
28332
28544
  ) : /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.conversationSectionToggle, children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.conversationSectionLabel, children: /* @__PURE__ */ jsx31("span", { children: section.label }) }) }),
28333
- canCreateConversationFromSection ? /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.conversationSectionActions, children: [
28545
+ canCreateConversationFromSection ? /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.conversationSectionActions, children: [
28334
28546
  previewMode ? /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.conversationSectionActionTooltipWrap, children: /* @__PURE__ */ jsx31(
28335
28547
  BareIconButton,
28336
28548
  {
@@ -28341,7 +28553,7 @@ var AgentGUIConversationRailSection = memo(
28341
28553
  onClick: handleCreateConversation,
28342
28554
  children: /* @__PURE__ */ jsx31(CreateChatIcon, { "aria-hidden": "true" })
28343
28555
  }
28344
- ) }) : /* @__PURE__ */ jsxs17(Tooltip3, { children: [
28556
+ ) }) : /* @__PURE__ */ jsxs18(Tooltip3, { children: [
28345
28557
  /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: /* @__PURE__ */ jsx31(
28346
28558
  "span",
28347
28559
  {
@@ -28369,7 +28581,7 @@ var AgentGUIConversationRailSection = memo(
28369
28581
  }
28370
28582
  )
28371
28583
  ] }),
28372
- projectPath ? /* @__PURE__ */ jsxs17(DropdownMenu, { children: [
28584
+ projectPath ? /* @__PURE__ */ jsxs18(DropdownMenu, { children: [
28373
28585
  previewMode ? /* @__PURE__ */ jsx31(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx31(
28374
28586
  "span",
28375
28587
  {
@@ -28384,7 +28596,7 @@ var AgentGUIConversationRailSection = memo(
28384
28596
  }
28385
28597
  )
28386
28598
  }
28387
- ) }) : /* @__PURE__ */ jsxs17(Tooltip3, { children: [
28599
+ ) }) : /* @__PURE__ */ jsxs18(Tooltip3, { children: [
28388
28600
  /* @__PURE__ */ jsx31(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: /* @__PURE__ */ jsx31(
28389
28601
  "span",
28390
28602
  {
@@ -28410,7 +28622,7 @@ var AgentGUIConversationRailSection = memo(
28410
28622
  }
28411
28623
  )
28412
28624
  ] }),
28413
- /* @__PURE__ */ jsxs17(
28625
+ /* @__PURE__ */ jsxs18(
28414
28626
  DropdownMenuContent,
28415
28627
  {
28416
28628
  align: "end",
@@ -28470,7 +28682,7 @@ var AgentGUIConversationRailSection = memo(
28470
28682
  }
28471
28683
  )
28472
28684
  ] }) : null,
28473
- !projectPath && section.kind === "conversations" && section.items.length > 0 ? /* @__PURE__ */ jsxs17(DropdownMenu, { children: [
28685
+ !projectPath && section.kind === "conversations" && section.items.length > 0 ? /* @__PURE__ */ jsxs18(DropdownMenu, { children: [
28474
28686
  previewMode ? /* @__PURE__ */ jsx31(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx31(
28475
28687
  "span",
28476
28688
  {
@@ -28485,7 +28697,7 @@ var AgentGUIConversationRailSection = memo(
28485
28697
  }
28486
28698
  )
28487
28699
  }
28488
- ) }) : /* @__PURE__ */ jsxs17(Tooltip3, { children: [
28700
+ ) }) : /* @__PURE__ */ jsxs18(Tooltip3, { children: [
28489
28701
  /* @__PURE__ */ jsx31(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipTrigger3, { asChild: true, children: /* @__PURE__ */ jsx31(
28490
28702
  "span",
28491
28703
  {
@@ -28542,7 +28754,7 @@ var AgentGUIConversationRailSection = memo(
28542
28754
  {
28543
28755
  className: AgentGUINode_styles_default.conversationSectionItems,
28544
28756
  "aria-hidden": isSectionCollapsed ? "true" : void 0,
28545
- children: /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.conversationSectionItemsInner, children: [
28757
+ children: /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.conversationSectionItemsInner, children: [
28546
28758
  !isSectionCollapsed && section.items.length === 0 ? /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.conversationSectionEmpty, children: labels.emptyProjectConversations }) : null,
28547
28759
  visibleItems.map((item) => /* @__PURE__ */ jsx31(
28548
28760
  AgentGUIConversationRailItem,
@@ -28565,7 +28777,7 @@ var AgentGUIConversationRailSection = memo(
28565
28777
  },
28566
28778
  item.id
28567
28779
  )),
28568
- canShowMore || canShowLess ? /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.conversationSectionPagination, children: [
28780
+ canShowMore || canShowLess ? /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.conversationSectionPagination, children: [
28569
28781
  canShowMore ? /* @__PURE__ */ jsx31(
28570
28782
  "button",
28571
28783
  {
@@ -28638,7 +28850,7 @@ var AgentGUIConversationRailItem = memo(
28638
28850
  const handleRequestDelete = useCallback10(() => {
28639
28851
  onRequestDeleteConversation(item.id);
28640
28852
  }, [item.id, onRequestDeleteConversation]);
28641
- return /* @__PURE__ */ jsxs17(
28853
+ return /* @__PURE__ */ jsxs18(
28642
28854
  "div",
28643
28855
  {
28644
28856
  ref: setItemElement,
@@ -28649,14 +28861,14 @@ var AgentGUIConversationRailItem = memo(
28649
28861
  "data-testid": `agent-gui-conversation-item-${item.id}`,
28650
28862
  onMouseLeave: handleMouseLeave,
28651
28863
  children: [
28652
- /* @__PURE__ */ jsxs17(
28864
+ /* @__PURE__ */ jsxs18(
28653
28865
  "button",
28654
28866
  {
28655
28867
  type: "button",
28656
28868
  className: AgentGUINode_styles_default.conversationSelect,
28657
28869
  onClick: handleSelect,
28658
28870
  children: [
28659
- /* @__PURE__ */ jsxs17("span", { className: AgentGUINode_styles_default.conversationTitleRow, children: [
28871
+ /* @__PURE__ */ jsxs18("span", { className: AgentGUINode_styles_default.conversationTitleRow, children: [
28660
28872
  providerIconUrl ? /* @__PURE__ */ jsx31(
28661
28873
  "span",
28662
28874
  {
@@ -28687,7 +28899,7 @@ var AgentGUIConversationRailItem = memo(
28687
28899
  },
28688
28900
  children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.conversationDeleteConfirmText, children: labels.deleteSessionConfirm })
28689
28901
  }
28690
- ) : /* @__PURE__ */ jsxs17(Fragment9, { children: [
28902
+ ) : /* @__PURE__ */ jsxs18(Fragment9, { children: [
28691
28903
  onOpenConversationWindow ? /* @__PURE__ */ jsx31(
28692
28904
  BareIconButton,
28693
28905
  {
@@ -28772,9 +28984,9 @@ function AgentGUIProjectRailHeader({
28772
28984
  selectProjectDirectory
28773
28985
  ]
28774
28986
  );
28775
- return /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.projectRailHeader, children: [
28987
+ return /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.projectRailHeader, children: [
28776
28988
  /* @__PURE__ */ jsx31("div", { className: AgentGUINode_styles_default.projectRailTitle, children: /* @__PURE__ */ jsx31("span", { children: workspaceUserProjectI18n.tFirst(["projectSelect.projectLabel"]) }) }),
28777
- /* @__PURE__ */ jsxs17("div", { className: AgentGUINode_styles_default.projectRailAddProject, children: [
28989
+ /* @__PURE__ */ jsxs18("div", { className: AgentGUINode_styles_default.projectRailAddProject, children: [
28778
28990
  /* @__PURE__ */ jsx31(
28779
28991
  WorkspaceUserProjectSelect2,
28780
28992
  {
@@ -28848,7 +29060,7 @@ var AgentGUIConversationTimelinePane = memo(
28848
29060
  labels
28849
29061
  }) {
28850
29062
  "use memo";
28851
- return /* @__PURE__ */ jsxs17(Fragment9, { children: [
29063
+ return /* @__PURE__ */ jsxs18(Fragment9, { children: [
28852
29064
  isLoadingOlderMessages && !isLoading ? /* @__PURE__ */ jsx31(
28853
29065
  "div",
28854
29066
  {
@@ -29069,7 +29281,7 @@ import {
29069
29281
  useState as useState13
29070
29282
  } from "react";
29071
29283
  import { createPortal as createPortal4 } from "react-dom";
29072
- import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs18 } from "react/jsx-runtime";
29284
+ import { Fragment as Fragment10, jsx as jsx32, jsxs as jsxs19 } from "react/jsx-runtime";
29073
29285
  var POPOVER_MIN_VIEWPORT_INSET_PX = 16;
29074
29286
  var POPOVER_DEFAULT_WIDTH_PX = 260;
29075
29287
  function dockAgentProbeLineKey(line) {
@@ -29079,9 +29291,9 @@ function renderDockAgentProbeLine(line) {
29079
29291
  if (typeof line === "string") {
29080
29292
  return line;
29081
29293
  }
29082
- return /* @__PURE__ */ jsxs18(Fragment10, { children: [
29294
+ return /* @__PURE__ */ jsxs19(Fragment10, { children: [
29083
29295
  line.primary,
29084
- line.secondary ? /* @__PURE__ */ jsxs18(Fragment10, { children: [
29296
+ line.secondary ? /* @__PURE__ */ jsxs19(Fragment10, { children: [
29085
29297
  " ",
29086
29298
  /* @__PURE__ */ jsx32("span", { className: "desktop-dock-popup__agent-status-secondary", children: line.secondary })
29087
29299
  ] }) : null
@@ -29179,7 +29391,7 @@ function AgentProbeInfoPopover({
29179
29391
  children: /* @__PURE__ */ jsx32("ul", { className: "desktop-dock-popup__agent-info-list", children: lines.map((line) => {
29180
29392
  const label = getDockAgentProbeLineLabel(line);
29181
29393
  const valueText = formatDockAgentProbeLineText(line);
29182
- return /* @__PURE__ */ jsxs18(
29394
+ return /* @__PURE__ */ jsxs19(
29183
29395
  "li",
29184
29396
  {
29185
29397
  className: "desktop-dock-popup__agent-info-item",
@@ -29201,7 +29413,7 @@ function AgentProbeInfoPopover({
29201
29413
  }) })
29202
29414
  }
29203
29415
  );
29204
- return /* @__PURE__ */ jsxs18(
29416
+ return /* @__PURE__ */ jsxs19(
29205
29417
  "div",
29206
29418
  {
29207
29419
  ref: anchorRef,
@@ -29374,7 +29586,7 @@ function getAgentHostManagedToolchainAgentByName(name) {
29374
29586
  }
29375
29587
 
29376
29588
  // agent-gui/agentGuiNode/AgentGUINode.tsx
29377
- import { jsx as jsx33, jsxs as jsxs19 } from "react/jsx-runtime";
29589
+ import { jsx as jsx33, jsxs as jsxs20 } from "react/jsx-runtime";
29378
29590
  var workspaceFileReferenceLocaleKeyByPickerKey = {
29379
29591
  "actions.cancel": "common.cancel",
29380
29592
  "referencePicker.confirm": "agentHost.agentGui.referencePicker.confirm",
@@ -29603,7 +29815,7 @@ function composerOverridesByAgentTargetIdEqual(left, right) {
29603
29815
  return true;
29604
29816
  }
29605
29817
  function areAgentGUINodePropsEqual(previous, next) {
29606
- 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.comingSoonProviders === next.comingSoonProviders && 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;
29818
+ 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.renderSidebarFooter === next.renderSidebarFooter && previous.comingSoonProviders === next.comingSoonProviders && 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;
29607
29819
  }
29608
29820
  var AgentGUINode = memo2(function AgentGUINode2({
29609
29821
  nodeId,
@@ -29632,6 +29844,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
29632
29844
  onAgentProviderLogin,
29633
29845
  providerTargets,
29634
29846
  providerTargetsLoading = false,
29847
+ renderSidebarFooter,
29635
29848
  comingSoonProviders,
29636
29849
  providerReadinessGates = null,
29637
29850
  defaultProviderTargetId = null,
@@ -30051,6 +30264,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
30051
30264
  conversations: t("agentHost.agentGui.conversations"),
30052
30265
  newConversation: t("agentHost.agentGui.newConversation"),
30053
30266
  agentConfig: t("agentHost.agentGui.agentConfig"),
30267
+ agentSettingsMenu: t("agentHost.agentGui.agentSettingsMenu"),
30054
30268
  agentEnvSetup: t("agentHost.agentGui.agentEnvSetup"),
30055
30269
  noConversations: t("agentHost.agentGui.noConversations"),
30056
30270
  emptyProjectConversations: t(
@@ -30542,7 +30756,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
30542
30756
  className: "size-full bg-transparent",
30543
30757
  bodyClassName: `${AgentGUINode_styles_default.shell} nodrag size-full min-h-0 min-w-0 !bg-transparent p-0`,
30544
30758
  hideHeader: embedded,
30545
- titleAccessory: /* @__PURE__ */ jsxs19("span", { className: "inline-flex flex-none items-center gap-1", children: [
30759
+ titleAccessory: /* @__PURE__ */ jsxs20("span", { className: "inline-flex flex-none items-center gap-1", children: [
30546
30760
  /* @__PURE__ */ jsx33(
30547
30761
  AgentProbeInfoPopover,
30548
30762
  {
@@ -30589,6 +30803,7 @@ var AgentGUINode = memo2(function AgentGUINode2({
30589
30803
  AgentGUINodeView,
30590
30804
  {
30591
30805
  viewModel,
30806
+ renderSidebarFooter,
30592
30807
  actions: viewActions,
30593
30808
  isActive,
30594
30809
  composerFocusRequestSequence,
@@ -30683,6 +30898,7 @@ export {
30683
30898
  createAgentQueuedPromptRuntime,
30684
30899
  createLocalAgentGUIProviderTarget,
30685
30900
  createLocalAgentGUIProviderTargets,
30901
+ createSharedAgentGUIProviderTarget,
30686
30902
  getAgentActivityRuntime,
30687
30903
  getAgentCustomMentionKind,
30688
30904
  getOptionalAgentActivityRuntime,