@tutti-os/agent-gui 0.0.216 → 0.0.217

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 (70) hide show
  1. package/README.md +6 -0
  2. package/dist/{agentFileMentionContracts-BeBex-Sf.d.ts → AgentMentionSearchContracts-y1_u9cPi.d.ts} +73 -1
  3. package/dist/{AgentRichTextReadonly-IPPNAAWG.js → AgentRichTextReadonly-WZHUIARR.js} +7 -7
  4. package/dist/agent-conversation/index.js +9 -9
  5. package/dist/agent-gui.d.ts +16 -3
  6. package/dist/agent-gui.js +23 -22
  7. package/dist/agent-message-center/index.js +6 -6
  8. package/dist/app/renderer/agentactivity.css +93 -69
  9. package/dist/{chunk-VMPPZO5C.js → chunk-2QF3RBR4.js} +4 -4
  10. package/dist/{chunk-DTP2OMCE.js → chunk-44OCOBJS.js} +9 -11
  11. package/dist/chunk-44OCOBJS.js.map +1 -0
  12. package/dist/chunk-6GX57XB5.js +135 -0
  13. package/dist/chunk-6GX57XB5.js.map +1 -0
  14. package/dist/{chunk-EZRQMJTX.js → chunk-FS7EMOVD.js} +4 -4
  15. package/dist/{chunk-6A6OVD66.js → chunk-G2KRK7Z5.js} +44 -18
  16. package/dist/chunk-G2KRK7Z5.js.map +1 -0
  17. package/dist/{chunk-YY5WM3OE.js → chunk-GDLM6FLK.js} +90 -47
  18. package/dist/chunk-GDLM6FLK.js.map +1 -0
  19. package/dist/{chunk-UERICUWM.js → chunk-GLVENTN6.js} +2 -2
  20. package/dist/{chunk-B4TM2HYJ.js → chunk-JQOQETPN.js} +5 -5
  21. package/dist/{chunk-QFYOJMEQ.js → chunk-M6WEFXPL.js} +2 -2
  22. package/dist/{chunk-AOK22J62.js → chunk-N2M4B3G3.js} +2 -2
  23. package/dist/{chunk-DLN33TPF.js → chunk-NXQGAXIE.js} +8 -8
  24. package/dist/{chunk-MOCBHFJ2.js → chunk-O4QFGCLU.js} +42 -118
  25. package/dist/chunk-O4QFGCLU.js.map +1 -0
  26. package/dist/{chunk-Z5UJC4Q3.js → chunk-PPAV2TB4.js} +3 -3
  27. package/dist/{chunk-4CHBM3G3.js → chunk-SUVMLCED.js} +5 -5
  28. package/dist/{chunk-KJA3HHUJ.js → chunk-TKECUCUW.js} +529 -291
  29. package/dist/chunk-TKECUCUW.js.map +1 -0
  30. package/dist/{chunk-P2RIZAK5.js → chunk-ZXEICU6J.js} +3 -1
  31. package/dist/chunk-ZXEICU6J.js.map +1 -0
  32. package/dist/context-mention-palette/index.d.ts +3 -3
  33. package/dist/context-mention-palette/index.js +12 -12
  34. package/dist/headerLayout-CP4ujEbo.d.ts +14 -0
  35. package/dist/i18n/index.d.ts +2 -0
  36. package/dist/i18n/index.js +2 -2
  37. package/dist/index.d.ts +77 -46
  38. package/dist/index.js +46 -39
  39. package/dist/index.js.map +1 -1
  40. package/dist/layout.d.ts +7 -0
  41. package/dist/layout.js +9 -0
  42. package/dist/layout.js.map +1 -0
  43. package/dist/mention-search.d.ts +6 -73
  44. package/dist/mention-search.js +8 -8
  45. package/dist/workbench/browser-element-context/index.js +2 -2
  46. package/dist/workbench/contribution.js +7 -6
  47. package/dist/workbench/index.d.ts +3 -1
  48. package/dist/workbench/index.js +10 -9
  49. package/dist/workbench/launch.js +2 -2
  50. package/dist/workbench/sessionTitle.js +2 -2
  51. package/dist/workbench/tool-sidebar/index.d.ts +14 -13
  52. package/dist/workbench/tool-sidebar/index.js +66 -55
  53. package/dist/workbench/tool-sidebar/index.js.map +1 -1
  54. package/package.json +23 -16
  55. package/dist/chunk-6A6OVD66.js.map +0 -1
  56. package/dist/chunk-DTP2OMCE.js.map +0 -1
  57. package/dist/chunk-KJA3HHUJ.js.map +0 -1
  58. package/dist/chunk-MOCBHFJ2.js.map +0 -1
  59. package/dist/chunk-P2RIZAK5.js.map +0 -1
  60. package/dist/chunk-YY5WM3OE.js.map +0 -1
  61. /package/dist/{AgentRichTextReadonly-IPPNAAWG.js.map → AgentRichTextReadonly-WZHUIARR.js.map} +0 -0
  62. /package/dist/{chunk-VMPPZO5C.js.map → chunk-2QF3RBR4.js.map} +0 -0
  63. /package/dist/{chunk-EZRQMJTX.js.map → chunk-FS7EMOVD.js.map} +0 -0
  64. /package/dist/{chunk-UERICUWM.js.map → chunk-GLVENTN6.js.map} +0 -0
  65. /package/dist/{chunk-B4TM2HYJ.js.map → chunk-JQOQETPN.js.map} +0 -0
  66. /package/dist/{chunk-QFYOJMEQ.js.map → chunk-M6WEFXPL.js.map} +0 -0
  67. /package/dist/{chunk-AOK22J62.js.map → chunk-N2M4B3G3.js.map} +0 -0
  68. /package/dist/{chunk-DLN33TPF.js.map → chunk-NXQGAXIE.js.map} +0 -0
  69. /package/dist/{chunk-Z5UJC4Q3.js.map → chunk-PPAV2TB4.js.map} +0 -0
  70. /package/dist/{chunk-4CHBM3G3.js.map → chunk-SUVMLCED.js.map} +0 -0
@@ -1,3 +1,9 @@
1
+ import {
2
+ cn,
3
+ readParsedDocumentCache,
4
+ resolveAgentTargetPresentation,
5
+ useAgentTargetPresentations
6
+ } from "./chunk-LQMIEH4C.js";
1
7
  import {
2
8
  AGENT_RICH_TEXT_CARET_ANCHOR,
3
9
  AgentMentionReadonlyView,
@@ -6,13 +12,7 @@ import {
6
12
  formatAgentMentionMarkdown,
7
13
  mentionItemToAttrs,
8
14
  parseAgentMentionMarkdown
9
- } from "./chunk-B4TM2HYJ.js";
10
- import {
11
- cn,
12
- readParsedDocumentCache,
13
- resolveAgentTargetPresentation,
14
- useAgentTargetPresentations
15
- } from "./chunk-LQMIEH4C.js";
15
+ } from "./chunk-JQOQETPN.js";
16
16
 
17
17
  // shared/AgentRichTextReadonly.tsx
18
18
  import { useMemo } from "react";
@@ -747,4 +747,4 @@ export {
747
747
  agentRichTextContentToPromptText,
748
748
  AgentRichTextReadonly
749
749
  };
750
- //# sourceMappingURL=chunk-DLN33TPF.js.map
750
+ //# sourceMappingURL=chunk-NXQGAXIE.js.map
@@ -3,7 +3,7 @@ import {
3
3
  resolveAgentGUIConversationTitleDisplayPrompt,
4
4
  resolveAgentGuiWorkbenchHeaderTitle,
5
5
  resolveAgentGuiWorkbenchSessionTitle
6
- } from "./chunk-VMPPZO5C.js";
6
+ } from "./chunk-2QF3RBR4.js";
7
7
  import {
8
8
  createAgentGuiWorkbenchNodeStateSource,
9
9
  migrateLegacyAgentGuiWorkbenchState,
@@ -15,11 +15,14 @@ import {
15
15
  agentGuiWorkbenchTypeId,
16
16
  agentGuiWorkbenchUnifiedDockEntryId,
17
17
  createAgentGuiWorkbenchLaunchDescriptor
18
- } from "./chunk-4CHBM3G3.js";
18
+ } from "./chunk-SUVMLCED.js";
19
19
  import {
20
20
  agentGuiWorkbenchDefaultDockProviders,
21
21
  isAgentGuiWorkbenchProvider
22
22
  } from "./chunk-MGSRWYRN.js";
23
+ import {
24
+ useEngineSelector
25
+ } from "./chunk-EVQ4JY3N.js";
23
26
  import {
24
27
  normalizeAgentGUIAgents,
25
28
  projectAgentGUIAgentsToTargets
@@ -28,8 +31,10 @@ import {
28
31
  agentGuiDockIconUrls
29
32
  } from "./chunk-G7DS23D4.js";
30
33
  import {
31
- useEngineSelector
32
- } from "./chunk-EVQ4JY3N.js";
34
+ AGENT_GUI_PROVIDER_RAIL_WIDTH_PX,
35
+ resolveAgentGUIConversationRailPresentation,
36
+ resolveAgentGUIExpandedWindowFrame
37
+ } from "./chunk-6GX57XB5.js";
33
38
  import {
34
39
  normalizeManagedAgentProvider
35
40
  } from "./chunk-AFUVWWQY.js";
@@ -43,88 +48,6 @@ import {
43
48
  // workbench/contribution.ts
44
49
  import { createElement as createElement3 } from "react";
45
50
 
46
- // agent-gui/agentGuiNode/model/agentGuiRailLayout.ts
47
- function clamp(value, min, max) {
48
- return Math.min(max, Math.max(min, value));
49
- }
50
- var AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;
51
- var AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;
52
- var AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;
53
- var AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;
54
- var AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX = 320;
55
- var AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;
56
- var AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;
57
- var AGENT_GUI_EXPANDED_MIN_WIDTH_PX = AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
58
- var AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;
59
- var AGENT_GUI_STANDALONE_AUTO_COLLAPSE_WIDTH_PX = AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX + AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX + 52;
60
- var AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;
61
- function shouldAutoCollapseAgentGUIConversationRail(containerWidthPx, autoCollapseWidthPx = AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX) {
62
- return Number.isFinite(containerWidthPx) && containerWidthPx > 0 && containerWidthPx <= autoCollapseWidthPx;
63
- }
64
- function resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx) {
65
- const safeContainerWidth = Number.isFinite(containerWidthPx) && containerWidthPx > 0 ? containerWidthPx : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
66
- return Math.max(
67
- AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
68
- Math.min(
69
- AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,
70
- safeContainerWidth - AGENT_GUI_DETAIL_MIN_WIDTH_PX - AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
71
- )
72
- );
73
- }
74
- function clampAgentGUIConversationRailWidthPx(widthPx, containerWidthPx) {
75
- const preferredWidthPx = typeof widthPx === "number" && Number.isFinite(widthPx) ? Math.round(widthPx) : null;
76
- return clamp(
77
- preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,
78
- AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
79
- resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)
80
- );
81
- }
82
- function resolveNextAgentGUIConversationRailWidthPx(input) {
83
- const nextWidthPx = clampAgentGUIConversationRailWidthPx(
84
- input.requestedWidthPx,
85
- input.containerWidthPx
86
- );
87
- if (input.currentWidthPx === nextWidthPx) {
88
- return input.currentWidthPx;
89
- }
90
- if (input.currentWidthPx === null || input.currentWidthPx === void 0) {
91
- const defaultWidthPx = clampAgentGUIConversationRailWidthPx(
92
- null,
93
- input.containerWidthPx
94
- );
95
- if (nextWidthPx === defaultWidthPx) {
96
- return null;
97
- }
98
- }
99
- return nextWidthPx;
100
- }
101
- function resolveAgentGUIExpandedWindowFrame(input) {
102
- const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(
103
- input.conversationRailWidthPx,
104
- AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
105
- );
106
- const desiredWidthPx = Math.max(
107
- Math.round(input.width),
108
- desiredRailWidthPx + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,
109
- AGENT_GUI_EXPANDED_MIN_WIDTH_PX,
110
- AGENT_GUI_EXPANDED_TARGET_WIDTH_PX
111
- );
112
- const desktopWidthPx = Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0 ? Math.round(input.desktopSize.width) : desiredWidthPx;
113
- const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);
114
- const maxX = Math.max(0, desktopWidthPx - nextWidthPx);
115
- const nextX = clamp(Math.round(input.position.x), 0, maxX);
116
- return {
117
- position: {
118
- x: nextX,
119
- y: input.position.y
120
- },
121
- size: {
122
- width: nextWidthPx,
123
- height: input.height
124
- }
125
- };
126
- }
127
-
128
51
  // workbench/AgentGuiWorkbenchReactiveHeader.tsx
129
52
  import { useMemo } from "react";
130
53
 
@@ -399,7 +322,7 @@ function stopPointerPropagation(event) {
399
322
 
400
323
  // workbench/header.ts
401
324
  var LazyAgentRichTextReadonly = lazy(
402
- () => import("./AgentRichTextReadonly-IPPNAAWG.js").then((module) => ({
325
+ () => import("./AgentRichTextReadonly-WZHUIARR.js").then((module) => ({
403
326
  default: module.AgentRichTextReadonly
404
327
  }))
405
328
  );
@@ -422,6 +345,7 @@ function AgentGuiWorkbenchHeader({
422
345
  providerRailWidthPx,
423
346
  primaryAccessory,
424
347
  secondaryAccessory,
348
+ toolSidebar,
425
349
  sessionMenuAdditionalActions,
426
350
  sessionMenuActions,
427
351
  conversationTitle,
@@ -449,6 +373,7 @@ function AgentGuiWorkbenchHeader({
449
373
  const hasExpandedIdentity = Boolean(
450
374
  collapsedTitle || sessionIconUrl || sessionIconFallbackUrl
451
375
  );
376
+ const resolvedSecondaryAccessory = toolSidebar?.actions ?? secondaryAccessory;
452
377
  const sessionMenu = onSessionAction && copy.sessionMenu && sessionTitle && !hasBodyRenderError ? createElement(AgentGuiWorkbenchSessionMenu, {
453
378
  actions: sessionMenuActions,
454
379
  additionalActions: sessionMenuAdditionalActions,
@@ -468,6 +393,12 @@ function AgentGuiWorkbenchHeader({
468
393
  "--agent-gui-workbench-header-rail-width": `${Math.round(
469
394
  conversationRailWidthPx + (typeof providerRailWidthPx === "number" && Number.isFinite(providerRailWidthPx) ? providerRailWidthPx : 0)
470
395
  )}px`
396
+ } : {},
397
+ ...toolSidebar ? {
398
+ "--agent-gui-tool-sidebar-layout-width": `${Math.max(
399
+ 0,
400
+ Math.round(toolSidebar.layoutWidthPx)
401
+ )}px`
471
402
  } : {}
472
403
  };
473
404
  return createElement(
@@ -479,6 +410,7 @@ function AgentGuiWorkbenchHeader({
479
410
  "data-agent-gui-workbench-header-body-error": hasBodyRenderError ? "true" : "false",
480
411
  "data-agent-gui-workbench-header-collapsed": isConversationRailCollapsed ? "true" : "false",
481
412
  "data-agent-gui-workbench-header-has-session": sessionTitle ? "true" : "false",
413
+ "data-agent-gui-workbench-header-tool-sidebar": toolSidebar ? "true" : "false",
482
414
  style: headerStyle
483
415
  },
484
416
  createElement(
@@ -567,15 +499,15 @@ function AgentGuiWorkbenchHeader({
567
499
  ),
568
500
  sessionMenu
569
501
  ) : null,
570
- isConversationRailCollapsed && secondaryAccessory ? createElement(
502
+ isConversationRailCollapsed && resolvedSecondaryAccessory ? createElement(
571
503
  "div",
572
504
  {
573
505
  className: "agent-gui-workbench-header__secondary-accessory"
574
506
  },
575
- secondaryAccessory
507
+ resolvedSecondaryAccessory
576
508
  ) : null
577
509
  ),
578
- !isConversationRailCollapsed && (hasExpandedIdentity || secondaryAccessory) ? createElement(
510
+ !isConversationRailCollapsed && (hasExpandedIdentity || resolvedSecondaryAccessory) ? createElement(
579
511
  "div",
580
512
  {
581
513
  className: "agent-gui-workbench-header__detail"
@@ -616,12 +548,12 @@ function AgentGuiWorkbenchHeader({
616
548
  ) : null,
617
549
  sessionMenu
618
550
  ) : null,
619
- secondaryAccessory ? createElement(
551
+ resolvedSecondaryAccessory ? createElement(
620
552
  "div",
621
553
  {
622
554
  className: "agent-gui-workbench-header__secondary-accessory"
623
555
  },
624
- secondaryAccessory
556
+ resolvedSecondaryAccessory
625
557
  ) : null
626
558
  ) : null
627
559
  );
@@ -924,7 +856,7 @@ var agentGuiWorkbenchDefaultUsableWidthRatio = 0.9;
924
856
  var agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;
925
857
  var agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;
926
858
  var agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };
927
- var agentGuiWorkbenchProviderRailWidthPx = 52;
859
+ var agentGuiWorkbenchProviderRailWidthPx = AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;
928
860
  var agentGuiWorkbenchUnifiedDockTileProviders = [
929
861
  "codex",
930
862
  "claude-code",
@@ -1240,16 +1172,15 @@ function createAgentGuiWorkbenchContribution(input) {
1240
1172
  const workbenchState = normalizeAgentGuiWorkbenchState(
1241
1173
  migrateLegacyAgentGuiWorkbenchState(rawWorkbenchState)
1242
1174
  );
1243
- const isAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(
1244
- context.node.frame.width
1245
- );
1246
- if (workbenchState.conversationRailCollapsed === true || isAutoCollapsed) {
1175
+ const railPresentation = resolveAgentGUIConversationRailPresentation({
1176
+ containerWidthPx: context.node.frame.width,
1177
+ conversationRailCollapsed: workbenchState.conversationRailCollapsed,
1178
+ conversationRailWidthPx: workbenchState.conversationRailWidthPx
1179
+ });
1180
+ if (railPresentation.isCollapsed) {
1247
1181
  return "collapsed";
1248
1182
  }
1249
- return `expanded:${clampAgentGUIConversationRailWidthPx(
1250
- workbenchState.conversationRailWidthPx,
1251
- context.node.frame.width
1252
- )}`;
1183
+ return `expanded:${railPresentation.conversationRailWidthPx}`;
1253
1184
  },
1254
1185
  instance: { mode: "multi" },
1255
1186
  onBodyRenderErrorChange: ({ hasError, node }) => {
@@ -1310,12 +1241,14 @@ function createAgentGuiWorkbenchContribution(input) {
1310
1241
  migratedWorkbenchState,
1311
1242
  provider
1312
1243
  );
1313
- const isConversationRailAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(node.frame.width);
1314
- const isConversationRailCollapsed = nodeState.conversationRailCollapsed === true || isConversationRailAutoCollapsed;
1315
- const conversationRailWidthPx = clampAgentGUIConversationRailWidthPx(
1316
- nodeState.conversationRailWidthPx,
1317
- node.frame.width
1318
- );
1244
+ const railPresentation = resolveAgentGUIConversationRailPresentation({
1245
+ containerWidthPx: node.frame.width,
1246
+ conversationRailCollapsed: nodeState.conversationRailCollapsed,
1247
+ conversationRailWidthPx: nodeState.conversationRailWidthPx
1248
+ });
1249
+ const isConversationRailAutoCollapsed = railPresentation.isAutoCollapsed;
1250
+ const isConversationRailCollapsed = railPresentation.isCollapsed;
1251
+ const conversationRailWidthPx = railPresentation.conversationRailWidthPx;
1319
1252
  const conversationIdentity = input.sessionEngine ? null : input.resolveDockPopupIdentity?.(workbenchState) ?? null;
1320
1253
  const conversationTitle = input.sessionEngine ? null : conversationIdentity?.title ?? input.resolveDockPopupTitle?.(workbenchState) ?? null;
1321
1254
  const hasConversation = Boolean(
@@ -1443,6 +1376,7 @@ function createAgentGuiWorkbenchContribution(input) {
1443
1376
  closable: true,
1444
1377
  defaultOpen: false,
1445
1378
  header: {
1379
+ border: "none",
1446
1380
  layout: "overlay"
1447
1381
  },
1448
1382
  minimizedDock: { kind: "snapshot" },
@@ -1568,16 +1502,6 @@ function hasAgentSessionId2(payload) {
1568
1502
 
1569
1503
  export {
1570
1504
  resolveAgentGuiSessionProviderFlatIconUrl,
1571
- AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
1572
- AGENT_GUI_DETAIL_MIN_WIDTH_PX,
1573
- AGENT_GUI_COLLAPSED_MIN_WIDTH_PX,
1574
- AGENT_GUI_STANDALONE_AUTO_COLLAPSE_WIDTH_PX,
1575
- AGENT_GUI_EXPANDED_TARGET_WIDTH_PX,
1576
- shouldAutoCollapseAgentGUIConversationRail,
1577
- resolveAgentGUIConversationRailMaxWidthPx,
1578
- clampAgentGUIConversationRailWidthPx,
1579
- resolveNextAgentGUIConversationRailWidthPx,
1580
- resolveAgentGUIExpandedWindowFrame,
1581
1505
  resolveAgentGuiWorkbenchConversationIdentity,
1582
1506
  agentGuiWorkbenchConversationIdentitiesEqual,
1583
1507
  AgentGuiWorkbenchHeader,
@@ -1600,4 +1524,4 @@ export {
1600
1524
  AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT,
1601
1525
  createAgentGuiWorkbenchContribution
1602
1526
  };
1603
- //# sourceMappingURL=chunk-MOCBHFJ2.js.map
1527
+ //# sourceMappingURL=chunk-O4QFGCLU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.ts","../workbench/AgentGuiWorkbenchReactiveHeader.tsx","../workbench/conversationIdentity.ts","../agentGuiSessionProviderIconUrls.ts","../workbench/header.ts","../app/renderer/assets/icons/open-link-lined.svg","../workbench/bodyRenderErrorRegistry.ts","../workbench/AgentGuiWorkbenchSessionMenu.tsx","../workbench/sessionActions.ts","../workbench/contributionDock.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport {\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n resolveAgentGUIConversationRailPresentation,\n resolveAgentGUIExpandedWindowFrame\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { AgentGuiWorkbenchReactiveHeader } from \"./AgentGuiWorkbenchReactiveHeader.tsx\";\nimport { setAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\nimport {\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n createAgentGuiWorkbenchNodeStateSource,\n migrateLegacyAgentGuiWorkbenchState,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport type {\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport type { AgentGUIAgentDirectoryPort } from \"../types.ts\";\nimport {\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n dispatchAgentGuiWorkbenchSessionAction,\n isAgentGuiWorkbenchSessionAction\n} from \"./sessionActions.ts\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionActionDetail,\n AgentGuiWorkbenchSessionActionRequest,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"tutti:agent-gui-workbench-conversation-rail-toggle\";\n\nexport const AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT =\n \"tutti:agent-gui-workbench-new-conversation\";\n\n/**\n * Fired when the empty-hero \"Import session\" suggestion is chosen. The host\n * chrome (which owns the external-agent import wizard state) listens for this\n * and opens the wizard.\n */\nexport const AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT =\n \"tutti:agent-gui-workbench-open-external-import\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport {\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n dispatchAgentGuiWorkbenchSessionAction,\n isAgentGuiWorkbenchSessionAction\n};\nexport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionActionDetail,\n AgentGuiWorkbenchSessionActionRequest,\n AgentGuiWorkbenchSessionMenuCopy\n};\n\nexport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\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 untitledConversation: string;\n sessionMenu?: AgentGuiWorkbenchSessionMenuCopy | null;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n agentDirectory: AgentGUIAgentDirectoryPort;\n agentTargetId: string | null;\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider | null;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n agentDirectory: AgentGUIAgentDirectoryPort;\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n renderBody(\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 sessionEngine?: AgentSessionEngine;\n onOpenDetachedWindow?: (input: {\n agentSessionId?: string | null;\n agentTargetId?: string | null;\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 agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n dockIconUrls: input.dockIconUrls,\n label: copy.nodeTitle,\n providerAvailability: input.providerAvailability,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n unifiedDockIconUrl: input.unifiedDockIconUrl\n }),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n getHeaderFrameRenderKey: (context) => {\n if (context.isDragging) {\n return \"dragging\";\n }\n const rawWorkbenchState = (context.externalNodeState ??\n context.node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const workbenchState = normalizeAgentGuiWorkbenchState(\n migrateLegacyAgentGuiWorkbenchState(rawWorkbenchState)\n );\n const railPresentation = resolveAgentGUIConversationRailPresentation({\n containerWidthPx: context.node.frame.width,\n conversationRailCollapsed: workbenchState.conversationRailCollapsed,\n conversationRailWidthPx: workbenchState.conversationRailWidthPx\n });\n if (railPresentation.isCollapsed) {\n return \"collapsed\";\n }\n return `expanded:${railPresentation.conversationRailWidthPx}`;\n },\n instance: { mode: \"multi\" },\n onBodyRenderErrorChange: ({ hasError, node }) => {\n setAgentGuiWorkbenchBodyRenderError(node.id, hasError);\n },\n renderBody: (context) => {\n const persistedState = normalizeAgentGuiWorkbenchState(\n context.externalNodeState ?? context.node?.data.snapshotNodeState\n );\n const activationAgentTargetId = agentTargetIdFromActivation(\n context.activation\n );\n const state =\n activationAgentTargetId && !persistedState.agentTargetId\n ? { ...persistedState, agentTargetId: activationAgentTargetId }\n : persistedState;\n const agent = resolveAgentGuiWorkbenchStateAgent(\n state,\n input.agentDirectory\n );\n return input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n agentDirectory: input.agentDirectory,\n agentTargetId: state.agentTargetId ?? null,\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (nextState) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state: nextState,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agent?.provider ?? null\n }\n );\n },\n renderHeader: ({\n dragHandleProps,\n displayMode,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const headerTitle = copy.nodeTitle;\n const rawWorkbenchState = (externalNodeState ??\n node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const migratedWorkbenchState =\n migrateLegacyAgentGuiWorkbenchState(rawWorkbenchState);\n const workbenchState = normalizeAgentGuiWorkbenchState(\n migratedWorkbenchState\n );\n const selectedAgent = resolveAgentGuiWorkbenchStateAgent(\n workbenchState,\n input.agentDirectory\n );\n const provider = selectedAgent?.provider ?? \"unknown\";\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n migratedWorkbenchState,\n provider\n );\n const railPresentation = resolveAgentGUIConversationRailPresentation({\n containerWidthPx: node.frame.width,\n conversationRailCollapsed: nodeState.conversationRailCollapsed,\n conversationRailWidthPx: nodeState.conversationRailWidthPx\n });\n const isConversationRailAutoCollapsed =\n railPresentation.isAutoCollapsed;\n const isConversationRailCollapsed = railPresentation.isCollapsed;\n const conversationRailWidthPx =\n railPresentation.conversationRailWidthPx;\n const conversationIdentity = input.sessionEngine\n ? null\n : (input.resolveDockPopupIdentity?.(workbenchState) ?? null);\n const conversationTitle = input.sessionEngine\n ? null\n : (conversationIdentity?.title ??\n input.resolveDockPopupTitle?.(workbenchState) ??\n null);\n const hasConversation = Boolean(\n workbenchState.lastActiveAgentSessionId?.trim()\n );\n const conversationIconFallbackUrl = selectedAgent?.iconUrl ?? 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 const announceSessionAction = (\n action: AgentGuiWorkbenchSessionAction\n ) => {\n dispatchAgentGuiWorkbenchSessionAction({\n action,\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n instanceId\n });\n };\n\n const headerProps = {\n copy,\n conversationIconFallbackUrl,\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 onSessionAction: announceSessionAction,\n onOpenDetachedWindow: input.onOpenDetachedWindow\n ? selectedAgent\n ? () => {\n void input.onOpenDetachedWindow?.({\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n agentTargetId: selectedAgent.agentTargetId,\n provider: selectedAgent.provider,\n workspaceId: input.workspaceId\n });\n }\n : undefined\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 currentFrame = windowActions.getFrame();\n const expandedFrame = resolveAgentGUIExpandedWindowFrame({\n conversationRailWidthPx: nodeState.conversationRailWidthPx,\n desktopSize: surfaceSize,\n height: currentFrame.height,\n position: {\n x: currentFrame.x,\n y: currentFrame.y\n },\n width: currentFrame.width\n });\n\n windowActions.resize({\n ...currentFrame,\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 } satisfies AgentGuiWorkbenchHeaderProps;\n return input.sessionEngine\n ? createElement(AgentGuiWorkbenchReactiveHeader, {\n ...headerProps,\n agentDirectory: input.agentDirectory,\n dockIconUrls: input.dockIconUrls,\n sessionEngine: input.sessionEngine,\n workbenchState\n })\n : createElement(AgentGuiWorkbenchHeader, {\n ...headerProps,\n agentTitle: conversationIdentity?.agentTitle,\n conversationIconUrl,\n conversationTitle,\n hasConversation\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n header: {\n border: \"none\",\n layout: \"overlay\"\n },\n minimizedDock: { kind: \"snapshot\" },\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 agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (\n !hasAgentSessionId(launchPayload) &&\n !providerTargetLaunchPayloadFromRequest(\n launchPayload,\n providerFromState(launchPayload) ?? \"codex\"\n ).agentTargetId\n ) {\n return null;\n }\n if (!providerFromState(launchPayload)) {\n return null;\n }\n const {\n activation,\n dockEntryId,\n instanceId: descriptorInstanceId,\n openInNewWindow,\n provider,\n reusePolicy,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor({\n ...request,\n payload: launchPayload\n });\n const providerTarget = providerTargetLaunchPayloadFromRequest(\n launchPayload,\n provider\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 reusePolicy.kind === \"current-session\"\n ? nodeStateSource.findInstanceIdByAgentSessionId(\n reusePolicy.agentSessionId\n )\n : null;\n const instanceId = existingInstanceId ?? descriptorInstanceId;\n const title = copy.nodeTitle;\n const launchAgentTargetId = providerTarget.agentTargetId;\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 (providerTarget.agentTargetId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n lastActiveAgentSessionId: null,\n agentTargetId: providerTarget.agentTargetId\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: reusePolicy.kind === \"dock-entry\",\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nfunction resolveAgentGuiWorkbenchStateAgent(\n state: AgentGuiWorkbenchState | null,\n directory: AgentGUIAgentDirectoryPort\n) {\n const agentTargetId = state?.agentTargetId?.trim();\n if (!agentTargetId) {\n return null;\n }\n return (\n directory\n .getSnapshot()\n .agents.find((agent) => agent.agentTargetId === agentTargetId) ?? null\n );\n}\n\nfunction agentTargetIdFromActivation(activation: unknown): string | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n return typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null;\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return false;\n }\n return (\n typeof (payload as { agentSessionId?: unknown }).agentSessionId ===\n \"string\" &&\n (payload as { agentSessionId: string }).agentSessionId.trim().length > 0\n );\n}\n\nimport {\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n isAgentGuiWorkbenchCompactVisibleFrame,\n providerFromState,\n providerTargetLaunchPayloadFromRequest,\n resolveAgentGuiWorkbenchLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nimport type { AgentGuiWorkbenchProviderAvailability } from \"./contributionDock.tsx\";\nexport {\n agentGuiWorkbenchCompactVisibleAreaRatio,\n agentGuiWorkbenchDefaultCopy,\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchDefaultUsableHeightRatio,\n agentGuiWorkbenchDefaultUsableWidthRatio,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n resolveAgentGuiUnifiedDockLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nexport type {\n AgentGuiWorkbenchProviderAvailability,\n BuildAgentGuiDockEntriesInput\n} from \"./contributionDock.tsx\";\n","import { useMemo, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentDirectorySnapshot\n} from \"../types.ts\";\nimport { useEngineSelector } from \"../shared/engine/useEngineSelector.ts\";\nimport {\n agentGuiWorkbenchConversationIdentitiesEqual,\n resolveAgentGuiWorkbenchConversationIdentity\n} from \"./conversationIdentity.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\ninterface AgentGuiWorkbenchReactiveHeaderProps extends Omit<\n AgentGuiWorkbenchHeaderProps,\n | \"agentTitle\"\n | \"conversationIconUrl\"\n | \"conversationTitle\"\n | \"conversationTitleDisplayPrompt\"\n | \"hasConversation\"\n> {\n agentDirectory: AgentGUIAgentDirectoryPort;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n sessionEngine: AgentSessionEngine;\n workbenchState: AgentGuiWorkbenchState | null;\n}\n\nexport function AgentGuiWorkbenchReactiveHeader({\n agentDirectory,\n dockIconUrls,\n sessionEngine,\n workbenchState,\n ...headerProps\n}: AgentGuiWorkbenchReactiveHeaderProps): ReactNode {\n const directoryStore = useMemo(\n () => ({\n getSnapshot: () => agentDirectory.getSnapshot(),\n subscribe: (\n listener: (snapshot: AgentGUIAgentDirectorySnapshot) => void\n ) =>\n agentDirectory.subscribe(() => {\n listener(agentDirectory.getSnapshot());\n })\n }),\n [agentDirectory]\n );\n const agents = useEngineSelector(\n directoryStore,\n (snapshot) => snapshot.agents,\n Object.is\n );\n const conversationIdentity = useEngineSelector(\n sessionEngine,\n (engineState) =>\n resolveAgentGuiWorkbenchConversationIdentity({\n agents,\n dockIconUrls,\n engineState,\n workbenchState\n }),\n agentGuiWorkbenchConversationIdentitiesEqual\n );\n\n return (\n <AgentGuiWorkbenchHeader\n {...headerProps}\n agentTitle={conversationIdentity?.agentTitle}\n conversationIconUrl={\n conversationIdentity?.iconUrl ?? headerProps.conversationIconFallbackUrl\n }\n conversationTitle={conversationIdentity?.title}\n conversationTitleDisplayPrompt={conversationIdentity?.titleDisplayPrompt}\n hasConversation={Boolean(\n workbenchState?.lastActiveAgentSessionId?.trim()\n )}\n />\n );\n}\n","import {\n isPendingActivationViable,\n selectLatestActivationForSession,\n selectSessionMessages,\n selectWorkspaceAgentConsumerSession,\n type AgentActivityMessage,\n type AgentPromptContentBlock,\n type AgentSessionEngineState\n} from \"@tutti-os/agent-activity-core\";\nimport { resolveAgentGuiSessionProviderIconUrl } from \"../agentGuiSessionProviderIconUrls.ts\";\nimport {\n resolveAgentGUIConversationBrowserFreeTitle,\n resolveAgentGUIConversationTitleDisplayPrompt\n} from \"../shared/agentConversationTitleProjection.ts\";\nimport type { AgentGUIAgent } from \"../types.ts\";\nimport { isAgentGuiWorkbenchProvider } from \"./providerCatalog.ts\";\nimport {\n resolveAgentGuiWorkbenchHeaderTitle,\n resolveAgentGuiWorkbenchSessionTitle\n} from \"./sessionTitle.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\nexport interface AgentGuiWorkbenchConversationIdentity {\n agentTitle?: string | null;\n iconUrl?: string | null;\n title: string | null;\n titleDisplayPrompt?: string | null;\n}\n\nexport function resolveAgentGuiWorkbenchConversationIdentity(input: {\n agents: readonly AgentGUIAgent[];\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n engineState: AgentSessionEngineState;\n workbenchState: AgentGuiWorkbenchState | null;\n}): AgentGuiWorkbenchConversationIdentity | null {\n const agentSessionId =\n input.workbenchState?.lastActiveAgentSessionId?.trim() ?? \"\";\n if (!agentSessionId) {\n return null;\n }\n\n const session = selectWorkspaceAgentConsumerSession(\n input.engineState,\n agentSessionId\n )?.session;\n const activation = selectLatestActivationForSession(\n input.engineState,\n agentSessionId\n );\n const optimisticTitle =\n activation?.mode === \"new\" && isPendingActivationViable(activation)\n ? activation.optimisticTitle\n : null;\n const agentTargetId =\n session?.agentTargetId ?? input.workbenchState?.agentTargetId ?? null;\n const agent = agentTargetId\n ? (input.agents.find(\n (candidate) => candidate.agentTargetId === agentTargetId\n ) ?? null)\n : null;\n const provider = session?.provider ?? agent?.provider ?? null;\n const resolvedTitle = resolveAgentGuiWorkbenchSessionTitle({\n agentSessionId,\n fallbackTitle: null,\n optimisticTitle,\n session\n });\n const canonicalTitle = resolvedTitle.title;\n const messages = selectSessionMessages(input.engineState, agentSessionId);\n const titleDisplayPrompt = resolveAgentGuiWorkbenchTitleDisplayPrompt({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n // Keep browser context canonical in the message while omitting its tag from the visible header title.\n const title = resolveAgentGUIConversationBrowserFreeTitle({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n const agentTitle = resolveAgentGuiWorkbenchHeaderTitle({\n agentName: agent?.name,\n conversationTitle: title,\n provider\n });\n const iconUrl =\n agent?.iconUrl ??\n resolveAgentGuiSessionProviderIconUrl(provider ?? undefined) ??\n (isAgentGuiWorkbenchProvider(provider)\n ? (input.dockIconUrls?.[provider] ?? null)\n : null);\n\n return {\n agentTitle,\n iconUrl,\n title,\n titleDisplayPrompt\n };\n}\n\nexport function resolveAgentGuiWorkbenchTitleDisplayPrompt(input: {\n activation?: {\n content: readonly AgentPromptContentBlock[];\n displayPrompt?: string;\n mode: \"existing\" | \"new\";\n status: import(\"@tutti-os/agent-activity-core\").PendingActivationStatus;\n } | null;\n allowEmptyTitle?: boolean;\n messages: readonly AgentActivityMessage[];\n title: string | null;\n}): string | null {\n return resolveAgentGUIConversationTitleDisplayPrompt(input);\n}\n\nexport function agentGuiWorkbenchConversationIdentitiesEqual(\n left: AgentGuiWorkbenchConversationIdentity | null,\n right: AgentGuiWorkbenchConversationIdentity | null\n): boolean {\n return (\n left === right ||\n (left !== null &&\n right !== null &&\n left.agentTitle === right.agentTitle &&\n left.iconUrl === right.iconUrl &&\n left.title === right.title &&\n left.titleDisplayPrompt === right.titleDisplayPrompt)\n );\n}\n","import {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n resolveProviderIconAsset,\n tuttiFlatFilledIconUrl\n} from \"./providerIconAssets.ts\";\nimport { resolveAgentGUIProviderCatalogIdentity } from \"./providerIdentityCatalog.ts\";\nimport { cursorColorfulUrl } from \"./managedAgentIconAssets.ts\";\nimport { normalizeManagedAgentProvider } from \"./shared/managedAgentProviders\";\n\nexport {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorColorfulUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n tuttiFlatFilledIconUrl\n};\n\n/**\n * Colorful session icons, used where the icon renders as a real <img> avatar\n * (collapsed workbench header, dock popup). Colorful assets keep their fill.\n */\nexport function resolveAgentGuiSessionProviderIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionColorful\");\n}\n\n/**\n * Flat monochrome session icons, used where the icon renders through a CSS\n * mask (e.g. the conversation rail rows). Colorful assets would collapse to a\n * solid square under a mask, so these must be single-color glyphs with a\n * transparent background.\n */\nexport function resolveAgentGuiSessionProviderFlatIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionFlat\");\n}\n","import {\n createElement,\n lazy,\n Suspense,\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 {\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 openLinkLinedIconUrl from \"../app/renderer/assets/icons/open-link-lined.svg\";\nimport { useAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport { AgentGuiWorkbenchSessionMenu } from \"./AgentGuiWorkbenchSessionMenu.tsx\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\nimport type { AgentGuiWorkbenchSessionMenuAdditionalAction } from \"./AgentGuiWorkbenchSessionMenu.tsx\";\nimport type { AgentToolSidebarHeaderLayout } from \"./tool-sidebar/headerLayout.ts\";\n\nconst LazyAgentRichTextReadonly = lazy(() =>\n import(\"../shared/AgentRichTextReadonly.tsx\").then((module) => ({\n default: module.AgentRichTextReadonly\n }))\n);\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 untitledConversation?: string;\n sessionMenu?: AgentGuiWorkbenchSessionMenuCopy | null;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n agentTitle?: string | null;\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 hasConversation?: boolean;\n providerRailWidthPx?: number | null;\n primaryAccessory?: ReactNode;\n secondaryAccessory?: ReactNode;\n toolSidebar?: AgentToolSidebarHeaderLayout | null;\n sessionMenuAdditionalActions?: readonly AgentGuiWorkbenchSessionMenuAdditionalAction[];\n sessionMenuActions?: readonly AgentGuiWorkbenchSessionAction[];\n conversationTitle?: string | null;\n conversationTitleDisplayPrompt?: string | null;\n nodeId: string;\n onCreateConversation?: () => void;\n onOpenDetachedWindow?: () => void;\n onSessionAction?: (action: AgentGuiWorkbenchSessionAction) => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n showAppTitle?: boolean;\n showConversationRailToggle?: boolean;\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 agentTitle,\n defaultActions: _defaultActions,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n conversationRailWidthPx,\n conversationIconUrl,\n conversationIconFallbackUrl,\n hasConversation = false,\n providerRailWidthPx,\n primaryAccessory,\n secondaryAccessory,\n toolSidebar,\n sessionMenuAdditionalActions,\n sessionMenuActions,\n conversationTitle,\n conversationTitleDisplayPrompt,\n nodeId,\n onCreateConversation,\n onOpenDetachedWindow,\n onSessionAction,\n onToggleConversationRail,\n showAppTitle = true,\n showConversationRailToggle = true,\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 // Conversation identity belongs to an actual or pending Session. Keep this\n // invariant at the shared Header boundary so hosts may pass fallback\n // presentation without recreating the empty-home visibility rule.\n const sessionTitle =\n !hasConversation || hasBodyRenderError\n ? \"\"\n : conversationTitle?.trim() || copy.untitledConversation?.trim() || \"\";\n const sessionTitleDisplayPrompt =\n !hasConversation || hasBodyRenderError\n ? \"\"\n : conversationTitleDisplayPrompt?.trim() || \"\";\n const collapsedTitle = hasConversation\n ? sessionTitle || agentTitle?.trim() || \"\"\n : \"\";\n const sessionIconUrl = hasConversation\n ? conversationIconUrl?.trim() || \"\"\n : \"\";\n const sessionIconFallbackUrl = hasConversation\n ? conversationIconFallbackUrl?.trim() || \"\"\n : \"\";\n const hasExpandedIdentity = Boolean(\n collapsedTitle || sessionIconUrl || sessionIconFallbackUrl\n );\n const resolvedSecondaryAccessory = toolSidebar?.actions ?? secondaryAccessory;\n const sessionMenu =\n onSessionAction && copy.sessionMenu && sessionTitle && !hasBodyRenderError\n ? createElement(AgentGuiWorkbenchSessionMenu, {\n actions: sessionMenuActions,\n additionalActions: sessionMenuAdditionalActions,\n copy: copy.sessionMenu,\n onAction: onSessionAction\n })\n : null;\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 ...(toolSidebar\n ? {\n \"--agent-gui-tool-sidebar-layout-width\": `${Math.max(\n 0,\n Math.round(toolSidebar.layoutWidthPx)\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-body-error\": hasBodyRenderError\n ? \"true\"\n : \"false\",\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 \"data-agent-gui-workbench-header-tool-sidebar\": toolSidebar\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 showAppTitle && !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 primaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary-accessory\"\n },\n primaryAccessory\n )\n : null,\n onOpenDetachedWindow && !hasBodyRenderError\n ? createDetachedWindowButton({\n label: copy.openDetachedWindow ?? \"Open in detached window\",\n onOpenDetachedWindow\n })\n : null,\n showConversationRailToggle\n ? createConversationRailToggleButton({\n isAutoCollapsed: isConversationRailAutoCollapsed,\n isCollapsed: isConversationRailCollapsed,\n label: toggleLabel,\n onToggleConversationRail\n })\n : null,\n isConversationRailCollapsed && onCreateConversation\n ? createNewConversationButton({\n label: copy.newConversation,\n onCreateConversation\n })\n : null,\n isConversationRailCollapsed && collapsedTitle\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 collapsedTitle\n ),\n sessionMenu\n )\n : null,\n isConversationRailCollapsed && resolvedSecondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n resolvedSecondaryAccessory\n )\n : null\n ),\n !isConversationRailCollapsed &&\n (hasExpandedIdentity || resolvedSecondaryAccessory)\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail\"\n },\n hasExpandedIdentity\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 sessionTitleDisplayPrompt\n ? createElement(\n Suspense,\n {\n fallback: createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n },\n createElement(LazyAgentRichTextReadonly, {\n className:\n \"agent-gui-workbench-header__title-text agent-gui-workbench-header__rich-title\",\n editorClassName:\n \"agent-gui-workbench-header__rich-title-editor\",\n value: sessionTitleDisplayPrompt\n })\n )\n : sessionTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n : null,\n sessionMenu\n )\n : null,\n resolvedSecondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n resolvedSecondaryAccessory\n )\n : null\n )\n : null\n );\n}\n\nfunction createConversationRailToggleButton({\n isAutoCollapsed,\n isCollapsed,\n label,\n onToggleConversationRail\n}: {\n isAutoCollapsed: boolean;\n isCollapsed: boolean;\n label: string;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: conversationRailToggleButtonClassName,\n \"data-agent-gui-conversation-rail-auto-collapsed\": isAutoCollapsed\n ? \"true\"\n : undefined,\n \"data-agent-gui-conversation-rail-collapsed\": isCollapsed\n ? \"true\"\n : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: headerChromeIconClassName })\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 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(\"span\", {\n \"aria-hidden\": true,\n className: headerChromeIconClassName,\n \"data-agent-gui-icon\": \"open-link-lined\",\n style: {\n backgroundColor: \"currentColor\",\n display: \"block\",\n WebkitMaskImage: `url(\"${openLinkLinedIconUrl}\")`,\n WebkitMaskPosition: \"center\",\n WebkitMaskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskImage: `url(\"${openLinkLinedIconUrl}\")`,\n maskPosition: \"center\",\n maskRepeat: \"no-repeat\",\n maskSize: \"contain\"\n }\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 createNewConversationButton({\n label,\n onCreateConversation\n}: {\n label: string;\n onCreateConversation: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: headerChromeIconButtonClassName,\n size: \"icon-sm\",\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\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","export default \"data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cpath%20d%3D%22M14%203H21V10M20%204L10%2014%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M19%2013V19C19%2020.1046%2018.1046%2021%2017%2021H5C3.89543%2021%203%2020.1046%203%2019V7C3%205.89543%203.89543%205%205%205H11%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3C%2Fsvg%3E%0A\";","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 useCallback,\n useRef,\n type MouseEvent,\n type PointerEvent,\n type ReactNode\n} from \"react\";\nimport { FileText, MoreHorizontal, Pencil, AtSign } from \"lucide-react\";\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger\n} from \"@tutti-os/ui-system\";\nimport type {\n AgentGuiWorkbenchSessionAction,\n AgentGuiWorkbenchSessionMenuCopy\n} from \"./sessionActions.ts\";\n\nconst menuContentClassName =\n \"w-max min-w-44 nodrag [-webkit-app-region:no-drag]\";\n\nexport interface AgentGuiWorkbenchSessionMenuAdditionalAction {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n}\n\nexport interface AgentGuiWorkbenchSessionMenuProps {\n actions?: readonly AgentGuiWorkbenchSessionAction[];\n additionalActions?: readonly AgentGuiWorkbenchSessionMenuAdditionalAction[];\n copy: AgentGuiWorkbenchSessionMenuCopy;\n onAction: (action: AgentGuiWorkbenchSessionAction) => void;\n}\n\nexport function AgentGuiWorkbenchSessionMenu({\n actions = [\"rename\", \"copy-markdown\", \"copy-reference\"],\n additionalActions = [],\n copy,\n onAction\n}: AgentGuiWorkbenchSessionMenuProps): ReactNode {\n const showRename = actions.includes(\"rename\");\n const showCopyMarkdown = actions.includes(\"copy-markdown\");\n const showCopyReference = actions.includes(\"copy-reference\");\n const showCopyActions = showCopyMarkdown || showCopyReference;\n const showBuiltInActions = showRename || showCopyActions;\n const pendingActionRef = useRef(false);\n const select = useCallback((onSelect: () => void) => {\n if (pendingActionRef.current) {\n return;\n }\n pendingActionRef.current = true;\n // Radix renders the menu through a React portal. Portal events still\n // bubble through the React tree, so dispatching synchronously from\n // pointerup can update/unmount header chrome while its draggable region\n // is handling the same gesture. Let the menu gesture finish first.\n window.requestAnimationFrame(() => {\n pendingActionRef.current = false;\n onSelect();\n });\n }, []);\n const actionProps = useCallback(\n (onSelect: () => void) => ({\n onClick: () => select(onSelect),\n onPointerUp: (event: PointerEvent) => {\n if (event.button === 0) {\n select(onSelect);\n }\n },\n onSelect: () => select(onSelect)\n }),\n [select]\n );\n return (\n <DropdownMenu\n onOpenChange={(open) => {\n if (open) {\n pendingActionRef.current = false;\n }\n }}\n >\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={copy.moreSessionActions}\n title={copy.moreSessionActions}\n className=\"agent-gui-workbench-header__icon-button agent-gui-workbench-header__session-menu-trigger\"\n data-testid=\"agent-gui-session-menu-trigger\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <MoreHorizontal\n aria-hidden=\"true\"\n className=\"agent-gui-workbench-header__icon\"\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n className={menuContentClassName}\n onClick={stopMousePropagation}\n onDoubleClick={stopMousePropagation}\n onPointerDown={stopPointerPropagation}\n onPointerUp={stopPointerPropagation}\n sideOffset={6}\n >\n {additionalActions.map((action) => (\n <DropdownMenuItem key={action.id} {...actionProps(action.onSelect)}>\n {action.icon}\n <span>{action.label}</span>\n </DropdownMenuItem>\n ))}\n {additionalActions.length > 0 && showBuiltInActions ? (\n <DropdownMenuSeparator />\n ) : null}\n {showRename ? (\n <DropdownMenuItem {...actionProps(() => onAction(\"rename\"))}>\n <Pencil aria-hidden=\"true\" />\n <span>{copy.renameSession}</span>\n </DropdownMenuItem>\n ) : null}\n {showRename && showCopyActions ? <DropdownMenuSeparator /> : null}\n {showCopyMarkdown ? (\n <DropdownMenuItem {...actionProps(() => onAction(\"copy-markdown\"))}>\n <FileText aria-hidden=\"true\" />\n <span>{copy.copyAsMarkdown}</span>\n </DropdownMenuItem>\n ) : null}\n {showCopyReference ? (\n <DropdownMenuItem {...actionProps(() => onAction(\"copy-reference\"))}>\n <AtSign aria-hidden=\"true\" />\n <span>{copy.copyAsReference}</span>\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction stopMousePropagation(event: MouseEvent): void {\n event.stopPropagation();\n}\n\nfunction stopPointerPropagation(event: PointerEvent): void {\n event.stopPropagation();\n}\n","export const AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT =\n \"tutti:agent-gui-workbench-session-action\";\n\nexport type AgentGuiWorkbenchSessionAction =\n | \"rename\"\n | \"copy-markdown\"\n | \"copy-reference\";\n\nconst agentGuiWorkbenchSessionActions: readonly AgentGuiWorkbenchSessionAction[] =\n [\"rename\", \"copy-markdown\", \"copy-reference\"];\n\nexport function isAgentGuiWorkbenchSessionAction(\n value: unknown\n): value is AgentGuiWorkbenchSessionAction {\n return agentGuiWorkbenchSessionActions.includes(\n value as AgentGuiWorkbenchSessionAction\n );\n}\n\nexport interface AgentGuiWorkbenchSessionActionDetail {\n action: AgentGuiWorkbenchSessionAction;\n /**\n * Session the header menu was rendered for. Null lets the consumer fall\n * back to its active conversation; carrying the id pins the action to the\n * conversation the user saw when they clicked.\n */\n agentSessionId: string | null;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchSessionActionRequest {\n action: AgentGuiWorkbenchSessionAction;\n agentSessionId: string | null;\n sequence: number;\n}\n\nexport function dispatchAgentGuiWorkbenchSessionAction(\n detail: AgentGuiWorkbenchSessionActionDetail\n): void {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchSessionActionDetail>(\n AGENT_GUI_WORKBENCH_SESSION_ACTION_EVENT,\n { detail }\n )\n );\n}\n\nexport interface AgentGuiWorkbenchSessionMenuCopy {\n moreSessionActions: string;\n renameSession: string;\n copyAsMarkdown: string;\n copyAsReference: string;\n}\n","import { createElement, type ReactNode } from \"react\";\nimport {\n createMultiInstanceDockEntryOptions,\n getWorkbenchLayoutFrame,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostLaunchRequest\n} from \"@tutti-os/workbench-surface\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport {\n agentGuiWorkbenchDockIdentityFromIdentifier,\n agentGuiWorkbenchTypeId,\n agentGuiWorkbenchUnifiedDockEntryId\n} from \"./launch.ts\";\nimport { normalizeAgentGuiWorkbenchState } from \"./state.ts\";\nimport {\n agentGuiWorkbenchDefaultDockProviders,\n isAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport type { AgentGuiWorkbenchProvider } from \"./types.ts\";\nimport {\n normalizeAgentGUIAgents,\n projectAgentGUIAgentsToTargets\n} from \"../agents.ts\";\nimport { AGENT_GUI_PROVIDER_RAIL_WIDTH_PX } from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentTarget\n} from \"../types.ts\";\nimport type {\n AgentGuiWorkbenchContributionCopy,\n AgentGuiWorkbenchContributionCopyOverrides,\n CreateAgentGuiWorkbenchContributionInput\n} from \"./contribution.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableWidthRatio = 0.9;\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\nexport const agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };\nexport const agentGuiWorkbenchProviderRailWidthPx =\n AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;\nconst agentGuiWorkbenchUnifiedDockTileProviders = [\n \"codex\",\n \"claude-code\",\n \"tutti-agent\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Hide sidebar\",\n close: \"Close\",\n expandConversationRail: \"Show sidebar\",\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 untitledConversation: \"Untitled conversation\"\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 agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockEntryId?: string;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n label?: string;\n order?: number;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId?: string;\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 agentDirectory: input.agentDirectory,\n dockEntryId: input.dockEntryId ?? agentGuiWorkbenchUnifiedDockEntryId(),\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: input.order ?? 0,\n provider,\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 \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): {\n provider: AgentGuiWorkbenchProvider;\n agentTargetId?: string;\n} {\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return {\n provider: target.provider,\n agentTargetId: target.agentTargetId ?? target.targetId\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\nexport function 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 agentDirectory: AgentGUIAgentDirectoryPort;\n dockEntryId: string;\n icon: ReactNode;\n label: string;\n launchPayload?: Record<string, unknown>;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n const launchPayload = input.launchPayload ?? { provider: input.provider };\n return {\n ...createMultiInstanceDockEntryOptions(launchPayload, {\n allowNewWindowInDockPopup: false\n }),\n icon: input.icon,\n iconSize: \"large\",\n id: input.dockEntryId,\n label: input.label,\n order: input.order,\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\nexport function resolveAgentGuiWorkbenchProviderIconUrl(input: {\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n return (\n input.dockIconUrls?.[input.provider] ??\n agentGuiDockIconUrls[input.provider] ??\n \"\"\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\nexport function providerFromState(\n state: unknown\n): 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\nexport function 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\nexport function resolveAgentGuiWorkbenchLaunchPayload(\n request: WorkbenchHostLaunchRequest,\n input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n }\n): unknown | null {\n if (hasAgentSessionId(request.payload)) {\n return request.payload;\n }\n const snapshot = input.agentDirectory.getSnapshot();\n const agents = normalizeAgentGUIAgents(snapshot.agents);\n const payload = isRecord(request.payload) ? request.payload : {};\n const isUnifiedDockLaunch =\n request.reason === \"dock\" &&\n agentGuiWorkbenchDockIdentityFromIdentifier(request.dockEntryId)?.kind ===\n \"unifiedAggregate\";\n const explicitAgentTargetId = isUnifiedDockLaunch\n ? null\n : readTrimmedString(payload.agentTargetId);\n if (explicitAgentTargetId) {\n const explicitAgent = agents.find(\n (agent) =>\n agent.agentTargetId === explicitAgentTargetId &&\n agent.availability.status === \"ready\"\n );\n if (\n !explicitAgent ||\n !isAgentGuiWorkbenchProvider(explicitAgent.provider)\n ) {\n return null;\n }\n return {\n ...payload,\n agentTargetId: explicitAgent.agentTargetId,\n provider: explicitAgent.provider\n };\n }\n const requestedProvider = providerFromState(payload);\n const resolved = resolveAgentGuiUnifiedDockLaunchPayload({\n agentDirectory: input.agentDirectory,\n defaultProvider: requestedProvider ?? input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (!resolved.agentTargetId) {\n return null;\n }\n return { ...payload, ...resolved };\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n return readTrimmedString(payload.agentSessionId) !== null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readTrimmedString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction resolveUnifiedAgentGuiDockTarget(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): AgentGUIAgentTarget | null {\n const targets = projectAgentGUIAgentsToTargets(\n normalizeAgentGUIAgents(input.agentDirectory.getSnapshot().agents)\n ).filter(\n (\n target\n ): target is AgentGUIAgentTarget & {\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 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 \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\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 AgentGUIAgentTarget[],\n provider: AgentGuiWorkbenchProvider\n): AgentGUIAgentTarget | null {\n const agentTargets = targets.filter((target) => target.provider === provider);\n return agentTargets[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\nexport function providerTargetLaunchPayloadFromRequest(\n payload: unknown,\n _expectedProvider: AgentGuiWorkbenchProvider\n): {\n agentTargetId: string | null;\n} {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n agentTargetId: null\n };\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n const providerTargetId = (payload as { providerTargetId?: unknown })\n .providerTargetId;\n return {\n agentTargetId:\n typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : typeof providerTargetId === \"string\" && providerTargetId.trim()\n ? providerTargetId.trim()\n : null\n };\n}\n"],"mappings":"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","names":["createElement","Button","Button","jsx","createElement","createElement","createElement","hasAgentSessionId"]}
@@ -7,14 +7,14 @@ import {
7
7
  import {
8
8
  getOptionalAgentHostApi,
9
9
  useOptionalAgentHostApi
10
- } from "./chunk-QFYOJMEQ.js";
10
+ } from "./chunk-M6WEFXPL.js";
11
11
  import {
12
12
  managedAgentRoundedIconUrl
13
13
  } from "./chunk-M6HTOCQK.js";
14
14
  import {
15
15
  translate,
16
16
  useTranslation
17
- } from "./chunk-UERICUWM.js";
17
+ } from "./chunk-GLVENTN6.js";
18
18
  import {
19
19
  resolveAgentWorkspaceFileVisualKind
20
20
  } from "./chunk-5BJYO6X3.js";
@@ -3759,4 +3759,4 @@ export {
3759
3759
  AgentMessageMarkdown,
3760
3760
  CustomScrollArea
3761
3761
  };
3762
- //# sourceMappingURL=chunk-Z5UJC4Q3.js.map
3762
+ //# sourceMappingURL=chunk-PPAV2TB4.js.map
@@ -1,11 +1,11 @@
1
- import {
2
- agentGuiWorkbenchOpenSessionActivationType,
3
- agentGuiWorkbenchPrefillPromptActivationType
4
- } from "./chunk-CBMWHQ7P.js";
5
1
  import {
6
2
  isAgentGuiWorkbenchProvider,
7
3
  normalizeAgentGuiWorkbenchProvider
8
4
  } from "./chunk-MGSRWYRN.js";
5
+ import {
6
+ agentGuiWorkbenchOpenSessionActivationType,
7
+ agentGuiWorkbenchPrefillPromptActivationType
8
+ } from "./chunk-CBMWHQ7P.js";
9
9
 
10
10
  // workbench/launch.ts
11
11
  var agentGuiWorkbenchTypeId = "agent-gui";
@@ -179,4 +179,4 @@ export {
179
179
  createAgentGuiWorkbenchLaunchDescriptor,
180
180
  resolveAgentGuiWorkbenchLaunchDockEntryId
181
181
  };
182
- //# sourceMappingURL=chunk-4CHBM3G3.js.map
182
+ //# sourceMappingURL=chunk-SUVMLCED.js.map