@tutti-os/agent-gui 0.0.71 → 0.0.72

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 (64) hide show
  1. package/dist/{AgentMentionSearchController-Po0KQLcL.d.ts → AgentMentionSearchController-DD_WOred.d.ts} +1 -0
  2. package/dist/agent-conversation/index.d.ts +2 -2
  3. package/dist/agent-conversation/index.js +6 -6
  4. package/dist/agent-message-center/index.d.ts +2 -1
  5. package/dist/agent-message-center/index.js +12 -10
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/{agentGuiNodeTypes-C0oBQn-F.d.ts → agentGuiNodeTypes-aJ3AX7u2.d.ts} +39 -18
  8. package/dist/app/renderer/agentactivity.css +156 -1
  9. package/dist/{chunk-KTIHLBCN.js → chunk-2I2WRI4F.js} +248 -4
  10. package/dist/chunk-2I2WRI4F.js.map +1 -0
  11. package/dist/{chunk-DXENDZEF.js → chunk-3PKRGSMH.js} +2 -2
  12. package/dist/{chunk-QDWV5VTD.js → chunk-466AWJTS.js} +6 -31
  13. package/dist/chunk-466AWJTS.js.map +1 -0
  14. package/dist/{chunk-SG6A35BU.js → chunk-5H6NINJY.js} +2 -2
  15. package/dist/{chunk-SC3PS7AT.js → chunk-C7K3EFGI.js} +2 -2
  16. package/dist/{chunk-DGNKXT3Q.js → chunk-G6BVEY7I.js} +69 -3
  17. package/dist/chunk-G6BVEY7I.js.map +1 -0
  18. package/dist/{chunk-KS35VKHM.js → chunk-GDFQXJMG.js} +1 -1
  19. package/dist/chunk-GDFQXJMG.js.map +1 -0
  20. package/dist/{chunk-WWY6MYMU.js → chunk-IVIXKAEH.js} +19 -9
  21. package/dist/chunk-IVIXKAEH.js.map +1 -0
  22. package/dist/{chunk-IZX2YQXY.js → chunk-KWQ4N4IZ.js} +117 -8
  23. package/dist/chunk-KWQ4N4IZ.js.map +1 -0
  24. package/dist/{chunk-ISQCYEUJ.js → chunk-OBJRIQPX.js} +411 -62
  25. package/dist/chunk-OBJRIQPX.js.map +1 -0
  26. package/dist/{chunk-QJ42HQ24.js → chunk-Q6AWM3RH.js} +4 -4
  27. package/dist/{chunk-MVPSFOJZ.js → chunk-SVGIWXNK.js} +2 -2
  28. package/dist/{chunk-Y3C5EHSW.js → chunk-SZF52NMJ.js} +173 -12
  29. package/dist/chunk-SZF52NMJ.js.map +1 -0
  30. package/dist/{chunk-FTSEVC6O.js → chunk-XZF4QNT4.js} +2 -2
  31. package/dist/context-mention-palette/index.d.ts +2 -2
  32. package/dist/context-mention-palette/index.js +7 -7
  33. package/dist/i18n/index.d.ts +68 -2
  34. package/dist/i18n/index.js +2 -2
  35. package/dist/index.d.ts +103 -101
  36. package/dist/index.js +2188 -1324
  37. package/dist/index.js.map +1 -1
  38. package/dist/queued-prompt-runtime.d.ts +1 -1
  39. package/dist/workbench/contribution.d.ts +7 -1
  40. package/dist/workbench/contribution.js +4 -4
  41. package/dist/workbench/index.js +5 -7
  42. package/dist/workbench/sessionTitle.js +3 -3
  43. package/dist/workbench/state.js +1 -2
  44. package/dist/workspace-agent-generated-files.js +3 -3
  45. package/dist/{workspaceLinkActions-Bjy_XfBm.d.ts → workspaceLinkActions-DS9LWqzI.d.ts} +1 -1
  46. package/package.json +14 -14
  47. package/dist/chunk-DGNKXT3Q.js.map +0 -1
  48. package/dist/chunk-ISQCYEUJ.js.map +0 -1
  49. package/dist/chunk-IZX2YQXY.js.map +0 -1
  50. package/dist/chunk-KS35VKHM.js.map +0 -1
  51. package/dist/chunk-KTIHLBCN.js.map +0 -1
  52. package/dist/chunk-N37A62BK.js +0 -250
  53. package/dist/chunk-N37A62BK.js.map +0 -1
  54. package/dist/chunk-NROZAN34.js +0 -173
  55. package/dist/chunk-NROZAN34.js.map +0 -1
  56. package/dist/chunk-QDWV5VTD.js.map +0 -1
  57. package/dist/chunk-WWY6MYMU.js.map +0 -1
  58. package/dist/chunk-Y3C5EHSW.js.map +0 -1
  59. /package/dist/{chunk-DXENDZEF.js.map → chunk-3PKRGSMH.js.map} +0 -0
  60. /package/dist/{chunk-SG6A35BU.js.map → chunk-5H6NINJY.js.map} +0 -0
  61. /package/dist/{chunk-SC3PS7AT.js.map → chunk-C7K3EFGI.js.map} +0 -0
  62. /package/dist/{chunk-QJ42HQ24.js.map → chunk-Q6AWM3RH.js.map} +0 -0
  63. /package/dist/{chunk-MVPSFOJZ.js.map → chunk-SVGIWXNK.js.map} +0 -0
  64. /package/dist/{chunk-FTSEVC6O.js.map → chunk-XZF4QNT4.js.map} +0 -0
@@ -2,9 +2,10 @@ import {
2
2
  agentGuiWorkbenchProviderFromInstanceId,
3
3
  agentGuiWorkbenchProviderFromInstanceIdOrNull,
4
4
  createAgentGuiWorkbenchNodeStateSource,
5
+ normalizeAgentGUIProviderTargets,
5
6
  normalizeAgentGuiWorkbenchNodeState,
6
7
  normalizeAgentGuiWorkbenchState
7
- } from "./chunk-KTIHLBCN.js";
8
+ } from "./chunk-2I2WRI4F.js";
8
9
  import {
9
10
  agentGuiWorkbenchDockIdentityFromIdentifier,
10
11
  agentGuiWorkbenchProviderFromIdentifier,
@@ -18,15 +19,19 @@ import {
18
19
  resolveAgentGuiWorkbenchProviderLabel
19
20
  } from "./chunk-BHNJN2TR.js";
20
21
  import {
21
- agentGuiDockIconUrls,
22
- clampAgentGUIConversationRailWidthPx,
23
- resolveAgentGUIExpandedWindowFrame,
24
- resolveAgentGuiSessionProviderIconUrl,
25
- shouldAutoCollapseAgentGUIConversationRail
26
- } from "./chunk-NROZAN34.js";
27
- import {
28
- normalizeAgentGUIProviderTargets
29
- } from "./chunk-N37A62BK.js";
22
+ claudeRoundedUrl,
23
+ codexRoundedUrl,
24
+ cursorColorfulUrl,
25
+ cursorRoundedUrl,
26
+ geminiRoundedUrl,
27
+ hermesRoundedUrl,
28
+ manageAgentClaudeCodeUrl,
29
+ manageAgentTuttiUrl,
30
+ normalizeManagedAgentProvider,
31
+ openclawRoundedUrl,
32
+ opencodeRoundedUrl,
33
+ tuttiAgentRoundedUrl
34
+ } from "./chunk-4I2VCAMW.js";
30
35
 
31
36
  // workbench/contribution.ts
32
37
  import { createElement as createElement2 } from "react";
@@ -34,6 +39,149 @@ import {
34
39
  getWorkbenchLayoutFrame
35
40
  } from "@tutti-os/workbench-surface";
36
41
 
42
+ // agent-gui/agentGuiNode/model/agentGuiRailLayout.ts
43
+ function clamp(value, min, max) {
44
+ return Math.min(max, Math.max(min, value));
45
+ }
46
+ var AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;
47
+ var AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;
48
+ var AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;
49
+ var AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;
50
+ var AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;
51
+ var AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;
52
+ var AGENT_GUI_EXPANDED_MIN_WIDTH_PX = AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
53
+ var AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;
54
+ var AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;
55
+ function shouldAutoCollapseAgentGUIConversationRail(containerWidthPx) {
56
+ return Number.isFinite(containerWidthPx) && containerWidthPx > 0 && containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX;
57
+ }
58
+ function resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx) {
59
+ const safeContainerWidth = Number.isFinite(containerWidthPx) && containerWidthPx > 0 ? containerWidthPx : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
60
+ return Math.max(
61
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
62
+ Math.min(
63
+ AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,
64
+ safeContainerWidth - AGENT_GUI_DETAIL_MIN_WIDTH_PX - AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
65
+ )
66
+ );
67
+ }
68
+ function clampAgentGUIConversationRailWidthPx(widthPx, containerWidthPx) {
69
+ const preferredWidthPx = typeof widthPx === "number" && Number.isFinite(widthPx) ? Math.round(widthPx) : null;
70
+ return clamp(
71
+ preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,
72
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
73
+ resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)
74
+ );
75
+ }
76
+ function resolveNextAgentGUIConversationRailWidthPx(input) {
77
+ const nextWidthPx = clampAgentGUIConversationRailWidthPx(
78
+ input.requestedWidthPx,
79
+ input.containerWidthPx
80
+ );
81
+ if (input.currentWidthPx === nextWidthPx) {
82
+ return input.currentWidthPx;
83
+ }
84
+ if (input.currentWidthPx === null || input.currentWidthPx === void 0) {
85
+ const defaultWidthPx = clampAgentGUIConversationRailWidthPx(
86
+ null,
87
+ input.containerWidthPx
88
+ );
89
+ if (nextWidthPx === defaultWidthPx) {
90
+ return null;
91
+ }
92
+ }
93
+ return nextWidthPx;
94
+ }
95
+ function resolveAgentGUIExpandedWindowFrame(input) {
96
+ const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(
97
+ input.conversationRailWidthPx,
98
+ AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
99
+ );
100
+ const desiredWidthPx = Math.max(
101
+ Math.round(input.width),
102
+ desiredRailWidthPx + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,
103
+ AGENT_GUI_EXPANDED_MIN_WIDTH_PX,
104
+ AGENT_GUI_EXPANDED_TARGET_WIDTH_PX
105
+ );
106
+ const desktopWidthPx = Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0 ? Math.round(input.desktopSize.width) : desiredWidthPx;
107
+ const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);
108
+ const maxX = Math.max(0, desktopWidthPx - nextWidthPx);
109
+ const nextX = clamp(Math.round(input.position.x), 0, maxX);
110
+ return {
111
+ position: {
112
+ x: nextX,
113
+ y: input.position.y
114
+ },
115
+ size: {
116
+ width: nextWidthPx,
117
+ height: input.height
118
+ }
119
+ };
120
+ }
121
+
122
+ // dockIcons.ts
123
+ var agentGuiDockIconUrl = codexRoundedUrl;
124
+ var agentGuiDockIconUrls = {
125
+ "claude-code": manageAgentClaudeCodeUrl,
126
+ codex: codexRoundedUrl,
127
+ cursor: cursorRoundedUrl,
128
+ gemini: geminiRoundedUrl,
129
+ hermes: hermesRoundedUrl,
130
+ nexight: manageAgentTuttiUrl,
131
+ openclaw: openclawRoundedUrl,
132
+ opencode: opencodeRoundedUrl,
133
+ "tutti-agent": tuttiAgentRoundedUrl
134
+ };
135
+
136
+ // app/renderer/assets/icons/agents/claudecode-flat-filled.svg
137
+ var claudecode_flat_filled_default = "./claudecode-flat-filled-NHO4JCVK.svg";
138
+
139
+ // app/renderer/assets/icons/agents/codex-flat-filled.svg
140
+ var codex_flat_filled_default = "./codex-flat-filled-WYHCF5VR.svg";
141
+
142
+ // app/renderer/assets/icons/agents/cursor-flat-filled.svg
143
+ var cursor_flat_filled_default = "./cursor-flat-filled-CL7N3BTZ.svg";
144
+
145
+ // app/renderer/assets/icons/agents/opencode-flat-filled.svg
146
+ var opencode_flat_filled_default = "./opencode-flat-filled-CYAJPX45.svg";
147
+
148
+ // app/renderer/assets/icons/agents/tutti-flat-filled.svg
149
+ var tutti_flat_filled_default = "./tutti-flat-filled-K32QBTZE.svg";
150
+
151
+ // agentGuiSessionProviderIconUrls.ts
152
+ function resolveAgentGuiSessionProviderIconUrl(provider) {
153
+ switch (normalizeManagedAgentProvider(provider)) {
154
+ case "claude-code":
155
+ return claudeRoundedUrl;
156
+ case "codex":
157
+ return codexRoundedUrl;
158
+ case "cursor":
159
+ return cursorColorfulUrl;
160
+ case "opencode":
161
+ return opencodeRoundedUrl;
162
+ case "tutti":
163
+ return manageAgentTuttiUrl;
164
+ default:
165
+ return null;
166
+ }
167
+ }
168
+ function resolveAgentGuiSessionProviderFlatIconUrl(provider) {
169
+ switch (normalizeManagedAgentProvider(provider)) {
170
+ case "claude-code":
171
+ return claudecode_flat_filled_default;
172
+ case "codex":
173
+ return codex_flat_filled_default;
174
+ case "cursor":
175
+ return cursor_flat_filled_default;
176
+ case "opencode":
177
+ return opencode_flat_filled_default;
178
+ case "tutti":
179
+ return tutti_flat_filled_default;
180
+ default:
181
+ return null;
182
+ }
183
+ }
184
+
37
185
  // workbench/bodyRenderErrorRegistry.ts
38
186
  import { useSyncExternalStore } from "react";
39
187
  var listenersByNodeId = /* @__PURE__ */ new Map();
@@ -194,7 +342,7 @@ function AgentGuiWorkbenchHeader({
194
342
  appTitle
195
343
  )
196
344
  ) : null,
197
- onOpenDetachedWindow ? createDetachedWindowButton({
345
+ onOpenDetachedWindow && !hasBodyRenderError ? createDetachedWindowButton({
198
346
  label: copy.openDetachedWindow ?? "Open in detached window",
199
347
  onOpenDetachedWindow
200
348
  }) : null,
@@ -432,6 +580,7 @@ var agentGuiWorkbenchUnifiedDockTileProviders = [
432
580
  ];
433
581
  var AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT = "tutti:agent-gui-workbench-conversation-rail-toggle";
434
582
  var AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT = "tutti:agent-gui-workbench-new-conversation";
583
+ var AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT = "tutti:agent-gui-workbench-open-external-import";
435
584
  var agentGuiWorkbenchDefaultCopy = {
436
585
  collapseConversationRail: "Collapse conversation rail",
437
586
  close: "Close",
@@ -1030,6 +1179,17 @@ function createAgentGuiWorkbenchPreviewBodyContext(input) {
1030
1179
  }
1031
1180
 
1032
1181
  export {
1182
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
1183
+ AGENT_GUI_DETAIL_MIN_WIDTH_PX,
1184
+ AGENT_GUI_COLLAPSED_MIN_WIDTH_PX,
1185
+ shouldAutoCollapseAgentGUIConversationRail,
1186
+ resolveAgentGUIConversationRailMaxWidthPx,
1187
+ clampAgentGUIConversationRailWidthPx,
1188
+ resolveNextAgentGUIConversationRailWidthPx,
1189
+ resolveAgentGUIExpandedWindowFrame,
1190
+ agentGuiDockIconUrl,
1191
+ agentGuiDockIconUrls,
1192
+ resolveAgentGuiSessionProviderFlatIconUrl,
1033
1193
  AgentGuiWorkbenchHeader,
1034
1194
  agentGuiWorkbenchDefaultNodeFrame,
1035
1195
  agentGuiWorkbenchDefaultUsableWidthRatio,
@@ -1039,6 +1199,7 @@ export {
1039
1199
  agentGuiWorkbenchProviderRailWidthPx,
1040
1200
  AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
1041
1201
  AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,
1202
+ AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT,
1042
1203
  agentGuiWorkbenchDefaultCopy,
1043
1204
  createAgentGuiWorkbenchContribution,
1044
1205
  buildAgentGuiDockEntries,
@@ -1046,4 +1207,4 @@ export {
1046
1207
  resolveAgentGuiWorkbenchDefaultLaunchFrame,
1047
1208
  resolveAgentGuiWorkbenchContributionCopy
1048
1209
  };
1049
- //# sourceMappingURL=chunk-Y3C5EHSW.js.map
1210
+ //# sourceMappingURL=chunk-SZF52NMJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.ts","../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts","../dockIcons.ts","../agentGuiSessionProviderIconUrls.ts","../workbench/bodyRenderErrorRegistry.ts","../workbench/header.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchContribution,\n type WorkbenchDockPreviewContent,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostDockPopupItemInput,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n clampAgentGUIConversationRailWidthPx,\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport { resolveAgentGuiSessionProviderIconUrl } from \"../agentGuiSessionProviderIconUrls.ts\";\nimport { setAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport { AgentGuiWorkbenchHeader } from \"./header.ts\";\nimport {\n agentGuiWorkbenchDockIdentityFromIdentifier,\n agentGuiWorkbenchProviderFromIdentifier,\n agentGuiWorkbenchTypeId,\n agentGuiWorkbenchUnifiedDockEntryId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n agentGuiWorkbenchProviderFromInstanceId,\n agentGuiWorkbenchProviderFromInstanceIdOrNull,\n createAgentGuiWorkbenchNodeStateSource,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport {\n agentGuiWorkbenchDefaultDockProviders,\n isAgentGuiWorkbenchProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport { normalizeAgentGUIProviderTargets } from \"../providerTargets.ts\";\nimport type {\n AgentGUIProviderTarget,\n AgentGUIProviderTargetRef\n} from \"../types.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableWidthRatio = 0.8;\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\nexport const agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };\nexport const agentGuiWorkbenchProviderRailWidthPx = 52;\nconst agentGuiWorkbenchUnifiedDockTileProviders = [\n \"codex\",\n \"claude-code\",\n \"tutti-agent\",\n \"hermes\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"tutti:agent-gui-workbench-conversation-rail-toggle\";\n\nexport const AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT =\n \"tutti:agent-gui-workbench-new-conversation\";\n\n/**\n * Fired when the empty-hero \"Import session\" suggestion is chosen. The host\n * chrome (which owns the external-agent import wizard state) listens for this\n * and opens the wizard.\n */\nexport const AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT =\n \"tutti:agent-gui-workbench-open-external-import\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchConversationIdentity {\n iconUrl?: string | null;\n title: string | null;\n}\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n close: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize: string;\n minimize: string;\n newConversation: string;\n nodeTitle: string;\n openDetachedWindow: string;\n restore: string;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Collapse conversation rail\",\n close: \"Close\",\n expandConversationRail: \"Expand conversation rail\",\n fallbackAgentLabel: \"Agent\",\n maximize: \"Maximize\",\n minimize: \"Minimize\",\n newConversation: \"New conversation\",\n nodeTitle: \"Agent\",\n openDetachedWindow: \"Open in detached window\",\n restore: \"Restore\"\n};\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n defaultProviderTargetId?: string | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n providerTargets?: readonly AgentGUIProviderTarget[] | null;\n providerTargetsLoading?: boolean;\n renderBody(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderPreview?(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderMinimizedPreview(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockPopupTitle?: (\n state: AgentGuiWorkbenchState | null\n ) => string | null;\n resolveDockPopupIdentity?: (\n state: AgentGuiWorkbenchState | null\n ) => AgentGuiWorkbenchConversationIdentity | null;\n resolveDockLaunchPayload?: (input: {\n dockEntryId?: string | null;\n payload: unknown;\n reason: WorkbenchHostLaunchRequest[\"reason\"];\n }) => unknown | null | undefined;\n onOpenDetachedWindow?: (input: {\n agentSessionId?: string | null;\n agentTargetId?: string | null;\n providerTargets?: readonly AgentGUIProviderTarget[];\n provider: AgentGuiWorkbenchProvider;\n workspaceId: string;\n }) => void | Promise<void>;\n unifiedDockIconUrl?: string;\n workspaceId: string;\n}\n\nexport function createAgentGuiWorkbenchContribution(\n input: CreateAgentGuiWorkbenchContributionInput\n): WorkbenchContribution {\n const nodeStateSource = createAgentGuiWorkbenchNodeStateSource({\n workspaceId: input.workspaceId\n });\n const frame = input.frame ?? agentGuiWorkbenchDefaultNodeFrame;\n const copy = resolveAgentGuiWorkbenchContributionCopy(input.copy);\n return {\n dockEntries: buildAgentGuiDockEntries({\n defaultProvider: input.defaultProvider,\n defaultProviderTargetId: input.defaultProviderTargetId,\n dockIconUrls: input.dockIconUrls,\n label: copy.nodeTitle,\n providerAvailability: input.providerAvailability,\n providerTargetsLoading: input.providerTargetsLoading,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n targets: input.providerTargets,\n unifiedDockIconUrl: input.unifiedDockIconUrl\n }),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\n onBodyRenderErrorChange: ({ hasError, node }) => {\n setAgentGuiWorkbenchBodyRenderError(node.id, hasError);\n },\n renderBody: (context) =>\n input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (state) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider:\n providerFromActivation(context.activation) ??\n agentGuiWorkbenchProviderFromInstanceId(context.instanceId)\n }\n ),\n renderHeader: ({\n activation,\n dragHandleProps,\n displayMode,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const provider =\n providerFromActivation(activation) ??\n agentGuiWorkbenchProviderFromInstanceId(instanceId);\n const headerTitle = copy.nodeTitle;\n const rawWorkbenchState = (externalNodeState ??\n node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const workbenchState =\n normalizeAgentGuiWorkbenchState(rawWorkbenchState);\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n rawWorkbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const conversationRailWidthPx = clampAgentGUIConversationRailWidthPx(\n nodeState.conversationRailWidthPx,\n node.frame.width\n );\n const conversationIdentity =\n input.resolveDockPopupIdentity?.(workbenchState) ?? null;\n const conversationTitle =\n conversationIdentity?.title ??\n input.resolveDockPopupTitle?.(workbenchState) ??\n workbenchState.lastActiveConversationTitle ??\n null;\n // Resolve the icon from a *known* provider only. During a freshly\n // created session the provider is not encoded yet; falling back to\n // `provider` (which defaults to \"codex\") would flash the wrong icon,\n // so we leave the URL empty and let the header render a neutral\n // placeholder until the real provider resolves.\n const iconProvider =\n providerFromActivation(activation) ??\n agentGuiWorkbenchProviderFromInstanceIdOrNull(instanceId);\n const conversationIconFallbackUrl = iconProvider\n ? (resolveAgentGuiSessionProviderIconUrl(iconProvider) ??\n resolveAgentGuiWorkbenchProviderIconUrl({\n dockIconUrls: input.dockIconUrls,\n provider: iconProvider\n }))\n : null;\n const conversationIconUrl =\n conversationIdentity?.iconUrl ?? conversationIconFallbackUrl;\n const persistConversationRailCollapsed = (collapsed: boolean) => {\n nodeStateSource.writeNodeState({\n instanceId,\n nodeId: node.id,\n state: {\n ...workbenchState,\n conversationRailCollapsed: collapsed\n },\n typeId: agentGuiWorkbenchTypeId\n });\n };\n const announceConversationRailCollapsed = (collapsed: boolean) => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchConversationRailToggleDetail>(\n AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,\n {\n detail: {\n conversationRailCollapsed: collapsed,\n instanceId\n }\n }\n )\n );\n };\n const announceNewConversation = () => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchNewConversationDetail>(\n AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,\n {\n detail: {\n instanceId\n }\n }\n )\n );\n };\n\n return createElement(AgentGuiWorkbenchHeader, {\n copy,\n conversationIconUrl,\n conversationIconFallbackUrl,\n conversationTitle,\n conversationRailWidthPx,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n nodeId: node.id,\n providerRailWidthPx: agentGuiWorkbenchProviderRailWidthPx,\n title: headerTitle,\n windowActions: {\n close: windowActions.close,\n minimize: windowActions.minimize,\n toggleDisplayMode: windowActions.toggleDisplayMode\n },\n ...dragHandleProps,\n onCreateConversation: announceNewConversation,\n onOpenDetachedWindow: input.onOpenDetachedWindow\n ? () => {\n void input.onOpenDetachedWindow?.({\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n agentTargetId: nodeState.agentTargetId,\n providerTargets: input.providerTargets ?? undefined,\n provider,\n workspaceId: input.workspaceId\n });\n }\n : undefined,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleConversationRail: (nextCollapsed) => {\n announceConversationRailCollapsed(nextCollapsed);\n if (\n isConversationRailCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n const expandedFrame = resolveAgentGUIExpandedWindowFrame({\n conversationRailWidthPx: nodeState.conversationRailWidthPx,\n desktopSize: surfaceSize,\n height: node.frame.height,\n position: {\n x: node.frame.x,\n y: node.frame.y\n },\n width: node.frame.width\n });\n\n windowActions.resize({\n ...node.frame,\n height: expandedFrame.size.height,\n width: expandedFrame.size.width,\n x: expandedFrame.position.x,\n y: expandedFrame.position.y\n });\n }\n\n persistConversationRailCollapsed(nextCollapsed);\n }\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"component\",\n providePreview: (item) =>\n createAgentGuiWorkbenchPreviewContent({\n item,\n renderPreview: input.renderMinimizedPreview,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const launchPayload = resolveAgentGuiWorkbenchLaunchPayload(request, {\n resolveDockLaunchPayload: input.resolveDockLaunchPayload\n });\n const {\n activation,\n dockEntryId,\n instanceId: descriptorInstanceId,\n openInNewWindow,\n provider,\n reuseDockEntryNode,\n reuseExistingSessionNode,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor({\n ...request,\n payload: launchPayload\n });\n // Locate an already-open node currently showing this session (its launch\n // instanceId may differ from the session-keyed one, e.g. a conversation\n // started fresh as a draft) so we focus it instead of opening a duplicate.\n const existingInstanceId =\n targetAgentSessionId && reuseExistingSessionNode\n ? nodeStateSource.findInstanceIdByAgentSessionId(targetAgentSessionId)\n : null;\n const instanceId = existingInstanceId ?? descriptorInstanceId;\n const title = copy.nodeTitle;\n const providerTarget = providerTargetLaunchPayloadFromRequest(\n launchPayload,\n provider\n );\n const launchAgentTargetId =\n providerTarget.agentTargetId ?? providerTarget.providerTargetId;\n if (targetAgentSessionId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n ...(targetAgentSessionId\n ? { lastActiveAgentSessionId: targetAgentSessionId }\n : {}),\n agentTargetId: launchAgentTargetId ?? null\n },\n typeId: agentGuiWorkbenchTypeId\n });\n } else if (\n providerTarget.agentTargetId ||\n providerTarget.providerTargetId ||\n providerTarget.providerTargetRef\n ) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n ...(providerTarget.agentTargetId\n ? { agentTargetId: providerTarget.agentTargetId }\n : {}),\n ...(providerTarget.providerTargetId\n ? { agentTargetId: providerTarget.providerTargetId }\n : {})\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n const defaultFrame = resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n });\n return {\n activation,\n ...(openInNewWindow\n ? { cascadeOffset: agentGuiWorkbenchNewWindowCascadeOffset }\n : {}),\n defaultFrame,\n dockEntryId,\n framePolicy:\n !openInNewWindow &&\n isAgentGuiWorkbenchCompactVisibleFrame(defaultFrame, frame)\n ? \"absolute\"\n : \"cascade-same-type-centered\",\n instanceId,\n // Reusing the window already showing this specific conversation\n // (e.g. clicking a completion notification) should just focus it,\n // not reset it back to the default size/position.\n preserveExistingNodeFrame: existingInstanceId !== null,\n reuseDockEntryNode,\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nexport type AgentGuiWorkbenchProviderAvailability = Partial<\n Record<\n AgentGuiWorkbenchProvider,\n | boolean\n | \"available\"\n | \"ready\"\n | \"unavailable\"\n | {\n available?: boolean | null;\n status?: string | null;\n }\n | null\n | undefined\n >\n>;\n\nexport interface BuildAgentGuiDockEntriesInput {\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n defaultProviderTargetId?: string | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n label?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n providerTargetsLoading?: boolean;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId?: string;\n targets?: readonly AgentGUIProviderTarget[] | null;\n unifiedDockIconUrl?: string;\n}\n\nexport function buildAgentGuiDockEntries(\n input: BuildAgentGuiDockEntriesInput\n): WorkbenchHostDockEntry[] {\n const sectionId = input.sectionId ?? \"agents\";\n const launchPayload = resolveAgentGuiUnifiedDockLaunchPayload(input);\n const provider = launchPayload.provider;\n const unifiedTileIconUrls = resolveAgentGuiUnifiedDockTileIconUrls(\n input.dockIconUrls\n );\n return [\n createAgentGuiWorkbenchDockEntry({\n aggregateProviders: agentGuiWorkbenchDefaultDockProviders,\n icon: input.unifiedDockIconUrl\n ? createAgentGuiWorkbenchUnifiedDockIcon({\n iconUrl: input.unifiedDockIconUrl\n })\n : createAgentGuiWorkbenchLaunchpadStyleDockIcon({\n tileIconUrls: unifiedTileIconUrls\n }),\n label: input.label ?? agentGuiWorkbenchDefaultCopy.nodeTitle,\n launchPayload,\n order: 0,\n provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId,\n visibility: \"always\"\n })\n ];\n}\n\nexport function resolveAgentGuiUnifiedDockLaunchPayload(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n | \"defaultProvider\"\n | \"defaultProviderTargetId\"\n | \"providerAvailability\"\n | \"providerTargetsLoading\"\n | \"targets\"\n >\n): {\n provider: AgentGuiWorkbenchProvider;\n agentTargetId?: string;\n providerTargetId?: string;\n providerTargetRef?: AgentGUIProviderTargetRef;\n} {\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return {\n provider: target.provider,\n ...(target.agentTargetId ? { agentTargetId: target.agentTargetId } : {}),\n providerTargetId: target.targetId,\n providerTargetRef: target.ref\n };\n }\n return {\n provider: resolveUnifiedAgentGuiDockProvider(input)\n };\n}\n\nexport function resolveAgentGuiWorkbenchDefaultLaunchFrame(input: {\n frame: WorkbenchFrame;\n request: Pick<\n WorkbenchHostLaunchRequest,\n \"layoutConstraints\" | \"surfaceSize\"\n >;\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.request.surfaceSize,\n input.request.layoutConstraints\n );\n const defaultHeight = Math.round(\n layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio\n );\n const defaultWidth = Math.round(\n layoutFrame.width * agentGuiWorkbenchDefaultUsableWidthRatio\n );\n\n return {\n ...input.frame,\n height: defaultHeight,\n width: defaultWidth,\n x: Math.round(layoutFrame.x + (layoutFrame.width - defaultWidth) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - defaultHeight) / 2)\n };\n}\n\nfunction isAgentGuiWorkbenchCompactVisibleFrame(\n frame: WorkbenchFrame,\n defaultFrame: WorkbenchFrame\n): boolean {\n return frame.width !== defaultFrame.width || frame.x !== defaultFrame.x;\n}\n\nexport function resolveAgentGuiWorkbenchContributionCopy(\n copy?: AgentGuiWorkbenchContributionCopyOverrides\n): AgentGuiWorkbenchContributionCopy {\n return {\n ...agentGuiWorkbenchDefaultCopy,\n ...copy\n };\n}\n\nfunction createAgentGuiWorkbenchDockEntry(input: {\n aggregateProviders?: readonly AgentGuiWorkbenchProvider[];\n icon: ReactNode;\n label: string;\n launchPayload?: Record<string, unknown>;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: input.icon,\n iconSize: \"large\",\n id: agentGuiWorkbenchUnifiedDockEntryId(),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: input.launchPayload ?? { provider: input.provider },\n matchNode: (node) =>\n node.data.typeId === agentGuiWorkbenchTypeId &&\n (input.aggregateProviders\n ? input.aggregateProviders.includes(\n resolveAgentGuiWorkbenchProviderFromNode(node)\n )\n : resolveAgentGuiWorkbenchProviderFromNode(node) === input.provider),\n order: input.order,\n providePopupItemPreview: (item) =>\n input.renderPreview\n ? createAgentGuiWorkbenchPreviewContent({\n item,\n label: input.label,\n provider: input.provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n : null,\n resolvePopupItem: ({ externalNodeState }) => {\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\n null;\n return {\n revision: `${input.provider}\\n${title ?? \"\"}`,\n title\n };\n },\n sectionId: input.sectionId,\n typeId: agentGuiWorkbenchTypeId,\n visibility: input.visibility\n };\n}\n\nfunction resolveAgentGuiUnifiedDockTileIconUrls(\n dockIconUrls: Partial<Record<AgentGuiWorkbenchProvider, string>> | undefined\n): readonly string[] {\n return agentGuiWorkbenchUnifiedDockTileProviders.map((provider) =>\n resolveAgentGuiWorkbenchProviderIconUrl({ dockIconUrls, provider })\n );\n}\n\nfunction resolveAgentGuiWorkbenchProviderIconUrl(input: {\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n return (\n input.dockIconUrls?.[input.provider] ?? agentGuiDockIconUrls[input.provider]\n );\n}\n\nfunction createAgentGuiWorkbenchLaunchpadStyleDockIcon(input: {\n tileIconUrls: readonly string[];\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: \"agent-gui-workbench-dock-icon\"\n },\n input.tileIconUrls.map((src, index) =>\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-dock-icon__tile\",\n key: `${src}:${index}`\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src\n })\n )\n )\n );\n}\n\nfunction createAgentGuiWorkbenchUnifiedDockIcon(input: {\n iconUrl: string;\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-dock-icon agent-gui-workbench-dock-icon--single\"\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl\n })\n );\n}\n\nfunction resolveAgentGuiWorkbenchProviderFromNode(\n node: Parameters<NonNullable<WorkbenchHostDockEntry[\"matchNode\"]>>[0]\n): AgentGuiWorkbenchProvider {\n return (\n agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ??\n agentGuiWorkbenchProviderFromIdentifier(node.data.dockEntryId) ??\n providerFromState(node.data.snapshotNodeState) ??\n providerFromState(node.data.runtimeNodeState) ??\n agentGuiWorkbenchProviderFromIdentifier(node.data.typeId) ??\n \"codex\"\n );\n}\n\nfunction providerFromState(state: unknown): AgentGuiWorkbenchProvider | null {\n if (!state || typeof state !== \"object\") {\n return null;\n }\n const provider = (state as { provider?: unknown }).provider;\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nfunction providerFromActivation(\n activation: unknown\n): AgentGuiWorkbenchProvider | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n return providerFromState(payload);\n}\n\nfunction resolveAgentGuiWorkbenchLaunchPayload(\n request: WorkbenchHostLaunchRequest,\n input: Pick<\n CreateAgentGuiWorkbenchContributionInput,\n \"resolveDockLaunchPayload\"\n >\n): unknown {\n if (\n request.reason !== \"dock\" ||\n agentGuiWorkbenchDockIdentityFromIdentifier(request.dockEntryId)?.kind !==\n \"unifiedAggregate\" ||\n !isEmptyAgentGuiWorkbenchDockLaunchPayload(request.payload)\n ) {\n return request.payload;\n }\n return (\n input.resolveDockLaunchPayload?.({\n dockEntryId: request.dockEntryId,\n payload: request.payload,\n reason: request.reason\n }) ?? request.payload\n );\n}\n\nfunction isEmptyAgentGuiWorkbenchDockLaunchPayload(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return true;\n }\n const typed = payload as Record<string, unknown>;\n return (\n typeof typed.agentSessionId !== \"string\" &&\n typeof typed.draftPrompt !== \"string\"\n );\n}\n\nfunction resolveUnifiedAgentGuiDockTarget(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n | \"defaultProvider\"\n | \"defaultProviderTargetId\"\n | \"providerAvailability\"\n | \"providerTargetsLoading\"\n | \"targets\"\n >\n): AgentGUIProviderTarget | null {\n const targets = normalizeAgentGUIProviderTargets(input.targets, {\n useStaticCatalog:\n input.providerTargetsLoading !== true && input.targets == null\n }).filter(\n (\n target\n ): target is AgentGUIProviderTarget & {\n provider: (typeof agentGuiWorkbenchDefaultDockProviders)[number];\n } =>\n isAgentGuiWorkbenchProvider(target.provider) &&\n isUnifiedAgentGuiDockProvider(target.provider) &&\n target.disabled !== true &&\n isAgentGuiProviderAvailable(target.provider, input.providerAvailability)\n );\n const defaultProviderTargetId = input.defaultProviderTargetId?.trim();\n if (defaultProviderTargetId) {\n const explicitTarget = targets.find(\n (target) => target.targetId === defaultProviderTargetId\n );\n if (explicitTarget) {\n return explicitTarget;\n }\n }\n\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n const target = preferredAgentGuiDockTargetForProvider(\n targets,\n input.defaultProvider\n );\n if (target) {\n return target;\n }\n }\n\n return targets[0] ?? null;\n}\n\nfunction resolveUnifiedAgentGuiDockProvider(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"defaultProvider\" | \"providerAvailability\" | \"targets\"\n >\n): AgentGuiWorkbenchProvider {\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n return input.defaultProvider;\n }\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return target.provider;\n }\n return (\n agentGuiWorkbenchDefaultDockProviders.find((provider) =>\n isAgentGuiProviderAvailable(provider, input.providerAvailability)\n ) ?? \"codex\"\n );\n}\n\nfunction isUnifiedAgentGuiDockProvider(\n provider: AgentGuiWorkbenchProvider\n): provider is (typeof agentGuiWorkbenchDefaultDockProviders)[number] {\n return agentGuiWorkbenchDefaultDockProviders.includes(\n provider as (typeof agentGuiWorkbenchDefaultDockProviders)[number]\n );\n}\n\nfunction preferredAgentGuiDockTargetForProvider(\n targets: readonly AgentGUIProviderTarget[],\n provider: AgentGuiWorkbenchProvider\n): AgentGUIProviderTarget | null {\n const providerTargets = targets.filter(\n (target) => target.provider === provider\n );\n return providerTargets[0] ?? null;\n}\n\nfunction isAgentGuiProviderAvailable(\n provider: AgentGuiWorkbenchProvider,\n availability: AgentGuiWorkbenchProviderAvailability | null | undefined\n): boolean {\n const value = availability?.[provider];\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value === \"ready\" || value === \"available\";\n }\n if (typeof value.available === \"boolean\") {\n return value.available;\n }\n return value.status === \"ready\" || value.status === \"available\";\n}\n\nfunction providerTargetLaunchPayloadFromRequest(\n payload: unknown,\n expectedProvider: AgentGuiWorkbenchProvider\n): {\n agentTargetId: string | null;\n providerTargetId: string | null;\n providerTargetRef: AgentGUIProviderTargetRef | null;\n} {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n agentTargetId: null,\n providerTargetId: null,\n providerTargetRef: null\n };\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n const providerTargetId = (payload as { providerTargetId?: unknown })\n .providerTargetId;\n const providerTargetRef = (payload as { providerTargetRef?: unknown })\n .providerTargetRef;\n return {\n agentTargetId:\n typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null,\n providerTargetId:\n typeof providerTargetId === \"string\" && providerTargetId.trim()\n ? providerTargetId.trim()\n : null,\n providerTargetRef:\n providerTargetRef &&\n typeof providerTargetRef === \"object\" &&\n !Array.isArray(providerTargetRef) &&\n (providerTargetRef as { provider?: unknown }).provider ===\n expectedProvider &&\n typeof (providerTargetRef as { kind?: unknown }).kind === \"string\" &&\n (providerTargetRef as { kind: string }).kind.trim()\n ? {\n ...(providerTargetRef as AgentGUIProviderTargetRef),\n kind: (providerTargetRef as { kind: string }).kind.trim(),\n provider: expectedProvider\n }\n : null\n };\n}\n\nfunction createAgentGuiWorkbenchPreviewContent(input: {\n item: WorkbenchHostDockPopupItemInput;\n label?: string;\n provider?: AgentGuiWorkbenchProvider;\n renderPreview: NonNullable<\n CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"]\n >;\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n}): WorkbenchDockPreviewContent {\n const { externalNodeState, node } = input.item;\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\n node.title;\n const provider =\n input.provider ??\n agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ??\n agentGuiWorkbenchProviderFromInstanceId(node.data.instanceId);\n const label = input.label ?? resolveAgentGuiWorkbenchProviderLabel(provider);\n const lines = [label, state.lastActiveAgentSessionId].filter(\n (line): line is string => Boolean(line?.trim())\n );\n return {\n element: input.renderPreview(\n createAgentGuiWorkbenchPreviewBodyContext(input.item),\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: () => undefined,\n provider\n }\n ),\n kind: \"component\",\n revision: `${provider}\\n${title}\\n${lines.join(\"\\n\")}`\n };\n}\n\nfunction createAgentGuiWorkbenchPreviewBodyContext(\n input: WorkbenchHostDockPopupItemInput\n): WorkbenchHostNodeBodyContext<AgentGuiWorkbenchState | null, unknown> {\n return {\n activation: null,\n displayMode: input.node.displayMode,\n externalNodeState: input.externalNodeState as AgentGuiWorkbenchState | null,\n externalWorkspaceState: input.externalWorkspaceState,\n focus: () => undefined,\n host: input.host,\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n isFocused: false,\n node: input.node,\n previewViewport: input.previewViewport,\n setNodeRuntimeState: () => undefined,\n setSnapshotNodeState: () => undefined\n };\n}\n","function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n// Keep aligned with the issue manager task-list rail dimensions.\nexport const AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;\nexport const AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;\nexport const AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;\nexport const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;\nexport const AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;\nexport const AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;\nexport const AGENT_GUI_EXPANDED_MIN_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\n\nexport interface AgentGUIExpandedWindowFrameInput {\n position: { x: number; y: number };\n width: number;\n height: number;\n desktopSize: { width: number; height: number };\n conversationRailWidthPx: number | null | undefined;\n}\n\nexport function shouldAutoCollapseAgentGUIConversationRail(\n containerWidthPx: number\n): boolean {\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailMaxWidthPx(\n containerWidthPx: number\n): number {\n const safeContainerWidth =\n Number.isFinite(containerWidthPx) && containerWidthPx > 0\n ? containerWidthPx\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n\n return Math.max(\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n Math.min(\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,\n safeContainerWidth -\n AGENT_GUI_DETAIL_MIN_WIDTH_PX -\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n )\n );\n}\n\nexport function clampAgentGUIConversationRailWidthPx(\n widthPx: number | null | undefined,\n containerWidthPx: number\n): number {\n const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : null;\n\n return clamp(\n preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\n );\n}\n\nexport function resolveNextAgentGUIConversationRailWidthPx(input: {\n currentWidthPx: number | null | undefined;\n requestedWidthPx: number;\n containerWidthPx: number;\n}): number | null {\n const nextWidthPx = clampAgentGUIConversationRailWidthPx(\n input.requestedWidthPx,\n input.containerWidthPx\n );\n if (input.currentWidthPx === nextWidthPx) {\n return input.currentWidthPx;\n }\n\n if (input.currentWidthPx === null || input.currentWidthPx === undefined) {\n const defaultWidthPx = clampAgentGUIConversationRailWidthPx(\n null,\n input.containerWidthPx\n );\n if (nextWidthPx === defaultWidthPx) {\n return null;\n }\n }\n\n return nextWidthPx;\n}\n\nexport function resolveAgentGUIExpandedWindowFrame(\n input: AgentGUIExpandedWindowFrameInput\n): {\n position: { x: number; y: number };\n size: { width: number; height: number };\n} {\n const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n );\n const desiredWidthPx = Math.max(\n Math.round(input.width),\n desiredRailWidthPx +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,\n AGENT_GUI_EXPANDED_MIN_WIDTH_PX,\n AGENT_GUI_EXPANDED_TARGET_WIDTH_PX\n );\n const desktopWidthPx =\n Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0\n ? Math.round(input.desktopSize.width)\n : desiredWidthPx;\n const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);\n const maxX = Math.max(0, desktopWidthPx - nextWidthPx);\n const nextX = clamp(Math.round(input.position.x), 0, maxX);\n\n return {\n position: {\n x: nextX,\n y: input.position.y\n },\n size: {\n width: nextWidthPx,\n height: input.height\n }\n };\n}\n","import {\n codexRoundedUrl,\n cursorRoundedUrl,\n geminiRoundedUrl,\n hermesRoundedUrl,\n manageAgentClaudeCodeUrl,\n manageAgentTuttiUrl,\n opencodeRoundedUrl,\n openclawRoundedUrl,\n tuttiAgentRoundedUrl\n} from \"./managedAgentIconAssets.ts\";\n\nexport const agentGuiDockIconUrl = codexRoundedUrl;\n\nexport const agentGuiDockIconUrls = {\n \"claude-code\": manageAgentClaudeCodeUrl,\n codex: codexRoundedUrl,\n cursor: cursorRoundedUrl,\n gemini: geminiRoundedUrl,\n hermes: hermesRoundedUrl,\n nexight: manageAgentTuttiUrl,\n openclaw: openclawRoundedUrl,\n opencode: opencodeRoundedUrl,\n \"tutti-agent\": tuttiAgentRoundedUrl\n} as const;\n","import claudeCodeFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/claudecode-flat-filled.svg\";\nimport codexFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/codex-flat-filled.svg\";\nimport cursorFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/cursor-flat-filled.svg\";\nimport opencodeFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/opencode-flat-filled.svg\";\nimport tuttiFlatFilledIconUrl from \"./app/renderer/assets/icons/agents/tutti-flat-filled.svg\";\nimport {\n claudeRoundedUrl,\n codexRoundedUrl,\n cursorColorfulUrl,\n manageAgentTuttiUrl,\n opencodeRoundedUrl\n} from \"./managedAgentIconAssets\";\nimport { normalizeManagedAgentProvider } from \"./shared/managedAgentProviders\";\n\nexport {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorColorfulUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n tuttiFlatFilledIconUrl\n};\n\n/**\n * Colorful session icons, used where the icon renders as a real <img> avatar\n * (collapsed workbench header, dock popup). Colorful assets keep their fill.\n */\nexport function resolveAgentGuiSessionProviderIconUrl(\n provider: string | undefined\n): string | null {\n switch (normalizeManagedAgentProvider(provider)) {\n case \"claude-code\":\n return claudeRoundedUrl;\n case \"codex\":\n return codexRoundedUrl;\n case \"cursor\":\n return cursorColorfulUrl;\n case \"opencode\":\n return opencodeRoundedUrl;\n case \"tutti\":\n return manageAgentTuttiUrl;\n default:\n return null;\n }\n}\n\n/**\n * Flat monochrome session icons, used where the icon renders through a CSS\n * mask (e.g. the conversation rail rows). Colorful assets would collapse to a\n * solid square under a mask, so these must be single-color glyphs with a\n * transparent background.\n */\nexport function resolveAgentGuiSessionProviderFlatIconUrl(\n provider: string | undefined\n): string | null {\n switch (normalizeManagedAgentProvider(provider)) {\n case \"claude-code\":\n return claudeCodeFlatFilledIconUrl;\n case \"codex\":\n return codexFlatFilledIconUrl;\n case \"cursor\":\n return cursorFlatFilledIconUrl;\n case \"opencode\":\n return opencodeFlatFilledIconUrl;\n case \"tutti\":\n return tuttiFlatFilledIconUrl;\n default:\n return null;\n }\n}\n","import { useSyncExternalStore } from \"react\";\n\nconst listenersByNodeId = new Map<string, Set<() => void>>();\nconst errorNodeIds = new Set<string>();\n\nexport function setAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n hasError: boolean\n): void {\n const hadError = errorNodeIds.has(nodeId);\n if (hadError === hasError) {\n return;\n }\n if (hasError) {\n errorNodeIds.add(nodeId);\n } else {\n errorNodeIds.delete(nodeId);\n }\n for (const listener of listenersByNodeId.get(nodeId) ?? []) {\n listener();\n }\n}\n\nfunction subscribeAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n listener: () => void\n): () => void {\n let listeners = listenersByNodeId.get(nodeId);\n if (!listeners) {\n listeners = new Set();\n listenersByNodeId.set(nodeId, listeners);\n }\n listeners.add(listener);\n return () => {\n listeners?.delete(listener);\n if (listeners?.size === 0) {\n listenersByNodeId.delete(nodeId);\n }\n };\n}\n\nfunction getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId: string): boolean {\n return errorNodeIds.has(nodeId);\n}\n\nexport function useAgentGuiWorkbenchBodyRenderError(nodeId: string): boolean {\n return useSyncExternalStore(\n (listener) => subscribeAgentGuiWorkbenchBodyRenderError(nodeId, listener),\n () => getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId)\n );\n}\n","import {\n createElement,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode\n} from \"react\";\nimport type {\n WorkbenchDisplayMode,\n WorkbenchHostNodeHeaderWindowActions\n} from \"@tutti-os/workbench-surface\";\nimport { ExternalLink } from \"lucide-react\";\nimport {\n Button,\n PanelIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { CreateChatIcon } from \"@tutti-os/ui-system/icons\";\nimport { useAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\n\nconst headerChromeIconButtonClassName =\n \"agent-gui-workbench-header__icon-button\";\n\nconst conversationRailToggleButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__rail-toggle\";\n\nconst detachedWindowButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__detached-window\";\n\nconst headerChromeIconClassName = \"agent-gui-workbench-header__icon\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n close?: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize?: string;\n minimize?: string;\n newConversation: string;\n openDetachedWindow?: string;\n restore?: string;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n defaultActions?: ReactNode;\n displayMode?: WorkbenchDisplayMode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n conversationRailWidthPx?: number | null;\n conversationIconUrl?: string | null;\n conversationIconFallbackUrl?: string | null;\n providerRailWidthPx?: number | null;\n conversationTitle?: string | null;\n nodeId: string;\n onCreateConversation?: () => void;\n onOpenDetachedWindow?: () => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n showWindowControls?: boolean;\n title?: string;\n windowActions?: Pick<\n WorkbenchHostNodeHeaderWindowActions,\n \"close\" | \"minimize\" | \"toggleDisplayMode\"\n >;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n defaultActions: _defaultActions,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n conversationRailWidthPx,\n conversationIconUrl,\n conversationIconFallbackUrl,\n providerRailWidthPx,\n conversationTitle,\n nodeId,\n onCreateConversation,\n onOpenDetachedWindow,\n onToggleConversationRail,\n showWindowControls = true,\n title: _title,\n windowActions,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const hasBodyRenderError = useAgentGuiWorkbenchBodyRenderError(nodeId);\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n const appTitle = _title?.trim() || copy.fallbackAgentLabel;\n const sessionTitle = hasBodyRenderError\n ? \"\"\n : conversationTitle?.trim() || \"\";\n const sessionIconUrl = conversationIconUrl?.trim() || \"\";\n const sessionIconFallbackUrl = conversationIconFallbackUrl?.trim() || \"\";\n const safeDisplayMode = displayMode ?? \"floating\";\n const safeWindowActions = windowActions ?? {\n close: () => undefined,\n minimize: () => undefined,\n toggleDisplayMode: () => undefined\n };\n const displayModeLabel =\n safeDisplayMode === \"fullscreen\"\n ? (copy.restore ?? \"Restore\")\n : (copy.maximize ?? \"Maximize\");\n const headerStyle = {\n ...(headerProps.style ?? {}),\n ...(typeof conversationRailWidthPx === \"number\" &&\n Number.isFinite(conversationRailWidthPx)\n ? {\n \"--agent-gui-workbench-header-rail-width\": `${Math.round(\n conversationRailWidthPx +\n (typeof providerRailWidthPx === \"number\" &&\n Number.isFinite(providerRailWidthPx)\n ? providerRailWidthPx\n : 0)\n )}px`\n }\n : {})\n } as CSSProperties;\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\"agent-gui-workbench-header\", className),\n \"data-agent-gui-workbench-header\": \"true\",\n \"data-agent-gui-workbench-header-collapsed\": isConversationRailCollapsed\n ? \"true\"\n : \"false\",\n \"data-agent-gui-workbench-header-has-session\": sessionTitle\n ? \"true\"\n : \"false\",\n style: headerStyle\n },\n createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary\",\n \"data-agent-gui-workbench-header-primary\": \"true\"\n },\n showWindowControls\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__traffic-lights\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createTrafficLightButton({\n label: copy.close ?? \"Close\",\n onClick: safeWindowActions.close,\n testId: \"agent-gui-window-close\",\n tone: \"close\"\n }),\n createTrafficLightButton({\n label: copy.minimize ?? \"Minimize\",\n onClick: safeWindowActions.minimize,\n testId: \"agent-gui-window-minimize\",\n tone: \"minimize\"\n }),\n createTrafficLightButton({\n label: displayModeLabel,\n onClick: safeWindowActions.toggleDisplayMode,\n pressed: safeDisplayMode === \"fullscreen\",\n testId: \"agent-gui-window-toggle-display-mode\",\n tone: \"maximize\"\n })\n )\n : null,\n !isConversationRailCollapsed\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__agent-brand\"\n },\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__agent-name\"\n },\n appTitle\n )\n )\n : null,\n onOpenDetachedWindow && !hasBodyRenderError\n ? createDetachedWindowButton({\n label: copy.openDetachedWindow ?? \"Open in detached window\",\n onOpenDetachedWindow\n })\n : null,\n createElement(\n Button as never,\n {\n \"aria-label\": toggleLabel,\n className: conversationRailToggleButtonClassName,\n \"data-agent-gui-conversation-rail-auto-collapsed\":\n isConversationRailAutoCollapsed ? \"true\" : undefined,\n \"data-agent-gui-conversation-rail-collapsed\":\n isConversationRailCollapsed ? \"true\" : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-sm\",\n title: toggleLabel,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isConversationRailCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: headerChromeIconClassName })\n ),\n isConversationRailCollapsed && onCreateConversation\n ? createElement(\n Button as never,\n {\n \"aria-label\": copy.newConversation,\n className: headerChromeIconButtonClassName,\n size: \"icon-sm\",\n title: copy.newConversation,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onCreateConversation();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(CreateChatIcon, {\n \"aria-hidden\": true,\n className: headerChromeIconClassName\n })\n )\n : null,\n isConversationRailCollapsed && sessionTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__session-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-session-icon\"\n }),\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n )\n : null\n ),\n !isConversationRailCollapsed && sessionTitle\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail-title\",\n \"data-testid\": \"agent-gui-window-detail-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-detail-title-icon\"\n }),\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n )\n : null\n );\n}\n\nfunction createDetachedWindowButton({\n label,\n onOpenDetachedWindow\n}: {\n label: string;\n onOpenDetachedWindow: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: detachedWindowButtonClassName,\n \"data-testid\": \"agent-gui-open-detached-window\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onOpenDetachedWindow();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(ExternalLink, {\n \"aria-hidden\": true,\n className: headerChromeIconClassName\n })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createSessionHeaderIconSlot({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc: string;\n testId: string;\n}): ReactNode {\n // While the session's provider is still resolving (e.g. a freshly created\n // session) there is no icon URL yet. Render a neutral skeleton block rather\n // than flashing a wrong/default provider icon; it is replaced once the real\n // icon arrives.\n if (!src) {\n return createElement(\"span\", {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-header__session-icon agent-gui-workbench-header__session-icon--pending\",\n \"data-testid\": `${testId}-pending`\n });\n }\n return createElement(SessionHeaderIcon, {\n key: `${src}::${fallbackSrc}`,\n fallbackSrc,\n src,\n testId\n });\n}\n\nfunction SessionHeaderIcon({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc?: string;\n testId: string;\n}): ReactNode {\n const [useFallback, setUseFallback] = useState(false);\n const [hidden, setHidden] = useState(false);\n\n const hasFallback = Boolean(fallbackSrc) && fallbackSrc !== src;\n const effectiveSrc = useFallback && fallbackSrc ? fallbackSrc : src;\n\n if (hidden) {\n return null;\n }\n\n return createElement(\"img\", {\n alt: \"\",\n className: \"agent-gui-workbench-header__session-icon\",\n \"data-testid\": testId,\n draggable: false,\n src: effectiveSrc,\n onError: () => {\n // On load failure, fall back to the bundled provider icon once; if that\n // also fails (or there is none), hide the img so the browser's broken\n // image glyph never shows.\n if (!useFallback && hasFallback) {\n setUseFallback(true);\n } else {\n setHidden(true);\n }\n }\n });\n}\n\nfunction createTrafficLightButton(input: {\n label: string;\n onClick: () => void;\n pressed?: boolean;\n testId: string;\n tone: \"close\" | \"minimize\" | \"maximize\";\n}): ReactNode {\n const iconName =\n input.tone === \"maximize\"\n ? input.pressed\n ? \"unfullscreen\"\n : \"fullscreen\"\n : input.tone;\n return createElement(\n \"button\",\n {\n \"aria-label\": input.label,\n \"aria-pressed\": input.pressed,\n className: \"agent-gui-workbench-header__traffic-light\",\n \"data-agent-gui-workbench-traffic-light\": input.tone,\n \"data-testid\": input.testId,\n type: \"button\",\n onClick: (event) => {\n event.stopPropagation();\n input.onClick();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(TrafficLightIcon, {\n \"aria-hidden\": true,\n className: \"agent-gui-workbench-header__traffic-light-icon\",\n \"data-agent-gui-workbench-traffic-light-icon\": iconName,\n iconName\n })\n );\n}\n\nfunction TrafficLightIcon({\n className,\n iconName,\n ...props\n}: {\n className: string;\n iconName: \"close\" | \"fullscreen\" | \"minimize\" | \"unfullscreen\";\n \"aria-hidden\": true;\n \"data-agent-gui-workbench-traffic-light-icon\": string;\n}): ReactNode {\n return createElement(\n \"svg\",\n {\n ...props,\n className,\n fill: \"currentColor\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\"\n },\n createElement(\"path\", { d: trafficLightIconPathByName[iconName] })\n );\n}\n\nconst trafficLightIconPathByName = {\n close:\n \"M16.9395 4.93953C17.5253 4.35374 18.4748 4.35374 19.0606 4.93953C19.6463 5.52532 19.6464 6.47486 19.0606 7.06062L14.1212 12.0001L19.0606 16.9395C19.6463 17.5253 19.6464 18.4749 19.0606 19.0606C18.4749 19.6464 17.5253 19.6463 16.9395 19.0606L12.0001 14.1212L7.06062 19.0606C6.47486 19.6464 5.52532 19.6463 4.93953 19.0606C4.35374 18.4748 4.35374 17.5253 4.93953 16.9395L9.87898 12.0001L4.93953 7.06062C4.35374 6.47484 4.35374 5.52532 4.93953 4.93953C5.52532 4.35374 6.47484 4.35374 7.06062 4.93953L12.0001 9.87898L16.9395 4.93953Z\",\n fullscreen:\n \"M18.1465 7.85352C18.4615 7.53861 18.9999 7.76165 19 8.20703V18.5C19 18.7761 18.7761 19 18.5 19H8.20703C7.76165 18.9999 7.53861 18.4615 7.85352 18.1465L18.1465 7.85352ZM15.793 5C16.2384 5.00006 16.4614 5.53855 16.1465 5.85352L5.85352 16.1465C5.53855 16.4614 5.00006 16.2384 5 15.793V5.5C5 5.22386 5.22386 5 5.5 5H15.793Z\",\n minimize:\n \"M5 10.5H19C19.8284 10.5 20.5 11.1716 20.5 12C20.5 12.8284 19.8284 13.5 19 13.5H5C4.17157 13.5 3.5 12.8284 3.5 12C3.5 11.1716 4.17157 10.5 5 10.5Z\",\n unfullscreen:\n \"M20.793 12C21.2384 12.0001 21.4614 12.5386 21.1465 12.8536L12.8536 21.1465C12.5386 21.4614 12.0001 21.2384 12.0001 20.793V12.5C12.0001 12.2239 12.2239 12 12.5001 12H20.793ZM11.1465 2.85356C11.4615 2.53864 12 2.76166 12.0001 3.20708V11.5C12 11.7761 11.7762 12 11.5001 12H3.20708C2.76166 12 2.53864 11.4615 2.85357 11.1465L11.1465 2.85356Z\"\n} as const;\n"],"mappings":"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","names":["createElement","createElement"]}
@@ -4,7 +4,7 @@ import {
4
4
  formatAgentSessionMentionText,
5
5
  normalizeAgentGUIProviderIdentity,
6
6
  resolveAgentGUIExplicitConversationTitle
7
- } from "./chunk-SG6A35BU.js";
7
+ } from "./chunk-5H6NINJY.js";
8
8
 
9
9
  // workbench/sessionTitle.ts
10
10
  function formatAgentGuiSessionPlainTitle(title, options = {}) {
@@ -96,4 +96,4 @@ export {
96
96
  formatAgentGuiConversationPlainTitle,
97
97
  resolveAgentGuiWorkbenchSessionTitle
98
98
  };
99
- //# sourceMappingURL=chunk-FTSEVC6O.js.map
99
+ //# sourceMappingURL=chunk-XZF4QNT4.js.map
@@ -1,5 +1,5 @@
1
- import { f as AgentMentionSearchState, A as AgentContextMentionItem, a as AgentMentionBrowseCategory, b as AgentMentionFilterId, d as AgentMentionGroupId } from '../AgentMentionSearchController-Po0KQLcL.js';
2
- export { c as AgentMentionGroup, e as AgentMentionSearchController } from '../AgentMentionSearchController-Po0KQLcL.js';
1
+ import { f as AgentMentionSearchState, A as AgentContextMentionItem, a as AgentMentionBrowseCategory, b as AgentMentionFilterId, d as AgentMentionGroupId } from '../AgentMentionSearchController-DD_WOred.js';
2
+ export { c as AgentMentionGroup, e as AgentMentionSearchController } from '../AgentMentionSearchController-DD_WOred.js';
3
3
  export { AGENT_CONTEXT_MENTION_PROVIDER_IDS, AgentContextMentionInsertResult, AgentContextMentionProvider, AgentContextMentionProviderId, AgentContextMentionQueryInput } from '../context-mention-provider.js';
4
4
  import '@tutti-os/ui-rich-text/at-panel';
5
5
  import '@tutti-os/ui-rich-text/types';
@@ -4,19 +4,19 @@ import {
4
4
  AgentMentionSearchController,
5
5
  flattenAgentMentionPaletteEntries,
6
6
  groupStartKeys
7
- } from "../chunk-QDWV5VTD.js";
8
- import "../chunk-DXENDZEF.js";
9
- import "../chunk-MVPSFOJZ.js";
7
+ } from "../chunk-466AWJTS.js";
8
+ import "../chunk-3PKRGSMH.js";
9
+ import "../chunk-SVGIWXNK.js";
10
10
  import "../chunk-IBIMGLCD.js";
11
- import "../chunk-IZX2YQXY.js";
11
+ import "../chunk-KWQ4N4IZ.js";
12
12
  import "../chunk-Y35GDLP2.js";
13
13
  import "../chunk-LUGELG5V.js";
14
- import "../chunk-KS35VKHM.js";
14
+ import "../chunk-GDFQXJMG.js";
15
15
  import "../chunk-4US2YHBY.js";
16
- import "../chunk-SC3PS7AT.js";
16
+ import "../chunk-C7K3EFGI.js";
17
17
  import "../chunk-PJP5BUU6.js";
18
18
  import "../chunk-4I2VCAMW.js";
19
- import "../chunk-DGNKXT3Q.js";
19
+ import "../chunk-G6BVEY7I.js";
20
20
  import {
21
21
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
22
22
  } from "../chunk-JM24HADP.js";
@@ -540,7 +540,10 @@ declare const agentGuiI18nResources: {
540
540
  readonly planImplementationSkip: "Stay in Plan Mode";
541
541
  readonly noRunningResponse: "No running response to stop.";
542
542
  readonly composerTextMenu: "Composer text actions";
543
- readonly pastedTextPromptAttachment: "Pasted text attachment: {{name}}";
543
+ readonly pastedTextFilesHeader: "Referenced pasted text files:";
544
+ readonly pastedTextFileLine: "- pasted text file \"{{preview}}\": {{path}}. Read this file before continuing.";
545
+ readonly pastedTextAttachmentTitle: "Pasted text";
546
+ readonly pastedTextRestoreToComposer: "Show in text field";
544
547
  readonly copyMessage: "Copy message";
545
548
  readonly copyImage: "Copy image";
546
549
  readonly messageCopied: "Copied";
@@ -590,6 +593,29 @@ declare const agentGuiI18nResources: {
590
593
  };
591
594
  };
592
595
  readonly empty: "What can {{provider}} help you with?";
596
+ readonly homeSuggestionsClose: "Close suggestions";
597
+ readonly homeSuggestions: {
598
+ readonly about: {
599
+ readonly title: "Meet Tutti";
600
+ readonly prompt: "Tell me what Tutti can help me do";
601
+ };
602
+ readonly breakdown: {
603
+ readonly title: "Task breakdown";
604
+ readonly taskCenterLabel: "Task management";
605
+ readonly prompt: "Use {{taskCenterMention}} to help me break down the task, topic { enter here }";
606
+ };
607
+ readonly review: {
608
+ readonly title: "Quality review";
609
+ readonly prompt: "Have { @agent } review the output quality of { @agent session }";
610
+ };
611
+ readonly interaction: {
612
+ readonly title: "Agent interaction";
613
+ readonly prompt: "Have { @agent } and { @agent } work together to { do something }, topic { enter here }";
614
+ };
615
+ readonly import: {
616
+ readonly title: "Import session";
617
+ };
618
+ };
593
619
  readonly conversations: "Sessions";
594
620
  readonly newConversation: "New session";
595
621
  readonly accountMenuTitle: "Tutti Agent";
@@ -790,7 +816,14 @@ declare const agentGuiI18nResources: {
790
816
  readonly showLessConversations: "Show less";
791
817
  readonly deleteSession: "Delete session";
792
818
  readonly pinSession: "Pin session";
819
+ readonly copySessionLink: "Copy session link";
820
+ readonly renameSession: "Rename session";
821
+ readonly renameSessionTitle: "Rename conversation";
822
+ readonly renameSessionDescription: "Keep it short and easy to recognize.";
823
+ readonly renameSessionPlaceholder: "Conversation title";
824
+ readonly renameSessionSave: "Save";
793
825
  readonly unpinSession: "Unpin session";
826
+ readonly markSessionUnread: "Mark as unread";
794
827
  readonly deleteSessionTitle: "Delete session?";
795
828
  readonly deleteSessionBody: "This session cannot be recovered after deletion. It will no longer appear in the session list, session timeline, room timeline, or room status.";
796
829
  readonly deleteSessionConfirm: "Delete session";
@@ -3025,7 +3058,10 @@ declare const agentGuiI18nResources: {
3025
3058
  readonly planImplementationSkip: "留在计划模式";
3026
3059
  readonly noRunningResponse: "当前没有正在运行的回复。";
3027
3060
  readonly composerTextMenu: "输入框文本操作";
3028
- readonly pastedTextPromptAttachment: "粘贴的文本附件:{{name}}";
3061
+ readonly pastedTextFilesHeader: "引用的粘贴文本文件:";
3062
+ readonly pastedTextFileLine: "- 粘贴的文本文件 \"{{preview}}\":{{path}},继续前请先阅读此文件。";
3063
+ readonly pastedTextAttachmentTitle: "粘贴的文本";
3064
+ readonly pastedTextRestoreToComposer: "在文本框中显示";
3029
3065
  readonly copyMessage: "复制消息";
3030
3066
  readonly copyImage: "复制图片";
3031
3067
  readonly messageCopied: "已复制";
@@ -3075,6 +3111,29 @@ declare const agentGuiI18nResources: {
3075
3111
  };
3076
3112
  };
3077
3113
  readonly empty: "需要 {{provider}} 帮你做些什么?";
3114
+ readonly homeSuggestionsClose: "收起建议";
3115
+ readonly homeSuggestions: {
3116
+ readonly about: {
3117
+ readonly title: "认识 Tutti";
3118
+ readonly prompt: "介绍一下 Tutti 能帮我做些什么";
3119
+ };
3120
+ readonly breakdown: {
3121
+ readonly title: "任务拆解";
3122
+ readonly taskCenterLabel: "任务管理";
3123
+ readonly prompt: "使用 {{taskCenterMention}} 帮我拆解任务,任务主题 { 请输入 }";
3124
+ };
3125
+ readonly review: {
3126
+ readonly title: "质量审查";
3127
+ readonly prompt: "让 { @agent } 审查 { @agent 会话 } 的产物质量";
3128
+ };
3129
+ readonly interaction: {
3130
+ readonly title: "Agent 互动";
3131
+ readonly prompt: "让 { @agent } 和 { @agent } 一起 { 做些什么 },主题 { 请输入 }";
3132
+ };
3133
+ readonly import: {
3134
+ readonly title: "导入会话";
3135
+ };
3136
+ };
3078
3137
  readonly conversations: "会话";
3079
3138
  readonly newConversation: "新建会话";
3080
3139
  readonly accountMenuTitle: "Tutti Agent";
@@ -3275,7 +3334,14 @@ declare const agentGuiI18nResources: {
3275
3334
  readonly showLessConversations: "收起";
3276
3335
  readonly deleteSession: "删除会话";
3277
3336
  readonly pinSession: "置顶会话";
3337
+ readonly copySessionLink: "复制会话链接";
3338
+ readonly renameSession: "重命名会话";
3339
+ readonly renameSessionTitle: "重命名对话";
3340
+ readonly renameSessionDescription: "保持简短且易于识别。";
3341
+ readonly renameSessionPlaceholder: "对话标题";
3342
+ readonly renameSessionSave: "保存";
3278
3343
  readonly unpinSession: "取消置顶";
3344
+ readonly markSessionUnread: "标记为未读";
3279
3345
  readonly deleteSessionTitle: "删除会话?";
3280
3346
  readonly deleteSessionBody: "删除后无法恢复。该会话将不再出现在会话列表、会话时间线、房间时间线或房间状态中。";
3281
3347
  readonly deleteSessionConfirm: "删除会话";
@@ -6,8 +6,8 @@ import {
6
6
  translate,
7
7
  translateInUiLanguage,
8
8
  useTranslation
9
- } from "../chunk-SC3PS7AT.js";
10
- import "../chunk-DGNKXT3Q.js";
9
+ } from "../chunk-C7K3EFGI.js";
10
+ import "../chunk-G6BVEY7I.js";
11
11
  export {
12
12
  AgentGuiI18nProvider,
13
13
  agentGuiI18nModule,