@tutti-os/agent-gui 0.0.166 → 0.0.168

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 (61) hide show
  1. package/README.md +5 -2
  2. package/dist/{AgentRichTextReadonly-PLUYTH5Y.js → AgentRichTextReadonly-WOIEQ673.js} +5 -5
  3. package/dist/agent-conversation/index.d.ts +2 -2
  4. package/dist/agent-conversation/index.js +7 -7
  5. package/dist/agent-gui.d.ts +3 -2
  6. package/dist/agent-gui.js +15 -15
  7. package/dist/agent-message-center/index.js +6 -6
  8. package/dist/{agentGuiNodeTypes-BXaOdqzS.d.ts → agentGuiNodeTypes-CXL3ISqC.d.ts} +1 -1
  9. package/dist/agents.d.ts +1 -1
  10. package/dist/agents.js +1 -1
  11. package/dist/{chunk-W3EI5EWM.js → chunk-42KTGN4W.js} +2 -2
  12. package/dist/{chunk-GJBSQWIA.js → chunk-42W6JENH.js} +52 -72
  13. package/dist/chunk-42W6JENH.js.map +1 -0
  14. package/dist/{chunk-T7DN6RYO.js → chunk-5EHKHIFG.js} +3 -3
  15. package/dist/{chunk-7W4WEFAY.js → chunk-7M6STXDS.js} +111 -88
  16. package/dist/chunk-7M6STXDS.js.map +1 -0
  17. package/dist/{chunk-HIPSKKXB.js → chunk-BHLX4ZFU.js} +2 -2
  18. package/dist/{chunk-YB5DZYLI.js → chunk-C7RY5XMJ.js} +61 -16
  19. package/dist/chunk-C7RY5XMJ.js.map +1 -0
  20. package/dist/{chunk-66JZ7BQM.js → chunk-CX6XXG6R.js} +4 -1
  21. package/dist/chunk-CX6XXG6R.js.map +1 -0
  22. package/dist/{chunk-TK3MIDHE.js → chunk-ES5LNRP4.js} +95 -115
  23. package/dist/chunk-ES5LNRP4.js.map +1 -0
  24. package/dist/{chunk-W4UPFP2N.js → chunk-EZ6E3LVP.js} +2 -2
  25. package/dist/{chunk-A6UMKVKW.js → chunk-GMALB4L6.js} +4 -4
  26. package/dist/{chunk-OXCWE3B5.js → chunk-J4RQ2RTM.js} +3 -1
  27. package/dist/chunk-J4RQ2RTM.js.map +1 -0
  28. package/dist/{chunk-MJNX2SC6.js → chunk-JQUFRZ2P.js} +4 -4
  29. package/dist/{chunk-FVACDLAJ.js → chunk-KDRU3NBW.js} +4 -4
  30. package/dist/{chunk-ZEYVTTUK.js → chunk-OUOVA353.js} +4 -4
  31. package/dist/{chunk-KUTB4EGX.js → chunk-QEOAZW53.js} +2 -2
  32. package/dist/context-mention-palette/index.js +7 -7
  33. package/dist/{contribution--lqIXGqn.d.ts → contribution-DfA5SxBL.d.ts} +2 -0
  34. package/dist/i18n/index.d.ts +2 -0
  35. package/dist/i18n/index.js +2 -2
  36. package/dist/index.d.ts +8 -0
  37. package/dist/index.js +15 -15
  38. package/dist/mention-search.js +5 -5
  39. package/dist/{types-DVmB_kyD.d.ts → types-CWFDZVkv.d.ts} +3 -0
  40. package/dist/workbench/contribution.d.ts +1 -1
  41. package/dist/workbench/contribution.js +4 -4
  42. package/dist/workbench/index.d.ts +2 -2
  43. package/dist/workbench/index.js +4 -4
  44. package/dist/workbench/sessionTitle.js +2 -2
  45. package/package.json +17 -15
  46. package/dist/chunk-66JZ7BQM.js.map +0 -1
  47. package/dist/chunk-7W4WEFAY.js.map +0 -1
  48. package/dist/chunk-GJBSQWIA.js.map +0 -1
  49. package/dist/chunk-OXCWE3B5.js.map +0 -1
  50. package/dist/chunk-TK3MIDHE.js.map +0 -1
  51. package/dist/chunk-YB5DZYLI.js.map +0 -1
  52. /package/dist/{AgentRichTextReadonly-PLUYTH5Y.js.map → AgentRichTextReadonly-WOIEQ673.js.map} +0 -0
  53. /package/dist/{chunk-W3EI5EWM.js.map → chunk-42KTGN4W.js.map} +0 -0
  54. /package/dist/{chunk-T7DN6RYO.js.map → chunk-5EHKHIFG.js.map} +0 -0
  55. /package/dist/{chunk-HIPSKKXB.js.map → chunk-BHLX4ZFU.js.map} +0 -0
  56. /package/dist/{chunk-W4UPFP2N.js.map → chunk-EZ6E3LVP.js.map} +0 -0
  57. /package/dist/{chunk-A6UMKVKW.js.map → chunk-GMALB4L6.js.map} +0 -0
  58. /package/dist/{chunk-MJNX2SC6.js.map → chunk-JQUFRZ2P.js.map} +0 -0
  59. /package/dist/{chunk-FVACDLAJ.js.map → chunk-KDRU3NBW.js.map} +0 -0
  60. /package/dist/{chunk-ZEYVTTUK.js.map → chunk-OUOVA353.js.map} +0 -0
  61. /package/dist/{chunk-KUTB4EGX.js.map → chunk-QEOAZW53.js.map} +0 -0
@@ -8,6 +8,7 @@ function normalizeAgentGUIAgents(agents) {
8
8
  const iconUrl = agent.iconUrl.trim();
9
9
  const maskIconUrl = agent.maskIconUrl?.trim() ?? "";
10
10
  const heroImageUrl = agent.heroImageUrl?.trim() ?? "";
11
+ const ownerDeviceLabel = agent.ownerDeviceLabel?.trim() ?? "";
11
12
  if (!agentTargetId || !name || !iconUrl || seenAgentTargetIds.has(agentTargetId)) {
12
13
  continue;
13
14
  }
@@ -22,6 +23,7 @@ function normalizeAgentGUIAgents(agents) {
22
23
  ...maskIconUrl ? { maskIconUrl } : {},
23
24
  ...heroImageUrl ? { heroImageUrl } : {},
24
25
  ...agent.description?.trim() ? { description: agent.description.trim() } : {},
26
+ ...ownerDeviceLabel ? { ownerDeviceLabel } : {},
25
27
  ...ownerName || ownerAvatarUrl ? {
26
28
  owner: {
27
29
  ...ownerName ? { name: ownerName } : {},
@@ -71,6 +73,7 @@ function projectAgentGUIAgentsToTargets(agents) {
71
73
  iconUrl: agent.iconUrl,
72
74
  ...agent.maskIconUrl ? { maskIconUrl: agent.maskIconUrl } : {},
73
75
  ...agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {},
76
+ ...agent.ownerDeviceLabel ? { ownerDeviceLabel: agent.ownerDeviceLabel } : {},
74
77
  ...agent.owner?.avatarUrl ? {
75
78
  badge: {
76
79
  iconUrl: agent.owner.avatarUrl,
@@ -101,4 +104,4 @@ export {
101
104
  resolveAgentGUISelectedDirectoryAgent,
102
105
  projectAgentGUIAgentsToTargets
103
106
  };
104
- //# sourceMappingURL=chunk-66JZ7BQM.js.map
107
+ //# sourceMappingURL=chunk-CX6XXG6R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agents.ts"],"sourcesContent":["import type {\n AgentGUIAgent,\n AgentGUIAgentAvailabilityStatus,\n AgentGUIAgentTarget\n} from \"./types.ts\";\n\nexport function normalizeAgentGUIAgents(\n agents: readonly AgentGUIAgent[] | null | undefined\n): AgentGUIAgent[] {\n const normalized: AgentGUIAgent[] = [];\n const seenAgentTargetIds = new Set<string>();\n for (const agent of agents ?? []) {\n const agentTargetId = agent.agentTargetId.trim();\n const name = agent.name.trim();\n const iconUrl = agent.iconUrl.trim();\n const maskIconUrl = agent.maskIconUrl?.trim() ?? \"\";\n const heroImageUrl = agent.heroImageUrl?.trim() ?? \"\";\n const ownerDeviceLabel = agent.ownerDeviceLabel?.trim() ?? \"\";\n if (\n !agentTargetId ||\n !name ||\n !iconUrl ||\n seenAgentTargetIds.has(agentTargetId)\n ) {\n continue;\n }\n seenAgentTargetIds.add(agentTargetId);\n const ownerName = agent.owner?.name?.trim() ?? \"\";\n const ownerAvatarUrl = agent.owner?.avatarUrl?.trim() ?? \"\";\n const reason = agent.availability.reason?.trim() ?? \"\";\n normalized.push({\n agentTargetId,\n name,\n iconUrl,\n ...(maskIconUrl ? { maskIconUrl } : {}),\n ...(heroImageUrl ? { heroImageUrl } : {}),\n ...(agent.description?.trim()\n ? { description: agent.description.trim() }\n : {}),\n ...(ownerDeviceLabel ? { ownerDeviceLabel } : {}),\n ...(ownerName || ownerAvatarUrl\n ? {\n owner: {\n ...(ownerName ? { name: ownerName } : {}),\n ...(ownerAvatarUrl ? { avatarUrl: ownerAvatarUrl } : {})\n }\n }\n : {}),\n ...(agent.ownership === \"self\" || agent.ownership === \"shared\"\n ? { ownership: agent.ownership }\n : {}),\n availability: {\n status: normalizeAgentGUIAgentAvailabilityStatus(\n agent.availability.status\n ),\n ...(reason ? { reason } : {}),\n ...(agent.availability.pendingAction\n ? { pendingAction: agent.availability.pendingAction }\n : {})\n },\n provider: agent.provider,\n ...(agent.setupKind === \"target_runtime\"\n ? { setupKind: \"target_runtime\" as const }\n : {})\n });\n }\n return normalized;\n}\n\nexport function agentGUIAgentIsReady(agent: AgentGUIAgent): boolean {\n return agent.availability.status === \"ready\";\n}\n\nexport function resolveAgentGUISelectedDirectoryAgent(input: {\n agents: readonly AgentGUIAgent[];\n agentTargetId?: string | null;\n defaultAgentTargetId?: string | null;\n}): AgentGUIAgent | null {\n const explicitAgentTargetId =\n input.agentTargetId?.trim() || input.defaultAgentTargetId?.trim() || \"\";\n if (explicitAgentTargetId) {\n return (\n input.agents.find(\n (agent) => agent.agentTargetId === explicitAgentTargetId\n ) ?? null\n );\n }\n return (\n input.agents.find((agent) => agentGUIAgentIsReady(agent)) ??\n input.agents[0] ??\n null\n );\n}\n\n/** Projects the canonical Agent directory into target rows for selection menus. */\nexport function projectAgentGUIAgentsToTargets(\n agents: readonly AgentGUIAgent[]\n): AgentGUIAgentTarget[] {\n return agents.map((agent) => ({\n targetId: agent.agentTargetId,\n agentTargetId: agent.agentTargetId,\n provider: agent.provider,\n ref: {\n kind: \"agent-directory\",\n provider: agent.provider,\n agentTargetId: agent.agentTargetId,\n ...(agent.setupKind ? { setupKind: agent.setupKind } : {})\n },\n label: agent.name,\n availability: agent.availability,\n ...(agent.description ? { description: agent.description } : {}),\n iconUrl: agent.iconUrl,\n ...(agent.maskIconUrl ? { maskIconUrl: agent.maskIconUrl } : {}),\n ...(agent.heroImageUrl ? { heroImageUrl: agent.heroImageUrl } : {}),\n ...(agent.ownerDeviceLabel\n ? { ownerDeviceLabel: agent.ownerDeviceLabel }\n : {}),\n ...(agent.owner?.avatarUrl\n ? {\n badge: {\n iconUrl: agent.owner.avatarUrl,\n ...(agent.owner.name ? { label: agent.owner.name } : {})\n }\n }\n : {}),\n ...(agent.owner?.name ? { ownerLabel: agent.owner.name } : {}),\n ...(agent.ownership ? { ownership: agent.ownership } : {}),\n ...(agent.availability.status !== \"ready\" && !agent.setupKind\n ? { disabled: true }\n : {}),\n ...(agent.availability.reason\n ? { unavailableReason: agent.availability.reason }\n : {})\n }));\n}\n\nfunction normalizeAgentGUIAgentAvailabilityStatus(\n status: AgentGUIAgentAvailabilityStatus\n): AgentGUIAgentAvailabilityStatus {\n switch (status) {\n case \"ready\":\n case \"checking\":\n case \"coming_soon\":\n case \"not_installed\":\n case \"auth_required\":\n case \"unavailable\":\n return status;\n }\n}\n"],"mappings":"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","names":[]}
@@ -12,7 +12,7 @@ import {
12
12
  resolveAgentGuiSessionProviderFlatIconUrl,
13
13
  resolveNextAgentGUIConversationRailWidthPx,
14
14
  shouldAutoCollapseAgentGUIConversationRail
15
- } from "./chunk-MJNX2SC6.js";
15
+ } from "./chunk-JQUFRZ2P.js";
16
16
  import {
17
17
  resolveAgentGuiWorkbenchProviderLabel
18
18
  } from "./chunk-SZVHT57M.js";
@@ -31,7 +31,7 @@ import {
31
31
  resolveAgentGUIFirstUserMessageDisplayPrompt,
32
32
  resolveAgentGUIProviderDisplayLabel,
33
33
  resolveAgentGUIProviderIdentity
34
- } from "./chunk-W3EI5EWM.js";
34
+ } from "./chunk-42KTGN4W.js";
35
35
  import {
36
36
  AgentConversationFlow,
37
37
  Button,
@@ -65,7 +65,7 @@ import {
65
65
  toLocalShortDateTime,
66
66
  updateAgentComposerDraft,
67
67
  useProjectedAgentConversation
68
- } from "./chunk-YB5DZYLI.js";
68
+ } from "./chunk-C7RY5XMJ.js";
69
69
  import {
70
70
  agentRichTextContentToPromptText,
71
71
  createAgentRichTextInputExtensions,
@@ -75,7 +75,7 @@ import {
75
75
  plainTextToAgentRichTextInlineContent,
76
76
  skillDescriptionForDisplay,
77
77
  skillTriggerForPrefix
78
- } from "./chunk-GJBSQWIA.js";
78
+ } from "./chunk-42W6JENH.js";
79
79
  import {
80
80
  AgentEnvPanelActionProvider
81
81
  } from "./chunk-THBCAUBR.js";
@@ -90,18 +90,18 @@ import {
90
90
  AgentFileMentionPalette,
91
91
  agentMentionItemKey,
92
92
  isAgentMentionItemDisabled
93
- } from "./chunk-FVACDLAJ.js";
93
+ } from "./chunk-KDRU3NBW.js";
94
94
  import {
95
95
  normalizeAgentGUIAgents,
96
96
  projectAgentGUIAgentsToTargets
97
- } from "./chunk-66JZ7BQM.js";
97
+ } from "./chunk-CX6XXG6R.js";
98
98
  import {
99
99
  AGENT_MENTION_FILTER_TAB_ORDER,
100
100
  AgentMentionSearchController,
101
101
  DEFAULT_AGENT_MENTION_FILTER,
102
102
  agentGuiScheduler,
103
103
  buildWorkspaceAgentActivityListViewModel
104
- } from "./chunk-A6UMKVKW.js";
104
+ } from "./chunk-GMALB4L6.js";
105
105
  import {
106
106
  AGENT_RICH_TEXT_CARET_ANCHOR,
107
107
  agentComposerFileMentionReferences,
@@ -118,7 +118,7 @@ import {
118
118
  parseMentionItemFromHref,
119
119
  remainingAgentComposerPromptAssetSlots,
120
120
  updateAgentComposerFileMentions
121
- } from "./chunk-7W4WEFAY.js";
121
+ } from "./chunk-7M6STXDS.js";
122
122
  import {
123
123
  AgentInteractivePromptSurface,
124
124
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
@@ -128,7 +128,7 @@ import {
128
128
  dispatchAgentPlanPromptAction,
129
129
  latestPlanTurnId,
130
130
  planImplementationPromptFromPlanTurn
131
- } from "./chunk-ZEYVTTUK.js";
131
+ } from "./chunk-OUOVA353.js";
132
132
  import {
133
133
  useEngineSelector
134
134
  } from "./chunk-2RQM7PJN.js";
@@ -138,7 +138,7 @@ import {
138
138
  blobToBase64,
139
139
  normalizeAgentApprovalPurpose,
140
140
  resolveWorkspaceLinkAction
141
- } from "./chunk-T7DN6RYO.js";
141
+ } from "./chunk-5EHKHIFG.js";
142
142
  import {
143
143
  AgentTargetPresentationProvider,
144
144
  cn,
@@ -156,7 +156,7 @@ import {
156
156
  useAgentHostApi,
157
157
  useOptionalAgentActivityRuntime,
158
158
  useOptionalAgentHostApi
159
- } from "./chunk-KUTB4EGX.js";
159
+ } from "./chunk-QEOAZW53.js";
160
160
  import {
161
161
  MANAGED_AGENT_ICON_FALLBACK_URL,
162
162
  MANAGED_AGENT_ICON_URLS,
@@ -166,7 +166,7 @@ import {
166
166
  AgentGuiI18nProvider,
167
167
  translate,
168
168
  useTranslation
169
- } from "./chunk-W4UPFP2N.js";
169
+ } from "./chunk-EZ6E3LVP.js";
170
170
  import {
171
171
  isBetaAgentProvider,
172
172
  normalizeManagedAgentProvider
@@ -3717,6 +3717,7 @@ function createSharedAgentGUIAgentTarget(input) {
3717
3717
  label: input.label,
3718
3718
  ...badge ? { badge } : {},
3719
3719
  ...input.ownerLabel?.trim() ? { ownerLabel: input.ownerLabel.trim() } : {},
3720
+ ...input.ownerDeviceLabel?.trim() ? { ownerDeviceLabel: input.ownerDeviceLabel.trim() } : {},
3720
3721
  ...input.iconUrl?.trim() ? { iconUrl: input.iconUrl.trim() } : {},
3721
3722
  ...input.maskIconUrl?.trim() ? { maskIconUrl: input.maskIconUrl.trim() } : {},
3722
3723
  ...input.unavailableReason?.trim() ? { unavailableReason: input.unavailableReason.trim() } : {},
@@ -3823,6 +3824,7 @@ function normalizeAgentGUIAgentTarget(target) {
3823
3824
  maskIconUrl,
3824
3825
  heroImageUrl,
3825
3826
  ownerLabel,
3827
+ ownerDeviceLabel,
3826
3828
  unavailableReason,
3827
3829
  ...rest
3828
3830
  } = target;
@@ -3851,6 +3853,7 @@ function normalizeAgentGUIAgentTarget(target) {
3851
3853
  ...maskIconUrl?.trim() ? { maskIconUrl: maskIconUrl.trim() } : {},
3852
3854
  ...heroImageUrl?.trim() ? { heroImageUrl: heroImageUrl.trim() } : {},
3853
3855
  ...ownerLabel?.trim() ? { ownerLabel: ownerLabel.trim() } : {},
3856
+ ...ownerDeviceLabel?.trim() ? { ownerDeviceLabel: ownerDeviceLabel.trim() } : {},
3854
3857
  ...unavailableReason?.trim() ? { unavailableReason: unavailableReason.trim() } : {}
3855
3858
  };
3856
3859
  }
@@ -13633,7 +13636,6 @@ import {
13633
13636
  Gift,
13634
13637
  LogIn,
13635
13638
  LogOut,
13636
- ListTree,
13637
13639
  Settings,
13638
13640
  Wrench,
13639
13641
  X
@@ -14214,27 +14216,6 @@ function AgentGUIConfigMenu({
14214
14216
  /* @__PURE__ */ jsx15("div", { className: "px-2", children: /* @__PURE__ */ jsx15("span", { className: "block h-px bg-[var(--border-1)]" }) })
14215
14217
  ] }) : null,
14216
14218
  /* @__PURE__ */ jsxs8("div", { className: "flex min-w-0 flex-col gap-1", children: [
14217
- /* @__PURE__ */ jsxs8(
14218
- "button",
14219
- {
14220
- type: "button",
14221
- "data-testid": "agent-gui-config-manage-agents",
14222
- 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]",
14223
- disabled: previewMode,
14224
- onClick: () => {
14225
- setOpen(false);
14226
- openWorkspaceSettingsPanel({
14227
- section: "agent",
14228
- pane: "agents",
14229
- provider: provider ?? void 0
14230
- });
14231
- },
14232
- children: [
14233
- /* @__PURE__ */ jsx15(ListTree, { "aria-hidden": "true", size: 16, strokeWidth: 1.8 }),
14234
- /* @__PURE__ */ jsx15("span", { children: labels.manageAgents })
14235
- ]
14236
- }
14237
- ),
14238
14219
  providerScopedActionsVisible && environmentSetupVisible ? /* @__PURE__ */ jsxs8(
14239
14220
  "button",
14240
14221
  {
@@ -17056,7 +17037,6 @@ function hasInlineOverflow(element) {
17056
17037
  function useComposerLayout({
17057
17038
  isHeroLayout,
17058
17039
  inputDisabled,
17059
- paletteDraftPrompt,
17060
17040
  showFileMentionPalette,
17061
17041
  showFloatingCommandMenu,
17062
17042
  previewMode,
@@ -17227,24 +17207,20 @@ function useComposerLayout({
17227
17207
  (currentHeight) => currentHeight === textHeight ? currentHeight : textHeight
17228
17208
  );
17229
17209
  };
17230
- measure();
17231
17210
  const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
17232
17211
  resizeObserver?.observe(inputArea);
17233
17212
  resizeObserver?.observe(editor);
17234
- for (const child of Array.from(inputArea.querySelectorAll("*"))) {
17235
- resizeObserver?.observe(child);
17213
+ for (const attachmentArea of Array.from(
17214
+ inputArea.querySelectorAll(
17215
+ '[data-testid="agent-gui-composer-image-drafts"], [data-testid="agent-gui-composer-file-drafts"]'
17216
+ )
17217
+ )) {
17218
+ resizeObserver?.observe(attachmentArea);
17236
17219
  }
17237
- window.addEventListener("resize", measure);
17238
17220
  return () => {
17239
17221
  resizeObserver?.disconnect();
17240
- window.removeEventListener("resize", measure);
17241
17222
  };
17242
- }, [
17243
- draftImages.length,
17244
- draftLargeTexts.length,
17245
- isHeroLayout,
17246
- paletteDraftPrompt
17247
- ]);
17223
+ }, [draftImages.length, draftLargeTexts.length, isHeroLayout]);
17248
17224
  const composerStyle = useMemo20(
17249
17225
  () => isHeroLayout ? void 0 : {
17250
17226
  // The dock keeps only the collapsed 56px input row in flow; a
@@ -23989,6 +23965,53 @@ function AgentHandoffMenu({
23989
23965
  }) {
23990
23966
  const [isIconPlaying, setIsIconPlaying] = useState21(false);
23991
23967
  const menuDisabled = disabled || targets.length === 0;
23968
+ const tooltip = labels.tooltip.trim();
23969
+ const trigger = /* @__PURE__ */ jsx36("span", { className: "inline-flex", children: /* @__PURE__ */ jsx36(
23970
+ SelectTrigger2,
23971
+ {
23972
+ size: "sm",
23973
+ "aria-label": labels.action,
23974
+ "data-testid": testId,
23975
+ onClick: isolateTriggerEvents ? (event) => {
23976
+ event.stopPropagation();
23977
+ } : void 0,
23978
+ onKeyDown: isolateTriggerEvents ? (event) => {
23979
+ event.stopPropagation();
23980
+ } : void 0,
23981
+ onPointerDown: isolateTriggerEvents ? (event) => {
23982
+ event.stopPropagation();
23983
+ } : void 0,
23984
+ onBlur: () => {
23985
+ setIsIconPlaying(false);
23986
+ },
23987
+ onFocus: () => {
23988
+ setIsIconPlaying(true);
23989
+ },
23990
+ onMouseEnter: () => {
23991
+ setIsIconPlaying(true);
23992
+ },
23993
+ onMouseLeave: () => {
23994
+ setIsIconPlaying(false);
23995
+ },
23996
+ className: cn(
23997
+ AgentGUINode_styles_default.composerMenuTrigger,
23998
+ AgentGUINode_styles_default.composerProviderSelect,
23999
+ AgentGUINode_styles_default.composerHandoffTrigger,
24000
+ "w-auto max-w-[180px] [&>svg:last-child]:hidden",
24001
+ triggerClassName
24002
+ ),
24003
+ children: /* @__PURE__ */ jsxs26("span", { className: "flex min-w-0 items-center gap-1.5", children: [
24004
+ /* @__PURE__ */ jsx36(
24005
+ AgentComposerHandoffIcon,
24006
+ {
24007
+ disabled: menuDisabled,
24008
+ isPlaying: isIconPlaying
24009
+ }
24010
+ ),
24011
+ !iconOnly ? /* @__PURE__ */ jsx36("span", { className: "min-w-0 truncate", children: triggerLabel }) : null
24012
+ ] })
24013
+ }
24014
+ ) });
23992
24015
  return /* @__PURE__ */ jsx36(
23993
24016
  "span",
23994
24017
  {
@@ -24017,55 +24040,10 @@ function AgentHandoffMenu({
24017
24040
  onSelect(target);
24018
24041
  },
24019
24042
  children: [
24020
- /* @__PURE__ */ jsx36(TooltipProvider3, { delayDuration: 120, children: /* @__PURE__ */ jsxs26(Tooltip3, { children: [
24021
- /* @__PURE__ */ jsx36(TooltipTrigger3, { asChild: true, children: /* @__PURE__ */ jsx36("span", { className: "inline-flex", children: /* @__PURE__ */ jsx36(
24022
- SelectTrigger2,
24023
- {
24024
- size: "sm",
24025
- "aria-label": labels.action,
24026
- "data-testid": testId,
24027
- onClick: isolateTriggerEvents ? (event) => {
24028
- event.stopPropagation();
24029
- } : void 0,
24030
- onKeyDown: isolateTriggerEvents ? (event) => {
24031
- event.stopPropagation();
24032
- } : void 0,
24033
- onPointerDown: isolateTriggerEvents ? (event) => {
24034
- event.stopPropagation();
24035
- } : void 0,
24036
- onBlur: () => {
24037
- setIsIconPlaying(false);
24038
- },
24039
- onFocus: () => {
24040
- setIsIconPlaying(true);
24041
- },
24042
- onMouseEnter: () => {
24043
- setIsIconPlaying(true);
24044
- },
24045
- onMouseLeave: () => {
24046
- setIsIconPlaying(false);
24047
- },
24048
- className: cn(
24049
- AgentGUINode_styles_default.composerMenuTrigger,
24050
- AgentGUINode_styles_default.composerProviderSelect,
24051
- AgentGUINode_styles_default.composerHandoffTrigger,
24052
- "w-auto max-w-[180px] [&>svg:last-child]:hidden",
24053
- triggerClassName
24054
- ),
24055
- children: /* @__PURE__ */ jsxs26("span", { className: "flex min-w-0 items-center gap-1.5", children: [
24056
- /* @__PURE__ */ jsx36(
24057
- AgentComposerHandoffIcon,
24058
- {
24059
- disabled: menuDisabled,
24060
- isPlaying: isIconPlaying
24061
- }
24062
- ),
24063
- !iconOnly ? /* @__PURE__ */ jsx36("span", { className: "min-w-0 truncate", children: triggerLabel }) : null
24064
- ] })
24065
- }
24066
- ) }) }),
24067
- /* @__PURE__ */ jsx36(TooltipContent3, { side: "top", children: labels.tooltip })
24068
- ] }) }),
24043
+ tooltip ? /* @__PURE__ */ jsx36(TooltipProvider3, { delayDuration: 120, children: /* @__PURE__ */ jsxs26(Tooltip3, { children: [
24044
+ /* @__PURE__ */ jsx36(TooltipTrigger3, { asChild: true, children: trigger }),
24045
+ /* @__PURE__ */ jsx36(TooltipContent3, { side: "top", children: tooltip })
24046
+ ] }) }) : trigger,
24069
24047
  /* @__PURE__ */ jsx36(
24070
24048
  SelectContent2,
24071
24049
  {
@@ -24082,6 +24060,8 @@ function AgentHandoffMenu({
24082
24060
  self: labels.self,
24083
24061
  shared: labels.shared
24084
24062
  });
24063
+ const ownerDeviceLabel = target.ownerDeviceLabel?.trim() ?? "";
24064
+ const deviceSourceLabel = ownerDeviceLabel ? labels.deviceSource?.(ownerDeviceLabel) ?? ownerDeviceLabel : null;
24085
24065
  return /* @__PURE__ */ jsx36(
24086
24066
  SelectItem2,
24087
24067
  {
@@ -24111,7 +24091,10 @@ function AgentHandoffMenu({
24111
24091
  ] }),
24112
24092
  /* @__PURE__ */ jsxs26("span", { className: "flex min-w-0 flex-col gap-0.5", children: [
24113
24093
  /* @__PURE__ */ jsx36("span", { className: "min-w-0 truncate", children: target.label }),
24114
- ownershipLabel ? /* @__PURE__ */ jsx36("span", { className: "min-w-0 truncate text-[11px] leading-none text-[var(--agent-gui-text-secondary)]", children: ownershipLabel }) : null
24094
+ ownershipLabel || deviceSourceLabel ? /* @__PURE__ */ jsxs26("span", { className: "flex min-w-0 items-center gap-1.5 truncate text-[11px] leading-none text-[var(--agent-gui-text-secondary)]", children: [
24095
+ ownershipLabel ? /* @__PURE__ */ jsx36("span", { children: ownershipLabel }) : null,
24096
+ deviceSourceLabel ? /* @__PURE__ */ jsx36("span", { children: deviceSourceLabel }) : null
24097
+ ] }) : null
24115
24098
  ] })
24116
24099
  ] })
24117
24100
  },
@@ -24275,6 +24258,7 @@ function ComposerFooter({
24275
24258
  disabled: handoffDisabled,
24276
24259
  labels: {
24277
24260
  action: effectiveHandoffLabel,
24261
+ deviceSource: labels.handoffTargetDeviceSource,
24278
24262
  menu: effectiveHandoffMenuLabel,
24279
24263
  self: labels.handoffTargetSelf,
24280
24264
  shared: labels.handoffTargetShared,
@@ -26892,7 +26876,6 @@ function AgentComposer(props) {
26892
26876
  const layout = useComposerLayout({
26893
26877
  isHeroLayout,
26894
26878
  inputDisabled,
26895
- paletteDraftPrompt,
26896
26879
  showFileMentionPalette,
26897
26880
  showFloatingCommandMenu,
26898
26881
  previewMode,
@@ -35011,32 +34994,24 @@ function useAgentGUIDetailScroll(input) {
35011
34994
  return;
35012
34995
  }
35013
34996
  const captureScrollAnchor = () => {
35014
- let scrollTop = timeline.scrollTop;
35015
34997
  const previousAnchor = timelineScrollAnchorRef.current;
35016
- const geometryChanged = previousAnchor?.conversationId !== activeConversationId || previousAnchor.scrollHeight !== timeline.scrollHeight || previousAnchor.clientHeight !== timeline.clientHeight;
35017
- const inferredUserScrollAway = previousAnchor?.conversationId === activeConversationId && !geometryChanged && scrollTop < previousAnchor.scrollTop - 1;
34998
+ if (!previousAnchor || previousAnchor.conversationId !== activeConversationId) {
34999
+ return;
35000
+ }
35001
+ const scrollTop = timeline.scrollTop;
35002
+ const inferredUserScrollAway = scrollTop < previousAnchor.scrollTop - 1;
35018
35003
  const explicitUserScrollAway = userScrollAwayIntentConversationRef.current === activeConversationId;
35019
35004
  if (explicitUserScrollAway || inferredUserScrollAway) {
35020
35005
  bottomLockOwnerRef.current = null;
35021
35006
  userScrollAwayIntentConversationRef.current = null;
35022
35007
  }
35023
- if (geometryChanged && bottomLockOwnerRef.current === activeConversationId) {
35024
- const maxScrollTop = Math.max(
35025
- 0,
35026
- timeline.scrollHeight - timeline.clientHeight
35027
- );
35028
- if (maxScrollTop - scrollTop > AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX) {
35029
- setTimelineScrollTopInstantly(timeline, maxScrollTop);
35030
- scrollTop = maxScrollTop;
35031
- }
35032
- }
35033
35008
  timelineScrollAnchorRef.current = {
35034
35009
  conversationId: activeConversationId,
35035
- scrollHeight: timeline.scrollHeight,
35010
+ scrollHeight: previousAnchor.scrollHeight,
35036
35011
  scrollTop,
35037
- clientHeight: timeline.clientHeight
35012
+ clientHeight: previousAnchor.clientHeight
35038
35013
  };
35039
- const atBottom = timeline.scrollHeight - scrollTop - timeline.clientHeight <= AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX;
35014
+ const atBottom = previousAnchor.scrollHeight - scrollTop - previousAnchor.clientHeight <= AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX;
35040
35015
  if (atBottom) {
35041
35016
  bottomLockOwnerRef.current = activeConversationId;
35042
35017
  }
@@ -35048,7 +35023,7 @@ function useAgentGUIDetailScroll(input) {
35048
35023
  if (activeConversationId === viewModel.rail.activeConversationId && viewModel.detail.hasOlderMessages && !viewModel.detail.isLoadingOlderMessages && scrollTop <= AGENT_GUI_TOP_HISTORY_PREFETCH_THRESHOLD_PX) {
35049
35024
  pendingPrependScrollAnchorRef.current = {
35050
35025
  conversationId: activeConversationId,
35051
- scrollHeight: timeline.scrollHeight,
35026
+ scrollHeight: previousAnchor.scrollHeight,
35052
35027
  scrollTop
35053
35028
  };
35054
35029
  actions.loadOlderConversationMessages();
@@ -35580,6 +35555,7 @@ function useAgentGUIDetailModel(input) {
35580
35555
  handoffConversation: labels.handoffConversation,
35581
35556
  handoffConversationTooltip: labels.handoffConversationTooltip,
35582
35557
  handoffConversationMenu: labels.handoffConversationMenu,
35558
+ handoffTargetDeviceSource: labels.handoffTargetDeviceSource,
35583
35559
  handoffTargetSelf: labels.handoffTargetSelf,
35584
35560
  handoffTargetShared: labels.handoffTargetShared,
35585
35561
  providerSwitchLabel: labels.providerSwitchLabel,
@@ -35606,6 +35582,7 @@ function useAgentGUIDetailModel(input) {
35606
35582
  labels.handoffConversation,
35607
35583
  labels.handoffConversationTooltip,
35608
35584
  labels.handoffConversationMenu,
35585
+ labels.handoffTargetDeviceSource,
35609
35586
  labels.handoffTargetSelf,
35610
35587
  labels.handoffTargetShared,
35611
35588
  labels.inheritedUnavailable,
@@ -39303,6 +39280,9 @@ function useAgentGUIViewLabels(input) {
39303
39280
  "agentHost.agentGui.handoffConversationTooltip"
39304
39281
  ),
39305
39282
  handoffConversationMenu: t("agentHost.agentGui.handoffConversationMenu"),
39283
+ handoffTargetDeviceSource: (deviceLabel) => t("agentHost.agentGui.handoffTargetDeviceSource", {
39284
+ device: deviceLabel
39285
+ }),
39306
39286
  handoffTargetSelf: t("agentHost.agentGui.handoffTargetSelf"),
39307
39287
  handoffTargetShared: t("agentHost.agentGui.handoffTargetShared")
39308
39288
  }),
@@ -40062,4 +40042,4 @@ export {
40062
40042
  AgentHandoffMenu,
40063
40043
  AgentGUI
40064
40044
  };
40065
- //# sourceMappingURL=chunk-TK3MIDHE.js.map
40045
+ //# sourceMappingURL=chunk-ES5LNRP4.js.map