@tutti-os/agent-gui 0.0.84 → 0.0.86

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 (63) hide show
  1. package/README.md +49 -44
  2. package/dist/agent-conversation/index.d.ts +2 -2
  3. package/dist/agent-conversation/index.js +5 -5
  4. package/dist/agent-message-center/index.js +7 -7
  5. package/dist/{agentGuiNodeTypes-CmuJ7VDZ.d.ts → agentGuiNodeTypes-fRobgKiP.d.ts} +1 -5
  6. package/dist/app/renderer/agentactivity.css +7 -0
  7. package/dist/{chunk-A2JPL5N6.js → chunk-3HARXLAZ.js} +2 -2
  8. package/dist/{chunk-BEM3KDOJ.js → chunk-45FF4DQU.js} +17 -281
  9. package/dist/chunk-45FF4DQU.js.map +1 -0
  10. package/dist/{chunk-UNLTQUPO.js → chunk-4SQNOOJ3.js} +4 -4
  11. package/dist/{chunk-FIH7IYLX.js → chunk-7FZT2OYT.js} +4 -4
  12. package/dist/chunk-7FZT2OYT.js.map +1 -0
  13. package/dist/{chunk-L2ZMLLYL.js → chunk-7LMJXF4R.js} +2 -2
  14. package/dist/{chunk-DBIJRSFG.js → chunk-A7RA7ORT.js} +104 -45
  15. package/dist/chunk-A7RA7ORT.js.map +1 -0
  16. package/dist/{chunk-CVPWQHQH.js → chunk-AOVPGJBC.js} +2 -2
  17. package/dist/{chunk-BT2DT2P7.js → chunk-GAPTLVII.js} +1 -1
  18. package/dist/{chunk-BT2DT2P7.js.map → chunk-GAPTLVII.js.map} +1 -1
  19. package/dist/{chunk-3355GEBI.js → chunk-HOSX5C5V.js} +2 -2
  20. package/dist/{chunk-CXJEQQR5.js → chunk-KQE5KV2V.js} +2 -2
  21. package/dist/{chunk-N7EX6XK3.js → chunk-SXDLSEHO.js} +3 -3
  22. package/dist/{chunk-MQ6WW3CD.js → chunk-U7D7G3UU.js} +2 -2
  23. package/dist/{chunk-6YLA7R4S.js → chunk-UNO7CEAF.js} +2 -2
  24. package/dist/{chunk-AA75BOX3.js → chunk-VWXFFSIM.js} +3 -1
  25. package/dist/chunk-VWXFFSIM.js.map +1 -0
  26. package/dist/{chunk-HUNUSBQQ.js → chunk-XQUUELKF.js} +2 -2
  27. package/dist/context-mention-palette/index.js +6 -6
  28. package/dist/i18n/index.d.ts +2 -0
  29. package/dist/i18n/index.js +2 -2
  30. package/dist/index.d.ts +28 -94
  31. package/dist/index.js +581 -458
  32. package/dist/index.js.map +1 -1
  33. package/dist/queued-prompt-runtime.d.ts +2 -2
  34. package/dist/{types-DUHHejs2.d.ts → types-BvztUbHf.d.ts} +31 -21
  35. package/dist/workbench/contribution.d.ts +9 -11
  36. package/dist/workbench/contribution.js +4 -4
  37. package/dist/workbench/index.d.ts +1 -1
  38. package/dist/workbench/index.js +7 -7
  39. package/dist/workbench/launch.d.ts +0 -1
  40. package/dist/workbench/launch.js +2 -2
  41. package/dist/workbench/providerCatalog.d.ts +0 -1
  42. package/dist/workbench/sessionTitle.d.ts +0 -1
  43. package/dist/workbench/sessionTitle.js +3 -3
  44. package/dist/workbench/state.d.ts +7 -2
  45. package/dist/workbench/state.js +3 -1
  46. package/dist/workbench/types.d.ts +0 -6
  47. package/dist/workbench/types.js +1 -1
  48. package/dist/workspace-agent-generated-files.js +3 -3
  49. package/package.json +14 -14
  50. package/dist/chunk-AA75BOX3.js.map +0 -1
  51. package/dist/chunk-BEM3KDOJ.js.map +0 -1
  52. package/dist/chunk-DBIJRSFG.js.map +0 -1
  53. package/dist/chunk-FIH7IYLX.js.map +0 -1
  54. /package/dist/{chunk-A2JPL5N6.js.map → chunk-3HARXLAZ.js.map} +0 -0
  55. /package/dist/{chunk-UNLTQUPO.js.map → chunk-4SQNOOJ3.js.map} +0 -0
  56. /package/dist/{chunk-L2ZMLLYL.js.map → chunk-7LMJXF4R.js.map} +0 -0
  57. /package/dist/{chunk-CVPWQHQH.js.map → chunk-AOVPGJBC.js.map} +0 -0
  58. /package/dist/{chunk-3355GEBI.js.map → chunk-HOSX5C5V.js.map} +0 -0
  59. /package/dist/{chunk-CXJEQQR5.js.map → chunk-KQE5KV2V.js.map} +0 -0
  60. /package/dist/{chunk-N7EX6XK3.js.map → chunk-SXDLSEHO.js.map} +0 -0
  61. /package/dist/{chunk-MQ6WW3CD.js.map → chunk-U7D7G3UU.js.map} +0 -0
  62. /package/dist/{chunk-6YLA7R4S.js.map → chunk-UNO7CEAF.js.map} +0 -0
  63. /package/dist/{chunk-HUNUSBQQ.js.map → chunk-XQUUELKF.js.map} +0 -0
package/dist/index.js CHANGED
@@ -6,33 +6,24 @@ import {
6
6
  agentGuiDockIconUrl,
7
7
  agentGuiDockIconUrls,
8
8
  clampAgentGUIConversationRailWidthPx,
9
+ normalizeAgentGUIAgents,
10
+ projectAgentGUIAgentsToInternalTargets,
9
11
  resolveAgentGUIConversationRailMaxWidthPx,
10
12
  resolveAgentGUIExpandedWindowFrame,
11
13
  resolveAgentGuiSessionProviderFlatIconUrl,
12
14
  resolveNextAgentGUIConversationRailWidthPx,
13
15
  shouldAutoCollapseAgentGUIConversationRail
14
- } from "./chunk-DBIJRSFG.js";
15
- import {
16
- agentGUIDefaultTargetProviders,
17
- agentGUIProviderTargetRefsEqual,
18
- createDisabledPlaceholderAgentGUIProviderTarget,
19
- createLocalAgentGUIProviderTarget,
20
- createLocalAgentGUIProviderTargets,
21
- createSharedAgentGUIProviderTarget,
22
- localAgentGUIAgentTargetId,
23
- localAgentGUIProviderTargetId,
24
- normalizeAgentGUIProviderTargets,
25
- resolveAgentGUIProviderTarget
26
- } from "./chunk-BEM3KDOJ.js";
27
- import "./chunk-L2ZMLLYL.js";
28
- import "./chunk-BT2DT2P7.js";
16
+ } from "./chunk-A7RA7ORT.js";
17
+ import "./chunk-45FF4DQU.js";
18
+ import "./chunk-7LMJXF4R.js";
19
+ import "./chunk-GAPTLVII.js";
29
20
  import {
30
21
  resolveAgentGuiWorkbenchProviderLabel
31
22
  } from "./chunk-XW4CVBUH.js";
32
23
  import {
33
24
  AgentInteractivePromptSurface,
34
25
  approvalOptionDisplayLabel
35
- } from "./chunk-N7EX6XK3.js";
26
+ } from "./chunk-SXDLSEHO.js";
36
27
  import {
37
28
  PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
38
29
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -51,7 +42,7 @@ import {
51
42
  resolveAgentGUIExplicitConversationTitle,
52
43
  resolveAgentGUIProviderDisplayLabel,
53
44
  resolveAgentGUIProviderIdentity
54
- } from "./chunk-3355GEBI.js";
45
+ } from "./chunk-HOSX5C5V.js";
55
46
  import {
56
47
  AGENT_PASTED_TEXT_BLOCK_KIND,
57
48
  AGENT_PASTED_TEXT_MENTION_KIND,
@@ -88,14 +79,14 @@ import {
88
79
  textPromptContent,
89
80
  toLocalShortDateTime,
90
81
  useProjectedAgentConversation
91
- } from "./chunk-FIH7IYLX.js";
82
+ } from "./chunk-7FZT2OYT.js";
92
83
  import {
93
84
  AgentMessageMarkdown,
94
85
  AgentTargetPresentationProvider,
95
86
  ZoomableImage,
96
87
  cn,
97
88
  resolveWorkspaceLinkAction
98
- } from "./chunk-HUNUSBQQ.js";
89
+ } from "./chunk-XQUUELKF.js";
99
90
  import {
100
91
  openAgentEnvPanel
101
92
  } from "./chunk-PSLAWU25.js";
@@ -106,12 +97,12 @@ import {
106
97
  DEFAULT_AGENT_MENTION_FILTER,
107
98
  agentMentionItemKey,
108
99
  preloadAgentMentionBrowse
109
- } from "./chunk-UNLTQUPO.js";
100
+ } from "./chunk-4SQNOOJ3.js";
110
101
  import {
111
102
  buildWorkspaceAgentActivityListViewModel,
112
103
  isWorkspaceAgentUntitledTask
113
- } from "./chunk-A2JPL5N6.js";
114
- import "./chunk-CVPWQHQH.js";
104
+ } from "./chunk-3HARXLAZ.js";
105
+ import "./chunk-AOVPGJBC.js";
115
106
  import {
116
107
  resolveWorkspaceAgentSessionSortTimeUnixMs
117
108
  } from "./chunk-IBIMGLCD.js";
@@ -125,7 +116,7 @@ import {
125
116
  mentionItemToAttrs,
126
117
  normalizeAgentSessionMentionTitle,
127
118
  parseMentionItemFromHref
128
- } from "./chunk-CXJEQQR5.js";
119
+ } from "./chunk-KQE5KV2V.js";
129
120
  import "./chunk-Y35GDLP2.js";
130
121
  import "./chunk-LUGELG5V.js";
131
122
  import {
@@ -166,14 +157,14 @@ import {
166
157
  agentGuiI18nResources,
167
158
  translate,
168
159
  useTranslation
169
- } from "./chunk-MQ6WW3CD.js";
160
+ } from "./chunk-U7D7G3UU.js";
170
161
  import "./chunk-PJP5BUU6.js";
171
162
  import {
172
163
  agentColorfulUrl,
173
164
  cursorColorfulUrl,
174
165
  normalizeManagedAgentProvider
175
166
  } from "./chunk-XDV4ZRVK.js";
176
- import "./chunk-AA75BOX3.js";
167
+ import "./chunk-VWXFFSIM.js";
177
168
  import {
178
169
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
179
170
  } from "./chunk-JM24HADP.js";
@@ -2374,6 +2365,169 @@ var DEFAULT_AGENT_SETTINGS = {
2374
2365
  hideWorktreeMismatchDropWarning: false
2375
2366
  };
2376
2367
 
2368
+ // providerTargets.ts
2369
+ var agentGUIProviderTargetStaticLabels = {
2370
+ "claude-code": "Claude Code",
2371
+ codex: "Codex",
2372
+ cursor: "Cursor",
2373
+ hermes: "Hermes",
2374
+ nexight: "Tutti Agent",
2375
+ openclaw: "OpenClaw",
2376
+ opencode: "Open Code",
2377
+ "tutti-agent": "Tutti Agent"
2378
+ };
2379
+ var agentGUIDefaultTargetProviders = [
2380
+ "codex",
2381
+ "claude-code",
2382
+ "cursor",
2383
+ "tutti-agent",
2384
+ "opencode",
2385
+ "hermes",
2386
+ "openclaw"
2387
+ ];
2388
+ var agentGUIDisabledPlaceholderProviders = [
2389
+ "hermes",
2390
+ "openclaw"
2391
+ ];
2392
+ function createLocalAgentGUIProviderTarget(provider) {
2393
+ const targetId = localAgentGUIProviderTargetId(provider);
2394
+ const agentTargetId = localAgentGUIAgentTargetId(provider);
2395
+ return {
2396
+ targetId,
2397
+ ...agentTargetId ? { agentTargetId } : {},
2398
+ provider,
2399
+ ref: {
2400
+ kind: "local",
2401
+ provider
2402
+ },
2403
+ label: agentGUIProviderTargetStaticLabels[provider] ?? provider
2404
+ };
2405
+ }
2406
+ function createDisabledPlaceholderAgentGUIProviderTarget(provider) {
2407
+ return {
2408
+ ...createLocalAgentGUIProviderTarget(provider),
2409
+ disabled: true
2410
+ };
2411
+ }
2412
+ function createStaticAgentGUIProviderTargets(providers = agentGUIDefaultTargetProviders, options) {
2413
+ const disabledProviders = new Set(
2414
+ options?.includeDisabledPlaceholders === true ? agentGUIDisabledPlaceholderProviders : []
2415
+ );
2416
+ return providers.map(
2417
+ (provider) => disabledProviders.has(provider) ? createDisabledPlaceholderAgentGUIProviderTarget(provider) : createLocalAgentGUIProviderTarget(provider)
2418
+ );
2419
+ }
2420
+ function localAgentGUIProviderTargetId(provider) {
2421
+ return `local:${provider}`;
2422
+ }
2423
+ function localAgentGUIAgentTargetId(provider) {
2424
+ switch (provider) {
2425
+ case "codex":
2426
+ return "local:codex";
2427
+ case "claude-code":
2428
+ return "local:claude-code";
2429
+ case "tutti-agent":
2430
+ return "local:tutti-agent";
2431
+ case "cursor":
2432
+ return "local:cursor";
2433
+ case "hermes":
2434
+ return "local:hermes";
2435
+ case "nexight":
2436
+ return "local:nexight";
2437
+ case "openclaw":
2438
+ return "local:openclaw";
2439
+ case "opencode":
2440
+ return "local:opencode";
2441
+ default:
2442
+ return null;
2443
+ }
2444
+ }
2445
+ function normalizeAgentGUIProviderTargets(targets, options) {
2446
+ const includeDisabledPlaceholders = options?.includeDisabledPlaceholders === true;
2447
+ const useStaticCatalog = options?.useStaticCatalog !== false;
2448
+ const source = targets && targets.length > 0 ? targets : [];
2449
+ const normalizedTargets = [];
2450
+ const seenTargetKeys = /* @__PURE__ */ new Set();
2451
+ const seenProviders = /* @__PURE__ */ new Set();
2452
+ for (const target of source) {
2453
+ const normalized = normalizeAgentGUIProviderTarget(target);
2454
+ if (!normalized) {
2455
+ continue;
2456
+ }
2457
+ const dedupeKey = `${normalized.provider}\0${normalized.targetId}`;
2458
+ if (seenTargetKeys.has(dedupeKey)) {
2459
+ continue;
2460
+ }
2461
+ seenTargetKeys.add(dedupeKey);
2462
+ seenProviders.add(normalized.provider);
2463
+ normalizedTargets.push(normalized);
2464
+ }
2465
+ if (includeDisabledPlaceholders && normalizedTargets.length > 0) {
2466
+ for (const provider of agentGUIDisabledPlaceholderProviders) {
2467
+ if (seenProviders.has(provider)) {
2468
+ continue;
2469
+ }
2470
+ normalizedTargets.push(
2471
+ createDisabledPlaceholderAgentGUIProviderTarget(provider)
2472
+ );
2473
+ }
2474
+ }
2475
+ return normalizedTargets.length > 0 || !useStaticCatalog ? normalizedTargets : createStaticAgentGUIProviderTargets(void 0, {
2476
+ includeDisabledPlaceholders
2477
+ });
2478
+ }
2479
+ function normalizeAgentGUIProviderTarget(target) {
2480
+ const {
2481
+ targetId: _targetId,
2482
+ agentTargetId: _agentTargetId,
2483
+ provider: _provider,
2484
+ ref: _ref,
2485
+ label: _label,
2486
+ badge,
2487
+ description,
2488
+ iconUrl,
2489
+ ownerLabel,
2490
+ unavailableReason,
2491
+ ...rest
2492
+ } = target;
2493
+ const targetId = target.targetId.trim();
2494
+ const agentTargetId = target.agentTargetId?.trim();
2495
+ const label = target.label.trim();
2496
+ const kind = typeof target.ref.kind === "string" ? target.ref.kind.trim() : "";
2497
+ if (!targetId || !label || !kind || target.ref.provider !== target.provider) {
2498
+ return null;
2499
+ }
2500
+ const normalizedBadge = normalizeAgentGUIProviderTargetBadge(badge);
2501
+ return {
2502
+ ...rest,
2503
+ targetId,
2504
+ ...agentTargetId ? { agentTargetId } : {},
2505
+ provider: target.provider,
2506
+ ref: {
2507
+ ...target.ref,
2508
+ kind,
2509
+ provider: target.provider
2510
+ },
2511
+ label,
2512
+ ...normalizedBadge ? { badge: normalizedBadge } : {},
2513
+ ...description?.trim() ? { description: description.trim() } : {},
2514
+ ...iconUrl?.trim() ? { iconUrl: iconUrl.trim() } : {},
2515
+ ...ownerLabel?.trim() ? { ownerLabel: ownerLabel.trim() } : {},
2516
+ ...unavailableReason?.trim() ? { unavailableReason: unavailableReason.trim() } : {}
2517
+ };
2518
+ }
2519
+ function normalizeAgentGUIProviderTargetBadge(badge) {
2520
+ const iconUrl = badge?.iconUrl?.trim() ?? "";
2521
+ if (!iconUrl) {
2522
+ return null;
2523
+ }
2524
+ const label = badge?.label?.trim() ?? "";
2525
+ return {
2526
+ iconUrl,
2527
+ ...label ? { label } : {}
2528
+ };
2529
+ }
2530
+
2377
2531
  // agent-gui/agentGuiNode/model/agentGuiConversationFilter.ts
2378
2532
  function createAgentGUIConversationFilterState(filter = { kind: "all" }) {
2379
2533
  return {
@@ -6860,7 +7014,7 @@ function composerTargetDataFromProviderTarget(input) {
6860
7014
  const currentAgentTargetId = normalizeOptionalText2(
6861
7015
  input.current.agentTargetId
6862
7016
  );
6863
- const canPromoteLegacyComposerOverrides = agentTargetId !== null && currentAgentTargetId === null && normalizeOptionalText2(input.current.providerTargetId) === null && input.current.providerTargetRef == null && input.current.provider === input.target.provider && input.current.composerOverrides != null && !input.current.composerOverridesByAgentTargetId?.[agentTargetId];
7017
+ const canPromoteLegacyComposerOverrides = agentTargetId !== null && currentAgentTargetId === null && input.current.provider === input.target.provider && input.current.composerOverrides != null && !input.current.composerOverridesByAgentTargetId?.[agentTargetId];
6864
7018
  const composerOverridesByAgentTargetId = canPromoteLegacyComposerOverrides ? {
6865
7019
  ...input.current.composerOverridesByAgentTargetId ?? {},
6866
7020
  [agentTargetId]: input.current.composerOverrides
@@ -6869,15 +7023,11 @@ function composerTargetDataFromProviderTarget(input) {
6869
7023
  return {
6870
7024
  agentTargetId,
6871
7025
  provider: input.target.provider,
6872
- providerTargetId: null,
6873
- providerTargetRef: null,
6874
7026
  targetId: input.target.targetId,
6875
7027
  data: {
6876
7028
  ...input.current,
6877
7029
  provider: input.target.provider,
6878
7030
  agentTargetId,
6879
- providerTargetId: null,
6880
- providerTargetRef: null,
6881
7031
  composerOverrides: canPromoteLegacyComposerOverrides ? null : currentTargetIdentityChanged ? null : input.current.composerOverrides,
6882
7032
  composerOverridesByAgentTargetId
6883
7033
  }
@@ -6885,7 +7035,7 @@ function composerTargetDataFromProviderTarget(input) {
6885
7035
  }
6886
7036
  function isExplicitAgentGUIProviderTarget(target, explicitTargets) {
6887
7037
  return explicitTargets.some(
6888
- (candidate) => candidate.provider === target.provider && candidate.targetId === target.targetId && agentGUIProviderTargetRefsEqual(candidate.ref, target.ref)
7038
+ (candidate) => candidate.agentTargetId === target.agentTargetId
6889
7039
  );
6890
7040
  }
6891
7041
  function findAgentGUIDirectoryTarget(directory, agentTargetId) {
@@ -6896,21 +7046,26 @@ function findAgentGUIDirectoryTarget(directory, agentTargetId) {
6896
7046
  (target) => normalizeOptionalText2(target.agentTargetId) === agentTargetId
6897
7047
  );
6898
7048
  }
7049
+ function resolveAgentGUIDirectorySelection(input) {
7050
+ const agentTargetId = normalizeOptionalText2(input.agentTargetId);
7051
+ if (agentTargetId) {
7052
+ return findAgentGUIDirectoryTarget(input.targets, agentTargetId) ?? null;
7053
+ }
7054
+ const providerTargets = input.provider ? input.targets.filter((target) => target.provider === input.provider) : [];
7055
+ return providerTargets.find((target) => target.disabled !== true) ?? providerTargets[0] ?? input.targets.find((target) => target.disabled !== true) ?? input.targets[0] ?? null;
7056
+ }
6899
7057
  function composerTargetDataFromNodeData(data, directory) {
6900
7058
  const foreignKeyAgentTargetId = normalizeOptionalText2(data.agentTargetId);
6901
- const lookupAgentTargetId = foreignKeyAgentTargetId ?? localAgentGUIAgentTargetId(data.provider);
6902
7059
  const directoryTarget = findAgentGUIDirectoryTarget(
6903
7060
  directory,
6904
- lookupAgentTargetId
7061
+ foreignKeyAgentTargetId
6905
7062
  );
6906
7063
  const agentTargetId = normalizeOptionalText2(directoryTarget?.agentTargetId) ?? foreignKeyAgentTargetId;
6907
7064
  const provider = directoryTarget?.provider ?? data.provider;
6908
7065
  return {
6909
7066
  agentTargetId,
6910
7067
  provider,
6911
- providerTargetId: null,
6912
- providerTargetRef: null,
6913
- targetId: directoryTarget?.targetId ?? agentTargetId ?? `local:${provider}`,
7068
+ targetId: directoryTarget?.targetId ?? agentTargetId ?? "__missing__",
6914
7069
  data: directoryTarget && directoryTarget.provider !== data.provider ? { ...data, provider } : data
6915
7070
  };
6916
7071
  }
@@ -6920,18 +7075,17 @@ function resolveActiveSessionComposerTarget(input) {
6920
7075
  if (input.directoryLoading) {
6921
7076
  return { status: "loading", target, missingAgentTargetId: null };
6922
7077
  }
6923
- const resolveKey = foreignKey ?? localAgentGUIAgentTargetId(input.data.provider);
6924
7078
  const directoryTarget = findAgentGUIDirectoryTarget(
6925
7079
  input.directory,
6926
- resolveKey
7080
+ foreignKey
6927
7081
  );
6928
7082
  if (directoryTarget) {
6929
7083
  return { status: "resolved", target, missingAgentTargetId: null };
6930
7084
  }
6931
- return { status: "missing", target, missingAgentTargetId: resolveKey };
7085
+ return { status: "missing", target, missingAgentTargetId: foreignKey };
6932
7086
  }
6933
7087
  function agentGUINodeDataHasComposerTarget(data) {
6934
- return normalizeOptionalText2(data.agentTargetId) !== null || normalizeOptionalText2(data.providerTargetId) !== null || data.providerTargetRef != null;
7088
+ return normalizeOptionalText2(data.agentTargetId) !== null;
6935
7089
  }
6936
7090
  function composerOptionsForTarget(input) {
6937
7091
  if (!input.target.agentTargetId) {
@@ -6985,7 +7139,7 @@ function sanitizeComposerSettingsForTarget(input) {
6985
7139
  return sanitizeComposerSettingsForOptions(input.settings, input.options);
6986
7140
  }
6987
7141
  function agentGUIProviderTargetsEqual(left, right) {
6988
- return left.provider === right.provider && left.targetId === right.targetId && (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && agentGUIProviderTargetRefsEqual(left.ref, right.ref);
7142
+ return (left.agentTargetId ?? left.targetId) === (right.agentTargetId ?? right.targetId);
6989
7143
  }
6990
7144
  function reportAgentGUIDiagnostic(runtime, input) {
6991
7145
  const reportDiagnostic = runtime.reportDiagnostic;
@@ -7037,9 +7191,9 @@ function showAgentGUIControllerErrorToast(hostToast, message) {
7037
7191
  function reportAgentGUIConversationFilterTargetUnresolved(input) {
7038
7192
  reportAgentGUIDiagnostic(input.runtime, {
7039
7193
  details: {
7194
+ agentTargetId: input.agentTargetId,
7040
7195
  provider: input.provider,
7041
7196
  providerTargetCount: input.providerTargetCount,
7042
- providerTargetId: input.providerTargetId,
7043
7197
  reason: input.reason
7044
7198
  },
7045
7199
  event: "agent.gui.conversation_filter.target_unresolved",
@@ -8158,20 +8312,6 @@ function normalizeOptionalText2(value) {
8158
8312
  const trimmed = value.trim();
8159
8313
  return trimmed ? trimmed : null;
8160
8314
  }
8161
- function resolveSameProviderActiveSessionModel(input) {
8162
- const agentSessionId = normalizeOptionalText2(input.agentSessionId);
8163
- if (agentSessionId === null) {
8164
- return null;
8165
- }
8166
- const runtimeSession = input.runtime.getSnapshot(input.workspaceId).sessions.find(
8167
- (candidate) => candidate.agentSessionId.trim() === agentSessionId
8168
- ) ?? null;
8169
- const activeProvider = normalizeOptionalText2(runtimeSession?.provider) ?? normalizeOptionalText2(input.activeProvider);
8170
- if (activeProvider !== input.provider) {
8171
- return null;
8172
- }
8173
- return normalizeOptionalText2(input.sessionState?.settings?.model) ?? normalizeOptionalText2(runtimeSession?.model);
8174
- }
8175
8315
  function normalizeOptionalPrompt(value) {
8176
8316
  return typeof value === "string" ? value.trim() : "";
8177
8317
  }
@@ -9007,16 +9147,6 @@ function normalizedPositiveNumber2(value) {
9007
9147
  function timelineItemTime(item) {
9008
9148
  return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? 0;
9009
9149
  }
9010
- var emptyComingSoonProviders = [];
9011
- function applyComingSoonProviderTargets(targets, comingSoonProviders) {
9012
- if (comingSoonProviders.length === 0) {
9013
- return targets;
9014
- }
9015
- const comingSoon = new Set(comingSoonProviders);
9016
- return targets.map(
9017
- (target) => comingSoon.has(target.provider) && target.disabled !== true ? { ...target, disabled: true } : target
9018
- );
9019
- }
9020
9150
  function useAgentGUINodeController({
9021
9151
  nodeId,
9022
9152
  workspaceId,
@@ -9026,10 +9156,8 @@ function useAgentGUINodeController({
9026
9156
  data,
9027
9157
  providerTargets,
9028
9158
  providerTargetsLoading = false,
9029
- providerRailMode = "catalog",
9030
- comingSoonProviders,
9031
9159
  providerReadinessGates = null,
9032
- defaultProviderTargetId = null,
9160
+ defaultAgentTargetId = null,
9033
9161
  openSessionRequest = null,
9034
9162
  prefillPromptRequest = null,
9035
9163
  previewMode = false,
@@ -9058,42 +9186,16 @@ function useAgentGUINodeController({
9058
9186
  const agentQueuedPromptRuntime = useAgentQueuedPromptRuntime();
9059
9187
  const agentHostApi = useAgentHostApi();
9060
9188
  const agentActivitySnapshot = useAgentActivitySnapshot(workspaceId);
9061
- const normalizedComingSoonProviders = useMemo3(
9062
- () => comingSoonProviders && comingSoonProviders.length > 0 ? [...comingSoonProviders] : emptyComingSoonProviders,
9063
- [comingSoonProviders]
9064
- );
9065
- const isExactProviderRailMode = providerRailMode === "exact";
9066
- const normalizedExplicitProviderTargets = useMemo3(() => {
9067
- const normalized = normalizeAgentGUIProviderTargets(providerTargets, {
9068
- includeDisabledPlaceholders: !isExactProviderRailMode,
9069
- useStaticCatalog: false
9070
- });
9071
- return isExactProviderRailMode ? normalized : applyComingSoonProviderTargets(
9072
- normalized,
9073
- normalizedComingSoonProviders
9074
- );
9075
- }, [isExactProviderRailMode, normalizedComingSoonProviders, providerTargets]);
9076
- const normalizedProviderTargets = useMemo3(() => {
9077
- if (providerTargetsLoading) {
9078
- return [];
9079
- }
9080
- if (!isExactProviderRailMode && (providerTargets === void 0 || normalizedExplicitProviderTargets.length === 0)) {
9081
- return applyComingSoonProviderTargets(
9082
- normalizeAgentGUIProviderTargets(null, {
9083
- includeDisabledPlaceholders: true
9084
- }),
9085
- normalizedComingSoonProviders
9086
- );
9087
- }
9088
- return normalizedExplicitProviderTargets;
9089
- }, [
9090
- isExactProviderRailMode,
9091
- normalizedExplicitProviderTargets,
9092
- normalizedComingSoonProviders,
9093
- providerTargets,
9094
- providerTargetsLoading
9095
- ]);
9096
- const shouldUseStaticProviderTargets = !isExactProviderRailMode && !providerTargetsLoading && (providerTargets === void 0 || normalizedExplicitProviderTargets.length === 0);
9189
+ const normalizedExplicitProviderTargets = useMemo3(
9190
+ () => normalizeAgentGUIProviderTargets(providerTargets, {
9191
+ // AgentGUINode always passes the projected `/agents` array, including
9192
+ // an explicit empty array. The undefined branch exists only for direct
9193
+ // package-internal controller harnesses and legacy tests.
9194
+ useStaticCatalog: providerTargets === void 0
9195
+ }),
9196
+ [providerTargets]
9197
+ );
9198
+ const normalizedProviderTargets = providerTargetsLoading ? [] : normalizedExplicitProviderTargets;
9097
9199
  const handoffProviderTargets = useMemo3(
9098
9200
  () => providerTargetsLoading ? [] : normalizedExplicitProviderTargets.filter(
9099
9201
  (target) => target.disabled !== true
@@ -9101,14 +9203,10 @@ function useAgentGUINodeController({
9101
9203
  [normalizedExplicitProviderTargets, providerTargetsLoading]
9102
9204
  );
9103
9205
  const selectedProviderTarget = useMemo3(() => {
9104
- const resolved = resolveAgentGUIProviderTarget({
9105
- agentTargetId: data.agentTargetId,
9106
- defaultProviderTargetId,
9107
- provider: data.provider,
9108
- providerTargetId: data.providerTargetId,
9109
- providerTargets: normalizedProviderTargets,
9110
- useStaticCatalog: shouldUseStaticProviderTargets
9111
- });
9206
+ const selectedAgentTargetId = normalizeOptionalText2(data.agentTargetId) ?? normalizeOptionalText2(defaultAgentTargetId);
9207
+ const resolved = normalizedProviderTargets.find(
9208
+ (target) => target.agentTargetId === selectedAgentTargetId
9209
+ ) ?? normalizedProviderTargets.find((target) => target.disabled !== true) ?? normalizedProviderTargets[0];
9112
9210
  return resolved ?? {
9113
9211
  targetId: data.agentTargetId ?? "__loading__",
9114
9212
  provider: data.provider,
@@ -9122,27 +9220,19 @@ function useAgentGUINodeController({
9122
9220
  }, [
9123
9221
  data.agentTargetId,
9124
9222
  data.provider,
9125
- data.providerTargetId,
9126
- defaultProviderTargetId,
9127
- normalizedProviderTargets,
9128
- shouldUseStaticProviderTargets
9223
+ defaultAgentTargetId,
9224
+ normalizedProviderTargets
9129
9225
  ]);
9130
9226
  const selectedProviderTargetIsExplicit = useMemo3(
9131
9227
  () => normalizedExplicitProviderTargets.some(
9132
- (target) => target.provider === selectedProviderTarget.provider && target.targetId === selectedProviderTarget.targetId && agentGUIProviderTargetRefsEqual(
9133
- target.ref,
9134
- selectedProviderTarget.ref
9135
- )
9228
+ (target) => target.agentTargetId === selectedProviderTarget.agentTargetId
9136
9229
  ),
9137
9230
  [normalizedExplicitProviderTargets, selectedProviderTarget]
9138
9231
  );
9139
9232
  const [homeComposerTargetOverride, setHomeComposerTargetOverride] = useState4(null);
9140
9233
  const homeComposerTargetOverrideIsExplicit = useMemo3(
9141
9234
  () => homeComposerTargetOverride ? normalizedExplicitProviderTargets.some(
9142
- (target) => target.provider === homeComposerTargetOverride.provider && target.targetId === homeComposerTargetOverride.targetId && agentGUIProviderTargetRefsEqual(
9143
- target.ref,
9144
- homeComposerTargetOverride.ref
9145
- )
9235
+ (target) => target.agentTargetId === homeComposerTargetOverride.agentTargetId
9146
9236
  ) : false,
9147
9237
  [homeComposerTargetOverride, normalizedExplicitProviderTargets]
9148
9238
  );
@@ -9155,10 +9245,7 @@ function useAgentGUINodeController({
9155
9245
  (target) => target.disabled !== true && providerReadinessGates[target.provider] === null
9156
9246
  ) ?? null;
9157
9247
  }, [normalizedProviderTargets, providerReadinessGates]);
9158
- const nodeComposerTargetResolvedByProviderTarget = agentGUINodeDataHasComposerTarget(data) && (normalizeOptionalText2(data.agentTargetId) !== null && selectedProviderTarget.agentTargetId === normalizeOptionalText2(data.agentTargetId) || normalizeOptionalText2(data.providerTargetId) !== null && selectedProviderTarget.targetId === normalizeOptionalText2(data.providerTargetId) || data.providerTargetRef != null && agentGUIProviderTargetRefsEqual(
9159
- selectedProviderTarget.ref,
9160
- data.providerTargetRef
9161
- ));
9248
+ const nodeComposerTargetResolvedByProviderTarget = agentGUINodeDataHasComposerTarget(data) && selectedProviderTarget.agentTargetId === normalizeOptionalText2(data.agentTargetId);
9162
9249
  const selectedComposerTargetData = useMemo3(
9163
9250
  () => homeComposerTargetOverride ? composerTargetDataFromProviderTarget({
9164
9251
  current: data,
@@ -9168,7 +9255,7 @@ function useAgentGUINodeController({
9168
9255
  current: data,
9169
9256
  isExplicit: selectedProviderTargetIsExplicit,
9170
9257
  target: selectedProviderTarget
9171
- }) : agentGUINodeDataHasComposerTarget(data) ? composerTargetDataFromNodeData(data, normalizedProviderTargets) : composerTargetDataFromProviderTarget({
9258
+ }) : agentGUINodeDataHasComposerTarget(data) && data.lastActiveAgentSessionId !== null ? composerTargetDataFromNodeData(data, normalizedProviderTargets) : composerTargetDataFromProviderTarget({
9172
9259
  current: data,
9173
9260
  isExplicit: selectedProviderTargetIsExplicit,
9174
9261
  target: selectedProviderTarget
@@ -9618,7 +9705,7 @@ function useAgentGUINodeController({
9618
9705
  const pendingHomeErrorRef = useRef4(null);
9619
9706
  const activatedConversationIdsRef = useRef4(/* @__PURE__ */ new Set());
9620
9707
  const failedNewConversationIdsRef = useRef4(/* @__PURE__ */ new Set());
9621
- const lastActiveModelByProviderRef = useRef4({});
9708
+ const lastActiveModelByAgentTargetIdRef = useRef4({});
9622
9709
  const pendingTurnIdBySessionIdRef = useRef4({});
9623
9710
  const submitTraceBySessionIdRef = useRef4({});
9624
9711
  const conversationIdsRef = useRef4(
@@ -12023,14 +12110,14 @@ function useAgentGUINodeController({
12023
12110
  (initialContentInput, displayPrompt) => {
12024
12111
  const target = selectedProviderTargetRef.current;
12025
12112
  const targetData = selectedComposerTargetDataRef.current;
12026
- if (isCreatingConversation || target.disabled === true || targetData.provider === "openclaw" && openclawGateway?.status !== "ready") {
12027
- return;
12028
- }
12029
12113
  const agentTargetId = targetData.agentTargetId ?? "";
12030
12114
  if (!agentTargetId || providerTargetsProvidedRef.current && !selectedProviderTargetIsExplicitRef.current) {
12031
12115
  setDetailError(translate("agentHost.agentGui.agentTargetRequired"));
12032
12116
  return;
12033
12117
  }
12118
+ if (isCreatingConversation || target.disabled === true || targetData.provider === "openclaw" && openclawGateway?.status !== "ready") {
12119
+ return;
12120
+ }
12034
12121
  const normalizedInitialContent = Array.isArray(initialContentInput) ? normalizeAgentPromptContentBlocks(
12035
12122
  initialContentInput
12036
12123
  ) : textPromptContent(normalizeOptionalPrompt(initialContentInput));
@@ -12057,15 +12144,10 @@ function useAgentGUINodeController({
12057
12144
  const provider = targetData.provider;
12058
12145
  const agentTargetId2 = targetData.agentTargetId ?? "";
12059
12146
  onDataChangeRef.current(
12060
- (current) => current.provider === provider && (current.agentTargetId ?? null) === (agentTargetId2 || null) && (current.providerTargetId ?? null) === targetData.providerTargetId && agentGUIProviderTargetRefsEqual(
12061
- current.providerTargetRef,
12062
- targetData.providerTargetRef
12063
- ) ? current : {
12147
+ (current) => current.provider === provider && (current.agentTargetId ?? null) === (agentTargetId2 || null) ? current : {
12064
12148
  ...current,
12065
12149
  provider,
12066
- agentTargetId: agentTargetId2 || null,
12067
- providerTargetId: targetData.providerTargetId,
12068
- providerTargetRef: targetData.providerTargetRef
12150
+ agentTargetId: agentTargetId2 || null
12069
12151
  }
12070
12152
  );
12071
12153
  const selectedProjectPath2 = selectedProjectPathRef.current;
@@ -12094,15 +12176,8 @@ function useAgentGUINodeController({
12094
12176
  currentActiveConversationId,
12095
12177
  transientConversationRef.current
12096
12178
  ) : null;
12097
- const inheritedModel = normalizeOptionalText2(targetSafeInitialNodeSettings.model) === null ? resolveSameProviderActiveSessionModel({
12098
- activeProvider: currentActiveConversation?.provider ?? null,
12099
- agentSessionId: currentActiveConversationId,
12100
- provider,
12101
- runtime: agentActivityRuntime,
12102
- sessionState: activeSessionState,
12103
- workspaceId
12104
- }) ?? normalizeOptionalText2(
12105
- lastActiveModelByProviderRef.current[provider]
12179
+ const inheritedModel = normalizeOptionalText2(targetSafeInitialNodeSettings.model) === null ? normalizeOptionalText2(
12180
+ lastActiveModelByAgentTargetIdRef.current[agentTargetId2]
12106
12181
  ) : null;
12107
12182
  const effectiveInitialSettings = inheritedModel === null ? initialSettings : { ...initialSettings, model: inheritedModel };
12108
12183
  const targetSafeEffectiveInitialSettings = sanitizeComposerSettingsForTarget({
@@ -12571,12 +12646,10 @@ function useAgentGUINodeController({
12571
12646
  }
12572
12647
  const filter = conversationFilterRef.current;
12573
12648
  if (filter.kind === "agentTarget") {
12574
- const filterTarget = resolveAgentGUIProviderTarget({
12649
+ const filterTarget = resolveAgentGUIDirectorySelection({
12575
12650
  agentTargetId: filter.agentTargetId,
12576
- defaultProviderTargetId,
12577
12651
  provider: dataRef.current.provider,
12578
- providerTargets: normalizedProviderTargets,
12579
- useStaticCatalog: false
12652
+ targets: normalizedProviderTargets
12580
12653
  });
12581
12654
  if (filterTarget && filterTarget.disabled !== true && (filterTarget.agentTargetId?.trim() ?? "") === filter.agentTargetId) {
12582
12655
  setHomeComposerTargetOverride(filterTarget);
@@ -12615,7 +12688,7 @@ function useAgentGUINodeController({
12615
12688
  [
12616
12689
  activation,
12617
12690
  agentActivityRuntime,
12618
- defaultProviderTargetId,
12691
+ defaultAgentTargetId,
12619
12692
  loadDraftComposerOptions,
12620
12693
  normalizedProviderTargets,
12621
12694
  persistActiveConversation,
@@ -12629,7 +12702,20 @@ function useAgentGUINodeController({
12629
12702
  if (handledPrefillPromptSequenceRef.current === prefillPromptRequest.sequence) {
12630
12703
  return;
12631
12704
  }
12705
+ if (providerTargetsLoading && prefillPromptRequest.agentTargetId?.trim()) {
12706
+ return;
12707
+ }
12708
+ const selectedTargetData = selectedComposerTargetDataRef.current;
12709
+ const prefillTargetHinted = Boolean(prefillPromptRequest.provider) || Boolean(prefillPromptRequest.agentTargetId);
12710
+ const prefillTarget = prefillTargetHinted ? resolveAgentGUIDirectorySelection({
12711
+ agentTargetId: prefillPromptRequest.agentTargetId,
12712
+ provider: prefillPromptRequest.provider ?? selectedTargetData.provider,
12713
+ targets: normalizedProviderTargets
12714
+ }) : null;
12632
12715
  handledPrefillPromptSequenceRef.current = prefillPromptRequest.sequence;
12716
+ if (prefillPromptRequest.agentTargetId?.trim() && !prefillTarget) {
12717
+ return;
12718
+ }
12633
12719
  const draftPrompt2 = prefillPromptRequest.draftPrompt.trim();
12634
12720
  if (!draftPrompt2) {
12635
12721
  return;
@@ -12660,15 +12746,6 @@ function useAgentGUINodeController({
12660
12746
  setActiveConversationId(null);
12661
12747
  setIsLoadingMessages(false);
12662
12748
  setDetailError(null);
12663
- const selectedTargetData = selectedComposerTargetDataRef.current;
12664
- const prefillTargetHinted = Boolean(prefillPromptRequest.provider) || Boolean(prefillPromptRequest.agentTargetId);
12665
- const prefillTarget = prefillTargetHinted ? resolveAgentGUIProviderTarget({
12666
- agentTargetId: prefillPromptRequest.agentTargetId,
12667
- defaultProviderTargetId,
12668
- provider: prefillPromptRequest.provider ?? selectedTargetData.provider,
12669
- providerTargets: normalizedProviderTargets,
12670
- useStaticCatalog: shouldUseStaticProviderTargets
12671
- }) : null;
12672
12749
  const targetData = prefillTarget ? composerTargetDataFromProviderTarget({
12673
12750
  current: dataRef.current,
12674
12751
  isExplicit: isExplicitAgentGUIProviderTarget(
@@ -12717,14 +12794,14 @@ function useAgentGUINodeController({
12717
12794
  }, [
12718
12795
  activation,
12719
12796
  agentActivityRuntime,
12720
- defaultProviderTargetId,
12797
+ defaultAgentTargetId,
12721
12798
  loadDraftComposerOptions,
12722
12799
  normalizedExplicitProviderTargets,
12723
12800
  normalizedProviderTargets,
12724
12801
  persistActiveConversation,
12725
12802
  prefillPromptRequest,
12726
12803
  previewMode,
12727
- shouldUseStaticProviderTargets,
12804
+ providerTargetsLoading,
12728
12805
  workspaceId
12729
12806
  ]);
12730
12807
  const continueInNewConversation = useCallback4(() => {
@@ -13815,9 +13892,7 @@ function useAgentGUINodeController({
13815
13892
  {
13816
13893
  ...current,
13817
13894
  provider: targetData.provider,
13818
- agentTargetId: targetData.agentTargetId,
13819
- providerTargetId: targetData.providerTargetId,
13820
- providerTargetRef: targetData.providerTargetRef
13895
+ agentTargetId: targetData.agentTargetId
13821
13896
  },
13822
13897
  targetSafeMerged
13823
13898
  )
@@ -14871,12 +14946,10 @@ function useAgentGUINodeController({
14871
14946
  if (!providerMismatch && !agentTargetMismatch) {
14872
14947
  return;
14873
14948
  }
14874
- const sessionTarget = resolveAgentGUIProviderTarget({
14949
+ const sessionTarget = resolveAgentGUIDirectorySelection({
14875
14950
  agentTargetId: summaryAgentTargetId,
14876
- defaultProviderTargetId,
14877
14951
  provider: summary.provider,
14878
- providerTargets: normalizedProviderTargets,
14879
- useStaticCatalog: shouldUseStaticProviderTargets
14952
+ targets: normalizedProviderTargets
14880
14953
  });
14881
14954
  if (!sessionTarget || sessionTarget.provider !== summary.provider) {
14882
14955
  return;
@@ -14886,7 +14959,7 @@ function useAgentGUINodeController({
14886
14959
  }
14887
14960
  setHomeComposerTargetOverride(null);
14888
14961
  const sessionTargetIsExplicit = normalizedExplicitProviderTargets.some(
14889
- (target) => target.provider === sessionTarget.provider && target.targetId === sessionTarget.targetId && agentGUIProviderTargetRefsEqual(target.ref, sessionTarget.ref)
14962
+ (target) => agentGUIProviderTargetsEqual(target, sessionTarget)
14890
14963
  );
14891
14964
  onDataChangeRef.current((current) => {
14892
14965
  const targetData = composerTargetDataFromProviderTarget({
@@ -14894,10 +14967,7 @@ function useAgentGUINodeController({
14894
14967
  isExplicit: sessionTargetIsExplicit,
14895
14968
  target: sessionTarget
14896
14969
  });
14897
- if (current.provider === targetData.provider && normalizeOptionalText2(current.agentTargetId) === targetData.agentTargetId && (current.providerTargetId ?? null) === targetData.providerTargetId && agentGUIProviderTargetRefsEqual(
14898
- current.providerTargetRef,
14899
- targetData.providerTargetRef
14900
- )) {
14970
+ if (current.provider === targetData.provider && normalizeOptionalText2(current.agentTargetId) === targetData.agentTargetId) {
14901
14971
  return current;
14902
14972
  }
14903
14973
  dataRef.current = targetData.data;
@@ -14906,12 +14976,11 @@ function useAgentGUINodeController({
14906
14976
  }, [
14907
14977
  activeConversationId,
14908
14978
  conversations,
14909
- defaultProviderTargetId,
14979
+ defaultAgentTargetId,
14910
14980
  normalizedExplicitProviderTargets,
14911
14981
  normalizedProviderTargets,
14912
14982
  previewMode,
14913
- providerTargetsLoading,
14914
- shouldUseStaticProviderTargets
14983
+ providerTargetsLoading
14915
14984
  ]);
14916
14985
  const activeSessionTargetResolution = useMemo3(() => {
14917
14986
  if (previewMode || activeConversationId === null) {
@@ -15240,9 +15309,7 @@ function useAgentGUINodeController({
15240
15309
  {
15241
15310
  ...current,
15242
15311
  provider: selectedComposerTargetData.provider,
15243
- agentTargetId: selectedComposerTargetData.agentTargetId,
15244
- providerTargetId: selectedComposerTargetData.providerTargetId,
15245
- providerTargetRef: selectedComposerTargetData.providerTargetRef
15312
+ agentTargetId: selectedComposerTargetData.agentTargetId
15246
15313
  },
15247
15314
  targetSafeNodeDefaultSettings
15248
15315
  )
@@ -15280,24 +15347,23 @@ function useAgentGUINodeController({
15280
15347
  ) : null;
15281
15348
  const pendingInteractivePrompt = serverInteractivePrompt ?? planImplementationPromptVM;
15282
15349
  useEffect4(() => {
15283
- const provider = normalizeOptionalText2(
15284
- activeRuntimeSession?.provider ?? activeConversation?.provider
15285
- );
15286
- if (provider === null) {
15350
+ const agentTargetId = activeSessionTargetResolution.status === "resolved" ? normalizeOptionalText2(
15351
+ activeSessionTargetResolution.target.agentTargetId
15352
+ ) : null;
15353
+ if (agentTargetId === null) {
15287
15354
  return;
15288
15355
  }
15289
15356
  const model = normalizeOptionalText2(activeSessionState?.settings?.model) ?? normalizeOptionalText2(activeRuntimeSession?.model);
15290
15357
  if (model === null) {
15291
15358
  return;
15292
15359
  }
15293
- lastActiveModelByProviderRef.current = {
15294
- ...lastActiveModelByProviderRef.current,
15295
- [provider]: model
15360
+ lastActiveModelByAgentTargetIdRef.current = {
15361
+ ...lastActiveModelByAgentTargetIdRef.current,
15362
+ [agentTargetId]: model
15296
15363
  };
15297
15364
  }, [
15298
- activeConversation?.provider,
15365
+ activeSessionTargetResolution,
15299
15366
  activeRuntimeSession?.model,
15300
- activeRuntimeSession?.provider,
15301
15367
  activeSessionState?.settings?.model
15302
15368
  ]);
15303
15369
  const activeActivityDisplayStatus = activeConversationId ? agentActivityDisplayStatuses.get(activeConversationId) ?? null : null;
@@ -15358,7 +15424,7 @@ function useAgentGUINodeController({
15358
15424
  hasProviderSessionNotFoundError,
15359
15425
  pendingApproval
15360
15426
  ]);
15361
- const canSubmit = !providerTargetsLoading && activeLiveState !== "activating" && activeLiveState !== "failed" && !activeConversationResumeUnavailable && (activeConversationId !== null || effectiveSelectedProviderTarget.disabled !== true) && (composerTargetData.provider !== "openclaw" || openclawGateway?.status === "ready") && pendingApproval === null && pendingInteractivePrompt === null && sessionChrome.auth === null && !activeConversationBusy && !isCreatingConversation && !isSubmitting && !isInterrupting;
15427
+ const canSubmit = !providerTargetsLoading && activeLiveState !== "activating" && activeLiveState !== "failed" && !activeConversationResumeUnavailable && (activeConversationId !== null || effectiveSelectedProviderTarget.disabled !== true && (homeComposerTargetOverride ? homeComposerTargetOverrideIsExplicit : selectedProviderTargetIsExplicit)) && (composerTargetData.provider !== "openclaw" || openclawGateway?.status === "ready") && pendingApproval === null && pendingInteractivePrompt === null && sessionChrome.auth === null && !activeConversationBusy && !isCreatingConversation && !isSubmitting && !isInterrupting;
15362
15428
  const activeConversationCreatePending = Boolean(activeConversationId) && isCreatingConversation && startingConversationIdRef.current === activeConversationId;
15363
15429
  const canQueueWhileBusy = Boolean(activeConversationId) && (activeConversationCreatePending || activeConversationBusy || isSubmitting || Boolean(activeSessionState?.pendingInteractive));
15364
15430
  useEffect4(() => {
@@ -15549,12 +15615,12 @@ function useAgentGUINodeController({
15549
15615
  ]);
15550
15616
  const stableComposerSettings = useStableComposerSettingsVM(composerSettings);
15551
15617
  const resolveDefaultHomeComposerTarget = useCallback4(() => {
15552
- const defaultTargetId = defaultProviderTargetId?.trim() ?? "";
15618
+ const defaultTargetId = defaultAgentTargetId?.trim() ?? "";
15553
15619
  const explicitDefaultTarget = defaultTargetId ? normalizedProviderTargets.find(
15554
15620
  (target) => target.targetId === defaultTargetId || target.agentTargetId === defaultTargetId
15555
15621
  ) ?? null : null;
15556
15622
  return explicitDefaultTarget ?? normalizedProviderTargets.find((target) => target.disabled !== true) ?? normalizedProviderTargets[0] ?? null;
15557
- }, [defaultProviderTargetId, normalizedProviderTargets]);
15623
+ }, [defaultAgentTargetId, normalizedProviderTargets]);
15558
15624
  const resetHomeComposerAgentTargetToDefault = useCallback4(() => {
15559
15625
  if (previewMode) {
15560
15626
  return;
@@ -15564,7 +15630,7 @@ function useAgentGUINodeController({
15564
15630
  return;
15565
15631
  }
15566
15632
  const nextTargetIsExplicit = normalizedExplicitProviderTargets.some(
15567
- (target) => target.provider === nextTarget.provider && target.targetId === nextTarget.targetId && agentGUIProviderTargetRefsEqual(target.ref, nextTarget.ref)
15633
+ (target) => agentGUIProviderTargetsEqual(target, nextTarget)
15568
15634
  );
15569
15635
  const nextTargetData = composerTargetDataFromProviderTarget({
15570
15636
  current: dataRef.current,
@@ -15617,18 +15683,16 @@ function useAgentGUINodeController({
15617
15683
  return;
15618
15684
  }
15619
15685
  const nextProvider = input.provider;
15620
- const nextTarget = resolveAgentGUIProviderTarget({
15621
- defaultProviderTargetId,
15686
+ const nextTarget = resolveAgentGUIDirectorySelection({
15687
+ agentTargetId: input.agentTargetId,
15622
15688
  provider: nextProvider,
15623
- providerTargetId: input.providerTargetId,
15624
- providerTargets: normalizedProviderTargets,
15625
- useStaticCatalog: shouldUseStaticProviderTargets
15689
+ targets: normalizedProviderTargets
15626
15690
  });
15627
15691
  if (!nextTarget) {
15628
15692
  return;
15629
15693
  }
15630
15694
  const nextTargetIsExplicit = normalizedExplicitProviderTargets.some(
15631
- (target) => target.provider === nextTarget.provider && target.targetId === nextTarget.targetId && agentGUIProviderTargetRefsEqual(target.ref, nextTarget.ref)
15695
+ (target) => agentGUIProviderTargetsEqual(target, nextTarget)
15632
15696
  );
15633
15697
  const nextTargetData = composerTargetDataFromProviderTarget({
15634
15698
  current: dataRef.current,
@@ -15703,8 +15767,6 @@ function useAgentGUINodeController({
15703
15767
  provider: currentNextTargetData.provider,
15704
15768
  agentTargetId: currentNextTargetData.agentTargetId,
15705
15769
  lastActiveAgentSessionId: null,
15706
- providerTargetId: currentNextTargetData.providerTargetId,
15707
- providerTargetRef: currentNextTargetData.providerTargetRef,
15708
15770
  composerOverrides: providerTargetChanged ? null : current.composerOverrides
15709
15771
  };
15710
15772
  dataRef.current = nextData;
@@ -15716,22 +15778,21 @@ function useAgentGUINodeController({
15716
15778
  },
15717
15779
  [
15718
15780
  activation,
15719
- defaultProviderTargetId,
15781
+ defaultAgentTargetId,
15720
15782
  loadComposerOptionsForTarget,
15721
15783
  normalizedExplicitProviderTargets,
15722
15784
  normalizedProviderTargets,
15723
15785
  persistActiveConversation,
15724
- previewMode,
15725
- shouldUseStaticProviderTargets
15786
+ previewMode
15726
15787
  ]
15727
15788
  );
15728
15789
  useEffect4(() => {
15729
15790
  if (previewMode || activeConversationId !== null || conversationFilter.kind !== "all" || homeComposerTargetOverride !== null || agentGUINodeDataHasComposerTarget(data) || !providerReadinessGates || !firstReadyHomeComposerProviderTarget) {
15730
15791
  return;
15731
15792
  }
15732
- if (firstReadyHomeComposerProviderTarget.provider === effectiveSelectedProviderTarget.provider && firstReadyHomeComposerProviderTarget.targetId === effectiveSelectedProviderTarget.targetId && agentGUIProviderTargetRefsEqual(
15733
- firstReadyHomeComposerProviderTarget.ref,
15734
- effectiveSelectedProviderTarget.ref
15793
+ if (agentGUIProviderTargetsEqual(
15794
+ firstReadyHomeComposerProviderTarget,
15795
+ effectiveSelectedProviderTarget
15735
15796
  )) {
15736
15797
  return;
15737
15798
  }
@@ -15747,7 +15808,7 @@ function useAgentGUINodeController({
15747
15808
  }
15748
15809
  selectHomeComposerAgentTarget({
15749
15810
  provider: firstReadyHomeComposerProviderTarget.provider,
15750
- providerTargetId: firstReadyHomeComposerProviderTarget.targetId
15811
+ agentTargetId: firstReadyHomeComposerProviderTarget.agentTargetId ?? firstReadyHomeComposerProviderTarget.targetId
15751
15812
  });
15752
15813
  }, [
15753
15814
  activeConversationId,
@@ -15762,17 +15823,15 @@ function useAgentGUINodeController({
15762
15823
  ]);
15763
15824
  const selectConversationFilterTarget = useCallback4(
15764
15825
  (input) => {
15765
- const nextTarget = resolveAgentGUIProviderTarget({
15766
- defaultProviderTargetId,
15826
+ const nextTarget = resolveAgentGUIDirectorySelection({
15827
+ agentTargetId: input.agentTargetId,
15767
15828
  provider: input.provider,
15768
- providerTargetId: input.providerTargetId,
15769
- providerTargets: normalizedProviderTargets,
15770
- useStaticCatalog: shouldUseStaticProviderTargets
15829
+ targets: normalizedProviderTargets
15771
15830
  });
15772
15831
  if (!nextTarget) {
15773
15832
  reportAgentGUIConversationFilterTargetUnresolved({
15774
15833
  provider: input.provider,
15775
- providerTargetId: input.providerTargetId ?? null,
15834
+ agentTargetId: input.agentTargetId ?? null,
15776
15835
  providerTargetCount: normalizedProviderTargets.length,
15777
15836
  reason: "unresolved",
15778
15837
  runtime: agentActivityRuntime,
@@ -15815,11 +15874,10 @@ function useAgentGUINodeController({
15815
15874
  },
15816
15875
  [
15817
15876
  agentActivityRuntime,
15818
- defaultProviderTargetId,
15877
+ defaultAgentTargetId,
15819
15878
  normalizedProviderTargets,
15820
15879
  selectConversation,
15821
15880
  selectHomeComposerAgentTarget,
15822
- shouldUseStaticProviderTargets,
15823
15881
  workspaceId
15824
15882
  ]
15825
15883
  );
@@ -15838,7 +15896,7 @@ function useAgentGUINodeController({
15838
15896
  }
15839
15897
  selectHomeComposerAgentTarget({
15840
15898
  provider: target.provider,
15841
- providerTargetId: target.targetId
15899
+ agentTargetId: target.agentTargetId ?? target.targetId
15842
15900
  });
15843
15901
  }, [
15844
15902
  activeConversationId,
@@ -16011,8 +16069,6 @@ function useAgentGUINodeController({
16011
16069
  providerTargets: normalizedProviderTargets,
16012
16070
  handoffProviderTargets,
16013
16071
  providerTargetsLoading,
16014
- providerRailMode,
16015
- comingSoonProviders: normalizedComingSoonProviders,
16016
16072
  conversationFilter,
16017
16073
  conversations: visibleConversations,
16018
16074
  userProjects,
@@ -16094,9 +16150,7 @@ function useAgentGUINodeController({
16094
16150
  data,
16095
16151
  effectiveSelectedProviderTarget,
16096
16152
  handoffProviderTargets,
16097
- normalizedComingSoonProviders,
16098
16153
  normalizedProviderTargets,
16099
- providerRailMode,
16100
16154
  providerReadinessGate,
16101
16155
  providerTargetsLoading,
16102
16156
  detailError,
@@ -17107,6 +17161,7 @@ var AgentGuiHeroCarouselScene = class _AgentGuiHeroCarouselScene {
17107
17161
  wheelRadius;
17108
17162
  onSettle;
17109
17163
  images = [];
17164
+ ownedImages = /* @__PURE__ */ new Set();
17110
17165
  scroll = 0;
17111
17166
  target = 0;
17112
17167
  velocity = 0;
@@ -17144,22 +17199,26 @@ var AgentGuiHeroCarouselScene = class _AgentGuiHeroCarouselScene {
17144
17199
  this.tiles.push({ mesh });
17145
17200
  }
17146
17201
  options.iconUrls.forEach((iconUrl, agentIndex) => {
17147
- const image = new Image();
17202
+ const loadedImage = options.loadedImages?.[agentIndex] ?? null;
17203
+ const image = loadedImage ?? new Image();
17204
+ if (!loadedImage) {
17205
+ image.decoding = "async";
17206
+ image.loading = "eager";
17207
+ image.setAttribute("fetchpriority", "high");
17208
+ this.ownedImages.add(image);
17209
+ }
17148
17210
  this.images.push(image);
17149
17211
  image.onload = () => {
17150
17212
  if (this.disposed) {
17151
17213
  return;
17152
17214
  }
17153
- const texture = roundedIconTexture(image, () => this.requestRender());
17154
- for (const tile of this.tiles) {
17155
- if (tile.mesh.userData.agentIndex === agentIndex) {
17156
- tile.mesh.material.map = texture;
17157
- tile.mesh.material.visible = true;
17158
- tile.mesh.material.needsUpdate = true;
17159
- }
17160
- }
17215
+ this.applyImageTexture(image, agentIndex);
17161
17216
  };
17162
- image.src = iconUrl;
17217
+ if (image.complete && image.naturalWidth > 0) {
17218
+ this.applyImageTexture(image, agentIndex);
17219
+ } else if (!loadedImage) {
17220
+ image.src = iconUrl;
17221
+ }
17163
17222
  });
17164
17223
  this.applyPoses();
17165
17224
  }
@@ -17245,8 +17304,11 @@ var AgentGuiHeroCarouselScene = class _AgentGuiHeroCarouselScene {
17245
17304
  }
17246
17305
  for (const image of this.images) {
17247
17306
  image.onload = null;
17248
- image.src = "";
17307
+ if (this.ownedImages.has(image)) {
17308
+ image.src = "";
17309
+ }
17249
17310
  }
17311
+ this.ownedImages.clear();
17250
17312
  for (const tile of this.tiles) {
17251
17313
  tile.mesh.geometry.dispose();
17252
17314
  tile.mesh.material.map?.dispose();
@@ -17308,6 +17370,19 @@ var AgentGuiHeroCarouselScene = class _AgentGuiHeroCarouselScene {
17308
17370
  }
17309
17371
  });
17310
17372
  }
17373
+ applyImageTexture(image, agentIndex) {
17374
+ if (this.disposed) {
17375
+ return;
17376
+ }
17377
+ const texture = roundedIconTexture(image, () => this.requestRender());
17378
+ for (const tile of this.tiles) {
17379
+ if (tile.mesh.userData.agentIndex === agentIndex) {
17380
+ tile.mesh.material.map = texture;
17381
+ tile.mesh.material.visible = true;
17382
+ tile.mesh.material.needsUpdate = true;
17383
+ }
17384
+ }
17385
+ }
17311
17386
  applyPoses() {
17312
17387
  const step = Math.PI * 2 / Math.max(this.tileCount, 1);
17313
17388
  this.tiles.forEach((tile, index) => {
@@ -17325,30 +17400,87 @@ var AgentGuiHeroCarouselScene = class _AgentGuiHeroCarouselScene {
17325
17400
 
17326
17401
  // agent-gui/agentGuiNode/AgentGUIHeroAgentCarousel.tsx
17327
17402
  import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
17328
- function agentGUILaunchpadProviderTarget(providerTargets, provider) {
17329
- const normalized = normalizeManagedAgentProvider(provider);
17330
- const matches = providerTargets.filter(
17331
- (target) => normalizeManagedAgentProvider(target.provider) === normalized
17332
- );
17333
- return matches.find((target) => target.disabled !== true) ?? matches[0] ?? null;
17334
- }
17335
17403
  var CAROUSEL_WHEEL_STEP_THRESHOLD = 42;
17336
17404
  var CAROUSEL_WHEEL_STEP_COOLDOWN_MS = 110;
17337
17405
  var CAROUSEL_DRAG_STEP_PX = 52;
17406
+ function emptyPreloadedCarouselImages(length) {
17407
+ return Array.from({ length }).map(() => null);
17408
+ }
17409
+ function useAgentGUIHeroCarouselImages(icons, iconKey) {
17410
+ const [preloadState, setPreloadState] = useState7({
17411
+ images: [],
17412
+ ready: icons.length === 0
17413
+ });
17414
+ useEffect6(() => {
17415
+ if (icons.length === 0) {
17416
+ setPreloadState({ images: [], ready: true });
17417
+ return;
17418
+ }
17419
+ if (typeof Image !== "function") {
17420
+ setPreloadState({
17421
+ images: emptyPreloadedCarouselImages(icons.length),
17422
+ ready: true
17423
+ });
17424
+ return;
17425
+ }
17426
+ let cancelled = false;
17427
+ setPreloadState({
17428
+ images: emptyPreloadedCarouselImages(icons.length),
17429
+ ready: false
17430
+ });
17431
+ void Promise.all(
17432
+ icons.map(
17433
+ (icon) => new Promise((resolve) => {
17434
+ const image = new Image();
17435
+ const resolveDecoded = () => {
17436
+ const decode = image.decode?.();
17437
+ if (decode) {
17438
+ void decode.then(() => resolve(image)).catch(() => resolve(image));
17439
+ return;
17440
+ }
17441
+ resolve(image);
17442
+ };
17443
+ image.decoding = "async";
17444
+ image.loading = "eager";
17445
+ image.setAttribute("fetchpriority", "high");
17446
+ image.onload = () => {
17447
+ resolveDecoded();
17448
+ };
17449
+ image.onerror = () => resolve(null);
17450
+ image.src = icon.iconUrl;
17451
+ if (image.complete) {
17452
+ if (image.naturalWidth > 0) {
17453
+ resolveDecoded();
17454
+ } else {
17455
+ resolve(null);
17456
+ }
17457
+ }
17458
+ })
17459
+ )
17460
+ ).then((images) => {
17461
+ if (!cancelled) {
17462
+ setPreloadState({ images, ready: true });
17463
+ }
17464
+ });
17465
+ return () => {
17466
+ cancelled = true;
17467
+ };
17468
+ }, [iconKey]);
17469
+ return preloadState;
17470
+ }
17338
17471
  var AgentGUIHeroAgentCarousel = memo2(
17339
17472
  function AgentGUIHeroAgentCarousel2({
17340
- activeProvider,
17473
+ activeAgentTargetId,
17341
17474
  icons,
17342
17475
  providerTargets,
17343
17476
  onProviderSelect,
17344
17477
  providerSelectLabel
17345
17478
  }) {
17346
- const normalizedActiveProvider = activeProvider ? normalizeManagedAgentProvider(activeProvider) : null;
17347
17479
  const activeIconIndex = useMemo4(
17348
- () => normalizedActiveProvider === null ? -1 : icons.findIndex(
17349
- (icon) => normalizeManagedAgentProvider(icon.provider) === normalizedActiveProvider
17480
+ () => !activeAgentTargetId ? -1 : icons.findIndex(
17481
+ (icon) => icon.agentTargetId === activeAgentTargetId
17350
17482
  ),
17351
- [icons, normalizedActiveProvider]
17483
+ [activeAgentTargetId, icons]
17352
17484
  );
17353
17485
  const [centerIndex, setCenterIndex] = useState7(
17354
17486
  activeIconIndex >= 0 ? activeIconIndex : 0
@@ -17364,10 +17496,12 @@ var AgentGUIHeroAgentCarousel = memo2(
17364
17496
  if (!icon || !interactive) {
17365
17497
  return null;
17366
17498
  }
17367
- return agentGUILaunchpadProviderTarget(
17368
- providerTargets ?? [],
17369
- icon.provider
17370
- );
17499
+ if (!icon.agentTargetId) {
17500
+ return null;
17501
+ }
17502
+ return providerTargets?.find(
17503
+ (target) => (target.agentTargetId ?? target.targetId) === icon.agentTargetId
17504
+ ) ?? null;
17371
17505
  },
17372
17506
  [icons, interactive, providerTargets]
17373
17507
  );
@@ -17379,7 +17513,7 @@ var AgentGUIHeroAgentCarousel = memo2(
17379
17513
  }
17380
17514
  onProviderSelect({
17381
17515
  provider: target.provider,
17382
- providerTargetId: target.targetId
17516
+ agentTargetId: target.targetId
17383
17517
  });
17384
17518
  },
17385
17519
  [onProviderSelect, targetForIndex]
@@ -17389,16 +17523,18 @@ var AgentGUIHeroAgentCarousel = memo2(
17389
17523
  const stageRef = useRef5(null);
17390
17524
  const canvasRef = useRef5(null);
17391
17525
  const sceneRef = useRef5(null);
17392
- const iconKey = icons.map((icon) => `${icon.provider}:${icon.iconUrl}`).join("|");
17526
+ const iconKey = icons.map((icon) => `${icon.agentTargetId ?? icon.provider}:${icon.iconUrl}`).join("|");
17527
+ const carouselImages = useAgentGUIHeroCarouselImages(icons, iconKey);
17393
17528
  useEffect6(() => {
17394
17529
  const canvas = canvasRef.current;
17395
17530
  const stage = stageRef.current;
17396
- if (!canvas || !stage) {
17531
+ if (!canvas || !stage || !carouselImages.ready) {
17397
17532
  return;
17398
17533
  }
17399
17534
  const scene = AgentGuiHeroCarouselScene.create({
17400
17535
  canvas,
17401
17536
  iconUrls: icons.map((icon) => icon.iconUrl),
17537
+ loadedImages: carouselImages.images,
17402
17538
  onSettle: (index) => {
17403
17539
  centerIndexRef.current = index;
17404
17540
  setCenterIndex(index);
@@ -17424,7 +17560,7 @@ var AgentGUIHeroAgentCarousel = memo2(
17424
17560
  scene.dispose();
17425
17561
  sceneRef.current = null;
17426
17562
  };
17427
- }, [iconKey]);
17563
+ }, [carouselImages.images, carouselImages.ready, iconKey]);
17428
17564
  useEffect6(() => {
17429
17565
  if (activeIconIndex >= 0 && activeIconIndex !== centerIndexRef.current) {
17430
17566
  centerIndexRef.current = activeIconIndex;
@@ -17562,6 +17698,7 @@ var AgentGUIHeroAgentCarousel = memo2(
17562
17698
  "aria-label": interactive ? providerSelectLabel : void 0,
17563
17699
  role: interactive ? "group" : void 0,
17564
17700
  className: AgentGUINode_styles_default.emptyHeroCarousel,
17701
+ "data-icons-ready": carouselImages.ready,
17565
17702
  onKeyDown: interactive ? handleKeyDown : void 0,
17566
17703
  onPointerDown: interactive ? handlePointerDown : void 0,
17567
17704
  onPointerMove: interactive ? handlePointerMove : void 0,
@@ -17582,7 +17719,7 @@ var AgentGUIHeroAgentCarousel = memo2(
17582
17719
  icons.map((icon, index) => {
17583
17720
  const isCenter = index === centerIndex;
17584
17721
  const target = targetForIndex(index);
17585
- const key = `${icon.provider}:${icon.iconUrl}`;
17722
+ const key = `${icon.agentTargetId ?? icon.provider}:${icon.iconUrl}`;
17586
17723
  if (target && onProviderSelect) {
17587
17724
  const label = providerSelectLabel ? `${providerSelectLabel}: ${target.label}` : target.label;
17588
17725
  return /* @__PURE__ */ jsx20(
@@ -17590,6 +17727,7 @@ var AgentGUIHeroAgentCarousel = memo2(
17590
17727
  {
17591
17728
  type: "button",
17592
17729
  className: AgentGUINode_styles_default.emptyHeroCarouselItem,
17730
+ "data-agent-target-id": icon.agentTargetId,
17593
17731
  "data-provider": icon.provider,
17594
17732
  "data-provider-active": isCenter,
17595
17733
  "aria-label": label,
@@ -24452,9 +24590,9 @@ ${normalizedText}` : normalizedText;
24452
24590
  () => providerSwitchTargets.filter((target) => target.disabled !== true),
24453
24591
  [providerSwitchTargets]
24454
24592
  );
24455
- const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
24593
+ const selectedAgentTargetId = selectedProviderTarget?.targetId ?? `local:${provider}`;
24456
24594
  const selectedProviderSwitchTarget = providerSwitchTargets.find(
24457
- (target) => target.targetId === selectedProviderTargetId
24595
+ (target) => target.targetId === selectedAgentTargetId
24458
24596
  ) ?? providerSwitchTargets.find((target) => target.provider === provider) ?? selectedProviderTarget;
24459
24597
  const providerMenuTargets = selectedProviderSwitchTarget && !enabledProviderSwitchTargets.some(
24460
24598
  (target) => target.targetId === selectedProviderSwitchTarget.targetId
@@ -24469,9 +24607,9 @@ ${normalizedText}` : normalizedText;
24469
24607
  if (target.targetId === selectedProviderSwitchTarget.targetId) {
24470
24608
  return false;
24471
24609
  }
24472
- const selectedAgentTargetId = selectedProviderSwitchTarget.agentTargetId ?? selectedProviderSwitchTarget.targetId;
24610
+ const selectedAgentTargetId2 = selectedProviderSwitchTarget.agentTargetId ?? selectedProviderSwitchTarget.targetId;
24473
24611
  const targetAgentTargetId = target.agentTargetId ?? target.targetId;
24474
- return targetAgentTargetId !== selectedAgentTargetId;
24612
+ return targetAgentTargetId !== selectedAgentTargetId2;
24475
24613
  }) : enabledHandoffProviderTargets;
24476
24614
  const selectedProviderLabel = selectedProviderSwitchTarget?.label ?? selectedProviderTarget?.label ?? provider;
24477
24615
  const effectiveHandoffLabel = handoffLabel || labels.handoffConversation;
@@ -25671,7 +25809,7 @@ ${normalizedText}` : normalizedText;
25671
25809
  }
25672
25810
  onProviderSelect?.({
25673
25811
  provider: target.provider,
25674
- providerTargetId: target.targetId
25812
+ agentTargetId: target.targetId
25675
25813
  });
25676
25814
  },
25677
25815
  children: [
@@ -26584,13 +26722,12 @@ function resolveAgentGUIHeroIconUrl(provider) {
26584
26722
  const normalizedProvider = normalizeManagedAgentProvider(provider);
26585
26723
  return MANAGED_AGENT_ICON_URLS[normalizedProvider] ?? MANAGED_AGENT_ICON_FALLBACK_URL;
26586
26724
  }
26587
- var HERO_USES_PROVIDER_RAIL_ICON = /* @__PURE__ */ new Set(["cursor", "opencode"]);
26588
26725
  function agentGUIProviderIconPresentation(provider, iconUrl) {
26589
26726
  const normalizedProvider = normalizeManagedAgentProvider(provider);
26590
26727
  const providerRailIconUrl = MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS[normalizedProvider] ?? null;
26591
26728
  return {
26592
26729
  provider: normalizedProvider,
26593
- iconUrl: (HERO_USES_PROVIDER_RAIL_ICON.has(normalizedProvider) ? providerRailIconUrl : null) || iconUrl?.trim() || resolveAgentGUIHeroIconUrl(normalizedProvider)
26730
+ iconUrl: iconUrl?.trim() || providerRailIconUrl || resolveAgentGUIHeroIconUrl(normalizedProvider)
26594
26731
  };
26595
26732
  }
26596
26733
  function agentGUIProviderRailIconPresentation(provider, iconUrl) {
@@ -26598,7 +26735,7 @@ function agentGUIProviderRailIconPresentation(provider, iconUrl) {
26598
26735
  const providerRailIconUrl = MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS[normalizedProvider] ?? null;
26599
26736
  return {
26600
26737
  provider: normalizedProvider,
26601
- iconUrl: (HERO_USES_PROVIDER_RAIL_ICON.has(normalizedProvider) ? providerRailIconUrl : null) || iconUrl?.trim() || providerRailIconUrl || resolveAgentGUIHeroIconUrl(normalizedProvider)
26738
+ iconUrl: iconUrl?.trim() || providerRailIconUrl || resolveAgentGUIHeroIconUrl(normalizedProvider)
26602
26739
  };
26603
26740
  }
26604
26741
  function shouldEmphasizeEmptyHeroProvider(label) {
@@ -27398,10 +27535,8 @@ function AgentGUINodeView({
27398
27535
  selectedProviderTarget: viewModel.selectedProviderTarget,
27399
27536
  providerTargets: viewModel.providerTargets,
27400
27537
  providerTargetsLoading: viewModel.providerTargetsLoading,
27401
- providerRailMode: viewModel.providerRailMode,
27402
27538
  renderProviderRailEmpty,
27403
27539
  providerRailAllPresentation,
27404
- comingSoonProviders: viewModel.comingSoonProviders,
27405
27540
  onSelectConversationFilterTarget: actions.selectConversationFilterTarget,
27406
27541
  onUpdateConversationFilter: actions.updateConversationFilter,
27407
27542
  onRequestComposerFocus: requestComposerFocus
@@ -27542,6 +27677,7 @@ function AgentGUINodeView({
27542
27677
  contextMentionProviders,
27543
27678
  workspaceAppIcons: effectiveWorkspaceAppIcons,
27544
27679
  workspaceUserProjectI18n,
27680
+ renderAgentsEmpty: renderProviderRailEmpty,
27545
27681
  renderProviderUnavailableState,
27546
27682
  renderProviderReadinessGateState,
27547
27683
  previewMode
@@ -27797,6 +27933,7 @@ var AgentGUIDetailPane = memo3(function AgentGUIDetailPane2({
27797
27933
  onRequestComposerFocus,
27798
27934
  contextMentionProviders,
27799
27935
  workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS3,
27936
+ renderAgentsEmpty,
27800
27937
  renderProviderUnavailableState,
27801
27938
  renderProviderReadinessGateState
27802
27939
  }) {
@@ -27822,8 +27959,9 @@ var AgentGUIDetailPane = memo3(function AgentGUIDetailPane2({
27822
27959
  avoidGroupingEdits: viewModel.avoidGroupingEdits
27823
27960
  });
27824
27961
  const hasActiveConversation = viewModel.activeConversationId !== null;
27825
- const selectedProviderTargetComingSoon = viewModel.selectedProviderTarget?.disabled === true;
27826
- const emptyProviderReadinessGate = !hasActiveConversation ? selectedProviderTargetComingSoon ? { status: "coming_soon" } : viewModel.providerReadinessGate : null;
27962
+ const agentsLoadedEmpty = !viewModel.providerTargetsLoading && viewModel.providerTargets.length === 0;
27963
+ const selectedProviderTargetComingSoon = viewModel.selectedProviderTarget?.disabled === true && (viewModel.providerReadinessGate === null || viewModel.providerReadinessGate?.status === "coming_soon");
27964
+ const emptyProviderReadinessGate = !hasActiveConversation ? viewModel.providerReadinessGate ?? (selectedProviderTargetComingSoon ? { status: "coming_soon" } : null) : null;
27827
27965
  const activePrompt = viewModel.pendingInteractivePrompt ?? viewModel.pendingApproval;
27828
27966
  const activePromptRequestId = activePrompt?.requestId ?? null;
27829
27967
  const sessionChrome = useMemo11(
@@ -28564,11 +28702,36 @@ var AgentGUIDetailPane = memo3(function AgentGUIDetailPane2({
28564
28702
  [bottomDockComposerProps]
28565
28703
  );
28566
28704
  const emptyHeroProvider = viewModel.selectedProviderTarget?.provider ?? viewModel.data.provider;
28567
- const emptyHeroProviderLabel = labels.emptyProviderForProvider?.(emptyHeroProvider) ?? labels.emptyProvider ?? "";
28568
- const emptyHeroLabel = labels.emptyForProvider?.(emptyHeroProvider) ?? labels.empty;
28705
+ const emptyHeroRuntimeProviderLabel = labels.emptyProviderForProvider?.(emptyHeroProvider) ?? labels.emptyProvider ?? "";
28706
+ const emptyHeroProviderLabel = viewModel.selectedProviderTarget?.label ?? emptyHeroRuntimeProviderLabel;
28707
+ const emptyHeroBaseLabel = labels.emptyForProvider?.(emptyHeroProvider) ?? labels.empty;
28708
+ const emptyHeroLabel = emptyHeroRuntimeProviderLabel ? emptyHeroBaseLabel.replace(
28709
+ emptyHeroRuntimeProviderLabel,
28710
+ emptyHeroProviderLabel
28711
+ ) : emptyHeroBaseLabel;
28569
28712
  const emptyHeroIconPresentations = useMemo11(
28570
- () => viewModel.conversationFilter.kind === "all" ? agentGUILaunchpadIconPresentations() : [agentGUIProviderIconPresentation(emptyHeroProvider)],
28571
- [emptyHeroProvider, viewModel.conversationFilter]
28713
+ () => viewModel.conversationFilter.kind === "all" ? viewModel.providerTargets.map((target) => ({
28714
+ agentTargetId: target.agentTargetId ?? target.targetId,
28715
+ provider: target.provider,
28716
+ iconUrl: agentGUIProviderRailIconPresentation(
28717
+ target.provider,
28718
+ target.iconUrl
28719
+ ).iconUrl
28720
+ })) : [
28721
+ {
28722
+ ...agentGUIProviderIconPresentation(
28723
+ emptyHeroProvider,
28724
+ viewModel.selectedProviderTarget?.iconUrl
28725
+ ),
28726
+ agentTargetId: viewModel.selectedProviderTarget?.agentTargetId ?? viewModel.selectedProviderTarget?.targetId
28727
+ }
28728
+ ],
28729
+ [
28730
+ emptyHeroProvider,
28731
+ viewModel.conversationFilter.kind,
28732
+ viewModel.providerTargets,
28733
+ viewModel.selectedProviderTarget
28734
+ ]
28572
28735
  );
28573
28736
  const disabledProviderTarget = selectedProviderTargetComingSoon ? viewModel.selectedProviderTarget ?? null : null;
28574
28737
  const shouldRenderProviderUnavailableState = !hasActiveConversation && disabledProviderTarget !== null && renderProviderUnavailableState !== void 0;
@@ -28967,7 +29130,14 @@ var AgentGUIDetailPane = memo3(function AgentGUIDetailPane2({
28967
29130
  viewportTestId: "agent-gui-timeline",
28968
29131
  viewportClassName: `${AgentGUINode_styles_default.timeline} ${hasActiveConversation ? AgentGUINode_styles_default.timelineWithComposer : AgentGUINode_styles_default.timelineCentered} ${!isTimelineScrolledToTop ? AgentGUINode_styles_default.timelineScrolledFromTop : ""} ${showUnavailableChatEmpty ? AgentGUINode_styles_default.timelineUnavailableChatEmpty : ""}`.trim(),
28969
29132
  viewportContentStyle: AGENT_GUI_TIMELINE_SCROLL_AREA_CONTENT_STYLE,
28970
- children: !hasActiveConversation ? shouldRenderProviderUnavailableState && disabledProviderTarget ? /* @__PURE__ */ jsx35(Fragment9, { children: renderProviderUnavailableState?.({
29133
+ children: !hasActiveConversation ? agentsLoadedEmpty ? renderAgentsEmpty ? /* @__PURE__ */ jsx35(Fragment9, { children: renderAgentsEmpty() }) : /* @__PURE__ */ jsx35(
29134
+ "div",
29135
+ {
29136
+ className: AgentGUINode_styles_default.emptyHero,
29137
+ "data-testid": "agent-gui-agents-empty",
29138
+ children: /* @__PURE__ */ jsx35("div", { className: AgentGUINode_styles_default.emptyHeroBody, children: /* @__PURE__ */ jsx35("h2", { className: AgentGUINode_styles_default.emptyHeroTitle, children: labels.agentsEmpty }) })
29139
+ }
29140
+ ) : shouldRenderProviderUnavailableState && disabledProviderTarget ? /* @__PURE__ */ jsx35(Fragment9, { children: renderProviderUnavailableState?.({
28971
29141
  provider: disabledProviderTarget.provider,
28972
29142
  providerLabel: labels.emptyProviderForProvider?.(
28973
29143
  disabledProviderTarget.provider
@@ -29191,7 +29361,7 @@ var AgentGUIEmptyHeroPane = memo3(function AgentGUIEmptyHeroPane2({
29191
29361
  /* @__PURE__ */ jsx35("div", { className: AgentGUINode_styles_default.emptyHeroIconSlot, children: heroIconPresentations.length > 1 ? /* @__PURE__ */ jsx35(
29192
29362
  AgentGUIHeroAgentCarousel,
29193
29363
  {
29194
- activeProvider: provider,
29364
+ activeAgentTargetId: selectedProviderTarget?.agentTargetId ?? selectedProviderTarget?.targetId,
29195
29365
  icons: heroIconPresentations,
29196
29366
  providerTargets,
29197
29367
  onProviderSelect,
@@ -29258,8 +29428,15 @@ var AgentGUIProviderReadinessGatePane = memo3(
29258
29428
  "use memo";
29259
29429
  const heroIconUrl = resolveAgentGUIHeroIconUrl(provider);
29260
29430
  const launchpadIconPresentations = useMemo11(
29261
- () => agentGUILaunchpadIconPresentations(),
29262
- []
29431
+ () => providerTargets.map((target) => ({
29432
+ agentTargetId: target.agentTargetId ?? target.targetId,
29433
+ provider: target.provider,
29434
+ iconUrl: agentGUIProviderRailIconPresentation(
29435
+ target.provider,
29436
+ target.iconUrl
29437
+ ).iconUrl
29438
+ })),
29439
+ [providerTargets]
29263
29440
  );
29264
29441
  const pendingAction = gate.pendingAction ?? null;
29265
29442
  const isPending = pendingAction !== null;
@@ -29280,7 +29457,7 @@ var AgentGUIProviderReadinessGatePane = memo3(
29280
29457
  showAllProviders ? /* @__PURE__ */ jsx35(
29281
29458
  AgentGUIHeroAgentCarousel,
29282
29459
  {
29283
- activeProvider: provider,
29460
+ activeAgentTargetId: selectedProviderTarget?.agentTargetId ?? selectedProviderTarget?.targetId,
29284
29461
  icons: launchpadIconPresentations,
29285
29462
  providerTargets,
29286
29463
  onProviderSelect,
@@ -29450,7 +29627,7 @@ function EmptyHeroTitle({
29450
29627
  return /* @__PURE__ */ jsx35(Fragment9, { children: label });
29451
29628
  }
29452
29629
  const providerEnd = providerStart + providerLabel.length;
29453
- const selectedProviderTargetId = selectedProviderTarget?.targetId ?? `local:${selectedProviderTarget?.provider ?? ""}`;
29630
+ const selectedAgentTargetId = selectedProviderTarget?.targetId ?? `local:${selectedProviderTarget?.provider ?? ""}`;
29454
29631
  const canSwitchProvider = providerTargets.length > 1 && selectedProviderTarget && onProviderSelect;
29455
29632
  const providerName = label.slice(providerStart, providerEnd);
29456
29633
  return /* @__PURE__ */ jsxs22(Fragment9, { children: [
@@ -29458,7 +29635,7 @@ function EmptyHeroTitle({
29458
29635
  canSwitchProvider ? /* @__PURE__ */ jsxs22(
29459
29636
  Select3,
29460
29637
  {
29461
- value: selectedProviderTargetId,
29638
+ value: selectedAgentTargetId,
29462
29639
  onValueChange: (nextTargetId) => {
29463
29640
  const target = providerTargets.find(
29464
29641
  (candidate) => candidate.targetId === nextTargetId
@@ -29468,7 +29645,7 @@ function EmptyHeroTitle({
29468
29645
  }
29469
29646
  onProviderSelect({
29470
29647
  provider: target.provider,
29471
- providerTargetId: target.targetId
29648
+ agentTargetId: target.targetId
29472
29649
  });
29473
29650
  },
29474
29651
  children: [
@@ -30065,43 +30242,6 @@ function conversationSyncStatesRenderEqual(left, right) {
30065
30242
  function conversationProjectsRenderEqual2(left, right) {
30066
30243
  return left === right || (!left || !right ? !left && !right : left.id === right.id && left.path === right.path && left.label === right.label && left.sectionKey === right.sectionKey && left.createdAtUnixMs === right.createdAtUnixMs && left.updatedAtUnixMs === right.updatedAtUnixMs && left.lastUsedAtUnixMs === right.lastUsedAtUnixMs);
30067
30244
  }
30068
- var agentGUIProviderRailOrder = [
30069
- "codex",
30070
- "claude-code",
30071
- "cursor",
30072
- "tutti-agent",
30073
- "nexight",
30074
- "opencode",
30075
- "hermes",
30076
- "openclaw"
30077
- ];
30078
- var agentGUIProviderRailDefaultProviders = [
30079
- "codex",
30080
- "claude-code",
30081
- "cursor",
30082
- "hermes",
30083
- "openclaw"
30084
- ];
30085
- var agentGUIProviderRailDisabledProviders = /* @__PURE__ */ new Set([
30086
- "nexight",
30087
- "hermes",
30088
- "openclaw"
30089
- ]);
30090
- function agentGUIProviderRailOrderIndex(provider) {
30091
- const index = agentGUIProviderRailOrder.indexOf(provider);
30092
- return index < 0 ? agentGUIProviderRailOrder.length : index;
30093
- }
30094
- function agentGUILaunchpadIconPresentations() {
30095
- return [
30096
- agentGUIProviderRailIconPresentation("codex"),
30097
- agentGUIProviderRailIconPresentation("claude-code"),
30098
- agentGUIProviderRailIconPresentation("cursor"),
30099
- agentGUIProviderRailIconPresentation("tutti"),
30100
- agentGUIProviderRailIconPresentation("opencode"),
30101
- agentGUIProviderRailIconPresentation("hermes"),
30102
- agentGUIProviderRailIconPresentation("openclaw")
30103
- ];
30104
- }
30105
30245
  function agentGUIConversationProviderIconUrl(provider) {
30106
30246
  return resolveAgentGuiSessionProviderFlatIconUrl(provider);
30107
30247
  }
@@ -30130,37 +30270,8 @@ function agentGUIProviderRailAriaLabel(label, badgeLabel) {
30130
30270
  function agentGUIProviderTargetMatchesConversationFilter(target, filter) {
30131
30271
  return filter.kind === "agentTarget" && (target.agentTargetId?.trim() ?? "") === filter.agentTargetId;
30132
30272
  }
30133
- function agentGUIProviderRailTargets(providerTargets, providerTargetsLoading, comingSoonProviders, providerRailMode) {
30134
- if (providerTargetsLoading) {
30135
- return [];
30136
- }
30137
- if (providerRailMode === "exact") {
30138
- return providerTargets;
30139
- }
30140
- const comingSoon = new Set(comingSoonProviders);
30141
- const source = providerTargets.length > 0 && !agentGUIProviderRailTargetsAreFullLocalFallback(providerTargets) ? providerTargets : [];
30142
- const seenProviders = new Set(source.map((target) => target.provider));
30143
- const missingDefaultProviders = agentGUIProviderRailDefaultProviders.filter(
30144
- (provider) => !seenProviders.has(provider)
30145
- );
30146
- if (source.length > 0 && missingDefaultProviders.length === 0) {
30147
- return source;
30148
- }
30149
- return [
30150
- ...source,
30151
- ...missingDefaultProviders.map(
30152
- (provider) => agentGUIProviderRailDisabledProviders.has(provider) || comingSoon.has(provider) ? createDisabledPlaceholderAgentGUIProviderTarget(provider) : createLocalAgentGUIProviderTarget(provider)
30153
- )
30154
- ];
30155
- }
30156
- function agentGUIProviderRailTargetsAreFullLocalFallback(providerTargets) {
30157
- if (providerTargets.length !== agentGUIProviderRailOrder.length) {
30158
- return false;
30159
- }
30160
- const fallbackProviders = new Set(agentGUIProviderRailOrder);
30161
- return providerTargets.every(
30162
- (target) => fallbackProviders.has(target.provider) && target.ref.kind === "local" && target.ref.provider === target.provider && target.targetId === `local:${target.provider}`
30163
- );
30273
+ function agentGUIProviderRailTargets(providerTargets, providerTargetsLoading) {
30274
+ return providerTargetsLoading ? [] : providerTargets;
30164
30275
  }
30165
30276
  var AGENT_GUI_PROVIDER_RAIL_DRAG_HYSTERESIS_PX = 8;
30166
30277
  var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
@@ -30171,10 +30282,8 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30171
30282
  selectedProviderTarget,
30172
30283
  providerTargets,
30173
30284
  providerTargetsLoading,
30174
- providerRailMode,
30175
30285
  renderProviderRailEmpty,
30176
30286
  providerRailAllPresentation,
30177
- comingSoonProviders,
30178
30287
  onRequestComposerFocus,
30179
30288
  onSelectConversationFilterTarget,
30180
30289
  onUpdateConversationFilter
@@ -30216,51 +30325,16 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30216
30325
  [providerRailOrderStorageKey]
30217
30326
  );
30218
30327
  const railProviderTargets = useMemo11(
30219
- () => agentGUIProviderRailTargets(
30220
- providerTargets,
30221
- providerTargetsLoading,
30222
- comingSoonProviders,
30223
- providerRailMode
30224
- ),
30225
- [
30226
- comingSoonProviders,
30227
- providerRailMode,
30228
- providerTargets,
30229
- providerTargetsLoading
30230
- ]
30328
+ () => agentGUIProviderRailTargets(providerTargets, providerTargetsLoading),
30329
+ [providerTargets, providerTargetsLoading]
30231
30330
  );
30232
30331
  const providerTiles = useMemo11(() => {
30233
- const targets = [...railProviderTargets];
30234
- const orderedTargets = providerRailMode === "exact" ? targets : (() => {
30235
- const originalIndexByTarget = /* @__PURE__ */ new Map();
30236
- targets.forEach((target, index) => {
30237
- originalIndexByTarget.set(
30238
- `${target.provider}\0${target.targetId}`,
30239
- index
30240
- );
30241
- });
30242
- return targets.sort((left, right) => {
30243
- const orderDelta = agentGUIProviderRailOrderIndex(left.provider) - agentGUIProviderRailOrderIndex(right.provider);
30244
- if (orderDelta !== 0) {
30245
- return orderDelta;
30246
- }
30247
- return (originalIndexByTarget.get(
30248
- `${left.provider}\0${left.targetId}`
30249
- ) ?? 0) - (originalIndexByTarget.get(
30250
- `${right.provider}\0${right.targetId}`
30251
- ) ?? 0);
30252
- });
30253
- })();
30254
- return applyAgentGUIProviderRailOrder(orderedTargets, providerRailOrder);
30255
- }, [providerRailMode, providerRailOrder, railProviderTargets]);
30256
- const visibleProviderTiles = useMemo11(() => {
30257
- if (!providerTiles.some((target) => target.provider === "tutti-agent")) {
30258
- return providerTiles;
30259
- }
30260
- return providerTiles.filter(
30261
- (target) => target.provider !== "nexight" || target.disabled !== true
30332
+ return applyAgentGUIProviderRailOrder(
30333
+ railProviderTargets,
30334
+ providerRailOrder
30262
30335
  );
30263
- }, [providerTiles]);
30336
+ }, [providerRailOrder, railProviderTargets]);
30337
+ const visibleProviderTiles = providerTiles;
30264
30338
  const selectedProviderTargetIsPlaceholder = selectedProviderTarget?.disabled === true;
30265
30339
  const allTileSelected = conversationFilter.kind === "all" && !selectedProviderTargetIsPlaceholder;
30266
30340
  const selectAllProviders = useCallback11(() => {
@@ -30270,7 +30344,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30270
30344
  if (fallbackTarget) {
30271
30345
  onSelectConversationFilterTarget({
30272
30346
  provider: fallbackTarget.provider,
30273
- providerTargetId: fallbackTarget.targetId
30347
+ agentTargetId: fallbackTarget.targetId
30274
30348
  });
30275
30349
  }
30276
30350
  }
@@ -30286,7 +30360,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30286
30360
  (target) => {
30287
30361
  onSelectConversationFilterTarget({
30288
30362
  provider: target.provider,
30289
- providerTargetId: target.targetId
30363
+ agentTargetId: target.targetId
30290
30364
  });
30291
30365
  onRequestComposerFocus();
30292
30366
  },
@@ -30363,7 +30437,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30363
30437
  "[data-provider-tile='true']"
30364
30438
  )
30365
30439
  ).map((element) => {
30366
- const targetId = element.dataset.providerTargetId?.trim() ?? "";
30440
+ const targetId = element.dataset.agentTargetId?.trim() ?? "";
30367
30441
  if (!targetId || targetId === activeDragState.draggedTargetId) {
30368
30442
  return null;
30369
30443
  }
@@ -30429,7 +30503,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30429
30503
  )
30430
30504
  );
30431
30505
  const dropTargets = tileElements.map((element) => {
30432
- const targetId = element.dataset.providerTargetId?.trim() ?? "";
30506
+ const targetId = element.dataset.agentTargetId?.trim() ?? "";
30433
30507
  if (!targetId || targetId === activeDragState.draggedTargetId) {
30434
30508
  return null;
30435
30509
  }
@@ -30459,7 +30533,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30459
30533
  },
30460
30534
  [dragState, previewMode, providerTargetsLoading, setProviderRailDragState]
30461
30535
  );
30462
- if (providerRailMode === "exact" && !providerTargetsLoading && visibleProviderTiles.length === 0 && renderProviderRailEmpty) {
30536
+ if (!providerTargetsLoading && visibleProviderTiles.length === 0 && renderProviderRailEmpty) {
30463
30537
  return /* @__PURE__ */ jsx35(
30464
30538
  "div",
30465
30539
  {
@@ -30467,8 +30541,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30467
30541
  role: "tablist",
30468
30542
  "aria-label": labels.providerSwitchLabel,
30469
30543
  "aria-busy": providerTargetsLoading,
30470
- "data-empty": "true",
30471
- children: renderProviderRailEmpty()
30544
+ "data-empty": "true"
30472
30545
  }
30473
30546
  );
30474
30547
  }
@@ -30482,29 +30555,31 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30482
30555
  onDragOver: handleProviderRailContainerDragOver,
30483
30556
  onDrop: commitProviderRailDragDrop,
30484
30557
  children: [
30485
- /* @__PURE__ */ jsxs22(
30486
- "button",
30487
- {
30488
- type: "button",
30489
- role: "tab",
30490
- "aria-label": labels.conversationFilterAll,
30491
- "aria-selected": allTileSelected,
30492
- className: AgentGUINode_styles_default.providerRailTile,
30493
- "data-selected": allTileSelected ? "true" : "false",
30494
- disabled: previewMode,
30495
- onClick: selectAllProviders,
30496
- children: [
30497
- /* @__PURE__ */ jsx35(
30498
- AgentGUIUnifiedProviderIcon,
30499
- {
30500
- presentation: providerRailAllPresentation
30501
- }
30502
- ),
30503
- /* @__PURE__ */ jsx35("span", { className: AgentGUINode_styles_default.providerRailTileLabel, children: labels.conversationFilterAll })
30504
- ]
30505
- }
30506
- ),
30507
- /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailSeparator }),
30558
+ visibleProviderTiles.length > 1 ? /* @__PURE__ */ jsxs22(Fragment9, { children: [
30559
+ /* @__PURE__ */ jsxs22(
30560
+ "button",
30561
+ {
30562
+ type: "button",
30563
+ role: "tab",
30564
+ "aria-label": labels.conversationFilterAll,
30565
+ "aria-selected": allTileSelected,
30566
+ className: AgentGUINode_styles_default.providerRailTile,
30567
+ "data-selected": allTileSelected ? "true" : "false",
30568
+ disabled: previewMode,
30569
+ onClick: selectAllProviders,
30570
+ children: [
30571
+ /* @__PURE__ */ jsx35(
30572
+ AgentGUIUnifiedProviderIcon,
30573
+ {
30574
+ presentation: providerRailAllPresentation
30575
+ }
30576
+ ),
30577
+ /* @__PURE__ */ jsx35("span", { className: AgentGUINode_styles_default.providerRailTileLabel, children: labels.conversationFilterAll })
30578
+ ]
30579
+ }
30580
+ ),
30581
+ /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", className: AgentGUINode_styles_default.providerRailSeparator })
30582
+ ] }) : null,
30508
30583
  providerTargetsLoading ? [0, 1, 2].map((index) => /* @__PURE__ */ jsx35(
30509
30584
  "button",
30510
30585
  {
@@ -30526,7 +30601,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30526
30601
  `provider-target-loading-${index}`
30527
30602
  )) : null,
30528
30603
  visibleProviderTiles.map((target) => {
30529
- const providerSelected = target.disabled === true ? selectedProviderTarget?.provider === target.provider && selectedProviderTarget?.targetId === target.targetId : agentGUIProviderTargetMatchesConversationFilter(
30604
+ const providerSelected = visibleProviderTiles.length === 1 ? true : target.disabled === true ? selectedProviderTarget?.provider === target.provider && selectedProviderTarget?.targetId === target.targetId : agentGUIProviderTargetMatchesConversationFilter(
30530
30605
  target,
30531
30606
  conversationFilter
30532
30607
  );
@@ -30551,7 +30626,7 @@ var AgentGUIProviderRail = memo3(function AgentGUIProviderRail2({
30551
30626
  "data-drag-over": dragState?.overTargetId === target.targetId ? dragState.position : void 0,
30552
30627
  "data-dragging": dragState?.draggedTargetId === target.targetId ? "true" : void 0,
30553
30628
  "data-provider-tile": "true",
30554
- "data-provider-target-id": target.targetId,
30629
+ "data-agent-target-id": target.targetId,
30555
30630
  "data-selected": providerSelected ? "true" : "false",
30556
30631
  disabled: previewMode,
30557
30632
  draggable: !previewMode && !providerTargetsLoading,
@@ -33302,10 +33377,7 @@ function resolveAgentGUIRailStatusProvider(input) {
33302
33377
  return target ? target.provider : null;
33303
33378
  }
33304
33379
  function agentGuiStateEquals(left, right) {
33305
- return left === right || left.provider === right.provider && (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && (left.providerTargetId ?? null) === (right.providerTargetId ?? null) && agentGUIProviderTargetRefsEqual(
33306
- left.providerTargetRef,
33307
- right.providerTargetRef
33308
- ) && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && (left.lastActiveConversationTitle ?? null) === (right.lastActiveConversationTitle ?? null) && left.conversationRailWidthPx === right.conversationRailWidthPx && left.conversationRailCollapsed === right.conversationRailCollapsed && (left.composerOverrides?.model ?? null) === (right.composerOverrides?.model ?? null) && (left.composerOverrides?.reasoningEffort ?? null) === (right.composerOverrides?.reasoningEffort ?? null) && (left.composerOverrides?.planMode ?? null) === (right.composerOverrides?.planMode ?? null) && (left.composerOverrides?.permissionModeId ?? null) === (right.composerOverrides?.permissionModeId ?? null) && composerOverridesByProviderEqual(
33380
+ return left === right || left.provider === right.provider && (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && (left.lastActiveConversationTitle ?? null) === (right.lastActiveConversationTitle ?? null) && left.conversationRailWidthPx === right.conversationRailWidthPx && left.conversationRailCollapsed === right.conversationRailCollapsed && (left.composerOverrides?.model ?? null) === (right.composerOverrides?.model ?? null) && (left.composerOverrides?.reasoningEffort ?? null) === (right.composerOverrides?.reasoningEffort ?? null) && (left.composerOverrides?.planMode ?? null) === (right.composerOverrides?.planMode ?? null) && (left.composerOverrides?.permissionModeId ?? null) === (right.composerOverrides?.permissionModeId ?? null) && composerOverridesByProviderEqual(
33309
33381
  left.composerOverridesByProvider,
33310
33382
  right.composerOverridesByProvider
33311
33383
  ) && composerOverridesByAgentTargetIdEqual(
@@ -33343,7 +33415,7 @@ function composerOverridesByAgentTargetIdEqual(left, right) {
33343
33415
  return true;
33344
33416
  }
33345
33417
  function areAgentGUINodePropsEqual(previous, next) {
33346
- return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.resolveDroppedFileReferences === next.resolveDroppedFileReferences && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveWorkspaceReferenceEntryIconUrl === next.resolveWorkspaceReferenceEntryIconUrl && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onHandoffConversation === next.onHandoffConversation && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.accountMenuState === next.accountMenuState && previous.providerTargets === next.providerTargets && previous.providerTargetsLoading === next.providerTargetsLoading && previous.providerRailAllPresentation?.iconUrl === next.providerRailAllPresentation?.iconUrl && previous.slashCommandFallbackMode === next.slashCommandFallbackMode && previous.renderSidebarFooter === next.renderSidebarFooter && previous.providerRailMode === next.providerRailMode && previous.renderProviderRailEmpty === next.renderProviderRailEmpty && previous.renderProviderUnavailableState === next.renderProviderUnavailableState && previous.renderProviderReadinessGateState === next.renderProviderReadinessGateState && previous.comingSoonProviders === next.comingSoonProviders && previous.providerReadinessGates === next.providerReadinessGates && previous.defaultProviderTargetId === next.defaultProviderTargetId && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onRememberComposerDefaults === next.onRememberComposerDefaults && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && previous.workspaceAgentProbes === next.workspaceAgentProbes && previous.onAgentProbeDemandChange === next.onAgentProbeDemandChange && previous.onAgentProbeRefreshRequest === next.onAgentProbeRefreshRequest && previous.providerAuthAccountLabels === next.providerAuthAccountLabels && previous.managedAgentsState === next.managedAgentsState && previous.contextMentionProviders === next.contextMentionProviders && previous.workspaceAppIcons === next.workspaceAppIcons && previous.embedded === next.embedded && previous.previewMode === next.previewMode && previous.isActive === next.isActive && previous.composerFocusRequestSequence === next.composerFocusRequestSequence && previous.newConversationRequestSequence === next.newConversationRequestSequence && previous.openSessionRequest === next.openSessionRequest && previous.prefillPromptRequest === next.prefillPromptRequest;
33418
+ return previous.nodeId === next.nodeId && previous.workspaceId === next.workspaceId && previous.currentUserId === next.currentUserId && previous.workspacePath === next.workspacePath && previous.workspaceFileReferenceAdapter === next.workspaceFileReferenceAdapter && previous.resolveDroppedFileReferences === next.resolveDroppedFileReferences && previous.selectProjectDirectory === next.selectProjectDirectory && previous.referenceSourceAggregator === next.referenceSourceAggregator && previous.resolveWorkspaceReferenceEntryIconUrl === next.resolveWorkspaceReferenceEntryIconUrl && previous.resolveMentionReferenceTarget === next.resolveMentionReferenceTarget && previous.resolveWorkspaceReferenceInitialTarget === next.resolveWorkspaceReferenceInitialTarget && previous.onWorkspaceFileReferencesAdded === next.onWorkspaceFileReferencesAdded && previous.agentSettings.avoidGroupingEdits === next.agentSettings.avoidGroupingEdits && previous.title === next.title && agentGuiStateEquals(previous.state, next.state) && previous.position.x === next.position.x && previous.position.y === next.position.y && previous.width === next.width && previous.height === next.height && previous.desktopSize.width === next.desktopSize.width && previous.desktopSize.height === next.desktopSize.height && previous.onLinkAction === next.onLinkAction && previous.onHandoffConversation === next.onHandoffConversation && previous.onCapabilitySettingsRequest === next.onCapabilitySettingsRequest && previous.onAgentProviderLogin === next.onAgentProviderLogin && previous.accountMenuState === next.accountMenuState && previous.agents === next.agents && previous.agentsLoading === next.agentsLoading && previous.allAgentsPresentation?.iconUrl === next.allAgentsPresentation?.iconUrl && previous.slashCommandFallbackMode === next.slashCommandFallbackMode && previous.renderSidebarFooter === next.renderSidebarFooter && previous.renderAgentsEmpty === next.renderAgentsEmpty && previous.renderAgentUnavailableState === next.renderAgentUnavailableState && previous.renderAgentReadinessState === next.renderAgentReadinessState && previous.onAgentAvailabilityAction === next.onAgentAvailabilityAction && previous.defaultAgentTargetId === next.defaultAgentTargetId && previous.onClose === next.onClose && previous.onResize === next.onResize && previous.onUpdateNode === next.onUpdateNode && previous.onRememberComposerDefaults === next.onRememberComposerDefaults && previous.onOpenConversationWindow === next.onOpenConversationWindow && previous.isMaximized === next.isMaximized && previous.isMuted === next.isMuted && previous.onMinimize === next.onMinimize && previous.onToggleMaximize === next.onToggleMaximize && previous.onShowMessage === next.onShowMessage && previous.workspaceAgentProbes === next.workspaceAgentProbes && previous.onAgentProbeDemandChange === next.onAgentProbeDemandChange && previous.onAgentProbeRefreshRequest === next.onAgentProbeRefreshRequest && previous.providerAuthAccountLabels === next.providerAuthAccountLabels && previous.managedAgentsState === next.managedAgentsState && previous.contextMentionProviders === next.contextMentionProviders && previous.workspaceAppIcons === next.workspaceAppIcons && previous.embedded === next.embedded && previous.previewMode === next.previewMode && previous.isActive === next.isActive && previous.composerFocusRequestSequence === next.composerFocusRequestSequence && previous.newConversationRequestSequence === next.newConversationRequestSequence && previous.openSessionRequest === next.openSessionRequest && previous.prefillPromptRequest === next.prefillPromptRequest;
33347
33419
  }
33348
33420
  var AgentGUINode = memo4(function AgentGUINode2({
33349
33421
  nodeId,
@@ -33371,18 +33443,16 @@ var AgentGUINode = memo4(function AgentGUINode2({
33371
33443
  onCapabilitySettingsRequest,
33372
33444
  onAgentProviderLogin,
33373
33445
  accountMenuState = null,
33374
- providerTargets,
33375
- providerTargetsLoading = false,
33376
- providerRailAllPresentation = null,
33446
+ agents = [],
33447
+ agentsLoading = false,
33448
+ allAgentsPresentation = null,
33377
33449
  slashCommandFallbackMode = "provider-default",
33378
- providerRailMode = "catalog",
33379
- renderProviderRailEmpty,
33380
- renderProviderUnavailableState,
33381
- renderProviderReadinessGateState,
33450
+ renderAgentsEmpty,
33451
+ renderAgentUnavailableState,
33452
+ renderAgentReadinessState,
33453
+ onAgentAvailabilityAction,
33382
33454
  renderSidebarFooter,
33383
- comingSoonProviders,
33384
- providerReadinessGates = null,
33385
- defaultProviderTargetId = null,
33455
+ defaultAgentTargetId = null,
33386
33456
  onWorkspaceFileReferencesAdded,
33387
33457
  onOpenConversationWindow,
33388
33458
  onClose,
@@ -33419,6 +33489,67 @@ var AgentGUINode = memo4(function AgentGUINode2({
33419
33489
  () => typeof i18n?.t === "function" ? createWorkspaceFileManagerI18nRuntime(i18n) : null,
33420
33490
  [i18n]
33421
33491
  );
33492
+ const normalizedAgents = useMemo12(
33493
+ () => normalizeAgentGUIAgents(agents),
33494
+ [agents]
33495
+ );
33496
+ const internalAgentTargets = useMemo12(
33497
+ () => projectAgentGUIAgentsToInternalTargets(normalizedAgents),
33498
+ [normalizedAgents]
33499
+ );
33500
+ const agentByTargetId = useMemo12(
33501
+ () => new Map(
33502
+ normalizedAgents.map((agent) => [agent.agentTargetId, agent])
33503
+ ),
33504
+ [normalizedAgents]
33505
+ );
33506
+ const selectedDirectoryAgent = useMemo12(() => {
33507
+ const selectedAgentTargetId = state.agentTargetId?.trim() || defaultAgentTargetId?.trim() || "";
33508
+ return agentByTargetId.get(selectedAgentTargetId) ?? normalizedAgents[0] ?? null;
33509
+ }, [
33510
+ agentByTargetId,
33511
+ defaultAgentTargetId,
33512
+ normalizedAgents,
33513
+ state.agentTargetId
33514
+ ]);
33515
+ const internalProviderReadinessGates = useMemo12(() => {
33516
+ if (!selectedDirectoryAgent || selectedDirectoryAgent.availability.status === "ready") {
33517
+ return {};
33518
+ }
33519
+ const agentTargetId = selectedDirectoryAgent.agentTargetId;
33520
+ return {
33521
+ [selectedDirectoryAgent.provider]: {
33522
+ status: selectedDirectoryAgent.availability.status,
33523
+ pendingAction: selectedDirectoryAgent.availability.pendingAction ?? null,
33524
+ onAction: (_provider, action) => {
33525
+ onAgentAvailabilityAction?.({ agentTargetId, action });
33526
+ }
33527
+ }
33528
+ };
33529
+ }, [onAgentAvailabilityAction, selectedDirectoryAgent]);
33530
+ const renderInternalAgentUnavailableState = useMemo12(() => {
33531
+ if (!renderAgentUnavailableState) {
33532
+ return void 0;
33533
+ }
33534
+ return ({ target }) => {
33535
+ const agentTargetId = target.agentTargetId?.trim() || target.targetId;
33536
+ const agent = agentByTargetId.get(agentTargetId);
33537
+ return agent ? renderAgentUnavailableState({ agent }) : null;
33538
+ };
33539
+ }, [agentByTargetId, renderAgentUnavailableState]);
33540
+ const renderInternalAgentReadinessState = useMemo12(() => {
33541
+ if (!renderAgentReadinessState) {
33542
+ return void 0;
33543
+ }
33544
+ return ({ target, showAllProviders }) => {
33545
+ const agentTargetId = target?.agentTargetId?.trim() || target?.targetId;
33546
+ const agent = agentTargetId ? agentByTargetId.get(agentTargetId) : selectedDirectoryAgent;
33547
+ return agent ? renderAgentReadinessState({
33548
+ agent,
33549
+ showAllAgents: showAllProviders
33550
+ }) : null;
33551
+ };
33552
+ }, [agentByTargetId, renderAgentReadinessState, selectedDirectoryAgent]);
33422
33553
  const handleLinkAction = useCallback13(
33423
33554
  (action) => {
33424
33555
  const agentTargetId = state.agentTargetId?.trim() || null;
@@ -33543,12 +33674,10 @@ var AgentGUINode = memo4(function AgentGUINode2({
33543
33674
  data: state,
33544
33675
  openSessionRequest,
33545
33676
  prefillPromptRequest,
33546
- providerTargets,
33547
- providerTargetsLoading,
33548
- providerRailMode,
33549
- comingSoonProviders,
33550
- providerReadinessGates,
33551
- defaultProviderTargetId,
33677
+ providerTargets: internalAgentTargets,
33678
+ providerTargetsLoading: agentsLoading,
33679
+ providerReadinessGates: internalProviderReadinessGates,
33680
+ defaultAgentTargetId,
33552
33681
  previewMode,
33553
33682
  onDataChange: handleDataChange,
33554
33683
  onRememberComposerDefaults,
@@ -33806,6 +33935,7 @@ var AgentGUINode = memo4(function AgentGUINode2({
33806
33935
  planImplementationSend: t("agentHost.agentGui.planImplementationSend"),
33807
33936
  planImplementationSkip: t("agentHost.agentGui.planImplementationSkip"),
33808
33937
  noRunningResponse: t("agentHost.agentGui.noRunningResponse"),
33938
+ agentsEmpty: t("agentHost.agentGui.agentsEmpty"),
33809
33939
  empty: t("agentHost.agentGui.empty", { provider: displayProviderLabel }),
33810
33940
  homeSuggestions: buildAgentHomeSuggestions(
33811
33941
  t,
@@ -34430,10 +34560,10 @@ var AgentGUINode = memo4(function AgentGUINode2({
34430
34560
  {
34431
34561
  viewModel,
34432
34562
  renderSidebarFooter,
34433
- renderProviderRailEmpty,
34434
- renderProviderUnavailableState,
34435
- renderProviderReadinessGateState,
34436
- providerRailAllPresentation,
34563
+ renderProviderRailEmpty: renderAgentsEmpty,
34564
+ renderProviderUnavailableState: renderInternalAgentUnavailableState,
34565
+ renderProviderReadinessGateState: renderInternalAgentReadinessState,
34566
+ providerRailAllPresentation: allAgentsPresentation,
34437
34567
  slashCommandFallbackMode,
34438
34568
  actions: viewActions,
34439
34569
  isActive,
@@ -34528,7 +34658,6 @@ export {
34528
34658
  AgentGuiI18nProvider,
34529
34659
  AgentQueuedPromptRuntimeProvider,
34530
34660
  agentActivityRuntimeCapabilityEnabled,
34531
- agentGUIDefaultTargetProviders,
34532
34661
  agentGuiDockIconUrl,
34533
34662
  agentGuiDockIconUrls,
34534
34663
  agentGuiI18nModule,
@@ -34536,15 +34665,10 @@ export {
34536
34665
  agentHostSnapshotFromAgentActivitySnapshot,
34537
34666
  buildAgentActivitySnapshotProjection,
34538
34667
  createAgentQueuedPromptRuntime,
34539
- createLocalAgentGUIProviderTarget,
34540
- createLocalAgentGUIProviderTargets,
34541
- createSharedAgentGUIProviderTarget,
34542
34668
  getAgentActivityRuntime,
34543
34669
  getAgentCustomMentionKind,
34544
34670
  getOptionalAgentActivityRuntime,
34545
- localAgentGUIAgentTargetId,
34546
- localAgentGUIProviderTargetId,
34547
- normalizeAgentGUIProviderTargets,
34671
+ normalizeAgentGUIAgents,
34548
34672
  preloadAgentMentionBrowse,
34549
34673
  projectCoreSessionStatus,
34550
34674
  registerAgentCustomMentionKind,
@@ -34552,7 +34676,6 @@ export {
34552
34676
  resetAgentCustomMentionKindsForTests,
34553
34677
  resetAgentQueuedPromptRuntimeForTests,
34554
34678
  resolveAgentGUIExpandedWindowFrame,
34555
- resolveAgentGUIProviderTarget,
34556
34679
  selectNeedsAttentionCount2 as selectNeedsAttentionCount,
34557
34680
  selectNeedsAttentionItems2 as selectNeedsAttentionItems,
34558
34681
  setAgentActivityRuntimeForTests,