@tutti-os/agent-gui 0.0.85 → 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 (62) 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/{chunk-A2JPL5N6.js → chunk-3HARXLAZ.js} +2 -2
  7. package/dist/{chunk-BEM3KDOJ.js → chunk-45FF4DQU.js} +17 -281
  8. package/dist/chunk-45FF4DQU.js.map +1 -0
  9. package/dist/{chunk-UNLTQUPO.js → chunk-4SQNOOJ3.js} +4 -4
  10. package/dist/{chunk-FIH7IYLX.js → chunk-7FZT2OYT.js} +4 -4
  11. package/dist/chunk-7FZT2OYT.js.map +1 -0
  12. package/dist/{chunk-L2ZMLLYL.js → chunk-7LMJXF4R.js} +2 -2
  13. package/dist/{chunk-DBIJRSFG.js → chunk-A7RA7ORT.js} +104 -45
  14. package/dist/chunk-A7RA7ORT.js.map +1 -0
  15. package/dist/{chunk-CVPWQHQH.js → chunk-AOVPGJBC.js} +2 -2
  16. package/dist/{chunk-BT2DT2P7.js → chunk-GAPTLVII.js} +1 -1
  17. package/dist/{chunk-BT2DT2P7.js.map → chunk-GAPTLVII.js.map} +1 -1
  18. package/dist/{chunk-3355GEBI.js → chunk-HOSX5C5V.js} +2 -2
  19. package/dist/{chunk-CXJEQQR5.js → chunk-KQE5KV2V.js} +2 -2
  20. package/dist/{chunk-N7EX6XK3.js → chunk-SXDLSEHO.js} +3 -3
  21. package/dist/{chunk-MQ6WW3CD.js → chunk-U7D7G3UU.js} +2 -2
  22. package/dist/{chunk-6YLA7R4S.js → chunk-UNO7CEAF.js} +2 -2
  23. package/dist/{chunk-AA75BOX3.js → chunk-VWXFFSIM.js} +3 -1
  24. package/dist/chunk-VWXFFSIM.js.map +1 -0
  25. package/dist/{chunk-HUNUSBQQ.js → chunk-XQUUELKF.js} +2 -2
  26. package/dist/context-mention-palette/index.js +6 -6
  27. package/dist/i18n/index.d.ts +2 -0
  28. package/dist/i18n/index.js +2 -2
  29. package/dist/index.d.ts +28 -94
  30. package/dist/index.js +479 -445
  31. package/dist/index.js.map +1 -1
  32. package/dist/queued-prompt-runtime.d.ts +2 -2
  33. package/dist/{types-DUHHejs2.d.ts → types-BvztUbHf.d.ts} +31 -21
  34. package/dist/workbench/contribution.d.ts +9 -11
  35. package/dist/workbench/contribution.js +4 -4
  36. package/dist/workbench/index.d.ts +1 -1
  37. package/dist/workbench/index.js +7 -7
  38. package/dist/workbench/launch.d.ts +0 -1
  39. package/dist/workbench/launch.js +2 -2
  40. package/dist/workbench/providerCatalog.d.ts +0 -1
  41. package/dist/workbench/sessionTitle.d.ts +0 -1
  42. package/dist/workbench/sessionTitle.js +3 -3
  43. package/dist/workbench/state.d.ts +7 -2
  44. package/dist/workbench/state.js +3 -1
  45. package/dist/workbench/types.d.ts +0 -6
  46. package/dist/workbench/types.js +1 -1
  47. package/dist/workspace-agent-generated-files.js +3 -3
  48. package/package.json +12 -12
  49. package/dist/chunk-AA75BOX3.js.map +0 -1
  50. package/dist/chunk-BEM3KDOJ.js.map +0 -1
  51. package/dist/chunk-DBIJRSFG.js.map +0 -1
  52. package/dist/chunk-FIH7IYLX.js.map +0 -1
  53. /package/dist/{chunk-A2JPL5N6.js.map → chunk-3HARXLAZ.js.map} +0 -0
  54. /package/dist/{chunk-UNLTQUPO.js.map → chunk-4SQNOOJ3.js.map} +0 -0
  55. /package/dist/{chunk-L2ZMLLYL.js.map → chunk-7LMJXF4R.js.map} +0 -0
  56. /package/dist/{chunk-CVPWQHQH.js.map → chunk-AOVPGJBC.js.map} +0 -0
  57. /package/dist/{chunk-3355GEBI.js.map → chunk-HOSX5C5V.js.map} +0 -0
  58. /package/dist/{chunk-CXJEQQR5.js.map → chunk-KQE5KV2V.js.map} +0 -0
  59. /package/dist/{chunk-N7EX6XK3.js.map → chunk-SXDLSEHO.js.map} +0 -0
  60. /package/dist/{chunk-MQ6WW3CD.js.map → chunk-U7D7G3UU.js.map} +0 -0
  61. /package/dist/{chunk-6YLA7R4S.js.map → chunk-UNO7CEAF.js.map} +0 -0
  62. /package/dist/{chunk-HUNUSBQQ.js.map → chunk-XQUUELKF.js.map} +0 -0
package/README.md CHANGED
@@ -84,54 +84,59 @@ Run this boundary check after changing AgentGUI data flow:
84
84
  pnpm check:agent-activity-runtime-boundaries
85
85
  ```
86
86
 
87
- ## Provider Targets
87
+ ## Agent Directory
88
88
 
89
- `provider` remains the real provider identity, such as `codex`,
90
- `claude-code`, or `nexight`. AgentGUI uses that identity for composer options,
91
- settings, icons, probes, status, and provider-specific UI policy.
92
-
93
- Hosts may pass `providerTargets` when a real provider has multiple launch
94
- targets. A target has display metadata plus an opaque `ref`:
89
+ `AgentGUI` requires the host's `/agents` projection through its `agents` prop.
90
+ The array is the complete UI directory and its order is authoritative. AgentGUI
91
+ does not add provider catalog entries when the array is empty.
95
92
 
96
93
  ```ts
97
- export interface AgentGUIProviderTargetRef {
98
- kind: string;
99
- provider: AgentGUIProvider;
100
- [key: string]: unknown;
101
- }
102
-
103
- export interface AgentGUIProviderTarget {
104
- targetId: string;
94
+ export interface AgentGUIAgent {
95
+ agentTargetId: string;
96
+ name: string;
97
+ iconUrl: string;
98
+ description?: string | null;
99
+ owner?: {
100
+ name?: string | null;
101
+ avatarUrl?: string | null;
102
+ } | null;
103
+ availability: {
104
+ status:
105
+ | "ready"
106
+ | "checking"
107
+ | "coming_soon"
108
+ | "not_installed"
109
+ | "auth_required"
110
+ | "unavailable";
111
+ reason?: string | null;
112
+ pendingAction?: "install" | "login" | "refresh" | null;
113
+ };
105
114
  provider: AgentGUIProvider;
106
- ref: AgentGUIProviderTargetRef;
107
- label: string;
108
- description?: string;
109
- ownerLabel?: string;
110
- disabled?: boolean;
111
- unavailableReason?: string;
112
115
  }
113
116
  ```
114
117
 
115
- AgentGUI does not interpret `ref.kind` and does not treat `targetId` or `ref`
116
- as authority. It displays `target.label`, keeps provider logic keyed by the
117
- real `target.provider`, and starts new sessions with the selected
118
- `agentTargetId`. Trusted host code must re-authenticate the current
119
- user/workspace and resolve any invocation plan before launching.
120
-
121
- If `providerTargets` is omitted or empty, AgentGUI creates local targets such as
122
- `local:codex` and `local:claude-code` from the static provider catalog for
123
- display/backward compatibility. Those static catalog targets are not persisted
124
- or sent as session creation authority.
125
-
126
- Hosts that need to brand the aggregate provider rail entry may pass
127
- `providerRailAllPresentation.iconUrl`. This only changes the `All` filter icon;
128
- single agent or target icons continue to come from `providerTargets[].iconUrl`.
129
-
130
- Hosts that need custom main-pane presentation for a disabled selected target may
131
- pass `renderProviderUnavailableState`. AgentGUI calls this renderer only when
132
- the selected `providerTargets[]` entry has `disabled: true`.
133
-
134
- Hosts that need custom main-pane presentation for provider readiness gates may
135
- pass `renderProviderReadinessGateState`. AgentGUI calls this renderer for
136
- host-projected gates such as checking, install, login, coming-soon, and
137
- unavailable; when it is omitted, AgentGUI uses the built-in readiness pane.
118
+ `agentTargetId` is the sole entry identity used for selection, filtering,
119
+ composer option lookup, persisted node state, and new-session launch. Two agents
120
+ may share the same `provider` and remain distinct. `provider` is runtime metadata
121
+ for provider-native execution, composer policy, probes, and capabilities; it
122
+ must not be used to group, deduplicate, name, icon, or select agents.
123
+
124
+ Agent names and primary icons always come from `agents[].name` and
125
+ `agents[].iconUrl`. `owner.avatarUrl` is rendered separately as an ownership
126
+ badge. Invalid entries and duplicate `agentTargetId` values are discarded by
127
+ `normalizeAgentGUIAgents`, with the first occurrence preserving host order.
128
+
129
+ With one agent, AgentGUI hides the aggregate `All` entry and renders that agent
130
+ directly. With multiple agents, it shows `All` plus the host-ordered agent rail
131
+ and empty-home carousel. Hosts may customize the aggregate icon with
132
+ `allAgentsPresentation.iconUrl`.
133
+
134
+ Use `agentsLoading` for directory hydration and `renderAgentsEmpty` for a
135
+ host-specific loaded-empty state. Use `renderAgentUnavailableState` or
136
+ `renderAgentReadinessState` for host-specific availability presentation, and
137
+ handle install/login/refresh requests through `onAgentAvailabilityAction`.
138
+
139
+ The old public `providerTargets`, `providerRailMode`, provider-target renderers,
140
+ and `defaultProviderTargetId` contract is intentionally unsupported. Workbench
141
+ state hydration performs a one-time read of legacy `providerTargetId` into
142
+ `agentTargetId`; new state writes contain only `agentTargetId`.
@@ -4,11 +4,11 @@ import { W as WorkspaceLinkAction } from '../workspaceLinkActions-DS9LWqzI.js';
4
4
  import { A as AgentMessageMarkdownWorkspaceAppIcon } from '../AgentMessageMarkdown-DeYPURtF.js';
5
5
  import { c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BgoqFyE9.js';
6
6
  export { B as BuildWorkspaceAgentSessionDetailInput, d as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-BgoqFyE9.js';
7
- import { e as AgentGUIProviderSkillOption } from '../agentGuiNodeTypes-CmuJ7VDZ.js';
7
+ import { e as AgentGUIProviderSkillOption } from '../agentGuiNodeTypes-fRobgKiP.js';
8
8
  export { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, q as WorkspaceAgentActivityTimelineItem } from '../workspaceAgentActivityListViewModel-TXH1VXrk.js';
9
9
  import '@tutti-os/workspace-issue-manager/core';
10
10
  import '@tutti-os/agent-activity-core';
11
- import '../types-DUHHejs2.js';
11
+ import '../types-BvztUbHf.js';
12
12
  import '@tutti-os/workspace-user-project/contracts';
13
13
 
14
14
  interface AgentConversationFlowProps {
@@ -6,20 +6,20 @@ import {
6
6
  projectAgentConversationVM,
7
7
  reconcileProjectedAgentConversationVM,
8
8
  useProjectedAgentConversation
9
- } from "../chunk-FIH7IYLX.js";
10
- import "../chunk-HUNUSBQQ.js";
9
+ } from "../chunk-7FZT2OYT.js";
10
+ import "../chunk-XQUUELKF.js";
11
11
  import "../chunk-PSLAWU25.js";
12
- import "../chunk-CXJEQQR5.js";
12
+ import "../chunk-KQE5KV2V.js";
13
13
  import "../chunk-Y35GDLP2.js";
14
14
  import "../chunk-LUGELG5V.js";
15
15
  import "../chunk-LR4FA5X6.js";
16
16
  import "../chunk-4HP6V2YA.js";
17
17
  import {
18
18
  translate
19
- } from "../chunk-MQ6WW3CD.js";
19
+ } from "../chunk-U7D7G3UU.js";
20
20
  import "../chunk-PJP5BUU6.js";
21
21
  import "../chunk-XDV4ZRVK.js";
22
- import "../chunk-AA75BOX3.js";
22
+ import "../chunk-VWXFFSIM.js";
23
23
 
24
24
  // shared/WorkspaceAgentSessionDetail.tsx
25
25
  import { useMemo } from "react";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  formatAgentGuiConversationPlainTitle
3
- } from "../chunk-6YLA7R4S.js";
3
+ } from "../chunk-UNO7CEAF.js";
4
4
  import {
5
5
  AgentInteractivePromptSurface,
6
6
  approvalOptionDisplayLabel,
7
7
  getPromptToolDetails,
8
8
  isPromptRequestIdTitle
9
- } from "../chunk-N7EX6XK3.js";
9
+ } from "../chunk-SXDLSEHO.js";
10
10
  import {
11
11
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
12
12
  PLAN_IMPLEMENTATION_PROMPT,
@@ -15,7 +15,7 @@ import {
15
15
  } from "../chunk-MKHDRIGN.js";
16
16
  import {
17
17
  formatAgentSessionMentionText
18
- } from "../chunk-3355GEBI.js";
18
+ } from "../chunk-HOSX5C5V.js";
19
19
  import {
20
20
  AgentMessageMarkdown,
21
21
  CustomScrollArea,
@@ -25,11 +25,11 @@ import {
25
25
  extractExitPlanModeOptions,
26
26
  isExitPlanSwitchModeInput,
27
27
  normalizeAskUserQuestions
28
- } from "../chunk-HUNUSBQQ.js";
28
+ } from "../chunk-XQUUELKF.js";
29
29
  import {
30
30
  userAvatarPlaceholderUrl,
31
31
  workspaceAgentActivityStatusLabel
32
- } from "../chunk-CVPWQHQH.js";
32
+ } from "../chunk-AOVPGJBC.js";
33
33
  import {
34
34
  resolveWorkspaceAgentSessionSortTimeUnixMs
35
35
  } from "../chunk-IBIMGLCD.js";
@@ -43,10 +43,10 @@ import {
43
43
  AgentGuiI18nProvider,
44
44
  getActiveUiLanguage,
45
45
  useTranslation
46
- } from "../chunk-MQ6WW3CD.js";
46
+ } from "../chunk-U7D7G3UU.js";
47
47
  import "../chunk-PJP5BUU6.js";
48
48
  import "../chunk-XDV4ZRVK.js";
49
- import "../chunk-AA75BOX3.js";
49
+ import "../chunk-VWXFFSIM.js";
50
50
  import "../chunk-GCBDIQDX.js";
51
51
 
52
52
  // agent-message-center/WorkspaceAgentMessageCenterPanel.tsx
@@ -1,5 +1,5 @@
1
1
  import { AgentActivityUsage } from '@tutti-os/agent-activity-core';
2
- import { k as AgentHostAgentSessionCommand, l as AgentHostAgentSessionComposerSettings, n as AgentHostAgentSessionReasoningEffort, o as AgentHostAgentSessionSpeed, m as AgentHostAgentSessionPermissionConfig, p as AgentHostAgentSessionState, a as AgentGUIProvider, s as AgentPromptContentBlock, A as AgentGUINodeData, g as AgentGUIProviderTarget, c as AgentGUIProviderRailMode, d as AgentGUIProviderReadinessGate } from './types-DUHHejs2.js';
2
+ import { k as AgentHostAgentSessionCommand, l as AgentHostAgentSessionComposerSettings, n as AgentHostAgentSessionReasoningEffort, o as AgentHostAgentSessionSpeed, m as AgentHostAgentSessionPermissionConfig, p as AgentHostAgentSessionState, g as AgentGUIProvider, s as AgentPromptContentBlock, f as AgentGUINodeData, i as AgentGUIProviderTarget, h as AgentGUIProviderReadinessGate } from './types-BvztUbHf.js';
3
3
  import { A as AgentHostBatchUserInfoInput, a as AgentHostBatchUserInfoResult, b as AgentHostDeleteWorkspaceAgentSessionInput, k as AgentHostWorkspaceAgentSessionSummaryInput, j as AgentHostWorkspaceAgentSessionSummary, e as AgentHostWorkspaceAgentListInput, l as AgentHostWorkspaceAgentSnapshot, i as AgentHostWorkspaceAgentSessionMessagesInput, h as AgentHostWorkspaceAgentSessionMessages, p as WorkspaceAgentActivitySyncState } from './workspaceAgentActivityListViewModel-TXH1VXrk.js';
4
4
  import { A as AgentApprovalItemVM, a as AgentAskUserQuestionVM, b as AgentConversationPromptVM, c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from './agentConversationVM-BgoqFyE9.js';
5
5
  import { WorkspaceUserProjectService } from '@tutti-os/workspace-user-project/contracts';
@@ -607,10 +607,6 @@ interface AgentGUINodeViewModel {
607
607
  providerTargets: readonly AgentGUIProviderTarget[];
608
608
  handoffProviderTargets: readonly AgentGUIProviderTarget[];
609
609
  providerTargetsLoading: boolean;
610
- /** How the rail composes its list — "exact" renders targets verbatim with no static injection. */
611
- providerRailMode: AgentGUIProviderRailMode;
612
- /** Providers gated by the host (feature-gated) — rail renders coming-soon placeholders. */
613
- comingSoonProviders: readonly AgentGUIProvider[];
614
610
  conversationFilter: AgentGUIConversationFilter;
615
611
  conversations: AgentGUIConversationSummary[];
616
612
  userProjects: AgentGUIConversationUserProject[];
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  translate,
14
14
  translateInUiLanguage
15
- } from "./chunk-MQ6WW3CD.js";
15
+ } from "./chunk-U7D7G3UU.js";
16
16
  import {
17
17
  normalizeAgentTitleText
18
18
  } from "./chunk-GCBDIQDX.js";
@@ -826,4 +826,4 @@ export {
826
826
  resolveWorkspaceAgentActivityStatus,
827
827
  resolveWorkspaceAgentActivityTitle
828
828
  };
829
- //# sourceMappingURL=chunk-A2JPL5N6.js.map
829
+ //# sourceMappingURL=chunk-3HARXLAZ.js.map
@@ -4,242 +4,6 @@ import {
4
4
  normalizeAgentGuiWorkbenchProvider
5
5
  } from "./chunk-XW4CVBUH.js";
6
6
 
7
- // providerTargets.ts
8
- var agentGUIProviderTargetStaticLabels = {
9
- "claude-code": "Claude Code",
10
- codex: "Codex",
11
- cursor: "Cursor",
12
- hermes: "Hermes",
13
- nexight: "Tutti Agent",
14
- openclaw: "OpenClaw",
15
- opencode: "Open Code",
16
- "tutti-agent": "Tutti Agent"
17
- };
18
- var agentGUIDefaultTargetProviders = [
19
- "codex",
20
- "claude-code",
21
- "cursor",
22
- "tutti-agent",
23
- "opencode",
24
- "hermes",
25
- "openclaw"
26
- ];
27
- var agentGUIDisabledPlaceholderProviders = [
28
- "hermes",
29
- "openclaw"
30
- ];
31
- function createLocalAgentGUIProviderTarget(provider) {
32
- const targetId = localAgentGUIProviderTargetId(provider);
33
- const agentTargetId = localAgentGUIAgentTargetId(provider);
34
- return {
35
- targetId,
36
- ...agentTargetId ? { agentTargetId } : {},
37
- provider,
38
- ref: {
39
- kind: "local",
40
- provider
41
- },
42
- label: agentGUIProviderTargetStaticLabels[provider] ?? provider
43
- };
44
- }
45
- function createDisabledPlaceholderAgentGUIProviderTarget(provider) {
46
- return {
47
- ...createLocalAgentGUIProviderTarget(provider),
48
- disabled: true
49
- };
50
- }
51
- function createSharedAgentGUIProviderTarget(input) {
52
- const sharedAgentId = input.sharedAgentId.trim();
53
- const targetId = `shared-agent:${sharedAgentId}`;
54
- const badge = normalizeAgentGUIProviderTargetBadge(input.badge);
55
- return {
56
- targetId,
57
- ...input.agentTargetId?.trim() ? { agentTargetId: input.agentTargetId.trim() } : {},
58
- provider: input.provider,
59
- ref: {
60
- ...input.ref ?? {},
61
- kind: "shared-agent",
62
- provider: input.provider,
63
- sharedAgentId
64
- },
65
- label: input.label,
66
- ...badge ? { badge } : {},
67
- ...input.ownerLabel?.trim() ? { ownerLabel: input.ownerLabel.trim() } : {},
68
- ...input.iconUrl?.trim() ? { iconUrl: input.iconUrl.trim() } : {},
69
- ...input.unavailableReason?.trim() ? { unavailableReason: input.unavailableReason.trim() } : {},
70
- ...input.disabled === true ? { disabled: true } : {}
71
- };
72
- }
73
- function createLocalAgentGUIProviderTargets(providers = agentGUIDefaultTargetProviders) {
74
- return providers.map(
75
- (provider) => createLocalAgentGUIProviderTarget(provider)
76
- );
77
- }
78
- function createStaticAgentGUIProviderTargets(providers = agentGUIDefaultTargetProviders, options) {
79
- const disabledProviders = new Set(
80
- options?.includeDisabledPlaceholders === true ? agentGUIDisabledPlaceholderProviders : []
81
- );
82
- return providers.map(
83
- (provider) => disabledProviders.has(provider) ? createDisabledPlaceholderAgentGUIProviderTarget(provider) : createLocalAgentGUIProviderTarget(provider)
84
- );
85
- }
86
- function localAgentGUIProviderTargetId(provider) {
87
- return `local:${provider}`;
88
- }
89
- function localAgentGUIAgentTargetId(provider) {
90
- switch (provider) {
91
- case "codex":
92
- return "local:codex";
93
- case "claude-code":
94
- return "local:claude-code";
95
- case "tutti-agent":
96
- return "local:tutti-agent";
97
- case "cursor":
98
- return "local:cursor";
99
- case "hermes":
100
- return "local:hermes";
101
- case "nexight":
102
- return "local:nexight";
103
- case "openclaw":
104
- return "local:openclaw";
105
- case "opencode":
106
- return "local:opencode";
107
- default:
108
- return null;
109
- }
110
- }
111
- function normalizeAgentGUIProviderTargets(targets, options) {
112
- const includeDisabledPlaceholders = options?.includeDisabledPlaceholders === true;
113
- const useStaticCatalog = options?.useStaticCatalog !== false;
114
- const source = targets && targets.length > 0 ? targets : [];
115
- const normalizedTargets = [];
116
- const seenTargetKeys = /* @__PURE__ */ new Set();
117
- const seenProviders = /* @__PURE__ */ new Set();
118
- for (const target of source) {
119
- const normalized = normalizeAgentGUIProviderTarget(target);
120
- if (!normalized) {
121
- continue;
122
- }
123
- const dedupeKey = `${normalized.provider}\0${normalized.targetId}`;
124
- if (seenTargetKeys.has(dedupeKey)) {
125
- continue;
126
- }
127
- seenTargetKeys.add(dedupeKey);
128
- seenProviders.add(normalized.provider);
129
- normalizedTargets.push(normalized);
130
- }
131
- if (includeDisabledPlaceholders && normalizedTargets.length > 0) {
132
- for (const provider of agentGUIDisabledPlaceholderProviders) {
133
- if (seenProviders.has(provider)) {
134
- continue;
135
- }
136
- normalizedTargets.push(
137
- createDisabledPlaceholderAgentGUIProviderTarget(provider)
138
- );
139
- }
140
- }
141
- return normalizedTargets.length > 0 || !useStaticCatalog ? normalizedTargets : createStaticAgentGUIProviderTargets(void 0, {
142
- includeDisabledPlaceholders
143
- });
144
- }
145
- function resolveAgentGUIProviderTarget(input) {
146
- const targetByAgentTargetId = new Map(
147
- input.providerTargets.flatMap(
148
- (target) => target.agentTargetId ? [[target.agentTargetId, target]] : []
149
- )
150
- );
151
- const agentTarget = targetByAgentTargetId.get(
152
- input.agentTargetId?.trim() ?? ""
153
- );
154
- if (agentTarget) {
155
- return agentTarget;
156
- }
157
- const providerTargets = input.providerTargets.filter(
158
- (target) => target.provider === input.provider
159
- );
160
- const targetById = new Map(
161
- providerTargets.map((target) => [target.targetId, target])
162
- );
163
- return targetById.get(input.providerTargetId?.trim() ?? "") ?? targetById.get(input.defaultProviderTargetId?.trim() ?? "") ?? targetById.get(localAgentGUIProviderTargetId(input.provider)) ?? providerTargets.find((target) => target.disabled !== true) ?? providerTargets[0] ?? (input.useStaticCatalog === false ? null : createLocalAgentGUIProviderTarget(input.provider));
164
- }
165
- function agentGUIProviderTargetRefsEqual(left, right) {
166
- if (left === right) {
167
- return true;
168
- }
169
- if (!left && !right) {
170
- return true;
171
- }
172
- if (!left || !right) {
173
- return false;
174
- }
175
- return stableProviderTargetRefKey(left) === stableProviderTargetRefKey(right);
176
- }
177
- function normalizeAgentGUIProviderTarget(target) {
178
- const {
179
- targetId: _targetId,
180
- agentTargetId: _agentTargetId,
181
- provider: _provider,
182
- ref: _ref,
183
- label: _label,
184
- badge,
185
- description,
186
- iconUrl,
187
- ownerLabel,
188
- unavailableReason,
189
- ...rest
190
- } = target;
191
- const targetId = target.targetId.trim();
192
- const agentTargetId = target.agentTargetId?.trim();
193
- const label = target.label.trim();
194
- const kind = typeof target.ref.kind === "string" ? target.ref.kind.trim() : "";
195
- if (!targetId || !label || !kind || target.ref.provider !== target.provider) {
196
- return null;
197
- }
198
- const normalizedBadge = normalizeAgentGUIProviderTargetBadge(badge);
199
- return {
200
- ...rest,
201
- targetId,
202
- ...agentTargetId ? { agentTargetId } : {},
203
- provider: target.provider,
204
- ref: {
205
- ...target.ref,
206
- kind,
207
- provider: target.provider
208
- },
209
- label,
210
- ...normalizedBadge ? { badge: normalizedBadge } : {},
211
- ...description?.trim() ? { description: description.trim() } : {},
212
- ...iconUrl?.trim() ? { iconUrl: iconUrl.trim() } : {},
213
- ...ownerLabel?.trim() ? { ownerLabel: ownerLabel.trim() } : {},
214
- ...unavailableReason?.trim() ? { unavailableReason: unavailableReason.trim() } : {}
215
- };
216
- }
217
- function normalizeAgentGUIProviderTargetBadge(badge) {
218
- const iconUrl = badge?.iconUrl?.trim() ?? "";
219
- if (!iconUrl) {
220
- return null;
221
- }
222
- const label = badge?.label?.trim() ?? "";
223
- return {
224
- iconUrl,
225
- ...label ? { label } : {}
226
- };
227
- }
228
- function stableProviderTargetRefKey(ref) {
229
- return JSON.stringify(sortProviderTargetRefValue(ref));
230
- }
231
- function sortProviderTargetRefValue(value) {
232
- if (Array.isArray(value)) {
233
- return value.map(sortProviderTargetRefValue);
234
- }
235
- if (!value || typeof value !== "object") {
236
- return value;
237
- }
238
- return Object.fromEntries(
239
- Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entryValue]) => [key, sortProviderTargetRefValue(entryValue)])
240
- );
241
- }
242
-
243
7
  // workbench/state.ts
244
8
  function createDefaultAgentGuiWorkbenchNodeState(provider = "codex") {
245
9
  return {
@@ -252,16 +16,14 @@ function createDefaultAgentGuiWorkbenchNodeState(provider = "codex") {
252
16
  conversationRailWidthPx: null,
253
17
  lastActiveAgentSessionId: null,
254
18
  lastActiveConversationTitle: null,
255
- provider,
256
- providerTargetId: null,
257
- providerTargetRef: null
19
+ provider
258
20
  };
259
21
  }
260
22
  function normalizeAgentGuiWorkbenchState(state) {
261
23
  if (!isRecord(state)) {
262
24
  return createDefaultAgentGuiWorkbenchState();
263
25
  }
264
- const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId) ?? normalizeOptionalNonEmptyString(state.providerTargetId);
26
+ const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);
265
27
  return {
266
28
  ...agentTargetId ? { agentTargetId } : {},
267
29
  conversationRailCollapsed: state.conversationRailCollapsed === true,
@@ -272,8 +34,17 @@ function normalizeAgentGuiWorkbenchState(state) {
272
34
  ...typeof state.lastActiveConversationTitle === "string" ? { lastActiveConversationTitle: state.lastActiveConversationTitle } : {}
273
35
  };
274
36
  }
37
+ function migrateLegacyAgentGuiWorkbenchState(state) {
38
+ if (!isRecord(state) || normalizeOptionalNonEmptyString(state.agentTargetId)) {
39
+ return state;
40
+ }
41
+ const legacyAgentTargetId = normalizeOptionalNonEmptyString(
42
+ state.providerTargetId
43
+ );
44
+ return legacyAgentTargetId ? { ...state, agentTargetId: legacyAgentTargetId } : state;
45
+ }
275
46
  function projectAgentGuiWorkbenchState(state) {
276
- const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId) ?? normalizeOptionalNonEmptyString(state.providerTargetId);
47
+ const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);
277
48
  return {
278
49
  ...agentTargetId ? { agentTargetId } : {},
279
50
  conversationRailCollapsed: state.conversationRailCollapsed === true,
@@ -294,7 +65,7 @@ function normalizeAgentGuiWorkbenchNodeState(state, fallbackProvider = "codex")
294
65
  );
295
66
  return {
296
67
  ...createDefaultAgentGuiWorkbenchNodeState(provider),
297
- agentTargetId: normalizeOptionalNonEmptyString(state?.agentTargetId) ?? normalizeOptionalNonEmptyString(state?.providerTargetId),
68
+ agentTargetId: normalizeOptionalNonEmptyString(state?.agentTargetId),
298
69
  composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(
299
70
  state?.composerOverrides
300
71
  ),
@@ -313,12 +84,7 @@ function normalizeAgentGuiWorkbenchNodeState(state, fallbackProvider = "codex")
313
84
  ),
314
85
  lastActiveAgentSessionId: typeof state?.lastActiveAgentSessionId === "string" ? state.lastActiveAgentSessionId : null,
315
86
  lastActiveConversationTitle: typeof state?.lastActiveConversationTitle === "string" ? state.lastActiveConversationTitle : null,
316
- provider,
317
- providerTargetId: normalizeOptionalNonEmptyString(state?.providerTargetId),
318
- providerTargetRef: normalizeAgentGuiProviderTargetRef(
319
- state?.providerTargetRef,
320
- provider
321
- )
87
+ provider
322
88
  };
323
89
  }
324
90
  function areAgentGuiWorkbenchNodeStatesEqual(left, right) {
@@ -328,10 +94,7 @@ function areAgentGuiWorkbenchNodeStatesEqual(left, right) {
328
94
  ) && composerOverridesByProviderEqual(
329
95
  left.composerOverridesByProvider,
330
96
  right.composerOverridesByProvider
331
- ) && left.conversationCount === right.conversationCount && left.conversationRailCollapsed === right.conversationRailCollapsed && left.conversationRailWidthPx === right.conversationRailWidthPx && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && left.lastActiveConversationTitle === right.lastActiveConversationTitle && left.provider === right.provider && (left.agentTargetId ?? null) === (right.agentTargetId ?? null) && (left.providerTargetId ?? null) === (right.providerTargetId ?? null) && agentGUIProviderTargetRefsEqual(
332
- left.providerTargetRef,
333
- right.providerTargetRef
334
- );
97
+ ) && left.conversationCount === right.conversationCount && left.conversationRailCollapsed === right.conversationRailCollapsed && left.conversationRailWidthPx === right.conversationRailWidthPx && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && left.lastActiveConversationTitle === right.lastActiveConversationTitle && left.provider === right.provider && (left.agentTargetId ?? null) === (right.agentTargetId ?? null);
335
98
  }
336
99
  function agentGuiWorkbenchProviderFromInstanceId(instanceId) {
337
100
  const normalized = instanceId?.trim();
@@ -451,24 +214,6 @@ function createDefaultAgentGuiWorkbenchState() {
451
214
  function normalizeOptionalNonEmptyString(value) {
452
215
  return typeof value === "string" && value.trim() ? value.trim() : null;
453
216
  }
454
- function normalizeAgentGuiProviderTargetRef(value, expectedProvider) {
455
- if (!isRecord(value)) {
456
- return null;
457
- }
458
- const kind = normalizeOptionalNonEmptyString(value.kind);
459
- const provider = value.provider;
460
- if (!kind || !isAgentGuiWorkbenchProvider(provider)) {
461
- return null;
462
- }
463
- if (expectedProvider && provider !== expectedProvider) {
464
- return null;
465
- }
466
- return {
467
- ...value,
468
- kind,
469
- provider
470
- };
471
- }
472
217
  function normalizeAgentGuiWorkbenchComposerOverrides(value) {
473
218
  if (!isRecord(value)) {
474
219
  return null;
@@ -552,18 +297,9 @@ function isRecord(value) {
552
297
  }
553
298
 
554
299
  export {
555
- agentGUIDefaultTargetProviders,
556
- createLocalAgentGUIProviderTarget,
557
- createDisabledPlaceholderAgentGUIProviderTarget,
558
- createSharedAgentGUIProviderTarget,
559
- createLocalAgentGUIProviderTargets,
560
- localAgentGUIProviderTargetId,
561
- localAgentGUIAgentTargetId,
562
- normalizeAgentGUIProviderTargets,
563
- resolveAgentGUIProviderTarget,
564
- agentGUIProviderTargetRefsEqual,
565
300
  createDefaultAgentGuiWorkbenchNodeState,
566
301
  normalizeAgentGuiWorkbenchState,
302
+ migrateLegacyAgentGuiWorkbenchState,
567
303
  projectAgentGuiWorkbenchState,
568
304
  areAgentGuiWorkbenchStatesEqual,
569
305
  normalizeAgentGuiWorkbenchNodeState,
@@ -572,4 +308,4 @@ export {
572
308
  agentGuiWorkbenchProviderFromInstanceIdOrNull,
573
309
  createAgentGuiWorkbenchNodeStateSource
574
310
  };
575
- //# sourceMappingURL=chunk-BEM3KDOJ.js.map
311
+ //# sourceMappingURL=chunk-45FF4DQU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/state.ts"],"sourcesContent":["import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n lastActiveConversationTitle: null,\n provider\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\n/**\n * One-time persisted-state reader for snapshots written before agentTargetId\n * became the canonical AgentGUI selection key. Current-state normalizers stay\n * strict so live callers cannot continue using the removed alias.\n */\nexport function migrateLegacyAgentGuiWorkbenchState(state: unknown): unknown {\n if (\n !isRecord(state) ||\n normalizeOptionalNonEmptyString(state.agentTargetId)\n ) {\n return state;\n }\n const legacyAgentTargetId = normalizeOptionalNonEmptyString(\n state.providerTargetId\n );\n return legacyAgentTargetId\n ? { ...state, agentTargetId: legacyAgentTargetId }\n : state;\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n (left.lastActiveConversationTitle ?? null) ===\n (right.lastActiveConversationTitle ?? null)\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: Partial<AgentGuiWorkbenchNodeState> | null | undefined,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const provider = normalizeAgentGuiWorkbenchProvider(\n state?.provider,\n fallbackProvider\n );\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId: normalizeOptionalNonEmptyString(state?.agentTargetId),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n state?.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n state?.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n state?.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n state?.conversationCount\n ),\n conversationRailCollapsed: state?.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state?.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state?.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n lastActiveConversationTitle:\n typeof state?.lastActiveConversationTitle === \"string\"\n ? state.lastActiveConversationTitle\n : null,\n provider\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.lastActiveConversationTitle === right.lastActiveConversationTitle &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null)\n );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return \"codex\";\n }\n const [, provider] = normalized.split(\":\", 3);\n return normalizeAgentGuiWorkbenchProvider(provider);\n}\n\n/**\n * Like {@link agentGuiWorkbenchProviderFromInstanceId} but returns `null`\n * instead of defaulting to `\"codex\"` when the provider cannot be determined\n * yet (e.g. a freshly created session whose instanceId does not encode a\n * provider). Callers that render a provider icon use this so they can show a\n * neutral placeholder during that transient window instead of flashing the\n * wrong provider's icon.\n */\nexport function agentGuiWorkbenchProviderFromInstanceIdOrNull(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return null;\n }\n const [, provider] = normalized.split(\":\", 3);\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}