@tutti-os/agent-gui 0.0.60 → 0.0.62

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 (55) hide show
  1. package/dist/agent-conversation/index.js +5 -5
  2. package/dist/agent-message-center/index.js +7 -7
  3. package/dist/app/renderer/agentactivity.css +13 -1
  4. package/dist/{chunk-K3UBSTJ5.js → chunk-3KS22CG2.js} +2 -2
  5. package/dist/{chunk-BB2SVMEV.js → chunk-4UTWOSHP.js} +4 -1
  6. package/dist/chunk-4UTWOSHP.js.map +1 -0
  7. package/dist/{chunk-YZ3POK7G.js → chunk-6MUKWI6Z.js} +9 -5
  8. package/dist/chunk-6MUKWI6Z.js.map +1 -0
  9. package/dist/{chunk-I5ZIKJVN.js → chunk-7P6CUYQT.js} +2 -2
  10. package/dist/{chunk-6VVBG4BF.js → chunk-CA25GD5Q.js} +5 -3
  11. package/dist/chunk-CA25GD5Q.js.map +1 -0
  12. package/dist/{chunk-4OPTXOOZ.js → chunk-CVSCZ3CK.js} +2 -2
  13. package/dist/{chunk-2LGUBUEJ.js → chunk-FQQDBBNI.js} +2 -2
  14. package/dist/{chunk-6TEPDMX6.js → chunk-G6UO6JVM.js} +2 -2
  15. package/dist/{chunk-MPZ3CW5C.js → chunk-IIVHPXAB.js} +1 -1
  16. package/dist/chunk-IIVHPXAB.js.map +1 -0
  17. package/dist/{chunk-AWIZJQXW.js → chunk-K4UUEG7X.js} +14 -8
  18. package/dist/chunk-K4UUEG7X.js.map +1 -0
  19. package/dist/{chunk-WNVIKTJK.js → chunk-NZN43XT5.js} +2 -2
  20. package/dist/{chunk-CZSMZRAV.js → chunk-QC642RAG.js} +4 -4
  21. package/dist/{chunk-24CUBQKJ.js → chunk-RO6KQD3J.js} +2 -2
  22. package/dist/{chunk-CUMZV32B.js → chunk-SGXYVGQT.js} +4 -4
  23. package/dist/{chunk-B6YDXIZW.js → chunk-SW6JCJCO.js} +2 -2
  24. package/dist/{chunk-74TIEA6X.js → chunk-ZUVEBW5T.js} +2 -2
  25. package/dist/context-mention-palette/index.js +6 -6
  26. package/dist/i18n/index.d.ts +4 -2
  27. package/dist/i18n/index.js +2 -2
  28. package/dist/index.d.ts +22 -7
  29. package/dist/index.js +320 -78
  30. package/dist/index.js.map +1 -1
  31. package/dist/workbench/contribution.js +5 -5
  32. package/dist/workbench/index.js +8 -8
  33. package/dist/workbench/launch.js +2 -2
  34. package/dist/workbench/sessionTitle.js +3 -3
  35. package/dist/workbench/state.js +2 -2
  36. package/dist/workbench/types.d.ts +1 -0
  37. package/dist/workbench/types.js +1 -1
  38. package/dist/workspace-agent-generated-files.js +3 -3
  39. package/package.json +12 -12
  40. package/dist/chunk-6VVBG4BF.js.map +0 -1
  41. package/dist/chunk-AWIZJQXW.js.map +0 -1
  42. package/dist/chunk-BB2SVMEV.js.map +0 -1
  43. package/dist/chunk-MPZ3CW5C.js.map +0 -1
  44. package/dist/chunk-YZ3POK7G.js.map +0 -1
  45. /package/dist/{chunk-K3UBSTJ5.js.map → chunk-3KS22CG2.js.map} +0 -0
  46. /package/dist/{chunk-I5ZIKJVN.js.map → chunk-7P6CUYQT.js.map} +0 -0
  47. /package/dist/{chunk-4OPTXOOZ.js.map → chunk-CVSCZ3CK.js.map} +0 -0
  48. /package/dist/{chunk-2LGUBUEJ.js.map → chunk-FQQDBBNI.js.map} +0 -0
  49. /package/dist/{chunk-6TEPDMX6.js.map → chunk-G6UO6JVM.js.map} +0 -0
  50. /package/dist/{chunk-WNVIKTJK.js.map → chunk-NZN43XT5.js.map} +0 -0
  51. /package/dist/{chunk-CZSMZRAV.js.map → chunk-QC642RAG.js.map} +0 -0
  52. /package/dist/{chunk-24CUBQKJ.js.map → chunk-RO6KQD3J.js.map} +0 -0
  53. /package/dist/{chunk-CUMZV32B.js.map → chunk-SGXYVGQT.js.map} +0 -0
  54. /package/dist/{chunk-B6YDXIZW.js.map → chunk-SW6JCJCO.js.map} +0 -0
  55. /package/dist/{chunk-74TIEA6X.js.map → chunk-ZUVEBW5T.js.map} +0 -0
package/dist/index.js CHANGED
@@ -16,14 +16,15 @@ import {
16
16
  createDisabledPlaceholderAgentGUIProviderTarget,
17
17
  createLocalAgentGUIProviderTarget,
18
18
  createLocalAgentGUIProviderTargets,
19
+ localAgentGUIAgentTargetId,
19
20
  localAgentGUIProviderTargetId,
20
21
  normalizeAgentGUIProviderTargets,
21
22
  resolveAgentGUIProviderTarget
22
- } from "./chunk-BB2SVMEV.js";
23
+ } from "./chunk-4UTWOSHP.js";
23
24
  import {
24
25
  AgentInteractivePromptSurface,
25
26
  approvalOptionDisplayLabel
26
- } from "./chunk-CZSMZRAV.js";
27
+ } from "./chunk-QC642RAG.js";
27
28
  import {
28
29
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
29
30
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -42,7 +43,7 @@ import {
42
43
  resolveAgentGUIExplicitConversationTitle,
43
44
  resolveAgentGUIProviderDisplayLabel,
44
45
  resolveAgentGUIProviderIdentity
45
- } from "./chunk-4OPTXOOZ.js";
46
+ } from "./chunk-CVSCZ3CK.js";
46
47
  import {
47
48
  AgentConversationFlow,
48
49
  Button,
@@ -63,14 +64,14 @@ import {
63
64
  skillTriggerForPrefix,
64
65
  toLocalShortDateTime,
65
66
  useProjectedAgentConversation
66
- } from "./chunk-YZ3POK7G.js";
67
+ } from "./chunk-6MUKWI6Z.js";
67
68
  import {
68
69
  AgentMessageMarkdown,
69
70
  AgentTargetPresentationProvider,
70
71
  ZoomableImage,
71
72
  cn,
72
73
  resolveWorkspaceLinkAction
73
- } from "./chunk-B6YDXIZW.js";
74
+ } from "./chunk-SW6JCJCO.js";
74
75
  import {
75
76
  openAgentEnvPanel
76
77
  } from "./chunk-PSLAWU25.js";
@@ -81,7 +82,7 @@ import {
81
82
  DEFAULT_AGENT_MENTION_FILTER,
82
83
  agentMentionItemKey,
83
84
  preloadAgentMentionBrowse
84
- } from "./chunk-CUMZV32B.js";
85
+ } from "./chunk-SGXYVGQT.js";
85
86
  import {
86
87
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
87
88
  buildWorkspaceAgentActivityListViewModel,
@@ -91,10 +92,10 @@ import {
91
92
  isWorkspaceAgentUntitledTask,
92
93
  mergeWorkspaceAgentActivityDurableAndOverlayMessages,
93
94
  selectWorkspaceAgentActivityOverlayMessages
94
- } from "./chunk-I5ZIKJVN.js";
95
+ } from "./chunk-7P6CUYQT.js";
95
96
  import {
96
97
  Spinner
97
- } from "./chunk-74TIEA6X.js";
98
+ } from "./chunk-ZUVEBW5T.js";
98
99
  import {
99
100
  resolveWorkspaceAgentSessionSortTimeUnixMs
100
101
  } from "./chunk-IBIMGLCD.js";
@@ -105,7 +106,7 @@ import {
105
106
  mentionItemToAttrs,
106
107
  normalizeAgentSessionMentionTitle,
107
108
  parseMentionItemFromHref
108
- } from "./chunk-2LGUBUEJ.js";
109
+ } from "./chunk-FQQDBBNI.js";
109
110
  import "./chunk-Y35GDLP2.js";
110
111
  import "./chunk-LUGELG5V.js";
111
112
  import {
@@ -136,10 +137,10 @@ import {
136
137
  agentGuiI18nResources,
137
138
  translate,
138
139
  useTranslation
139
- } from "./chunk-24CUBQKJ.js";
140
+ } from "./chunk-RO6KQD3J.js";
140
141
  import "./chunk-PJP5BUU6.js";
141
142
  import "./chunk-V4JGVBUN.js";
142
- import "./chunk-6VVBG4BF.js";
143
+ import "./chunk-CA25GD5Q.js";
143
144
  import {
144
145
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
145
146
  } from "./chunk-JM24HADP.js";
@@ -6708,21 +6709,26 @@ var AGENT_PROVIDER_SESSION_NOT_FOUND_FALLBACK_MESSAGE = "The previous agent sess
6708
6709
  var AGENT_RESUME_SESSION_NOT_LOCAL_FALLBACK_MESSAGE = "The previous agent session is not available on this machine.";
6709
6710
  var AGENT_GUI_CAUGHT_ERROR_STACK_LIMIT = 4e3;
6710
6711
  var SELECTED_SESSION_NOT_FOUND_RETRY_DELAY_MS = 150;
6711
- function composerDefaultsFromSettings(settings) {
6712
- const defaults = {};
6713
- const model = normalizeOptionalText2(settings.model);
6714
- const permissionModeId = normalizeOptionalText2(settings.permissionModeId);
6715
- const reasoningEffort = normalizeOptionalText2(settings.reasoningEffort);
6716
- if (model) {
6717
- defaults.model = model;
6718
- }
6719
- if (permissionModeId) {
6720
- defaults.permissionModeId = permissionModeId;
6721
- }
6722
- if (reasoningEffort) {
6723
- defaults.reasoningEffort = reasoningEffort;
6712
+ var rememberComposerDefaultsFields = [
6713
+ "model",
6714
+ "permissionModeId",
6715
+ "reasoningEffort",
6716
+ "speed"
6717
+ ];
6718
+ function composerDefaultsPatchFromSettings(touched, finalSettings) {
6719
+ const patch = {};
6720
+ for (const field of rememberComposerDefaultsFields) {
6721
+ if (touched[field] === void 0) {
6722
+ continue;
6723
+ }
6724
+ const touchedValue = normalizeOptionalText2(touched[field]);
6725
+ const finalValue = normalizeOptionalText2(finalSettings[field]);
6726
+ if (touchedValue !== null && finalValue === null) {
6727
+ continue;
6728
+ }
6729
+ patch[field] = finalValue;
6724
6730
  }
6725
- return Object.keys(defaults).length > 0 ? defaults : null;
6731
+ return Object.keys(patch).length > 0 ? patch : null;
6726
6732
  }
6727
6733
  function composerTargetDataFromProviderTarget(input) {
6728
6734
  const agentTargetId = normalizeOptionalText2(input.target.agentTargetId);
@@ -13082,8 +13088,12 @@ function useAgentGUINodeController({
13082
13088
  )
13083
13089
  );
13084
13090
  void onRememberComposerDefaultsRef.current?.({
13091
+ agentTargetId: targetData.agentTargetId,
13085
13092
  provider: targetData.provider,
13086
- defaults: composerDefaultsFromSettings(targetSafeMerged)
13093
+ defaults: composerDefaultsPatchFromSettings(
13094
+ supportedNextSettings,
13095
+ targetSafeMerged
13096
+ )
13087
13097
  });
13088
13098
  void agentActivityRuntime.trackDraftComposerSettingsChange?.({
13089
13099
  workspaceId,
@@ -13137,6 +13147,14 @@ function useAgentGUINodeController({
13137
13147
  }
13138
13148
  if (nextPermission !== void 0 && nextPermission && nextPermission !== currentPermission && activeSessionState2 !== null) {
13139
13149
  sessionSettingsPatch.permissionModeId = normalizePermissionModeId(nextPermission);
13150
+ const turnPhase = activeSessionState2.turnLifecycle?.phase;
13151
+ const isTurnInFlight = turnPhase === "running" || turnPhase === "submitted";
13152
+ if (dataRef.current.provider === "codex" && isTurnInFlight) {
13153
+ onShowMessageRef.current?.(
13154
+ translate("messages.agentPermissionModeAppliesNextTurn"),
13155
+ "info"
13156
+ );
13157
+ }
13140
13158
  }
13141
13159
  if (Object.keys(sessionSettingsPatch).length > 0 && activeSessionState2 !== null) {
13142
13160
  updateAgentSessionViewControlState(
@@ -13155,6 +13173,46 @@ function useAgentGUINodeController({
13155
13173
  }
13156
13174
  } : existing
13157
13175
  );
13176
+ void onRememberComposerDefaultsRef.current?.({
13177
+ agentTargetId: normalizeOptionalText2(dataRef.current.agentTargetId),
13178
+ provider: dataRef.current.provider,
13179
+ defaults: composerDefaultsPatchFromSettings(
13180
+ sessionSettingsPatch,
13181
+ sessionSettingsPatch
13182
+ )
13183
+ });
13184
+ const durableNodeDefaultsPatch = {};
13185
+ for (const field of rememberComposerDefaultsFields) {
13186
+ if (sessionSettingsPatch[field] !== void 0) {
13187
+ durableNodeDefaultsPatch[field] = sessionSettingsPatch[field];
13188
+ }
13189
+ }
13190
+ if (Object.keys(durableNodeDefaultsPatch).length > 0) {
13191
+ const defaultDraftKey = nodeDefaultDraftKey(
13192
+ dataRef.current.provider,
13193
+ dataRef.current.agentTargetId
13194
+ );
13195
+ const storedNodeDefaults = readNodeDefaultDraftSettings({
13196
+ data: dataRef.current,
13197
+ defaultReasoningEffort,
13198
+ drafts: draftSettingsBySessionIdRef.current
13199
+ });
13200
+ const nextNodeDefaults = {
13201
+ ...storedNodeDefaults,
13202
+ ...durableNodeDefaultsPatch
13203
+ };
13204
+ draftSettingsBySessionIdRef.current = {
13205
+ ...draftSettingsBySessionIdRef.current,
13206
+ [defaultDraftKey]: nextNodeDefaults
13207
+ };
13208
+ setDraftSettingsBySessionId((current) => ({
13209
+ ...current,
13210
+ [defaultDraftKey]: nextNodeDefaults
13211
+ }));
13212
+ onDataChangeRef.current(
13213
+ (current) => nodeDataFromComposerSettings(current, nextNodeDefaults)
13214
+ );
13215
+ }
13158
13216
  if (updatingSessionSettingsIdsRef.current[agentSessionId]) {
13159
13217
  const queuedUpdate = queuedComposerSettingsUpdatesRef.current[agentSessionId];
13160
13218
  queuedComposerSettingsUpdatesRef.current[agentSessionId] = {
@@ -14208,10 +14266,6 @@ function useAgentGUINodeController({
14208
14266
  targetSafeNodeDefaultSettings
14209
14267
  )
14210
14268
  );
14211
- void onRememberComposerDefaultsRef.current?.({
14212
- provider: selectedComposerTargetData.provider,
14213
- defaults: composerDefaultsFromSettings(targetSafeNodeDefaultSettings)
14214
- });
14215
14269
  }, [
14216
14270
  activeConversationId,
14217
14271
  providerComposerOptions,
@@ -14489,11 +14543,68 @@ function useAgentGUINodeController({
14489
14543
  draftSpeed
14490
14544
  ]);
14491
14545
  const stableComposerSettings = useStableComposerSettingsVM(composerSettings);
14546
+ const resolveDefaultHomeComposerTarget = useCallback4(() => {
14547
+ const defaultTargetId = defaultProviderTargetId?.trim() ?? "";
14548
+ const explicitDefaultTarget = defaultTargetId ? normalizedProviderTargets.find(
14549
+ (target) => target.targetId === defaultTargetId || target.agentTargetId === defaultTargetId
14550
+ ) ?? null : null;
14551
+ return explicitDefaultTarget ?? normalizedProviderTargets.find((target) => target.disabled !== true) ?? normalizedProviderTargets[0] ?? null;
14552
+ }, [defaultProviderTargetId, normalizedProviderTargets]);
14553
+ const resetHomeComposerAgentTargetToDefault = useCallback4(() => {
14554
+ if (previewMode) {
14555
+ return;
14556
+ }
14557
+ const nextTarget = resolveDefaultHomeComposerTarget();
14558
+ if (!nextTarget) {
14559
+ return;
14560
+ }
14561
+ const nextTargetIsExplicit = normalizedExplicitProviderTargets.some(
14562
+ (target) => target.provider === nextTarget.provider && target.targetId === nextTarget.targetId && agentGUIProviderTargetRefsEqual(target.ref, nextTarget.ref)
14563
+ );
14564
+ const nextTargetData = composerTargetDataFromProviderTarget({
14565
+ current: dataRef.current,
14566
+ isExplicit: nextTargetIsExplicit,
14567
+ target: nextTarget
14568
+ });
14569
+ setHomeComposerTargetOverride(nextTarget);
14570
+ setIntent({ tag: "home" });
14571
+ isComposerHomeRef.current = true;
14572
+ setIsComposerHome(true);
14573
+ onDataChangeRef.current((current) => {
14574
+ const currentNextTargetData = composerTargetDataFromProviderTarget({
14575
+ current,
14576
+ isExplicit: nextTargetIsExplicit,
14577
+ target: nextTarget
14578
+ });
14579
+ const nextData = {
14580
+ ...currentNextTargetData.data,
14581
+ lastActiveAgentSessionId: null
14582
+ };
14583
+ dataRef.current = nextData;
14584
+ return nextData;
14585
+ });
14586
+ dataRef.current = {
14587
+ ...nextTargetData.data,
14588
+ lastActiveAgentSessionId: null
14589
+ };
14590
+ if (nextTarget.disabled !== true) {
14591
+ loadComposerOptionsForTarget(nextTargetData, { force: true });
14592
+ }
14593
+ }, [
14594
+ loadComposerOptionsForTarget,
14595
+ normalizedExplicitProviderTargets,
14596
+ previewMode,
14597
+ resolveDefaultHomeComposerTarget
14598
+ ]);
14492
14599
  const updateConversationFilter = useCallback4(
14493
14600
  (filter) => {
14494
- setConversationFilter(normalizeAgentGUIConversationFilter(filter));
14601
+ const nextFilter = normalizeAgentGUIConversationFilter(filter);
14602
+ setConversationFilter(nextFilter);
14603
+ if (nextFilter.kind === "all" && activeConversationIdRef.current === null) {
14604
+ resetHomeComposerAgentTargetToDefault();
14605
+ }
14495
14606
  },
14496
- []
14607
+ [resetHomeComposerAgentTargetToDefault]
14497
14608
  );
14498
14609
  const selectHomeComposerAgentTarget = useCallback4(
14499
14610
  (input) => {
@@ -14519,7 +14630,14 @@ function useAgentGUINodeController({
14519
14630
  isExplicit: nextTargetIsExplicit,
14520
14631
  target: nextTarget
14521
14632
  });
14633
+ const shouldSyncScopedRailFilter = conversationFilterRef.current.kind === "agentTarget";
14522
14634
  setHomeComposerTargetOverride(nextTarget);
14635
+ if (shouldSyncScopedRailFilter) {
14636
+ const nextAgentTargetId = nextTarget.agentTargetId?.trim() ?? "";
14637
+ setConversationFilter(
14638
+ nextAgentTargetId ? { kind: "agentTarget", agentTargetId: nextAgentTargetId } : { kind: "all" }
14639
+ );
14640
+ }
14523
14641
  const previous = activeConversationIdRef.current;
14524
14642
  if (previous) {
14525
14643
  void activation.unactivate(previous);
@@ -14578,12 +14696,12 @@ function useAgentGUINodeController({
14578
14696
  providerTargets: normalizedProviderTargets,
14579
14697
  useStaticCatalog: shouldUseStaticProviderTargets
14580
14698
  });
14581
- if (!nextTarget || nextTarget.disabled === true) {
14699
+ if (!nextTarget) {
14582
14700
  reportAgentGUIConversationFilterTargetUnresolved({
14583
14701
  provider: input.provider,
14584
14702
  providerTargetId: input.providerTargetId ?? null,
14585
14703
  providerTargetCount: normalizedProviderTargets.length,
14586
- reason: nextTarget ? "disabled" : "unresolved",
14704
+ reason: "unresolved",
14587
14705
  runtime: agentActivityRuntime,
14588
14706
  workspaceId
14589
14707
  });
@@ -14605,6 +14723,34 @@ function useAgentGUINodeController({
14605
14723
  workspaceId
14606
14724
  ]
14607
14725
  );
14726
+ useEffect4(() => {
14727
+ if (previewMode || providerTargetsLoading || activeConversationId === null || conversationFilter.kind !== "agentTarget" || isLoadingConversations || conversationListState?.initialized !== true) {
14728
+ return;
14729
+ }
14730
+ if (filterAgentGUIConversationSummaries(conversations, conversationFilter).length > 0) {
14731
+ return;
14732
+ }
14733
+ const target = normalizedProviderTargets.find(
14734
+ (candidate) => (candidate.agentTargetId?.trim() ?? "") === conversationFilter.agentTargetId
14735
+ );
14736
+ if (!target) {
14737
+ return;
14738
+ }
14739
+ selectHomeComposerAgentTarget({
14740
+ provider: target.provider,
14741
+ providerTargetId: target.targetId
14742
+ });
14743
+ }, [
14744
+ activeConversationId,
14745
+ conversationFilter,
14746
+ conversationListState?.initialized,
14747
+ conversations,
14748
+ isLoadingConversations,
14749
+ normalizedProviderTargets,
14750
+ previewMode,
14751
+ providerTargetsLoading,
14752
+ selectHomeComposerAgentTarget
14753
+ ]);
14608
14754
  const stableCreateConversation = useStableControllerEventCallback(createConversation);
14609
14755
  const stableSelectHomeComposerAgentTarget = useStableControllerEventCallback(
14610
14756
  selectHomeComposerAgentTarget
@@ -16910,6 +17056,7 @@ var styles3 = {
16910
17056
  composerHero: "agent-gui-node__composer-hero",
16911
17057
  composerFloatingPrompt: "agent-gui-node__composer-floating-prompt",
16912
17058
  composerHandoffIcon: "agent-gui-node__composer-handoff-icon",
17059
+ composerHandoffAnimatedIcon: "agent-gui-node__composer-handoff-icon-animated",
16913
17060
  composerHandoffMenuContent: "agent-gui-node__composer-handoff-menu-content",
16914
17061
  composerHandoffStaticIcon: "agent-gui-node__composer-handoff-icon-static",
16915
17062
  composerHandoffTrigger: "agent-gui-node__composer-handoff-trigger",
@@ -17367,6 +17514,13 @@ import {
17367
17514
  function permissionModeSelectionPatch(permissionModeId, options) {
17368
17515
  return options.clearsPlanMode ? { permissionModeId, planMode: false } : { permissionModeId };
17369
17516
  }
17517
+ function resolvePermissionModeControlsDisabled(options) {
17518
+ const liveDuringTurn = options.provider === "claude-code" || options.provider === "codex";
17519
+ if (liveDuringTurn) {
17520
+ return options.isSubmittingPrompt;
17521
+ }
17522
+ return options.isSendingTurn || options.isSubmittingPrompt || options.showStopButton;
17523
+ }
17370
17524
 
17371
17525
  // agent-gui/agentGuiNode/model/composerSettingsMenuModel.ts
17372
17526
  function buildComposerModelMenuModel(composerSettings, labels) {
@@ -20361,6 +20515,8 @@ var handoff_lined_default = "./handoff-lined-4WQUBVG3.svg";
20361
20515
  // agent-gui/agentGuiNode/AgentComposer.tsx
20362
20516
  import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
20363
20517
  var USAGE_POPOVER_HOVER_DELAY_MS = 120;
20518
+ var HANDOFF_LOTTIE_PLAYER_SCRIPT_SRC = "https://unpkg.com/@lottiefiles/dotlottie-wc@0.9.14/dist/dotlottie-wc.js";
20519
+ var HANDOFF_LOTTIE_ANIMATION_SRC = "https://lottie.host/03d75946-52e5-4ccf-97df-174919a13ced/Av6piqVmPa.lottie";
20364
20520
  var DOCK_COMPOSER_INPUT_MIN_HEIGHT = 56;
20365
20521
  var DOCK_COMPOSER_TEXT_LINE_HEIGHT = 24;
20366
20522
  var DOCK_COMPOSER_MAX_VISIBLE_TEXT_LINES = 3.5;
@@ -20653,23 +20809,93 @@ function AgentComposerMaskIcon({
20653
20809
  );
20654
20810
  }
20655
20811
  var HANDOFF_SELECT_IDLE_VALUE = "__agent-handoff-idle__";
20656
- function AgentComposerHandoffIcon() {
20657
- return /* @__PURE__ */ jsx28("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.composerHandoffIcon, children: /* @__PURE__ */ jsx28(
20812
+ var handoffLottiePlayerLoadPromise = null;
20813
+ function loadHandoffLottiePlayer() {
20814
+ if (typeof window === "undefined" || typeof document === "undefined") {
20815
+ return Promise.resolve(false);
20816
+ }
20817
+ if (window.customElements?.get("dotlottie-wc")) {
20818
+ return Promise.resolve(true);
20819
+ }
20820
+ if (handoffLottiePlayerLoadPromise) {
20821
+ return handoffLottiePlayerLoadPromise;
20822
+ }
20823
+ handoffLottiePlayerLoadPromise = new Promise((resolve) => {
20824
+ const existingScript = document.querySelector(
20825
+ 'script[data-agent-gui-handoff-lottie="true"]'
20826
+ );
20827
+ const script = existingScript ?? document.createElement("script");
20828
+ const handleLoad = () => {
20829
+ resolve(Boolean(window.customElements?.get("dotlottie-wc")));
20830
+ };
20831
+ const handleError = () => {
20832
+ resolve(false);
20833
+ };
20834
+ script.addEventListener("load", handleLoad, { once: true });
20835
+ script.addEventListener("error", handleError, { once: true });
20836
+ if (!existingScript) {
20837
+ script.dataset.agentGuiHandoffLottie = "true";
20838
+ script.src = HANDOFF_LOTTIE_PLAYER_SCRIPT_SRC;
20839
+ script.type = "module";
20840
+ document.head.append(script);
20841
+ }
20842
+ });
20843
+ return handoffLottiePlayerLoadPromise;
20844
+ }
20845
+ function AgentComposerHandoffIcon({
20846
+ disabled,
20847
+ isPlaying
20848
+ }) {
20849
+ const [isLottieReady, setIsLottieReady] = useState11(false);
20850
+ useEffect12(() => {
20851
+ let isMounted = true;
20852
+ void loadHandoffLottiePlayer().then((isReady) => {
20853
+ if (isMounted) {
20854
+ setIsLottieReady(isReady);
20855
+ }
20856
+ });
20857
+ return () => {
20858
+ isMounted = false;
20859
+ };
20860
+ }, []);
20861
+ const shouldShowAnimation = !disabled && isPlaying && isLottieReady;
20862
+ return /* @__PURE__ */ jsxs15(
20658
20863
  "span",
20659
20864
  {
20660
- className: AgentGUINode_styles_default.composerHandoffStaticIcon,
20661
- style: {
20662
- WebkitMaskImage: `url("${handoff_lined_default}")`,
20663
- WebkitMaskPosition: "center",
20664
- WebkitMaskRepeat: "no-repeat",
20665
- WebkitMaskSize: "contain",
20666
- maskImage: `url("${handoff_lined_default}")`,
20667
- maskPosition: "center",
20668
- maskRepeat: "no-repeat",
20669
- maskSize: "contain"
20670
- }
20865
+ "aria-hidden": "true",
20866
+ className: AgentGUINode_styles_default.composerHandoffIcon,
20867
+ "data-disabled": disabled ? "true" : void 0,
20868
+ "data-playing": shouldShowAnimation ? "true" : void 0,
20869
+ children: [
20870
+ /* @__PURE__ */ jsx28(
20871
+ "span",
20872
+ {
20873
+ className: AgentGUINode_styles_default.composerHandoffStaticIcon,
20874
+ style: {
20875
+ WebkitMaskImage: `url("${handoff_lined_default}")`,
20876
+ WebkitMaskPosition: "center",
20877
+ WebkitMaskRepeat: "no-repeat",
20878
+ WebkitMaskSize: "contain",
20879
+ maskImage: `url("${handoff_lined_default}")`,
20880
+ maskPosition: "center",
20881
+ maskRepeat: "no-repeat",
20882
+ maskSize: "contain"
20883
+ }
20884
+ }
20885
+ ),
20886
+ /* @__PURE__ */ jsx28(
20887
+ "dotlottie-wc",
20888
+ {
20889
+ autoplay: true,
20890
+ className: AgentGUINode_styles_default.composerHandoffAnimatedIcon,
20891
+ "data-active": shouldShowAnimation ? "true" : void 0,
20892
+ loop: true,
20893
+ src: HANDOFF_LOTTIE_ANIMATION_SRC
20894
+ }
20895
+ )
20896
+ ]
20671
20897
  }
20672
- ) });
20898
+ );
20673
20899
  }
20674
20900
  function AgentComposer({
20675
20901
  workspaceId,
@@ -20756,6 +20982,7 @@ function AgentComposer({
20756
20982
  );
20757
20983
  const [isPaletteOpen, setIsPaletteOpen] = useState11(true);
20758
20984
  const [isReviewPickerOpen, setIsReviewPickerOpen] = useState11(false);
20985
+ const [isHandoffIconPlaying, setIsHandoffIconPlaying] = useState11(false);
20759
20986
  const [highlightedIndex, setHighlightedIndex] = useState11(0);
20760
20987
  const [mentionHighlightedKey, setMentionHighlightedKey] = useState11(null);
20761
20988
  const [shouldCenterMentionHighlight, setShouldCenterMentionHighlight] = useState11(false);
@@ -21050,6 +21277,12 @@ function AgentComposer({
21050
21277
  setIsSlashStatusPanelOpen(false);
21051
21278
  }, []);
21052
21279
  const settingsControlsDisabled = isSendingTurn || isSubmittingPrompt || showStopButton;
21280
+ const permissionModeControlsDisabled = resolvePermissionModeControlsDisabled({
21281
+ provider,
21282
+ isSendingTurn,
21283
+ isSubmittingPrompt,
21284
+ showStopButton
21285
+ });
21053
21286
  const composerControlsHardDisabled = isSelectedProjectMissing || isSubmittingPrompt || disabled && !isSendingTurn && !showStopButton;
21054
21287
  const closeReviewPicker = useCallback9(() => {
21055
21288
  setIsReviewPickerOpen(false);
@@ -21959,13 +22192,17 @@ function AgentComposer({
21959
22192
  () => providerTargets.filter(Boolean),
21960
22193
  [providerTargets]
21961
22194
  );
22195
+ const enabledProviderSwitchTargets = useMemo9(
22196
+ () => providerSwitchTargets.filter((target) => target.disabled !== true),
22197
+ [providerSwitchTargets]
22198
+ );
21962
22199
  const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
21963
22200
  const selectedProviderSwitchTarget = providerSwitchTargets.find(
21964
22201
  (target) => target.targetId === selectedProviderTargetId
21965
22202
  ) ?? providerSwitchTargets.find((target) => target.provider === provider) ?? selectedProviderTarget;
21966
- const providerMenuTargets = selectedProviderSwitchTarget && !providerSwitchTargets.some(
22203
+ const providerMenuTargets = selectedProviderSwitchTarget && !enabledProviderSwitchTargets.some(
21967
22204
  (target) => target.targetId === selectedProviderSwitchTarget.targetId
21968
- ) ? [selectedProviderSwitchTarget, ...providerSwitchTargets] : providerSwitchTargets;
22205
+ ) ? [selectedProviderSwitchTarget, ...enabledProviderSwitchTargets] : enabledProviderSwitchTargets;
21969
22206
  const handoffMenuTargets = selectedProviderSwitchTarget ? providerMenuTargets.filter((target) => {
21970
22207
  if (target.disabled === true) {
21971
22208
  return false;
@@ -22932,6 +23169,18 @@ function AgentComposer({
22932
23169
  size: "sm",
22933
23170
  "aria-label": effectiveHandoffLabel,
22934
23171
  title: effectiveHandoffLabel,
23172
+ onBlur: () => {
23173
+ setIsHandoffIconPlaying(false);
23174
+ },
23175
+ onFocus: () => {
23176
+ setIsHandoffIconPlaying(true);
23177
+ },
23178
+ onMouseEnter: () => {
23179
+ setIsHandoffIconPlaying(true);
23180
+ },
23181
+ onMouseLeave: () => {
23182
+ setIsHandoffIconPlaying(false);
23183
+ },
22935
23184
  className: cn(
22936
23185
  AgentGUINode_styles_default.composerMenuTrigger,
22937
23186
  AgentGUINode_styles_default.composerProviderSelect,
@@ -22939,7 +23188,13 @@ function AgentComposer({
22939
23188
  "w-auto max-w-[180px] [&>svg:last-child]:hidden"
22940
23189
  ),
22941
23190
  children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
22942
- /* @__PURE__ */ jsx28(AgentComposerHandoffIcon, {}),
23191
+ /* @__PURE__ */ jsx28(
23192
+ AgentComposerHandoffIcon,
23193
+ {
23194
+ disabled: handoffDisabled,
23195
+ isPlaying: isHandoffIconPlaying
23196
+ }
23197
+ ),
22943
23198
  /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: effectiveHandoffLabel })
22944
23199
  ] })
22945
23200
  }
@@ -23164,7 +23419,7 @@ function AgentComposer({
23164
23419
  AgentPermissionModeDropdown,
23165
23420
  {
23166
23421
  composerSettings,
23167
- disabled: settingsControlsDisabled,
23422
+ disabled: permissionModeControlsDisabled,
23168
23423
  previewMode,
23169
23424
  labels: {
23170
23425
  permissionLabel: labels.permissionLabel,
@@ -24514,7 +24769,7 @@ function AgentGUINodeView({
24514
24769
  showProviderRail ? /* @__PURE__ */ jsx31(
24515
24770
  "aside",
24516
24771
  {
24517
- className: AgentGUINode_styles_default.providerRailPanel,
24772
+ className: `${AgentGUINode_styles_default.providerRailPanel} nodrag tsh-desktop-no-drag`,
24518
24773
  "aria-label": labels.providerSwitchLabel,
24519
24774
  "aria-hidden": conversationRailCollapsed ? "true" : void 0,
24520
24775
  inert: conversationRailCollapsed ? true : void 0,
@@ -26204,7 +26459,10 @@ function EmptyHeroTitle({
26204
26459
  }
26205
26460
  const providerEnd = providerStart + providerLabel.length;
26206
26461
  const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${selectedProviderTarget?.provider ?? ""}`;
26207
- const canSwitchProvider = providerTargets.length > 1 && selectedProviderTarget && onProviderSelect;
26462
+ const enabledProviderTargets = providerTargets.filter(
26463
+ (target) => target.disabled !== true
26464
+ );
26465
+ const canSwitchProvider = enabledProviderTargets.length > 1 && selectedProviderTarget && onProviderSelect;
26208
26466
  const providerName = label.slice(providerStart, providerEnd);
26209
26467
  return /* @__PURE__ */ jsxs17(Fragment8, { children: [
26210
26468
  label.slice(0, providerStart),
@@ -26213,10 +26471,10 @@ function EmptyHeroTitle({
26213
26471
  {
26214
26472
  value: selectedProviderTargetId,
26215
26473
  onValueChange: (nextTargetId) => {
26216
- const target = providerTargets.find(
26474
+ const target = enabledProviderTargets.find(
26217
26475
  (candidate) => candidate.targetId === nextTargetId
26218
26476
  );
26219
- if (!target || target.disabled === true) {
26477
+ if (!target) {
26220
26478
  return;
26221
26479
  }
26222
26480
  onProviderSelect({
@@ -26240,42 +26498,25 @@ function EmptyHeroTitle({
26240
26498
  {
26241
26499
  align: "center",
26242
26500
  className: cn3(AgentGUINode_styles_default.composerMenuContent, "min-w-[190px]"),
26243
- children: providerTargets.map((target) => /* @__PURE__ */ jsx31(
26501
+ children: enabledProviderTargets.map((target) => /* @__PURE__ */ jsx31(
26244
26502
  SelectItem3,
26245
26503
  {
26246
26504
  value: target.targetId,
26247
- className: cn3(
26248
- AgentGUINode_styles_default.composerMenuItem,
26249
- "gap-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-30 data-[disabled]:text-[var(--text-disabled,var(--text-tertiary))]",
26250
- target.disabled === true ? "cursor-not-allowed opacity-30" : null
26251
- ),
26252
- disabled: target.disabled === true,
26505
+ className: cn3(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
26253
26506
  children: /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-1.5", children: [
26254
26507
  /* @__PURE__ */ jsx31(
26255
26508
  "img",
26256
26509
  {
26257
26510
  alt: "",
26258
26511
  "aria-hidden": "true",
26259
- className: cn3(
26260
- "size-4 shrink-0 rounded-[4px]",
26261
- target.disabled === true ? "grayscale opacity-30" : null
26262
- ),
26512
+ className: "size-4 shrink-0 rounded-[4px]",
26263
26513
  src: agentGUIProviderIconPresentation(
26264
26514
  target.provider,
26265
26515
  target.iconUrl
26266
26516
  ).iconUrl
26267
26517
  }
26268
26518
  ),
26269
- /* @__PURE__ */ jsx31(
26270
- "span",
26271
- {
26272
- className: cn3(
26273
- "min-w-0 truncate",
26274
- target.disabled === true ? "text-[var(--text-disabled,var(--text-tertiary))]" : null
26275
- ),
26276
- children: target.label
26277
- }
26278
- )
26519
+ /* @__PURE__ */ jsx31("span", { className: "min-w-0 truncate", children: target.label })
26279
26520
  ] })
26280
26521
  },
26281
26522
  `${target.provider}:${target.targetId}`
@@ -26877,7 +27118,7 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
26877
27118
  "data-disabled": target.disabled === true ? "true" : void 0,
26878
27119
  "data-provider-tile": "true",
26879
27120
  "data-selected": providerSelected ? "true" : "false",
26880
- disabled: previewMode || target.disabled === true,
27121
+ disabled: previewMode,
26881
27122
  onClick: () => selectAgentTargetTile(target),
26882
27123
  children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailAvatar, children: /* @__PURE__ */ jsx31(
26883
27124
  AgentGUIProviderIconVisual,
@@ -29993,6 +30234,7 @@ export {
29993
30234
  getAgentActivityRuntime,
29994
30235
  getAgentCustomMentionKind,
29995
30236
  getOptionalAgentActivityRuntime,
30237
+ localAgentGUIAgentTargetId,
29996
30238
  localAgentGUIProviderTargetId,
29997
30239
  normalizeAgentGUIProviderTargets,
29998
30240
  preloadAgentMentionBrowse,