@tutti-os/agent-gui 0.0.69 → 0.0.70

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 (49) hide show
  1. package/README.md +4 -5
  2. package/dist/agent-conversation/index.d.ts +1 -1
  3. package/dist/agent-conversation/index.js +6 -6
  4. package/dist/agent-message-center/index.js +8 -8
  5. package/dist/{agentGuiNodeTypes-BipgG2ib.d.ts → agentGuiNodeTypes-CmLUy5Jt.d.ts} +0 -5
  6. package/dist/app/renderer/agentactivity.css +168 -0
  7. package/dist/{chunk-KAPBUKIT.js → chunk-DGNKXT3Q.js} +3 -115
  8. package/dist/chunk-DGNKXT3Q.js.map +1 -0
  9. package/dist/{chunk-ERBUQOIL.js → chunk-DXENDZEF.js} +2 -2
  10. package/dist/{chunk-EHLJL76A.js → chunk-FTSEVC6O.js} +2 -2
  11. package/dist/{chunk-6XRTDIDR.js → chunk-ISQCYEUJ.js} +5 -5
  12. package/dist/{chunk-547R2HOD.js → chunk-IZX2YQXY.js} +3 -3
  13. package/dist/{chunk-ZZBLWZJR.js → chunk-KS35VKHM.js} +1 -2
  14. package/dist/chunk-KS35VKHM.js.map +1 -0
  15. package/dist/{chunk-HAKNLXW7.js → chunk-MVPSFOJZ.js} +2 -2
  16. package/dist/{chunk-S32FLJRP.js → chunk-QDWV5VTD.js} +5 -5
  17. package/dist/{chunk-JA6Z3QA7.js → chunk-QJ42HQ24.js} +4 -4
  18. package/dist/{chunk-NH3XBJTZ.js → chunk-SC3PS7AT.js} +2 -2
  19. package/dist/{chunk-KTIKZNGS.js → chunk-SG6A35BU.js} +2 -2
  20. package/dist/{chunk-DAPKF2SN.js → chunk-WWY6MYMU.js} +3 -3
  21. package/dist/{chunk-FRAG4UFU.js → chunk-Y3C5EHSW.js} +58 -14
  22. package/dist/chunk-Y3C5EHSW.js.map +1 -0
  23. package/dist/context-mention-palette/index.js +7 -7
  24. package/dist/i18n/index.d.ts +2 -114
  25. package/dist/i18n/index.js +2 -2
  26. package/dist/index.d.ts +111 -109
  27. package/dist/index.js +117 -32
  28. package/dist/index.js.map +1 -1
  29. package/dist/queued-prompt-runtime.d.ts +1 -1
  30. package/dist/workbench/contribution.d.ts +8 -0
  31. package/dist/workbench/contribution.js +1 -1
  32. package/dist/workbench/index.d.ts +4 -1
  33. package/dist/workbench/index.js +4 -4
  34. package/dist/workbench/sessionTitle.js +3 -3
  35. package/dist/workspace-agent-generated-files.js +3 -3
  36. package/package.json +12 -12
  37. package/dist/chunk-FRAG4UFU.js.map +0 -1
  38. package/dist/chunk-KAPBUKIT.js.map +0 -1
  39. package/dist/chunk-ZZBLWZJR.js.map +0 -1
  40. /package/dist/{chunk-ERBUQOIL.js.map → chunk-DXENDZEF.js.map} +0 -0
  41. /package/dist/{chunk-EHLJL76A.js.map → chunk-FTSEVC6O.js.map} +0 -0
  42. /package/dist/{chunk-6XRTDIDR.js.map → chunk-ISQCYEUJ.js.map} +0 -0
  43. /package/dist/{chunk-547R2HOD.js.map → chunk-IZX2YQXY.js.map} +0 -0
  44. /package/dist/{chunk-HAKNLXW7.js.map → chunk-MVPSFOJZ.js.map} +0 -0
  45. /package/dist/{chunk-S32FLJRP.js.map → chunk-QDWV5VTD.js.map} +0 -0
  46. /package/dist/{chunk-JA6Z3QA7.js.map → chunk-QJ42HQ24.js.map} +0 -0
  47. /package/dist/{chunk-NH3XBJTZ.js.map → chunk-SC3PS7AT.js.map} +0 -0
  48. /package/dist/{chunk-KTIKZNGS.js.map → chunk-SG6A35BU.js.map} +0 -0
  49. /package/dist/{chunk-DAPKF2SN.js.map → chunk-WWY6MYMU.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  userAvatarPlaceholderUrl,
3
3
  workspaceAgentActivityStatusLabel
4
- } from "./chunk-HAKNLXW7.js";
4
+ } from "./chunk-MVPSFOJZ.js";
5
5
  import {
6
6
  normalizeAgentSessionMentionTitle
7
- } from "./chunk-547R2HOD.js";
7
+ } from "./chunk-IZX2YQXY.js";
8
8
  import {
9
9
  resolveAgentMentionFileThumbnailUrl,
10
10
  resolveAgentMentionFileVisualKind
@@ -12,10 +12,10 @@ import {
12
12
  import {
13
13
  getOptionalAgentHostApi,
14
14
  managedAgentRoundedIconUrl
15
- } from "./chunk-ZZBLWZJR.js";
15
+ } from "./chunk-KS35VKHM.js";
16
16
  import {
17
17
  translate
18
- } from "./chunk-NH3XBJTZ.js";
18
+ } from "./chunk-SC3PS7AT.js";
19
19
  import {
20
20
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
21
21
  } from "./chunk-JM24HADP.js";
@@ -2211,4 +2211,4 @@ export {
2211
2211
  AgentFileMentionPalette,
2212
2212
  AgentContextMentionPalette
2213
2213
  };
2214
- //# sourceMappingURL=chunk-S32FLJRP.js.map
2214
+ //# sourceMappingURL=chunk-QDWV5VTD.js.map
@@ -7,14 +7,14 @@ import {
7
7
  AgentGUIConversation_styles_default,
8
8
  MessageSquareMoreIcon,
9
9
  extractAgentMcpToolTarget
10
- } from "./chunk-DAPKF2SN.js";
10
+ } from "./chunk-WWY6MYMU.js";
11
11
  import {
12
12
  getOptionalAgentHostApi,
13
13
  useOptionalAgentHostApi
14
- } from "./chunk-ZZBLWZJR.js";
14
+ } from "./chunk-KS35VKHM.js";
15
15
  import {
16
16
  translate
17
- } from "./chunk-NH3XBJTZ.js";
17
+ } from "./chunk-SC3PS7AT.js";
18
18
 
19
19
  // shared/agentConversation/approvalOptionPresentation.ts
20
20
  function approvalOptionDisplayLabel(option, intent = {}) {
@@ -1172,4 +1172,4 @@ export {
1172
1172
  isPromptRequestIdTitle,
1173
1173
  AgentInteractivePromptSurface
1174
1174
  };
1175
- //# sourceMappingURL=chunk-JA6Z3QA7.js.map
1175
+ //# sourceMappingURL=chunk-QJ42HQ24.js.map
@@ -6,7 +6,7 @@ import {
6
6
  setCurrentAgentGuiI18nRuntime,
7
7
  translate,
8
8
  translateInUiLanguage
9
- } from "./chunk-KAPBUKIT.js";
9
+ } from "./chunk-DGNKXT3Q.js";
10
10
 
11
11
  // i18n/index.ts
12
12
  import React, {
@@ -68,4 +68,4 @@ export {
68
68
  AgentGuiI18nProvider,
69
69
  useTranslation
70
70
  };
71
- //# sourceMappingURL=chunk-NH3XBJTZ.js.map
71
+ //# sourceMappingURL=chunk-SC3PS7AT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  translateInUiLanguage
3
- } from "./chunk-KAPBUKIT.js";
3
+ } from "./chunk-DGNKXT3Q.js";
4
4
  import {
5
5
  normalizeAgentTitleText
6
6
  } from "./chunk-GCBDIQDX.js";
@@ -327,4 +327,4 @@ export {
327
327
  resolveAgentGUIProviderDisplayLabel,
328
328
  firstAgentGUIUserMessageTitle
329
329
  };
330
- //# sourceMappingURL=chunk-KTIKZNGS.js.map
330
+ //# sourceMappingURL=chunk-SG6A35BU.js.map
@@ -3,11 +3,11 @@ import {
3
3
  getOptionalAgentHostApi,
4
4
  managedAgentRoundedIconUrl,
5
5
  useOptionalAgentHostApi
6
- } from "./chunk-ZZBLWZJR.js";
6
+ } from "./chunk-KS35VKHM.js";
7
7
  import {
8
8
  translate,
9
9
  useTranslation
10
- } from "./chunk-NH3XBJTZ.js";
10
+ } from "./chunk-SC3PS7AT.js";
11
11
  import {
12
12
  resolveAgentWorkspaceFileVisualKind
13
13
  } from "./chunk-PJP5BUU6.js";
@@ -3697,4 +3697,4 @@ export {
3697
3697
  CustomScrollArea,
3698
3698
  MessageSquareMoreIcon
3699
3699
  };
3700
- //# sourceMappingURL=chunk-DAPKF2SN.js.map
3700
+ //# sourceMappingURL=chunk-WWY6MYMU.js.map
@@ -81,6 +81,7 @@ import {
81
81
  createElement,
82
82
  useState
83
83
  } from "react";
84
+ import { ExternalLink } from "lucide-react";
84
85
  import {
85
86
  Button,
86
87
  PanelIcon,
@@ -93,6 +94,7 @@ import {
93
94
  import { CreateChatIcon } from "@tutti-os/ui-system/icons";
94
95
  var headerChromeIconButtonClassName = "agent-gui-workbench-header__icon-button";
95
96
  var conversationRailToggleButtonClassName = "agent-gui-workbench-header__icon-button agent-gui-workbench-header__rail-toggle";
97
+ var detachedWindowButtonClassName = "agent-gui-workbench-header__icon-button agent-gui-workbench-header__detached-window";
96
98
  var headerChromeIconClassName = "agent-gui-workbench-header__icon";
97
99
  function AgentGuiWorkbenchHeader({
98
100
  className,
@@ -108,7 +110,9 @@ function AgentGuiWorkbenchHeader({
108
110
  conversationTitle,
109
111
  nodeId,
110
112
  onCreateConversation,
113
+ onOpenDetachedWindow,
111
114
  onToggleConversationRail,
115
+ showWindowControls = true,
112
116
  title: _title,
113
117
  windowActions,
114
118
  ...headerProps
@@ -150,7 +154,7 @@ function AgentGuiWorkbenchHeader({
150
154
  className: "agent-gui-workbench-header__primary",
151
155
  "data-agent-gui-workbench-header-primary": "true"
152
156
  },
153
- createElement(
157
+ showWindowControls ? createElement(
154
158
  "div",
155
159
  {
156
160
  className: "agent-gui-workbench-header__traffic-lights",
@@ -176,7 +180,7 @@ function AgentGuiWorkbenchHeader({
176
180
  testId: "agent-gui-window-toggle-display-mode",
177
181
  tone: "maximize"
178
182
  })
179
- ),
183
+ ) : null,
180
184
  !isConversationRailCollapsed ? createElement(
181
185
  "div",
182
186
  {
@@ -190,6 +194,10 @@ function AgentGuiWorkbenchHeader({
190
194
  appTitle
191
195
  )
192
196
  ) : null,
197
+ onOpenDetachedWindow ? createDetachedWindowButton({
198
+ label: copy.openDetachedWindow ?? "Open in detached window",
199
+ onOpenDetachedWindow
200
+ }) : null,
193
201
  createElement(
194
202
  Button,
195
203
  {
@@ -272,6 +280,42 @@ function AgentGuiWorkbenchHeader({
272
280
  ) : null
273
281
  );
274
282
  }
283
+ function createDetachedWindowButton({
284
+ label,
285
+ onOpenDetachedWindow
286
+ }) {
287
+ const button = createElement(
288
+ Button,
289
+ {
290
+ "aria-label": label,
291
+ className: detachedWindowButtonClassName,
292
+ "data-testid": "agent-gui-open-detached-window",
293
+ size: "icon-sm",
294
+ type: "button",
295
+ variant: "ghost",
296
+ onClick: (event) => {
297
+ event.stopPropagation();
298
+ onOpenDetachedWindow();
299
+ },
300
+ onDoubleClick: (event) => event.stopPropagation(),
301
+ onPointerDown: (event) => event.stopPropagation()
302
+ },
303
+ createElement(ExternalLink, {
304
+ "aria-hidden": true,
305
+ className: headerChromeIconClassName
306
+ })
307
+ );
308
+ return createElement(TooltipProvider, {
309
+ children: createElement(
310
+ Tooltip,
311
+ null,
312
+ createElement(TooltipTrigger, { asChild: true }, button),
313
+ createElement(TooltipContent, { side: "bottom" }, label)
314
+ ),
315
+ delayDuration: 250,
316
+ skipDelayDuration: 0
317
+ });
318
+ }
275
319
  function createSessionHeaderIconSlot({
276
320
  src,
277
321
  fallbackSrc,
@@ -320,7 +364,7 @@ function SessionHeaderIcon({
320
364
  }
321
365
  function createTrafficLightButton(input) {
322
366
  const iconName = input.tone === "maximize" ? input.pressed ? "unfullscreen" : "fullscreen" : input.tone;
323
- const button = createElement(
367
+ return createElement(
324
368
  "button",
325
369
  {
326
370
  "aria-label": input.label,
@@ -343,16 +387,6 @@ function createTrafficLightButton(input) {
343
387
  iconName
344
388
  })
345
389
  );
346
- return createElement(TooltipProvider, {
347
- children: createElement(
348
- Tooltip,
349
- null,
350
- createElement(TooltipTrigger, { asChild: true }, button),
351
- createElement(TooltipContent, { side: "bottom" }, input.label)
352
- ),
353
- delayDuration: 250,
354
- skipDelayDuration: 0
355
- });
356
390
  }
357
391
  function TrafficLightIcon({
358
392
  className,
@@ -407,6 +441,7 @@ var agentGuiWorkbenchDefaultCopy = {
407
441
  minimize: "Minimize",
408
442
  newConversation: "New conversation",
409
443
  nodeTitle: "Agent",
444
+ openDetachedWindow: "Open in detached window",
410
445
  restore: "Restore"
411
446
  };
412
447
  function createAgentGuiWorkbenchContribution(input) {
@@ -542,6 +577,15 @@ function createAgentGuiWorkbenchContribution(input) {
542
577
  },
543
578
  ...dragHandleProps,
544
579
  onCreateConversation: announceNewConversation,
580
+ onOpenDetachedWindow: input.onOpenDetachedWindow ? () => {
581
+ void input.onOpenDetachedWindow?.({
582
+ agentSessionId: workbenchState.lastActiveAgentSessionId,
583
+ agentTargetId: nodeState.agentTargetId,
584
+ providerTargets: input.providerTargets ?? void 0,
585
+ provider,
586
+ workspaceId: input.workspaceId
587
+ });
588
+ } : void 0,
545
589
  onPointerDown: (event) => {
546
590
  dragHandleProps.onPointerDown?.(event);
547
591
  if (!isFocused) {
@@ -1002,4 +1046,4 @@ export {
1002
1046
  resolveAgentGuiWorkbenchDefaultLaunchFrame,
1003
1047
  resolveAgentGuiWorkbenchContributionCopy
1004
1048
  };
1005
- //# sourceMappingURL=chunk-FRAG4UFU.js.map
1049
+ //# sourceMappingURL=chunk-Y3C5EHSW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.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\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","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\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,19 +4,19 @@ import {
4
4
  AgentMentionSearchController,
5
5
  flattenAgentMentionPaletteEntries,
6
6
  groupStartKeys
7
- } from "../chunk-S32FLJRP.js";
8
- import "../chunk-ERBUQOIL.js";
9
- import "../chunk-HAKNLXW7.js";
7
+ } from "../chunk-QDWV5VTD.js";
8
+ import "../chunk-DXENDZEF.js";
9
+ import "../chunk-MVPSFOJZ.js";
10
10
  import "../chunk-IBIMGLCD.js";
11
- import "../chunk-547R2HOD.js";
11
+ import "../chunk-IZX2YQXY.js";
12
12
  import "../chunk-Y35GDLP2.js";
13
13
  import "../chunk-LUGELG5V.js";
14
- import "../chunk-ZZBLWZJR.js";
14
+ import "../chunk-KS35VKHM.js";
15
15
  import "../chunk-4US2YHBY.js";
16
- import "../chunk-NH3XBJTZ.js";
16
+ import "../chunk-SC3PS7AT.js";
17
17
  import "../chunk-PJP5BUU6.js";
18
18
  import "../chunk-4I2VCAMW.js";
19
- import "../chunk-KAPBUKIT.js";
19
+ import "../chunk-DGNKXT3Q.js";
20
20
  import {
21
21
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
22
22
  } from "../chunk-JM24HADP.js";
@@ -621,63 +621,6 @@ declare const agentGuiI18nResources: {
621
621
  readonly handoffConversation: "Handoff";
622
622
  readonly handoffConversationTooltip: "Hand off to another agent";
623
623
  readonly handoffConversationMenu: "Choose an agent for handoff";
624
- readonly batchRunnerStandaloneTitle: "Agent GUI batch runner";
625
- readonly batchRunnerSubtitle: "Run JSONL prompt cases and review execution results";
626
- readonly batchRunnerPromptSource: "Case source";
627
- readonly batchRunnerSelectAgent: "Select Agent";
628
- readonly batchRunnerUploadFile: "Upload JSONL";
629
- readonly batchRunnerUseBuiltInFile: "Use built-in cases";
630
- readonly batchRunnerSelectFile: "Select JSONL";
631
- readonly batchRunnerProviderClaudeCode: "Claude Code";
632
- readonly batchRunnerProviderCodex: "Codex";
633
- readonly batchRunnerProviderHermes: "Hermes";
634
- readonly batchRunnerProviderNexight: "Nexight";
635
- readonly batchRunnerProviderOpenClaw: "OpenClaw";
636
- readonly batchRunnerProviderTuttiAgent: "Tutti Agent";
637
- readonly batchRunnerRun: "Run";
638
- readonly batchRunnerRunning: "Running...";
639
- readonly batchRunnerExport: "Export";
640
- readonly batchRunnerExporting: "Exporting...";
641
- readonly batchRunnerNoFile: "No JSONL selected";
642
- readonly batchRunnerLoadedFile: "{{file}} · {{count}} cases";
643
- readonly batchRunnerLoadedFileMeta: "{{count}} cases";
644
- readonly batchRunnerEmptyFile: "No prompt cases found.";
645
- readonly batchRunnerParseInvalidJson: "Line {{line}}: invalid JSON.";
646
- readonly batchRunnerParseObjectRequired: "Line {{line}}: each row must be a JSON object.";
647
- readonly batchRunnerParsePromptRequired: "Line {{line}}: prompt is required.";
648
- readonly batchRunnerLine: "Line";
649
- readonly batchRunnerAgent: "Agent";
650
- readonly batchRunnerCase: "Case";
651
- readonly batchRunnerStatus: "Status";
652
- readonly batchRunnerIssues: "Tasks";
653
- readonly batchRunnerSession: "Session";
654
- readonly batchRunnerSessionEmpty: "Select a case with a session to inspect its timeline.";
655
- readonly batchRunnerSessionLoading: "Loading";
656
- readonly batchRunnerSessionRefresh: "Refresh";
657
- readonly batchRunnerSessionBackToResults: "Back to results";
658
- readonly batchRunnerSessionRawJson: "Raw JSON";
659
- readonly batchRunnerSessionErrorCount: "{{count}} errors";
660
- readonly batchRunnerSessionToolFailureCount: "{{count}} tool failures";
661
- readonly batchRunnerStatus_pending: "Pending";
662
- readonly batchRunnerStatus_running: "Running";
663
- readonly batchRunnerStatus_completed: "Done";
664
- readonly batchRunnerStatus_failed: "Failed";
665
- readonly batchRunnerStatus_canceled: "Canceled";
666
- readonly batchRunnerStatus_blocked: "Blocked";
667
- readonly batchRunnerStatus_error: "Error";
668
- readonly batchRunnerProgress: "Progress";
669
- readonly batchRunnerTotalCases: "{{count}} cases";
670
- readonly batchRunnerIssueCases: "{{count}} tasks";
671
- readonly batchRunnerSearchPlaceholder: "Search cases";
672
- readonly batchRunnerAllStatuses: "All statuses";
673
- readonly batchRunnerActions: "Actions";
674
- readonly batchRunnerCopySession: "Copy session id";
675
- readonly batchRunnerOpenSession: "Open session";
676
- readonly batchRunnerNoResults: "No matching cases";
677
- readonly batchRunnerVisibleCount: "Total {{count}}";
678
- readonly batchRunnerPageIndicator: "Page {{page}} / {{total}}";
679
- readonly batchRunnerPageSize: "{{count}} / page";
680
- readonly batchRunnerExported: "Exported {{file}}";
681
624
  readonly startConversation: "Start session";
682
625
  readonly selectConversation: "Select a session";
683
626
  readonly loadingConversations: "Loading sessions...";
@@ -905,6 +848,7 @@ declare const agentGuiI18nResources: {
905
848
  readonly fileMentionEmpty: "Search workspace files based on your input";
906
849
  readonly fileMentionError: "Unable to search Files.";
907
850
  readonly fileMentionTabHint: "Tab switch category | ←→ enter/leave folder | ↑↓ switch selection";
851
+ readonly fileDropHint: "Drop files to add them to the session";
908
852
  readonly mentionPalette: "Mention context";
909
853
  readonly addReference: "Add reference";
910
854
  readonly addContent: "Add files and more";
@@ -3162,63 +3106,6 @@ declare const agentGuiI18nResources: {
3162
3106
  readonly handoffConversation: "Handoff";
3163
3107
  readonly handoffConversationTooltip: "交接给其他 Agent";
3164
3108
  readonly handoffConversationMenu: "选择要交接的 Agent";
3165
- readonly batchRunnerStandaloneTitle: "Agent GUI 批量执行面板";
3166
- readonly batchRunnerSubtitle: "批量执行 JSONL 用例,查看进度与执行结果";
3167
- readonly batchRunnerPromptSource: "用例来源";
3168
- readonly batchRunnerSelectAgent: "选择 Agent";
3169
- readonly batchRunnerUploadFile: "上传 JSONL";
3170
- readonly batchRunnerUseBuiltInFile: "使用内置用例";
3171
- readonly batchRunnerSelectFile: "选择 JSONL";
3172
- readonly batchRunnerProviderClaudeCode: "Claude Code";
3173
- readonly batchRunnerProviderCodex: "Codex";
3174
- readonly batchRunnerProviderHermes: "Hermes";
3175
- readonly batchRunnerProviderNexight: "Nexight";
3176
- readonly batchRunnerProviderOpenClaw: "OpenClaw";
3177
- readonly batchRunnerProviderTuttiAgent: "Tutti Agent";
3178
- readonly batchRunnerRun: "执行";
3179
- readonly batchRunnerRunning: "执行中...";
3180
- readonly batchRunnerExport: "导出";
3181
- readonly batchRunnerExporting: "导出中...";
3182
- readonly batchRunnerNoFile: "未选择 JSONL";
3183
- readonly batchRunnerLoadedFile: "{{file}} · {{count}} 条用例";
3184
- readonly batchRunnerLoadedFileMeta: "{{count}} 条用例";
3185
- readonly batchRunnerEmptyFile: "没有找到 prompt 用例。";
3186
- readonly batchRunnerParseInvalidJson: "第 {{line}} 行:JSON 无效。";
3187
- readonly batchRunnerParseObjectRequired: "第 {{line}} 行:每行必须是 JSON 对象。";
3188
- readonly batchRunnerParsePromptRequired: "第 {{line}} 行:缺少 prompt。";
3189
- readonly batchRunnerLine: "行号";
3190
- readonly batchRunnerAgent: "Agent";
3191
- readonly batchRunnerCase: "用例";
3192
- readonly batchRunnerStatus: "状态";
3193
- readonly batchRunnerIssues: "异常";
3194
- readonly batchRunnerSession: "Session";
3195
- readonly batchRunnerSessionEmpty: "选择带 Session 的用例后查看 timeline。";
3196
- readonly batchRunnerSessionLoading: "加载中";
3197
- readonly batchRunnerSessionRefresh: "刷新";
3198
- readonly batchRunnerSessionBackToResults: "返回结果";
3199
- readonly batchRunnerSessionRawJson: "Raw JSON";
3200
- readonly batchRunnerSessionErrorCount: "{{count}} 个错误";
3201
- readonly batchRunnerSessionToolFailureCount: "{{count}} 个工具失败";
3202
- readonly batchRunnerStatus_pending: "待执行";
3203
- readonly batchRunnerStatus_running: "执行中";
3204
- readonly batchRunnerStatus_completed: "完成";
3205
- readonly batchRunnerStatus_failed: "失败";
3206
- readonly batchRunnerStatus_canceled: "已取消";
3207
- readonly batchRunnerStatus_blocked: "阻塞";
3208
- readonly batchRunnerStatus_error: "错误";
3209
- readonly batchRunnerProgress: "整体进度";
3210
- readonly batchRunnerTotalCases: "共 {{count}} 条用例";
3211
- readonly batchRunnerIssueCases: "{{count}} 条异常";
3212
- readonly batchRunnerSearchPlaceholder: "搜索用例";
3213
- readonly batchRunnerAllStatuses: "全部状态";
3214
- readonly batchRunnerActions: "操作";
3215
- readonly batchRunnerCopySession: "复制 Session ID";
3216
- readonly batchRunnerOpenSession: "打开 Session";
3217
- readonly batchRunnerNoResults: "没有匹配的用例";
3218
- readonly batchRunnerVisibleCount: "总计 {{count}} 条";
3219
- readonly batchRunnerPageIndicator: "第 {{page}} / {{total}} 页";
3220
- readonly batchRunnerPageSize: "{{count}} 条/页";
3221
- readonly batchRunnerExported: "已导出 {{file}}";
3222
3109
  readonly startConversation: "开始会话";
3223
3110
  readonly selectConversation: "选择一个会话";
3224
3111
  readonly loadingConversations: "正在加载会话...";
@@ -3446,6 +3333,7 @@ declare const agentGuiI18nResources: {
3446
3333
  readonly fileMentionEmpty: "根据你输入的内容搜索工作区文件";
3447
3334
  readonly fileMentionError: "无法搜索工作区文件。";
3448
3335
  readonly fileMentionTabHint: "Tab 切换分类 | ←→ 进入/返回文件夹 | ↑↓ 切换选中";
3336
+ readonly fileDropHint: "拖放文件以添加到会话";
3449
3337
  readonly mentionPalette: "提及上下文";
3450
3338
  readonly addReference: "添加引用";
3451
3339
  readonly addContent: "添加文件等内容";
@@ -6,8 +6,8 @@ import {
6
6
  translate,
7
7
  translateInUiLanguage,
8
8
  useTranslation
9
- } from "../chunk-NH3XBJTZ.js";
10
- import "../chunk-KAPBUKIT.js";
9
+ } from "../chunk-SC3PS7AT.js";
10
+ import "../chunk-DGNKXT3Q.js";
11
11
  export {
12
12
  AgentGuiI18nProvider,
13
13
  agentGuiI18nModule,