@tutti-os/agent-gui 0.0.61 → 0.0.63

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 (46) 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-SXML6H77.js → chunk-4UTWOSHP.js} +3 -1
  5. package/dist/chunk-4UTWOSHP.js.map +1 -0
  6. package/dist/{chunk-JLJIAKI3.js → chunk-6MUKWI6Z.js} +4 -4
  7. package/dist/{chunk-I5ZIKJVN.js → chunk-7P6CUYQT.js} +2 -2
  8. package/dist/{chunk-6VVBG4BF.js → chunk-CA25GD5Q.js} +5 -3
  9. package/dist/chunk-CA25GD5Q.js.map +1 -0
  10. package/dist/{chunk-4OPTXOOZ.js → chunk-CVSCZ3CK.js} +2 -2
  11. package/dist/{chunk-2LGUBUEJ.js → chunk-FQQDBBNI.js} +2 -2
  12. package/dist/{chunk-6TEPDMX6.js → chunk-G6UO6JVM.js} +2 -2
  13. package/dist/{chunk-JSIA4K67.js → chunk-K4UUEG7X.js} +13 -7
  14. package/dist/chunk-K4UUEG7X.js.map +1 -0
  15. package/dist/{chunk-JBWFRSFQ.js → chunk-NZN43XT5.js} +2 -2
  16. package/dist/{chunk-CZSMZRAV.js → chunk-QC642RAG.js} +4 -4
  17. package/dist/{chunk-24CUBQKJ.js → chunk-RO6KQD3J.js} +2 -2
  18. package/dist/{chunk-CUMZV32B.js → chunk-SGXYVGQT.js} +4 -4
  19. package/dist/{chunk-B6YDXIZW.js → chunk-SW6JCJCO.js} +2 -2
  20. package/dist/{chunk-74TIEA6X.js → chunk-ZUVEBW5T.js} +2 -2
  21. package/dist/context-mention-palette/index.js +6 -6
  22. package/dist/i18n/index.d.ts +4 -2
  23. package/dist/i18n/index.js +2 -2
  24. package/dist/index.d.ts +15 -3
  25. package/dist/index.js +254 -59
  26. package/dist/index.js.map +1 -1
  27. package/dist/workbench/contribution.js +3 -3
  28. package/dist/workbench/index.js +6 -6
  29. package/dist/workbench/sessionTitle.js +3 -3
  30. package/dist/workbench/state.js +2 -2
  31. package/dist/workspace-agent-generated-files.js +3 -3
  32. package/package.json +12 -12
  33. package/dist/chunk-6VVBG4BF.js.map +0 -1
  34. package/dist/chunk-JSIA4K67.js.map +0 -1
  35. package/dist/chunk-SXML6H77.js.map +0 -1
  36. /package/dist/{chunk-JLJIAKI3.js.map → chunk-6MUKWI6Z.js.map} +0 -0
  37. /package/dist/{chunk-I5ZIKJVN.js.map → chunk-7P6CUYQT.js.map} +0 -0
  38. /package/dist/{chunk-4OPTXOOZ.js.map → chunk-CVSCZ3CK.js.map} +0 -0
  39. /package/dist/{chunk-2LGUBUEJ.js.map → chunk-FQQDBBNI.js.map} +0 -0
  40. /package/dist/{chunk-6TEPDMX6.js.map → chunk-G6UO6JVM.js.map} +0 -0
  41. /package/dist/{chunk-JBWFRSFQ.js.map → chunk-NZN43XT5.js.map} +0 -0
  42. /package/dist/{chunk-CZSMZRAV.js.map → chunk-QC642RAG.js.map} +0 -0
  43. /package/dist/{chunk-24CUBQKJ.js.map → chunk-RO6KQD3J.js.map} +0 -0
  44. /package/dist/{chunk-CUMZV32B.js.map → chunk-SGXYVGQT.js.map} +0 -0
  45. /package/dist/{chunk-B6YDXIZW.js.map → chunk-SW6JCJCO.js.map} +0 -0
  46. /package/dist/{chunk-74TIEA6X.js.map → chunk-ZUVEBW5T.js.map} +0 -0
@@ -4,19 +4,19 @@ import {
4
4
  AgentMentionSearchController,
5
5
  flattenAgentMentionPaletteEntries,
6
6
  groupStartKeys
7
- } from "../chunk-CUMZV32B.js";
8
- import "../chunk-I5ZIKJVN.js";
9
- import "../chunk-74TIEA6X.js";
7
+ } from "../chunk-SGXYVGQT.js";
8
+ import "../chunk-7P6CUYQT.js";
9
+ import "../chunk-ZUVEBW5T.js";
10
10
  import "../chunk-IBIMGLCD.js";
11
- import "../chunk-2LGUBUEJ.js";
11
+ import "../chunk-FQQDBBNI.js";
12
12
  import "../chunk-Y35GDLP2.js";
13
13
  import "../chunk-LUGELG5V.js";
14
14
  import "../chunk-FRCIPTUD.js";
15
15
  import "../chunk-TYGL25EL.js";
16
- import "../chunk-24CUBQKJ.js";
16
+ import "../chunk-RO6KQD3J.js";
17
17
  import "../chunk-PJP5BUU6.js";
18
18
  import "../chunk-V4JGVBUN.js";
19
- import "../chunk-6VVBG4BF.js";
19
+ import "../chunk-CA25GD5Q.js";
20
20
  import {
21
21
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
22
22
  } from "../chunk-JM24HADP.js";
@@ -347,7 +347,7 @@ declare const agentGuiI18nResources: {
347
347
  readonly providerGateLoginAction: "Connect";
348
348
  readonly providerGateComingSoonTitle: "{{provider}} is coming soon";
349
349
  readonly providerGateComingSoonDescription: "{{provider}} is not available yet. We will enable this agent when it is ready.";
350
- readonly providerGateComingSoonAction: "Coming soon";
350
+ readonly providerGateComingSoonAction: "comming soon";
351
351
  readonly providerGateUnavailableTitle: "{{provider}} is not ready yet";
352
352
  readonly providerGateUnavailableDescription: "We could not confirm that {{provider}} is ready. Try checking again.";
353
353
  readonly providerGateRetryAction: "Check again";
@@ -2491,6 +2491,7 @@ declare const agentGuiI18nResources: {
2491
2491
  readonly agentProviderSessionNotFound: "This session history is still available, but the underlying provider session can no longer be restored.";
2492
2492
  readonly agentResumeSessionNotLocal: "This session cannot be resumed on this device. Start a new session and @this session to keep going.";
2493
2493
  readonly agentSettingsRequireNewSession: "This model can only be used in a new session to preserve context.";
2494
+ readonly agentPermissionModeAppliesNextTurn: "Permission mode will apply starting with your next message.";
2494
2495
  readonly agentThisSessionMentionLabel: "this session";
2495
2496
  readonly terminalLaunchFailed: "Terminal launch failed: {{message}}";
2496
2497
  readonly fallbackTerminalFailed: "Fallback terminal launch also failed: {{message}}";
@@ -2840,7 +2841,7 @@ declare const agentGuiI18nResources: {
2840
2841
  readonly providerGateLoginAction: "连接";
2841
2842
  readonly providerGateComingSoonTitle: "{{provider}} 即将上线";
2842
2843
  readonly providerGateComingSoonDescription: "{{provider}} 暂未开放。准备好后即可在这里使用这个 Agent。";
2843
- readonly providerGateComingSoonAction: "即将上线";
2844
+ readonly providerGateComingSoonAction: "comming soon";
2844
2845
  readonly providerGateUnavailableTitle: "{{provider}} 暂时还不可用";
2845
2846
  readonly providerGateUnavailableDescription: "我们还不能确认 {{provider}} 已准备好,可以再检测一次。";
2846
2847
  readonly providerGateRetryAction: "重新检测";
@@ -4984,6 +4985,7 @@ declare const agentGuiI18nResources: {
4984
4985
  readonly agentProviderSessionNotFound: "这条会话历史仍可查看,但底层 Provider 会话已经无法恢复。";
4985
4986
  readonly agentResumeSessionNotLocal: "这个会话没法在当前设备里直接恢复,你可以在新会话里 @这段对话,接着继续聊。";
4986
4987
  readonly agentSettingsRequireNewSession: "为了保留上下文,这个模型只能在新会话中使用";
4988
+ readonly agentPermissionModeAppliesNextTurn: "权限模式将从你的下一条消息开始生效。";
4987
4989
  readonly agentThisSessionMentionLabel: "本 session";
4988
4990
  readonly terminalLaunchFailed: "终端启动失败:{{message}}";
4989
4991
  readonly fallbackTerminalFailed: "兜底终端启动也失败了:{{message}}";
@@ -6,8 +6,8 @@ import {
6
6
  translate,
7
7
  translateInUiLanguage,
8
8
  useTranslation
9
- } from "../chunk-24CUBQKJ.js";
10
- import "../chunk-6VVBG4BF.js";
9
+ } from "../chunk-RO6KQD3J.js";
10
+ import "../chunk-CA25GD5Q.js";
11
11
  export {
12
12
  AgentGuiI18nProvider,
13
13
  agentGuiI18nModule,
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { AgentActivityNeedsAttentionItem, AgentActivitySnapshot, AgentActivityCa
2
2
  export { AgentActivityAdapter, AgentActivityController, AgentActivityMessage, AgentActivityNeedsAttentionItem, AgentActivitySnapshot, selectNeedsAttentionCount, selectNeedsAttentionItems } from '@tutti-os/agent-activity-core';
3
3
  import { m as WorkspaceAgentActivityListViewModel, g as AgentHostWorkspaceAgentSession, f as AgentHostWorkspaceAgentMessage, l as AgentHostWorkspaceAgentSnapshot, B as BuildWorkspaceAgentActivityListOptions, d as AgentHostRuntimeOpenclawGatewayWarmupResult, c as AgentHostManagedAgentsState } from './workspaceAgentActivityListViewModel-DJvAqZso.js';
4
4
  import * as react from 'react';
5
- import { ReactNode, PropsWithChildren, JSX } from 'react';
5
+ import { ReactNode, PropsWithChildren, JSX, HTMLAttributes } from 'react';
6
6
  import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
7
7
  import { q as AgentProvider, f as AgentGUIProviderTargetRef, i as AgentHostAgentSessionComposerSettings, g as AgentHostActivateAgentSessionResult, o as AgentHostUpdateAgentSessionSettingsResult, m as AgentHostAgentSessionState, n as AgentHostUnactivateAgentSessionResult, A as AgentGUINodeData, a as AgentGUIProvider, e as AgentGUIProviderTarget, p as AgentPromptContentBlock, P as Point, b as AgentGUIProviderReadinessGate, N as NodeFrame } from './types-DSc2ta3s.js';
8
8
  export { c as AgentGUIProviderReadinessGateAction, d as AgentGUIProviderReadinessGateStatus } from './types-DSc2ta3s.js';
@@ -13,13 +13,13 @@ import { WorkspaceFileReference, ReferenceLocateTarget, WorkspaceFileReferenceAd
13
13
  import { ReferenceSourceAggregator } from '@tutti-os/workspace-file-reference/core';
14
14
  import { U as UiLanguage, a as UiTheme } from './uiSettings-BQS9r2eo.js';
15
15
  import { W as WorkspaceLinkAction } from './workspaceLinkActions-Bjy_XfBm.js';
16
- import { A as AgentContextMentionItem } from './AgentMentionSearchController-Po0KQLcL.js';
17
- export { p as preloadAgentMentionBrowse } from './AgentMentionSearchController-Po0KQLcL.js';
18
16
  import { b as AgentConversationPromptVM } from './agentConversationVM-DPAgUJlR.js';
19
17
  import { WorkspaceUserProjectI18nRuntime } from '@tutti-os/workspace-user-project/i18n';
20
18
  import { WorkspaceUserProjectSelectChangeAction } from '@tutti-os/workspace-user-project/ui';
21
19
  import { WorkspaceUserProject } from '@tutti-os/workspace-user-project/contracts';
22
20
  import { A as AgentMessageMarkdownWorkspaceAppIcon } from './AgentMessageMarkdown-DeYPURtF.js';
21
+ import { A as AgentContextMentionItem } from './AgentMentionSearchController-Po0KQLcL.js';
22
+ export { p as preloadAgentMentionBrowse } from './AgentMentionSearchController-Po0KQLcL.js';
23
23
  import { AgentContextMentionProvider } from './context-mention-provider.js';
24
24
  export { AGENT_CONTEXT_MENTION_PROVIDER_IDS, AgentContextMentionProviderId } from './context-mention-provider.js';
25
25
  import { AgentQueuedPromptRuntime, AgentQueuedPromptQueueSnapshot } from './queued-prompt-runtime.js';
@@ -483,6 +483,18 @@ interface AgentProjectPathChangeMetadata {
483
483
 
484
484
  type AgentDroppedFileReferenceResolver = (files: readonly File[]) => Promise<readonly WorkspaceFileReference[]> | readonly WorkspaceFileReference[];
485
485
 
486
+ type DotLottieElementProps = HTMLAttributes<HTMLElement> & {
487
+ autoplay?: boolean;
488
+ loop?: boolean;
489
+ src?: string;
490
+ };
491
+ declare module "react" {
492
+ namespace JSX {
493
+ interface IntrinsicElements {
494
+ "dotlottie-wc": DotLottieElementProps;
495
+ }
496
+ }
497
+ }
486
498
  /**
487
499
  * 引用 picker 的确认结果:松散文件按 file mention 插入;mentionItems(如文件夹 bundle)
488
500
  * 作为整体节点插入。两者各走各的插入路径,composer 不需要理解 bundle 内部结构。
package/dist/index.js CHANGED
@@ -20,11 +20,11 @@ import {
20
20
  localAgentGUIProviderTargetId,
21
21
  normalizeAgentGUIProviderTargets,
22
22
  resolveAgentGUIProviderTarget
23
- } from "./chunk-SXML6H77.js";
23
+ } from "./chunk-4UTWOSHP.js";
24
24
  import {
25
25
  AgentInteractivePromptSurface,
26
26
  approvalOptionDisplayLabel
27
- } from "./chunk-CZSMZRAV.js";
27
+ } from "./chunk-QC642RAG.js";
28
28
  import {
29
29
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
30
30
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -43,7 +43,7 @@ import {
43
43
  resolveAgentGUIExplicitConversationTitle,
44
44
  resolveAgentGUIProviderDisplayLabel,
45
45
  resolveAgentGUIProviderIdentity
46
- } from "./chunk-4OPTXOOZ.js";
46
+ } from "./chunk-CVSCZ3CK.js";
47
47
  import {
48
48
  AgentConversationFlow,
49
49
  Button,
@@ -64,14 +64,14 @@ import {
64
64
  skillTriggerForPrefix,
65
65
  toLocalShortDateTime,
66
66
  useProjectedAgentConversation
67
- } from "./chunk-JLJIAKI3.js";
67
+ } from "./chunk-6MUKWI6Z.js";
68
68
  import {
69
69
  AgentMessageMarkdown,
70
70
  AgentTargetPresentationProvider,
71
71
  ZoomableImage,
72
72
  cn,
73
73
  resolveWorkspaceLinkAction
74
- } from "./chunk-B6YDXIZW.js";
74
+ } from "./chunk-SW6JCJCO.js";
75
75
  import {
76
76
  openAgentEnvPanel
77
77
  } from "./chunk-PSLAWU25.js";
@@ -82,7 +82,7 @@ import {
82
82
  DEFAULT_AGENT_MENTION_FILTER,
83
83
  agentMentionItemKey,
84
84
  preloadAgentMentionBrowse
85
- } from "./chunk-CUMZV32B.js";
85
+ } from "./chunk-SGXYVGQT.js";
86
86
  import {
87
87
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
88
88
  buildWorkspaceAgentActivityListViewModel,
@@ -92,10 +92,10 @@ import {
92
92
  isWorkspaceAgentUntitledTask,
93
93
  mergeWorkspaceAgentActivityDurableAndOverlayMessages,
94
94
  selectWorkspaceAgentActivityOverlayMessages
95
- } from "./chunk-I5ZIKJVN.js";
95
+ } from "./chunk-7P6CUYQT.js";
96
96
  import {
97
97
  Spinner
98
- } from "./chunk-74TIEA6X.js";
98
+ } from "./chunk-ZUVEBW5T.js";
99
99
  import {
100
100
  resolveWorkspaceAgentSessionSortTimeUnixMs
101
101
  } from "./chunk-IBIMGLCD.js";
@@ -106,7 +106,7 @@ import {
106
106
  mentionItemToAttrs,
107
107
  normalizeAgentSessionMentionTitle,
108
108
  parseMentionItemFromHref
109
- } from "./chunk-2LGUBUEJ.js";
109
+ } from "./chunk-FQQDBBNI.js";
110
110
  import "./chunk-Y35GDLP2.js";
111
111
  import "./chunk-LUGELG5V.js";
112
112
  import {
@@ -137,10 +137,10 @@ import {
137
137
  agentGuiI18nResources,
138
138
  translate,
139
139
  useTranslation
140
- } from "./chunk-24CUBQKJ.js";
140
+ } from "./chunk-RO6KQD3J.js";
141
141
  import "./chunk-PJP5BUU6.js";
142
142
  import "./chunk-V4JGVBUN.js";
143
- import "./chunk-6VVBG4BF.js";
143
+ import "./chunk-CA25GD5Q.js";
144
144
  import {
145
145
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
146
146
  } from "./chunk-JM24HADP.js";
@@ -13147,6 +13147,14 @@ function useAgentGUINodeController({
13147
13147
  }
13148
13148
  if (nextPermission !== void 0 && nextPermission && nextPermission !== currentPermission && activeSessionState2 !== null) {
13149
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
+ }
13150
13158
  }
13151
13159
  if (Object.keys(sessionSettingsPatch).length > 0 && activeSessionState2 !== null) {
13152
13160
  updateAgentSessionViewControlState(
@@ -14535,11 +14543,68 @@ function useAgentGUINodeController({
14535
14543
  draftSpeed
14536
14544
  ]);
14537
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
+ ]);
14538
14599
  const updateConversationFilter = useCallback4(
14539
14600
  (filter) => {
14540
- setConversationFilter(normalizeAgentGUIConversationFilter(filter));
14601
+ const nextFilter = normalizeAgentGUIConversationFilter(filter);
14602
+ setConversationFilter(nextFilter);
14603
+ if (nextFilter.kind === "all" && activeConversationIdRef.current === null) {
14604
+ resetHomeComposerAgentTargetToDefault();
14605
+ }
14541
14606
  },
14542
- []
14607
+ [resetHomeComposerAgentTargetToDefault]
14543
14608
  );
14544
14609
  const selectHomeComposerAgentTarget = useCallback4(
14545
14610
  (input) => {
@@ -14565,7 +14630,14 @@ function useAgentGUINodeController({
14565
14630
  isExplicit: nextTargetIsExplicit,
14566
14631
  target: nextTarget
14567
14632
  });
14633
+ const shouldSyncScopedRailFilter = conversationFilterRef.current.kind === "agentTarget";
14568
14634
  setHomeComposerTargetOverride(nextTarget);
14635
+ if (shouldSyncScopedRailFilter) {
14636
+ const nextAgentTargetId = nextTarget.agentTargetId?.trim() ?? "";
14637
+ setConversationFilter(
14638
+ nextAgentTargetId ? { kind: "agentTarget", agentTargetId: nextAgentTargetId } : { kind: "all" }
14639
+ );
14640
+ }
14569
14641
  const previous = activeConversationIdRef.current;
14570
14642
  if (previous) {
14571
14643
  void activation.unactivate(previous);
@@ -14624,12 +14696,12 @@ function useAgentGUINodeController({
14624
14696
  providerTargets: normalizedProviderTargets,
14625
14697
  useStaticCatalog: shouldUseStaticProviderTargets
14626
14698
  });
14627
- if (!nextTarget || nextTarget.disabled === true) {
14699
+ if (!nextTarget) {
14628
14700
  reportAgentGUIConversationFilterTargetUnresolved({
14629
14701
  provider: input.provider,
14630
14702
  providerTargetId: input.providerTargetId ?? null,
14631
14703
  providerTargetCount: normalizedProviderTargets.length,
14632
- reason: nextTarget ? "disabled" : "unresolved",
14704
+ reason: "unresolved",
14633
14705
  runtime: agentActivityRuntime,
14634
14706
  workspaceId
14635
14707
  });
@@ -14651,6 +14723,34 @@ function useAgentGUINodeController({
14651
14723
  workspaceId
14652
14724
  ]
14653
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
+ ]);
14654
14754
  const stableCreateConversation = useStableControllerEventCallback(createConversation);
14655
14755
  const stableSelectHomeComposerAgentTarget = useStableControllerEventCallback(
14656
14756
  selectHomeComposerAgentTarget
@@ -16956,6 +17056,7 @@ var styles3 = {
16956
17056
  composerHero: "agent-gui-node__composer-hero",
16957
17057
  composerFloatingPrompt: "agent-gui-node__composer-floating-prompt",
16958
17058
  composerHandoffIcon: "agent-gui-node__composer-handoff-icon",
17059
+ composerHandoffAnimatedIcon: "agent-gui-node__composer-handoff-icon-animated",
16959
17060
  composerHandoffMenuContent: "agent-gui-node__composer-handoff-menu-content",
16960
17061
  composerHandoffStaticIcon: "agent-gui-node__composer-handoff-icon-static",
16961
17062
  composerHandoffTrigger: "agent-gui-node__composer-handoff-trigger",
@@ -17413,6 +17514,13 @@ import {
17413
17514
  function permissionModeSelectionPatch(permissionModeId, options) {
17414
17515
  return options.clearsPlanMode ? { permissionModeId, planMode: false } : { permissionModeId };
17415
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
+ }
17416
17524
 
17417
17525
  // agent-gui/agentGuiNode/model/composerSettingsMenuModel.ts
17418
17526
  function buildComposerModelMenuModel(composerSettings, labels) {
@@ -20407,6 +20515,8 @@ var handoff_lined_default = "./handoff-lined-4WQUBVG3.svg";
20407
20515
  // agent-gui/agentGuiNode/AgentComposer.tsx
20408
20516
  import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
20409
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";
20410
20520
  var DOCK_COMPOSER_INPUT_MIN_HEIGHT = 56;
20411
20521
  var DOCK_COMPOSER_TEXT_LINE_HEIGHT = 24;
20412
20522
  var DOCK_COMPOSER_MAX_VISIBLE_TEXT_LINES = 3.5;
@@ -20699,23 +20809,93 @@ function AgentComposerMaskIcon({
20699
20809
  );
20700
20810
  }
20701
20811
  var HANDOFF_SELECT_IDLE_VALUE = "__agent-handoff-idle__";
20702
- function AgentComposerHandoffIcon() {
20703
- 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(
20704
20863
  "span",
20705
20864
  {
20706
- className: AgentGUINode_styles_default.composerHandoffStaticIcon,
20707
- style: {
20708
- WebkitMaskImage: `url("${handoff_lined_default}")`,
20709
- WebkitMaskPosition: "center",
20710
- WebkitMaskRepeat: "no-repeat",
20711
- WebkitMaskSize: "contain",
20712
- maskImage: `url("${handoff_lined_default}")`,
20713
- maskPosition: "center",
20714
- maskRepeat: "no-repeat",
20715
- maskSize: "contain"
20716
- }
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
+ ]
20717
20897
  }
20718
- ) });
20898
+ );
20719
20899
  }
20720
20900
  function AgentComposer({
20721
20901
  workspaceId,
@@ -20802,6 +20982,7 @@ function AgentComposer({
20802
20982
  );
20803
20983
  const [isPaletteOpen, setIsPaletteOpen] = useState11(true);
20804
20984
  const [isReviewPickerOpen, setIsReviewPickerOpen] = useState11(false);
20985
+ const [isHandoffIconPlaying, setIsHandoffIconPlaying] = useState11(false);
20805
20986
  const [highlightedIndex, setHighlightedIndex] = useState11(0);
20806
20987
  const [mentionHighlightedKey, setMentionHighlightedKey] = useState11(null);
20807
20988
  const [shouldCenterMentionHighlight, setShouldCenterMentionHighlight] = useState11(false);
@@ -21096,6 +21277,12 @@ function AgentComposer({
21096
21277
  setIsSlashStatusPanelOpen(false);
21097
21278
  }, []);
21098
21279
  const settingsControlsDisabled = isSendingTurn || isSubmittingPrompt || showStopButton;
21280
+ const permissionModeControlsDisabled = resolvePermissionModeControlsDisabled({
21281
+ provider,
21282
+ isSendingTurn,
21283
+ isSubmittingPrompt,
21284
+ showStopButton
21285
+ });
21099
21286
  const composerControlsHardDisabled = isSelectedProjectMissing || isSubmittingPrompt || disabled && !isSendingTurn && !showStopButton;
21100
21287
  const closeReviewPicker = useCallback9(() => {
21101
21288
  setIsReviewPickerOpen(false);
@@ -22005,13 +22192,17 @@ function AgentComposer({
22005
22192
  () => providerTargets.filter(Boolean),
22006
22193
  [providerTargets]
22007
22194
  );
22195
+ const enabledProviderSwitchTargets = useMemo9(
22196
+ () => providerSwitchTargets.filter((target) => target.disabled !== true),
22197
+ [providerSwitchTargets]
22198
+ );
22008
22199
  const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
22009
22200
  const selectedProviderSwitchTarget = providerSwitchTargets.find(
22010
22201
  (target) => target.targetId === selectedProviderTargetId
22011
22202
  ) ?? providerSwitchTargets.find((target) => target.provider === provider) ?? selectedProviderTarget;
22012
- const providerMenuTargets = selectedProviderSwitchTarget && !providerSwitchTargets.some(
22203
+ const providerMenuTargets = selectedProviderSwitchTarget && !enabledProviderSwitchTargets.some(
22013
22204
  (target) => target.targetId === selectedProviderSwitchTarget.targetId
22014
- ) ? [selectedProviderSwitchTarget, ...providerSwitchTargets] : providerSwitchTargets;
22205
+ ) ? [selectedProviderSwitchTarget, ...enabledProviderSwitchTargets] : enabledProviderSwitchTargets;
22015
22206
  const handoffMenuTargets = selectedProviderSwitchTarget ? providerMenuTargets.filter((target) => {
22016
22207
  if (target.disabled === true) {
22017
22208
  return false;
@@ -22978,6 +23169,18 @@ function AgentComposer({
22978
23169
  size: "sm",
22979
23170
  "aria-label": effectiveHandoffLabel,
22980
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
+ },
22981
23184
  className: cn(
22982
23185
  AgentGUINode_styles_default.composerMenuTrigger,
22983
23186
  AgentGUINode_styles_default.composerProviderSelect,
@@ -22985,7 +23188,13 @@ function AgentComposer({
22985
23188
  "w-auto max-w-[180px] [&>svg:last-child]:hidden"
22986
23189
  ),
22987
23190
  children: /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-1.5", children: [
22988
- /* @__PURE__ */ jsx28(AgentComposerHandoffIcon, {}),
23191
+ /* @__PURE__ */ jsx28(
23192
+ AgentComposerHandoffIcon,
23193
+ {
23194
+ disabled: handoffDisabled,
23195
+ isPlaying: isHandoffIconPlaying
23196
+ }
23197
+ ),
22989
23198
  /* @__PURE__ */ jsx28("span", { className: "min-w-0 truncate", children: effectiveHandoffLabel })
22990
23199
  ] })
22991
23200
  }
@@ -23210,7 +23419,7 @@ function AgentComposer({
23210
23419
  AgentPermissionModeDropdown,
23211
23420
  {
23212
23421
  composerSettings,
23213
- disabled: settingsControlsDisabled,
23422
+ disabled: permissionModeControlsDisabled,
23214
23423
  previewMode,
23215
23424
  labels: {
23216
23425
  permissionLabel: labels.permissionLabel,
@@ -24560,7 +24769,7 @@ function AgentGUINodeView({
24560
24769
  showProviderRail ? /* @__PURE__ */ jsx31(
24561
24770
  "aside",
24562
24771
  {
24563
- className: AgentGUINode_styles_default.providerRailPanel,
24772
+ className: `${AgentGUINode_styles_default.providerRailPanel} nodrag tsh-desktop-no-drag`,
24564
24773
  "aria-label": labels.providerSwitchLabel,
24565
24774
  "aria-hidden": conversationRailCollapsed ? "true" : void 0,
24566
24775
  inert: conversationRailCollapsed ? true : void 0,
@@ -26250,7 +26459,10 @@ function EmptyHeroTitle({
26250
26459
  }
26251
26460
  const providerEnd = providerStart + providerLabel.length;
26252
26461
  const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${selectedProviderTarget?.provider ?? ""}`;
26253
- 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;
26254
26466
  const providerName = label.slice(providerStart, providerEnd);
26255
26467
  return /* @__PURE__ */ jsxs17(Fragment8, { children: [
26256
26468
  label.slice(0, providerStart),
@@ -26259,10 +26471,10 @@ function EmptyHeroTitle({
26259
26471
  {
26260
26472
  value: selectedProviderTargetId,
26261
26473
  onValueChange: (nextTargetId) => {
26262
- const target = providerTargets.find(
26474
+ const target = enabledProviderTargets.find(
26263
26475
  (candidate) => candidate.targetId === nextTargetId
26264
26476
  );
26265
- if (!target || target.disabled === true) {
26477
+ if (!target) {
26266
26478
  return;
26267
26479
  }
26268
26480
  onProviderSelect({
@@ -26286,42 +26498,25 @@ function EmptyHeroTitle({
26286
26498
  {
26287
26499
  align: "center",
26288
26500
  className: cn3(AgentGUINode_styles_default.composerMenuContent, "min-w-[190px]"),
26289
- children: providerTargets.map((target) => /* @__PURE__ */ jsx31(
26501
+ children: enabledProviderTargets.map((target) => /* @__PURE__ */ jsx31(
26290
26502
  SelectItem3,
26291
26503
  {
26292
26504
  value: target.targetId,
26293
- className: cn3(
26294
- AgentGUINode_styles_default.composerMenuItem,
26295
- "gap-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-30 data-[disabled]:text-[var(--text-disabled,var(--text-tertiary))]",
26296
- target.disabled === true ? "cursor-not-allowed opacity-30" : null
26297
- ),
26298
- disabled: target.disabled === true,
26505
+ className: cn3(AgentGUINode_styles_default.composerMenuItem, "gap-2"),
26299
26506
  children: /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 items-center gap-1.5", children: [
26300
26507
  /* @__PURE__ */ jsx31(
26301
26508
  "img",
26302
26509
  {
26303
26510
  alt: "",
26304
26511
  "aria-hidden": "true",
26305
- className: cn3(
26306
- "size-4 shrink-0 rounded-[4px]",
26307
- target.disabled === true ? "grayscale opacity-30" : null
26308
- ),
26512
+ className: "size-4 shrink-0 rounded-[4px]",
26309
26513
  src: agentGUIProviderIconPresentation(
26310
26514
  target.provider,
26311
26515
  target.iconUrl
26312
26516
  ).iconUrl
26313
26517
  }
26314
26518
  ),
26315
- /* @__PURE__ */ jsx31(
26316
- "span",
26317
- {
26318
- className: cn3(
26319
- "min-w-0 truncate",
26320
- target.disabled === true ? "text-[var(--text-disabled,var(--text-tertiary))]" : null
26321
- ),
26322
- children: target.label
26323
- }
26324
- )
26519
+ /* @__PURE__ */ jsx31("span", { className: "min-w-0 truncate", children: target.label })
26325
26520
  ] })
26326
26521
  },
26327
26522
  `${target.provider}:${target.targetId}`
@@ -26923,7 +27118,7 @@ var AgentGUIProviderRail = memo(function AgentGUIProviderRail2({
26923
27118
  "data-disabled": target.disabled === true ? "true" : void 0,
26924
27119
  "data-provider-tile": "true",
26925
27120
  "data-selected": providerSelected ? "true" : "false",
26926
- disabled: previewMode || target.disabled === true,
27121
+ disabled: previewMode,
26927
27122
  onClick: () => selectAgentTargetTile(target),
26928
27123
  children: /* @__PURE__ */ jsx31("span", { className: AgentGUINode_styles_default.providerRailAvatar, children: /* @__PURE__ */ jsx31(
26929
27124
  AgentGUIProviderIconVisual,