@tutti-os/agent-gui 0.0.3

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 (112) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +56 -0
  3. package/dist/agent-message-center/index.d.ts +218 -0
  4. package/dist/agent-message-center/index.js +1962 -0
  5. package/dist/agent-message-center/index.js.map +1 -0
  6. package/dist/agent-rich-text-at-provider.d.ts +49 -0
  7. package/dist/agent-rich-text-at-provider.js +7 -0
  8. package/dist/agent-rich-text-at-provider.js.map +1 -0
  9. package/dist/agent-title-text.d.ts +3 -0
  10. package/dist/agent-title-text.js +7 -0
  11. package/dist/agent-title-text.js.map +1 -0
  12. package/dist/app/renderer/agentactivity.css +6773 -0
  13. package/dist/app/renderer/assets/icons/agent-sessions-filled.svg +1 -0
  14. package/dist/app/renderer/assets/icons/agents/claude-rounded.png +0 -0
  15. package/dist/app/renderer/assets/icons/agents/codex-rounded.png +0 -0
  16. package/dist/app/renderer/assets/icons/agents/gemini-rounded.png +0 -0
  17. package/dist/app/renderer/assets/icons/agents/hermes-rounded.png +0 -0
  18. package/dist/app/renderer/assets/icons/agents/manage-agent-claude-code.png +0 -0
  19. package/dist/app/renderer/assets/icons/agents/manage-agent-codex.png +0 -0
  20. package/dist/app/renderer/assets/icons/agents/manage-agent-gemini.png +0 -0
  21. package/dist/app/renderer/assets/icons/agents/manage-agent-hermes.png +0 -0
  22. package/dist/app/renderer/assets/icons/agents/manage-agent-nextop.png +0 -0
  23. package/dist/app/renderer/assets/icons/agents/manage-agent-openclaw.png +0 -0
  24. package/dist/app/renderer/assets/icons/agents/nextop-doc-rounded.png +0 -0
  25. package/dist/app/renderer/assets/icons/agents/openclaw-rounded.png +0 -0
  26. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-claude-code.png +0 -0
  27. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-codex.png +0 -0
  28. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-gemini.png +0 -0
  29. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-nexight.png +0 -0
  30. package/dist/app/renderer/assets/icons/agents/workspace-dock-agent-openclaw.png +0 -0
  31. package/dist/app/renderer/assets/icons/code-filled.svg +1 -0
  32. package/dist/app/renderer/assets/icons/doc-filled.svg +1 -0
  33. package/dist/app/renderer/assets/icons/folder-filled.svg +1 -0
  34. package/dist/app/renderer/assets/icons/image-filled.svg +1 -0
  35. package/dist/app/renderer/assets/icons/issue-filled.svg +1 -0
  36. package/dist/app/renderer/assets/icons/product-filled.svg +1 -0
  37. package/dist/app/renderer/assets/icons/user-avatar-placeholder.png +0 -0
  38. package/dist/app/renderer/assets/icons/video-filled.svg +1 -0
  39. package/dist/chunk-22L4VWUR.js +70 -0
  40. package/dist/chunk-22L4VWUR.js.map +1 -0
  41. package/dist/chunk-3D5VTIKP.js +93 -0
  42. package/dist/chunk-3D5VTIKP.js.map +1 -0
  43. package/dist/chunk-AF5CXBJN.js +3075 -0
  44. package/dist/chunk-AF5CXBJN.js.map +1 -0
  45. package/dist/chunk-BABBC24I.js +28 -0
  46. package/dist/chunk-BABBC24I.js.map +1 -0
  47. package/dist/chunk-GCBDIQDX.js +22 -0
  48. package/dist/chunk-GCBDIQDX.js.map +1 -0
  49. package/dist/chunk-HSR5DI6O.js +4695 -0
  50. package/dist/chunk-HSR5DI6O.js.map +1 -0
  51. package/dist/chunk-IVPB4MLI.js +7 -0
  52. package/dist/chunk-IVPB4MLI.js.map +1 -0
  53. package/dist/chunk-KCC3GNPB.js +13 -0
  54. package/dist/chunk-KCC3GNPB.js.map +1 -0
  55. package/dist/chunk-PJP5BUU6.js +18 -0
  56. package/dist/chunk-PJP5BUU6.js.map +1 -0
  57. package/dist/chunk-RORLLV27.js +144 -0
  58. package/dist/chunk-RORLLV27.js.map +1 -0
  59. package/dist/chunk-UJWUGMWC.js +128 -0
  60. package/dist/chunk-UJWUGMWC.js.map +1 -0
  61. package/dist/chunk-UKQIGNN3.js +921 -0
  62. package/dist/chunk-UKQIGNN3.js.map +1 -0
  63. package/dist/chunk-ZP7P7DYO.js +270 -0
  64. package/dist/chunk-ZP7P7DYO.js.map +1 -0
  65. package/dist/chunk-ZX5PDYAS.js +346 -0
  66. package/dist/chunk-ZX5PDYAS.js.map +1 -0
  67. package/dist/claude-rounded-F6VPQETB.png +0 -0
  68. package/dist/codex-rounded-SC63MZAW.png +0 -0
  69. package/dist/gemini-rounded-O4KAJFIM.png +0 -0
  70. package/dist/hermes-rounded-QGDHBNRJ.png +0 -0
  71. package/dist/i18n/index.d.ts +4580 -0
  72. package/dist/i18n/index.js +19 -0
  73. package/dist/i18n/index.js.map +1 -0
  74. package/dist/index.d.ts +775 -0
  75. package/dist/index.js +33699 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/manage-agent-claude-code-F6VPQETB.png +0 -0
  78. package/dist/manage-agent-codex-SC63MZAW.png +0 -0
  79. package/dist/manage-agent-gemini-O4KAJFIM.png +0 -0
  80. package/dist/manage-agent-hermes-QGDHBNRJ.png +0 -0
  81. package/dist/manage-agent-nextop-UFAQ22K2.png +0 -0
  82. package/dist/manage-agent-openclaw-24U7O6CA.png +0 -0
  83. package/dist/mention-file-presentation.d.ts +16 -0
  84. package/dist/mention-file-presentation.js +10 -0
  85. package/dist/mention-file-presentation.js.map +1 -0
  86. package/dist/nextop-doc-rounded-UFAQ22K2.png +0 -0
  87. package/dist/openclaw-rounded-24U7O6CA.png +0 -0
  88. package/dist/user-avatar-placeholder-WP2373TS.png +0 -0
  89. package/dist/workbench/contribution.d.ts +42 -0
  90. package/dist/workbench/contribution.js +24 -0
  91. package/dist/workbench/contribution.js.map +1 -0
  92. package/dist/workbench/index.d.ts +24 -0
  93. package/dist/workbench/index.js +82 -0
  94. package/dist/workbench/index.js.map +1 -0
  95. package/dist/workbench/launch.d.ts +49 -0
  96. package/dist/workbench/launch.js +23 -0
  97. package/dist/workbench/launch.js.map +1 -0
  98. package/dist/workbench/providerCatalog.d.ts +15 -0
  99. package/dist/workbench/providerCatalog.js +27 -0
  100. package/dist/workbench/providerCatalog.js.map +1 -0
  101. package/dist/workbench/state.d.ts +22 -0
  102. package/dist/workbench/state.js +22 -0
  103. package/dist/workbench/state.js.map +1 -0
  104. package/dist/workbench/types.d.ts +43 -0
  105. package/dist/workbench/types.js +7 -0
  106. package/dist/workbench/types.js.map +1 -0
  107. package/dist/workspace-agent-generated-files.d.ts +2 -0
  108. package/dist/workspace-agent-generated-files.js +21 -0
  109. package/dist/workspace-agent-generated-files.js.map +1 -0
  110. package/dist/workspaceAgentActivityListViewModel-PvLQDj60.d.ts +309 -0
  111. package/dist/workspaceLinkActions-Bwa-phu8.d.ts +51 -0
  112. package/package.json +166 -0
@@ -0,0 +1,346 @@
1
+ import {
2
+ agentGuiWorkbenchDockEntryId,
3
+ agentGuiWorkbenchProviderFromIdentifier,
4
+ agentGuiWorkbenchTypeId,
5
+ createAgentGuiWorkbenchLaunchDescriptor
6
+ } from "./chunk-RORLLV27.js";
7
+ import {
8
+ agentGuiWorkbenchProviderFromInstanceId,
9
+ createAgentGuiWorkbenchNodeStateSource,
10
+ normalizeAgentGuiWorkbenchNodeState,
11
+ normalizeAgentGuiWorkbenchState
12
+ } from "./chunk-ZP7P7DYO.js";
13
+ import {
14
+ agentGuiWorkbenchProviderLabels,
15
+ agentGuiWorkbenchProviders,
16
+ isAgentGuiWorkbenchDefaultDockProvider,
17
+ resolveAgentGuiWorkbenchProviderLabel
18
+ } from "./chunk-22L4VWUR.js";
19
+ import {
20
+ agentGuiDockIconUrls,
21
+ resolveAgentGUIExpandedWindowFrame,
22
+ shouldAutoCollapseAgentGUIConversationRail
23
+ } from "./chunk-UJWUGMWC.js";
24
+
25
+ // workbench/contribution.ts
26
+ import { createElement as createElement2 } from "react";
27
+ import {
28
+ getWorkbenchLayoutFrame
29
+ } from "@tutti-os/workbench-surface";
30
+
31
+ // workbench/header.ts
32
+ import { createElement } from "react";
33
+ import { Button, PanelIcon, cn } from "@tutti-os/ui-system";
34
+ function AgentGuiWorkbenchHeader({
35
+ className,
36
+ copy,
37
+ defaultActions,
38
+ isConversationRailAutoCollapsed,
39
+ isConversationRailCollapsed,
40
+ onToggleConversationRail,
41
+ title,
42
+ ...headerProps
43
+ }) {
44
+ const toggleLabel = isConversationRailCollapsed ? copy.expandConversationRail : copy.collapseConversationRail;
45
+ return createElement(
46
+ "header",
47
+ {
48
+ ...headerProps,
49
+ className: cn(
50
+ "flex h-full min-h-0 items-center justify-between gap-3 bg-[var(--background-panel)] px-2 pl-3",
51
+ className
52
+ )
53
+ },
54
+ createElement(
55
+ "div",
56
+ { className: "flex min-w-0 items-center gap-2" },
57
+ createElement(
58
+ "span",
59
+ {
60
+ className: "min-w-0 truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]"
61
+ },
62
+ title?.trim() || copy.fallbackAgentLabel
63
+ ),
64
+ createElement(
65
+ Button,
66
+ {
67
+ "aria-label": toggleLabel,
68
+ className: "cursor-pointer rounded-md",
69
+ "data-agent-gui-conversation-rail-auto-collapsed": isConversationRailAutoCollapsed ? "true" : void 0,
70
+ "data-agent-gui-conversation-rail-collapsed": isConversationRailCollapsed ? "true" : void 0,
71
+ "data-testid": "agent-gui-toggle-conversation-rail",
72
+ size: "icon-sm",
73
+ title: toggleLabel,
74
+ type: "button",
75
+ variant: "ghost",
76
+ onClick: (event) => {
77
+ event.stopPropagation();
78
+ onToggleConversationRail(!isConversationRailCollapsed);
79
+ },
80
+ onDoubleClick: (event) => event.stopPropagation(),
81
+ onPointerDown: (event) => event.stopPropagation()
82
+ },
83
+ createElement(PanelIcon, { className: "size-[18px]" })
84
+ )
85
+ ),
86
+ createElement(
87
+ "div",
88
+ {
89
+ className: "flex flex-none items-center gap-1",
90
+ onDoubleClick: (event) => event.stopPropagation(),
91
+ onPointerDown: (event) => event.stopPropagation()
92
+ },
93
+ defaultActions
94
+ )
95
+ );
96
+ }
97
+
98
+ // workbench/contribution.ts
99
+ var agentGuiWorkbenchDefaultNodeFrame = {
100
+ height: 560,
101
+ width: 1040,
102
+ x: 140,
103
+ y: 48
104
+ };
105
+ var agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;
106
+ var AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT = "nextop:agent-gui-workbench-conversation-rail-toggle";
107
+ var agentGuiWorkbenchDefaultCopy = {
108
+ collapseConversationRail: "Collapse conversation rail",
109
+ expandConversationRail: "Expand conversation rail",
110
+ fallbackAgentLabel: "Agent",
111
+ nodeTitle: "Agent"
112
+ };
113
+ function createAgentGuiWorkbenchContribution(input) {
114
+ const nodeStateSource = createAgentGuiWorkbenchNodeStateSource({
115
+ workspaceId: input.workspaceId
116
+ });
117
+ const frame = input.frame ?? agentGuiWorkbenchDefaultNodeFrame;
118
+ const copy = resolveAgentGuiWorkbenchContributionCopy(input.copy);
119
+ return {
120
+ dockEntries: agentGuiWorkbenchProviders.map(
121
+ (provider, index) => createAgentGuiWorkbenchDockEntry({
122
+ label: agentGuiWorkbenchProviderLabels[provider],
123
+ iconUrl: input.dockIconUrls?.[provider],
124
+ order: index,
125
+ provider,
126
+ sectionId: input.dockSectionId ?? "agents",
127
+ visibility: input.resolveDockEntryVisibility?.(provider) ?? (isAgentGuiWorkbenchDefaultDockProvider(provider) ? "always" : "never")
128
+ })
129
+ ),
130
+ externalStateSource: nodeStateSource.externalStateSource,
131
+ id: input.id ?? "workspace-agent-gui",
132
+ nodes: [
133
+ {
134
+ frame,
135
+ instance: { mode: "multi" },
136
+ renderBody: (context) => input.renderBody(
137
+ context,
138
+ {
139
+ nodeTypeId: agentGuiWorkbenchTypeId,
140
+ onStateChange: (state) => {
141
+ nodeStateSource.writeNodeState({
142
+ instanceId: context.instanceId,
143
+ state,
144
+ typeId: agentGuiWorkbenchTypeId
145
+ });
146
+ },
147
+ provider: agentGuiWorkbenchProviderFromInstanceId(
148
+ context.instanceId
149
+ )
150
+ }
151
+ ),
152
+ renderHeader: ({
153
+ defaultActions,
154
+ dragHandleProps,
155
+ externalNodeState,
156
+ instanceId,
157
+ isFocused,
158
+ node,
159
+ surfaceSize,
160
+ windowActions
161
+ }) => {
162
+ const provider = agentGuiWorkbenchProviderFromInstanceId(instanceId);
163
+ const title = resolveAgentGuiWorkbenchProviderLabel(provider);
164
+ const workbenchState = normalizeAgentGuiWorkbenchState(
165
+ externalNodeState ?? node.data.runtimeNodeState
166
+ );
167
+ const nodeState = normalizeAgentGuiWorkbenchNodeState(
168
+ workbenchState,
169
+ provider
170
+ );
171
+ const isConversationRailAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(node.frame.width);
172
+ const isConversationRailCollapsed = nodeState.conversationRailCollapsed === true || isConversationRailAutoCollapsed;
173
+ const persistConversationRailCollapsed = (collapsed) => {
174
+ nodeStateSource.writeNodeState({
175
+ instanceId,
176
+ state: {
177
+ ...workbenchState,
178
+ conversationRailCollapsed: collapsed
179
+ },
180
+ typeId: agentGuiWorkbenchTypeId
181
+ });
182
+ };
183
+ const announceConversationRailCollapsed = (collapsed) => {
184
+ window.dispatchEvent(
185
+ new CustomEvent(
186
+ AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
187
+ {
188
+ detail: {
189
+ conversationRailCollapsed: collapsed,
190
+ instanceId
191
+ }
192
+ }
193
+ )
194
+ );
195
+ };
196
+ return createElement2(AgentGuiWorkbenchHeader, {
197
+ copy,
198
+ defaultActions,
199
+ isConversationRailAutoCollapsed,
200
+ isConversationRailCollapsed,
201
+ title,
202
+ ...dragHandleProps,
203
+ onPointerDown: (event) => {
204
+ dragHandleProps.onPointerDown?.(event);
205
+ if (!isFocused) {
206
+ windowActions.focus();
207
+ }
208
+ },
209
+ onToggleConversationRail: (nextCollapsed) => {
210
+ announceConversationRailCollapsed(nextCollapsed);
211
+ if (isConversationRailCollapsed && nextCollapsed === false && node.displayMode !== "fullscreen") {
212
+ const expandedFrame = resolveAgentGUIExpandedWindowFrame({
213
+ conversationRailWidthPx: nodeState.conversationRailWidthPx,
214
+ desktopSize: surfaceSize,
215
+ height: node.frame.height,
216
+ position: {
217
+ x: node.frame.x,
218
+ y: node.frame.y
219
+ },
220
+ width: node.frame.width
221
+ });
222
+ windowActions.resize({
223
+ ...node.frame,
224
+ height: expandedFrame.size.height,
225
+ width: expandedFrame.size.width,
226
+ x: expandedFrame.position.x,
227
+ y: expandedFrame.position.y
228
+ });
229
+ }
230
+ persistConversationRailCollapsed(nextCollapsed);
231
+ }
232
+ });
233
+ },
234
+ title: copy.nodeTitle,
235
+ typeId: agentGuiWorkbenchTypeId,
236
+ window: {
237
+ closable: true,
238
+ defaultOpen: false,
239
+ minimizedDock: {
240
+ kind: "snapshot"
241
+ },
242
+ minimizable: true
243
+ }
244
+ }
245
+ ],
246
+ onLaunchRequest: (request) => {
247
+ if (request.typeId !== agentGuiWorkbenchTypeId) {
248
+ return null;
249
+ }
250
+ const {
251
+ activation,
252
+ dockEntryId,
253
+ instanceId,
254
+ pendingHandoff,
255
+ provider,
256
+ reuseDockEntryNode,
257
+ targetAgentSessionId
258
+ } = createAgentGuiWorkbenchLaunchDescriptor(request);
259
+ const title = resolveAgentGuiWorkbenchProviderLabel(provider);
260
+ if (targetAgentSessionId || pendingHandoff) {
261
+ const previousState = nodeStateSource.readNodeState({
262
+ instanceId,
263
+ typeId: agentGuiWorkbenchTypeId
264
+ });
265
+ nodeStateSource.writeNodeState({
266
+ instanceId,
267
+ state: {
268
+ ...previousState ?? normalizeAgentGuiWorkbenchState(null),
269
+ ...targetAgentSessionId ? { lastActiveAgentSessionId: targetAgentSessionId } : {},
270
+ ...pendingHandoff ? { pendingHandoff } : {}
271
+ },
272
+ typeId: agentGuiWorkbenchTypeId
273
+ });
274
+ }
275
+ return {
276
+ activation,
277
+ defaultFrame: resolveAgentGuiWorkbenchDefaultLaunchFrame({
278
+ frame,
279
+ request
280
+ }),
281
+ dockEntryId,
282
+ framePolicy: "cascade-same-type-centered",
283
+ instanceId,
284
+ reuseDockEntryNode,
285
+ title,
286
+ typeId: agentGuiWorkbenchTypeId
287
+ };
288
+ }
289
+ };
290
+ }
291
+ function resolveAgentGuiWorkbenchDefaultLaunchFrame(input) {
292
+ const layoutFrame = getWorkbenchLayoutFrame(
293
+ input.request.surfaceSize,
294
+ input.request.layoutConstraints
295
+ );
296
+ return {
297
+ ...input.frame,
298
+ height: Math.round(
299
+ layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio
300
+ )
301
+ };
302
+ }
303
+ function resolveAgentGuiWorkbenchContributionCopy(copy) {
304
+ return {
305
+ ...agentGuiWorkbenchDefaultCopy,
306
+ ...copy
307
+ };
308
+ }
309
+ function createAgentGuiWorkbenchDockEntry(input) {
310
+ return {
311
+ icon: createElement2("img", {
312
+ alt: "",
313
+ draggable: false,
314
+ src: input.iconUrl ?? agentGuiDockIconUrls[input.provider]
315
+ }),
316
+ iconSize: "large",
317
+ id: agentGuiWorkbenchDockEntryId(input.provider),
318
+ label: input.label,
319
+ launchBehavior: "enabled",
320
+ launchPayload: { provider: input.provider },
321
+ matchNode: (node) => node.data.typeId === agentGuiWorkbenchTypeId && agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) === input.provider,
322
+ order: input.order,
323
+ resolvePopupItem: ({ externalNodeState }) => ({
324
+ title: resolveAgentGuiWorkbenchDockPopupTitle(externalNodeState)
325
+ }),
326
+ sectionId: input.sectionId,
327
+ typeId: agentGuiWorkbenchTypeId,
328
+ visibility: input.visibility
329
+ };
330
+ }
331
+ function resolveAgentGuiWorkbenchDockPopupTitle(state) {
332
+ const title = state?.lastActiveConversationTitle;
333
+ return typeof title === "string" && title.trim() ? title.trim() : null;
334
+ }
335
+
336
+ export {
337
+ AgentGuiWorkbenchHeader,
338
+ agentGuiWorkbenchDefaultNodeFrame,
339
+ agentGuiWorkbenchDefaultUsableHeightRatio,
340
+ AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
341
+ agentGuiWorkbenchDefaultCopy,
342
+ createAgentGuiWorkbenchContribution,
343
+ resolveAgentGuiWorkbenchDefaultLaunchFrame,
344
+ resolveAgentGuiWorkbenchContributionCopy
345
+ };
346
+ //# sourceMappingURL=chunk-ZX5PDYAS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.ts","../workbench/header.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport { AgentGuiWorkbenchHeader } from \"./header.ts\";\nimport {\n agentGuiWorkbenchDockEntryId,\n agentGuiWorkbenchProviderFromIdentifier,\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n agentGuiWorkbenchProviderFromInstanceId,\n createAgentGuiWorkbenchNodeStateSource,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport {\n agentGuiWorkbenchProviderLabels,\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchDefaultDockProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\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 agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"nextop:agent-gui-workbench-conversation-rail-toggle\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n nodeTitle: string;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Collapse conversation rail\",\n expandConversationRail: \"Expand conversation rail\",\n fallbackAgentLabel: \"Agent\",\n nodeTitle: \"Agent\"\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 dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n renderBody(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockEntryVisibility?: (\n provider: AgentGuiWorkbenchProvider\n ) => WorkbenchHostDockEntry[\"visibility\"];\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\n return {\n dockEntries: agentGuiWorkbenchProviders.map((provider, index) =>\n createAgentGuiWorkbenchDockEntry({\n label: agentGuiWorkbenchProviderLabels[provider],\n iconUrl: input.dockIconUrls?.[provider],\n order: index,\n provider,\n sectionId: input.dockSectionId ?? \"agents\",\n visibility:\n input.resolveDockEntryVisibility?.(provider) ??\n (isAgentGuiWorkbenchDefaultDockProvider(provider)\n ? \"always\"\n : \"never\")\n })\n ),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\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 state,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agentGuiWorkbenchProviderFromInstanceId(\n context.instanceId\n )\n }\n ),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const provider = agentGuiWorkbenchProviderFromInstanceId(instanceId);\n const title = resolveAgentGuiWorkbenchProviderLabel(provider);\n const workbenchState = normalizeAgentGuiWorkbenchState(\n externalNodeState ?? node.data.runtimeNodeState\n );\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n workbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const persistConversationRailCollapsed = (collapsed: boolean) => {\n nodeStateSource.writeNodeState({\n instanceId,\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\n return createElement(AgentGuiWorkbenchHeader, {\n copy,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n title,\n ...dragHandleProps,\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: \"snapshot\"\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const {\n activation,\n dockEntryId,\n instanceId,\n pendingHandoff,\n provider,\n reuseDockEntryNode,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor(request);\n const title = resolveAgentGuiWorkbenchProviderLabel(provider);\n if (targetAgentSessionId || pendingHandoff) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...(previousState ?? normalizeAgentGuiWorkbenchState(null)),\n ...(targetAgentSessionId\n ? { lastActiveAgentSessionId: targetAgentSessionId }\n : {}),\n ...(pendingHandoff ? { pendingHandoff } : {})\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n return {\n activation,\n defaultFrame: resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n }),\n dockEntryId,\n framePolicy: \"cascade-same-type-centered\",\n instanceId,\n reuseDockEntryNode,\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\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\n return {\n ...input.frame,\n height: Math.round(\n layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio\n )\n };\n}\n\nexport function resolveAgentGuiWorkbenchContributionCopy(\n copy?: AgentGuiWorkbenchContributionCopyOverrides\n): AgentGuiWorkbenchContributionCopy {\n return {\n ...agentGuiWorkbenchDefaultCopy,\n ...copy\n };\n}\n\nfunction createAgentGuiWorkbenchDockEntry(input: {\n iconUrl?: string;\n label: string;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl ?? agentGuiDockIconUrls[input.provider]\n }),\n iconSize: \"large\",\n id: agentGuiWorkbenchDockEntryId(input.provider),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: { provider: input.provider },\n matchNode: (node) =>\n node.data.typeId === agentGuiWorkbenchTypeId &&\n agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ===\n input.provider,\n order: input.order,\n resolvePopupItem: ({ externalNodeState }) => ({\n title: resolveAgentGuiWorkbenchDockPopupTitle(externalNodeState)\n }),\n sectionId: input.sectionId,\n typeId: agentGuiWorkbenchTypeId,\n visibility: input.visibility\n };\n}\n\nfunction resolveAgentGuiWorkbenchDockPopupTitle(state: unknown): string | null {\n const title = (state as Partial<AgentGuiWorkbenchState> | null)\n ?.lastActiveConversationTitle;\n return typeof title === \"string\" && title.trim() ? title.trim() : null;\n}\n","import { createElement, type HTMLAttributes, type ReactNode } from \"react\";\nimport { Button, PanelIcon, cn } from \"@tutti-os/ui-system\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n defaultActions?: ReactNode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n title?: string;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n onToggleConversationRail,\n title,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\n \"flex h-full min-h-0 items-center justify-between gap-3 bg-[var(--background-panel)] px-2 pl-3\",\n className\n )\n },\n createElement(\n \"div\",\n { className: \"flex min-w-0 items-center gap-2\" },\n createElement(\n \"span\",\n {\n className:\n \"min-w-0 truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\"\n },\n title?.trim() || copy.fallbackAgentLabel\n ),\n createElement(\n Button as never,\n {\n \"aria-label\": toggleLabel,\n className: \"cursor-pointer rounded-md\",\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: \"size-[18px]\" })\n )\n ),\n createElement(\n \"div\",\n {\n className: \"flex flex-none items-center gap-1\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n defaultActions\n )\n );\n}\n"],"mappings":"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","names":["createElement","createElement"]}
Binary file
Binary file
Binary file
Binary file