@tutti-os/agent-gui 0.0.216 → 0.0.218

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 (103) 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-NBYQHR6U.js} +9 -9
  4. package/dist/agent-conversation/index.js +11 -11
  5. package/dist/agent-gui.d.ts +16 -3
  6. package/dist/agent-gui.js +26 -25
  7. package/dist/agent-message-center/index.js +8 -8
  8. package/dist/app/renderer/agentactivity.css +93 -69
  9. package/dist/app/renderer/assets/icons/agent-vinyl-player-chassis.png +0 -0
  10. package/dist/app/renderer/assets/icons/agent-vinyl-tonearm.png +0 -0
  11. package/dist/app/renderer/assets/icons/agent-vinyls/claude-vinyl.png +0 -0
  12. package/dist/app/renderer/assets/icons/agent-vinyls/codex-vinyl.png +0 -0
  13. package/dist/app/renderer/assets/icons/agent-vinyls/cursor-vinyl.png +0 -0
  14. package/dist/app/renderer/assets/icons/agent-vinyls/openclaw-vinyl.png +0 -0
  15. package/dist/app/renderer/assets/icons/agent-vinyls/opencode-vinyl.png +0 -0
  16. package/dist/app/renderer/assets/icons/agent-vinyls/tutti-vinyl.png +0 -0
  17. package/dist/app/renderer/assets/icons/agents/agent-colorful.png +0 -0
  18. package/dist/app/renderer/assets/icons/agents/claude-rounded.png +0 -0
  19. package/dist/app/renderer/assets/icons/agents/codex-rounded.png +0 -0
  20. package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
  21. package/dist/app/renderer/assets/icons/agents/cursor-rounded.png +0 -0
  22. package/dist/app/renderer/assets/icons/agents/gemini-rounded.png +0 -0
  23. package/dist/app/renderer/assets/icons/agents/manage-agent-tutti.png +0 -0
  24. package/dist/app/renderer/assets/icons/agents/openclaw-rounded.png +0 -0
  25. package/dist/app/renderer/assets/icons/agents/opencode-rounded.png +0 -0
  26. package/dist/app/renderer/assets/icons/agents/provider-rail-claude-code-colorful.png +0 -0
  27. package/dist/app/renderer/assets/icons/agents/provider-rail-codex-colorful.png +0 -0
  28. package/dist/app/renderer/assets/icons/agents/provider-rail-opencode-colorful.png +0 -0
  29. package/dist/app/renderer/assets/icons/agents/provider-rail-tutti.png +0 -0
  30. package/dist/app/renderer/assets/icons/user-avatar-placeholder.png +0 -0
  31. package/dist/{chunk-VMPPZO5C.js → chunk-2QF3RBR4.js} +4 -4
  32. package/dist/{chunk-M6HTOCQK.js → chunk-3X5VDG6T.js} +2 -2
  33. package/dist/chunk-6GX57XB5.js +135 -0
  34. package/dist/chunk-6GX57XB5.js.map +1 -0
  35. package/dist/{chunk-MOCBHFJ2.js → chunk-7V5XYXKB.js} +44 -120
  36. package/dist/chunk-7V5XYXKB.js.map +1 -0
  37. package/dist/chunk-BCBB4HOV.js +56 -0
  38. package/dist/{chunk-DLN33TPF.js → chunk-F6J3LJXK.js} +8 -8
  39. package/dist/{chunk-UERICUWM.js → chunk-GLVENTN6.js} +2 -2
  40. package/dist/{chunk-DTP2OMCE.js → chunk-KRITI65C.js} +10 -12
  41. package/dist/chunk-KRITI65C.js.map +1 -0
  42. package/dist/{chunk-EZRQMJTX.js → chunk-KZIW5CCW.js} +4 -4
  43. package/dist/{chunk-QFYOJMEQ.js → chunk-M6WEFXPL.js} +2 -2
  44. package/dist/chunk-OB7GGK6S.js +44534 -0
  45. package/dist/chunk-OB7GGK6S.js.map +1 -0
  46. package/dist/{chunk-G7DS23D4.js → chunk-PPA2OB2H.js} +2 -2
  47. package/dist/{chunk-YY5WM3OE.js → chunk-PZWBLTYH.js} +242 -81
  48. package/dist/chunk-PZWBLTYH.js.map +1 -0
  49. package/dist/chunk-SEHJINGH.js +150 -0
  50. package/dist/{chunk-4CHBM3G3.js → chunk-SUVMLCED.js} +5 -5
  51. package/dist/{chunk-B4TM2HYJ.js → chunk-SWO67UWQ.js} +6 -6
  52. package/dist/{chunk-6A6OVD66.js → chunk-UC2QN7FK.js} +44 -18
  53. package/dist/chunk-UC2QN7FK.js.map +1 -0
  54. package/dist/{chunk-Z5UJC4Q3.js → chunk-Z35E22WS.js} +4 -4
  55. package/dist/{chunk-P2RIZAK5.js → chunk-ZXEICU6J.js} +3 -1
  56. package/dist/chunk-ZXEICU6J.js.map +1 -0
  57. package/dist/context-mention-palette/index.d.ts +3 -3
  58. package/dist/context-mention-palette/index.js +14 -14
  59. package/dist/dock-icons.js +2 -2
  60. package/dist/headerLayout-CP4ujEbo.d.ts +14 -0
  61. package/dist/i18n/index.d.ts +2 -0
  62. package/dist/i18n/index.js +2 -2
  63. package/dist/index.d.ts +77 -46
  64. package/dist/index.js +49 -42
  65. package/dist/index.js.map +1 -1
  66. package/dist/layout.d.ts +7 -0
  67. package/dist/layout.js +9 -0
  68. package/dist/layout.js.map +1 -0
  69. package/dist/mention-search.d.ts +6 -73
  70. package/dist/mention-search.js +10 -10
  71. package/dist/provider-icons.js +1 -1
  72. package/dist/workbench/browser-element-context/index.js +2 -2
  73. package/dist/workbench/contribution.js +9 -8
  74. package/dist/workbench/index.d.ts +3 -1
  75. package/dist/workbench/index.js +12 -11
  76. package/dist/workbench/launch.js +2 -2
  77. package/dist/workbench/sessionTitle.js +2 -2
  78. package/dist/workbench/tool-sidebar/index.d.ts +14 -13
  79. package/dist/workbench/tool-sidebar/index.js +66 -55
  80. package/dist/workbench/tool-sidebar/index.js.map +1 -1
  81. package/package.json +22 -15
  82. package/dist/chunk-6A6OVD66.js.map +0 -1
  83. package/dist/chunk-AOK22J62.js +0 -56
  84. package/dist/chunk-DTP2OMCE.js.map +0 -1
  85. package/dist/chunk-KJA3HHUJ.js +0 -44291
  86. package/dist/chunk-KJA3HHUJ.js.map +0 -1
  87. package/dist/chunk-MOCBHFJ2.js.map +0 -1
  88. package/dist/chunk-P2RIZAK5.js.map +0 -1
  89. package/dist/chunk-QNE2ZPPV.js +0 -150
  90. package/dist/chunk-YY5WM3OE.js.map +0 -1
  91. /package/dist/{AgentRichTextReadonly-IPPNAAWG.js.map → AgentRichTextReadonly-NBYQHR6U.js.map} +0 -0
  92. /package/dist/{chunk-VMPPZO5C.js.map → chunk-2QF3RBR4.js.map} +0 -0
  93. /package/dist/{chunk-M6HTOCQK.js.map → chunk-3X5VDG6T.js.map} +0 -0
  94. /package/dist/{chunk-AOK22J62.js.map → chunk-BCBB4HOV.js.map} +0 -0
  95. /package/dist/{chunk-DLN33TPF.js.map → chunk-F6J3LJXK.js.map} +0 -0
  96. /package/dist/{chunk-UERICUWM.js.map → chunk-GLVENTN6.js.map} +0 -0
  97. /package/dist/{chunk-EZRQMJTX.js.map → chunk-KZIW5CCW.js.map} +0 -0
  98. /package/dist/{chunk-QFYOJMEQ.js.map → chunk-M6WEFXPL.js.map} +0 -0
  99. /package/dist/{chunk-G7DS23D4.js.map → chunk-PPA2OB2H.js.map} +0 -0
  100. /package/dist/{chunk-QNE2ZPPV.js.map → chunk-SEHJINGH.js.map} +0 -0
  101. /package/dist/{chunk-4CHBM3G3.js.map → chunk-SUVMLCED.js.map} +0 -0
  102. /package/dist/{chunk-B4TM2HYJ.js.map → chunk-SWO67UWQ.js.map} +0 -0
  103. /package/dist/{chunk-Z5UJC4Q3.js.map → chunk-Z35E22WS.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createProviderIconUrlMap
3
- } from "./chunk-QNE2ZPPV.js";
3
+ } from "./chunk-SEHJINGH.js";
4
4
  import {
5
5
  migratedAgentGUIProviderIdentityCatalog
6
6
  } from "./chunk-O433KXLK.js";
@@ -20,4 +20,4 @@ export {
20
20
  agentGuiDockIconUrls,
21
21
  agentGuiDockIconUrl
22
22
  };
23
- //# sourceMappingURL=chunk-G7DS23D4.js.map
23
+ //# sourceMappingURL=chunk-PPA2OB2H.js.map
@@ -2,7 +2,26 @@ import {
2
2
  AgentRichTextReadonly,
3
3
  promptForProviderSkills,
4
4
  skillTriggerForPrefix
5
- } from "./chunk-DLN33TPF.js";
5
+ } from "./chunk-F6J3LJXK.js";
6
+ import {
7
+ AgentGUIConversation_styles_default,
8
+ AgentMessageMarkdown,
9
+ CustomScrollArea,
10
+ MessageSquareMoreIcon,
11
+ ZoomableImage,
12
+ extractAgentMcpToolTarget,
13
+ extractExitPlanKeepPlanningOptionId,
14
+ extractExitPlanModeOptions,
15
+ isExitPlanSwitchModeInput,
16
+ normalizeAgentApprovalPurpose,
17
+ normalizeAskUserQuestions,
18
+ resolveWorkspaceFileLinkAction,
19
+ resolveWorkspaceFilePathCandidate,
20
+ resolveWorkspaceLinkAction
21
+ } from "./chunk-Z35E22WS.js";
22
+ import {
23
+ cn
24
+ } from "./chunk-LQMIEH4C.js";
6
25
  import {
7
26
  classifyRecoverableAgentMessage,
8
27
  resolveAgentErrorPresentation,
@@ -18,7 +37,7 @@ import {
18
37
  agentPromptFileBlocks,
19
38
  agentPromptPastedTextBlocks,
20
39
  materializeAgentComposerFileMentions
21
- } from "./chunk-B4TM2HYJ.js";
40
+ } from "./chunk-SWO67UWQ.js";
22
41
  import {
23
42
  extractImageGenerationPreview,
24
43
  isImageGenerationToolCall,
@@ -27,34 +46,11 @@ import {
27
46
  resolveImageGenerationPreviewSrc,
28
47
  stripImagePayloadData
29
48
  } from "./chunk-JDVP33S5.js";
30
- import {
31
- AGENT_PASTED_TEXT_BLOCK_KIND,
32
- AGENT_PASTED_TEXT_MENTION_KIND
33
- } from "./chunk-FGLQZ6I4.js";
34
- import {
35
- AgentGUIConversation_styles_default,
36
- AgentMessageMarkdown,
37
- CustomScrollArea,
38
- MessageSquareMoreIcon,
39
- ZoomableImage,
40
- extractAgentMcpToolTarget,
41
- extractExitPlanKeepPlanningOptionId,
42
- extractExitPlanModeOptions,
43
- isExitPlanSwitchModeInput,
44
- normalizeAgentApprovalPurpose,
45
- normalizeAskUserQuestions,
46
- resolveWorkspaceFileLinkAction,
47
- resolveWorkspaceFilePathCandidate,
48
- resolveWorkspaceLinkAction
49
- } from "./chunk-Z5UJC4Q3.js";
50
- import {
51
- cn
52
- } from "./chunk-LQMIEH4C.js";
53
49
  import {
54
50
  useOptionalAgentActivityRuntime,
55
51
  useOptionalAgentHostApi,
56
52
  workspaceAgentProviderLabel
57
- } from "./chunk-QFYOJMEQ.js";
53
+ } from "./chunk-M6WEFXPL.js";
58
54
  import {
59
55
  fileChangeCountFromChanges,
60
56
  fileChangeEntriesFromChanges,
@@ -64,10 +60,14 @@ import {
64
60
  getActiveUiLanguage,
65
61
  translate,
66
62
  useTranslation
67
- } from "./chunk-UERICUWM.js";
63
+ } from "./chunk-GLVENTN6.js";
68
64
  import {
69
65
  normalizeAgentTitleText
70
66
  } from "./chunk-MIJXEELH.js";
67
+ import {
68
+ AGENT_PASTED_TEXT_BLOCK_KIND,
69
+ AGENT_PASTED_TEXT_MENTION_KIND
70
+ } from "./chunk-FGLQZ6I4.js";
71
71
 
72
72
  // shared/workspaceAgentSystemNoticeSemantics.ts
73
73
  function resolveWorkspaceAgentNoticeCommandSemantics(input) {
@@ -5605,7 +5605,7 @@ import {
5605
5605
  memo as memo4,
5606
5606
  useCallback as useCallback15,
5607
5607
  useLayoutEffect as useLayoutEffect4,
5608
- useMemo as useMemo8,
5608
+ useMemo as useMemo9,
5609
5609
  useRef as useRef13,
5610
5610
  useState as useState25
5611
5611
  } from "react";
@@ -8971,7 +8971,7 @@ function fileNameFromPath(path) {
8971
8971
  }
8972
8972
 
8973
8973
  // shared/agentConversation/components/tool-renderers/file-diff/AgentMonacoDiffViewer.tsx
8974
- import { lazy, Suspense } from "react";
8974
+ import { Component, createRef } from "react";
8975
8975
 
8976
8976
  // app/renderer/components/icons/AtomIcon.tsx
8977
8977
  import {
@@ -9136,12 +9136,13 @@ var AtomIcon = forwardRef4(
9136
9136
  );
9137
9137
  AtomIcon.displayName = "AtomIcon";
9138
9138
 
9139
+ // shared/agentConversation/components/tool-renderers/file-diff/loadMonaco.ts
9140
+ function loadMonaco() {
9141
+ return import("monaco-editor");
9142
+ }
9143
+
9139
9144
  // shared/agentConversation/components/tool-renderers/file-diff/AgentMonacoDiffViewer.tsx
9140
9145
  import { jsx as jsx20, jsxs as jsxs12 } from "react/jsx-runtime";
9141
- var MonacoDiffEditor = lazy(async () => {
9142
- const module = await import("@monaco-editor/react");
9143
- return { default: module.DiffEditor };
9144
- });
9145
9146
  function AgentMonacoDiffViewer({
9146
9147
  path,
9147
9148
  oldValue,
@@ -9171,42 +9172,159 @@ function AgentMonacoDiffViewer({
9171
9172
  }
9172
9173
  ) : null,
9173
9174
  /* @__PURE__ */ jsx20("div", { className: "h-[220px] bg-[var(--background-panel)]", children: /* @__PURE__ */ jsx20(
9174
- Suspense,
9175
+ MonacoDiffEditorSurface,
9175
9176
  {
9176
- fallback: /* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-1.5 px-3 py-2.5 text-[11px] text-[var(--text-secondary)]", children: [
9177
- /* @__PURE__ */ jsx20(
9178
- AtomIcon,
9179
- {
9180
- size: 14,
9181
- active: true,
9182
- "aria-hidden": "true",
9183
- className: "shrink-0"
9184
- }
9185
- ),
9186
- /* @__PURE__ */ jsx20("span", { children: translate("agentHost.agentTool.details.loadingDiff") })
9187
- ] }),
9188
- children: /* @__PURE__ */ jsx20(
9189
- MonacoDiffEditor,
9190
- {
9191
- original: oldValue,
9192
- modified: newValue,
9193
- language: languageForPath2(path),
9194
- options: {
9195
- readOnly: true,
9196
- renderSideBySide: true,
9197
- minimap: { enabled: false },
9198
- scrollBeyondLastLine: false,
9199
- wordWrap: "on",
9200
- automaticLayout: true
9201
- }
9202
- }
9203
- )
9177
+ oldValue,
9178
+ newValue,
9179
+ language: languageForPath2(path)
9204
9180
  }
9205
9181
  ) })
9206
9182
  ]
9207
9183
  }
9208
9184
  );
9209
9185
  }
9186
+ var MonacoDiffEditorSurface = class extends Component {
9187
+ containerRef = createRef();
9188
+ resources = null;
9189
+ loadGeneration = 0;
9190
+ state = {
9191
+ loadError: null,
9192
+ loading: true
9193
+ };
9194
+ componentDidMount() {
9195
+ const loadGeneration = ++this.loadGeneration;
9196
+ void loadMonaco().then((monaco) => {
9197
+ const container = this.containerRef.current;
9198
+ if (loadGeneration !== this.loadGeneration || !container) {
9199
+ return;
9200
+ }
9201
+ this.resources = createMonacoDiffResources(
9202
+ monaco,
9203
+ container,
9204
+ this.props
9205
+ );
9206
+ this.setState({ loading: false });
9207
+ }).catch((error) => {
9208
+ if (loadGeneration === this.loadGeneration) {
9209
+ this.setState({
9210
+ loadError: error instanceof Error ? error : new Error(String(error))
9211
+ });
9212
+ }
9213
+ });
9214
+ }
9215
+ componentDidUpdate() {
9216
+ if (this.resources) {
9217
+ updateMonacoDiffResources(this.resources, this.props);
9218
+ }
9219
+ }
9220
+ componentWillUnmount() {
9221
+ this.loadGeneration += 1;
9222
+ const resources = this.resources;
9223
+ this.resources = null;
9224
+ if (resources) {
9225
+ disposeMonacoDiffResources(resources);
9226
+ }
9227
+ }
9228
+ render() {
9229
+ if (this.state.loadError) {
9230
+ throw this.state.loadError;
9231
+ }
9232
+ return /* @__PURE__ */ jsxs12("div", { className: "relative h-full w-full", children: [
9233
+ /* @__PURE__ */ jsx20("div", { ref: this.containerRef, className: "h-full w-full" }),
9234
+ this.state.loading ? /* @__PURE__ */ jsxs12("div", { className: "absolute inset-0 flex items-start gap-1.5 px-3 py-2.5 text-[11px] text-[var(--text-secondary)]", children: [
9235
+ /* @__PURE__ */ jsx20(
9236
+ AtomIcon,
9237
+ {
9238
+ size: 14,
9239
+ active: true,
9240
+ "aria-hidden": "true",
9241
+ className: "shrink-0"
9242
+ }
9243
+ ),
9244
+ /* @__PURE__ */ jsx20("span", { children: translate("agentHost.agentTool.details.loadingDiff") })
9245
+ ] }) : null
9246
+ ] });
9247
+ }
9248
+ };
9249
+ function createMonacoDiffResources(monaco, container, content) {
9250
+ const originalModel = monaco.editor.createModel(
9251
+ content.oldValue,
9252
+ content.language
9253
+ );
9254
+ const modifiedModel = monaco.editor.createModel(
9255
+ content.newValue,
9256
+ content.language
9257
+ );
9258
+ let editor = null;
9259
+ try {
9260
+ monaco.editor.setTheme("light");
9261
+ editor = monaco.editor.createDiffEditor(container, {
9262
+ readOnly: true,
9263
+ renderSideBySide: true,
9264
+ minimap: { enabled: false },
9265
+ scrollBeyondLastLine: false,
9266
+ wordWrap: "on",
9267
+ automaticLayout: true
9268
+ });
9269
+ editor.setModel({
9270
+ original: originalModel,
9271
+ modified: modifiedModel
9272
+ });
9273
+ return { monaco, editor, originalModel, modifiedModel };
9274
+ } catch (error) {
9275
+ if (editor) {
9276
+ try {
9277
+ editor.setModel(null);
9278
+ } finally {
9279
+ try {
9280
+ editor.dispose();
9281
+ } finally {
9282
+ disposeMonacoModels(originalModel, modifiedModel);
9283
+ }
9284
+ }
9285
+ } else {
9286
+ disposeMonacoModels(originalModel, modifiedModel);
9287
+ }
9288
+ throw error;
9289
+ }
9290
+ }
9291
+ function updateMonacoDiffResources(resources, content) {
9292
+ if (resources.originalModel.getValue() !== content.oldValue) {
9293
+ resources.originalModel.setValue(content.oldValue);
9294
+ }
9295
+ if (resources.modifiedModel.getValue() !== content.newValue) {
9296
+ resources.modifiedModel.setValue(content.newValue);
9297
+ }
9298
+ const currentLanguage = resources.originalModel.getLanguageId();
9299
+ if (currentLanguage !== content.language) {
9300
+ resources.monaco.editor.setModelLanguage(
9301
+ resources.originalModel,
9302
+ content.language
9303
+ );
9304
+ resources.monaco.editor.setModelLanguage(
9305
+ resources.modifiedModel,
9306
+ content.language
9307
+ );
9308
+ }
9309
+ }
9310
+ function disposeMonacoDiffResources(resources) {
9311
+ try {
9312
+ resources.editor.setModel(null);
9313
+ } finally {
9314
+ try {
9315
+ resources.editor.dispose();
9316
+ } finally {
9317
+ disposeMonacoModels(resources.originalModel, resources.modifiedModel);
9318
+ }
9319
+ }
9320
+ }
9321
+ function disposeMonacoModels(originalModel, modifiedModel) {
9322
+ try {
9323
+ originalModel.dispose();
9324
+ } finally {
9325
+ modifiedModel.dispose();
9326
+ }
9327
+ }
9210
9328
  function languageForPath2(path) {
9211
9329
  const extension = path?.split(".").pop()?.toLowerCase();
9212
9330
  switch (extension) {
@@ -12406,7 +12524,8 @@ function AgentMessageBlock({
12406
12524
  workspaceAppIcons,
12407
12525
  showRawTimelineJson = false,
12408
12526
  rawTimelineJsonLabel = "",
12409
- participantPresentation
12527
+ participantPresentation,
12528
+ showParticipantHeader = true
12410
12529
  }) {
12411
12530
  "use memo";
12412
12531
  const agentHostApi = useOptionalAgentHostApi();
@@ -12572,7 +12691,7 @@ function AgentMessageBlock({
12572
12691
  return /* @__PURE__ */ jsx61(Fragment6, { children: content }, message.id);
12573
12692
  });
12574
12693
  const enabledParticipantPresentation = participantPresentation?.enabled === true ? participantPresentation : null;
12575
- const showParticipant = enabledParticipantPresentation !== null && row.messages.length > 0;
12694
+ const showParticipant = enabledParticipantPresentation !== null && showParticipantHeader && row.messages.length > 0;
12576
12695
  return /* @__PURE__ */ jsxs43(
12577
12696
  "div",
12578
12697
  {
@@ -13723,6 +13842,7 @@ var AgentTranscriptItemView = memo3(function AgentTranscriptItemView2({
13723
13842
  workspaceAppIcons,
13724
13843
  showRawTimelineJson = false,
13725
13844
  participantPresentation,
13845
+ showParticipantHeader,
13726
13846
  toolGroupExpanded,
13727
13847
  toolGroupExpansionKey,
13728
13848
  onToolGroupExpandedChange
@@ -13770,7 +13890,8 @@ var AgentTranscriptItemView = memo3(function AgentTranscriptItemView2({
13770
13890
  toolCallsLabel: labels.toolCallsLabel,
13771
13891
  showRawTimelineJson,
13772
13892
  rawTimelineJsonLabel: labels.rawTimelineJson,
13773
- participantPresentation
13893
+ participantPresentation,
13894
+ showParticipantHeader
13774
13895
  }
13775
13896
  );
13776
13897
  case "tool-group":
@@ -13844,6 +13965,34 @@ import { Button as Button2 } from "@tutti-os/ui-system/components";
13844
13965
  import { ChevronDownIcon } from "@tutti-os/ui-system/icons";
13845
13966
 
13846
13967
  // shared/agentConversation/components/agentTurnWorkSectionModel.ts
13968
+ function findParticipantHeaderRenderKeys(groups, rowKeys, modelByGroupKey) {
13969
+ const headerKeys = /* @__PURE__ */ new Set();
13970
+ for (const group of groups) {
13971
+ const model = modelByGroupKey.get(group.key);
13972
+ const renderedRows = model ? model.collapseEligible ? [
13973
+ ...model.leadingRows,
13974
+ ...model.sections.flatMap(
13975
+ (section) => section.kind === "visible" ? section.rows : []
13976
+ ),
13977
+ ...model.sections.flatMap(
13978
+ (section) => section.kind === "work" ? section.rows : []
13979
+ )
13980
+ ] : [
13981
+ ...model.leadingRows,
13982
+ ...model.sections.flatMap((section) => section.rows)
13983
+ ] : group.rows;
13984
+ const seenSpeakers = /* @__PURE__ */ new Set();
13985
+ for (const entry of renderedRows) {
13986
+ const row = entry.row;
13987
+ if (row.kind !== "message" || row.messages.length === 0 || seenSpeakers.has(row.speaker)) {
13988
+ continue;
13989
+ }
13990
+ seenSpeakers.add(row.speaker);
13991
+ headerKeys.add(entry.renderKey ?? rowKeys[entry.rowIndex] ?? row.id);
13992
+ }
13993
+ }
13994
+ return headerKeys;
13995
+ }
13847
13996
  function resolveAgentTurnTiming(turn, isActiveTurn, submittedAtUnixMs) {
13848
13997
  if (!turn || !Number.isFinite(turn.startedAtUnixMs)) {
13849
13998
  return null;
@@ -14387,7 +14536,7 @@ import {
14387
14536
  } from "react";
14388
14537
 
14389
14538
  // shared/agentConversation/components/agentTranscriptModel.ts
14390
- import { useLayoutEffect as useLayoutEffect2, useRef as useRef9 } from "react";
14539
+ import { useLayoutEffect as useLayoutEffect2, useMemo as useMemo7, useRef as useRef9 } from "react";
14391
14540
  function useEnteringTranscriptRows(rowKeys) {
14392
14541
  const previousKeysRef = useRef9(null);
14393
14542
  const previousKeys = previousKeysRef.current;
@@ -14567,6 +14716,12 @@ function attachLeadingToolRowsToFollowingMessages(rows) {
14567
14716
  result.push(...pendingToolRows);
14568
14717
  return result;
14569
14718
  }
14719
+ function useAgentTranscriptDisplayRows(rows, participantHeadersEnabled) {
14720
+ return useMemo7(() => {
14721
+ const displayRows = participantHeadersEnabled ? attachLeadingToolRowsToFollowingMessages(rows) : rows;
14722
+ return { rows: displayRows, rowKeys: displayRows.map(transcriptRowKey) };
14723
+ }, [rows, participantHeadersEnabled]);
14724
+ }
14570
14725
 
14571
14726
  // shared/agentConversation/components/AgentMessageLocatorRail.tsx
14572
14727
  import { jsx as jsx68, jsxs as jsxs47 } from "react/jsx-runtime";
@@ -15184,12 +15339,12 @@ function useTurnDisclosureMotion() {
15184
15339
  import {
15185
15340
  useCallback as useCallback14,
15186
15341
  useImperativeHandle as useImperativeHandle6,
15187
- useMemo as useMemo7,
15342
+ useMemo as useMemo8,
15188
15343
  useRef as useRef12
15189
15344
  } from "react";
15190
15345
  import { jsx as jsx69 } from "react/jsx-runtime";
15191
15346
  function useAgentTranscriptTurnAttachments(input) {
15192
- const projection = useMemo7(() => {
15347
+ const projection = useMemo8(() => {
15193
15348
  const lastGroupIndexByTurnId = /* @__PURE__ */ new Map();
15194
15349
  input.turnGroups.forEach((group, groupIndex) => {
15195
15350
  if (group.turnId) lastGroupIndexByTurnId.set(group.turnId, groupIndex);
@@ -15381,21 +15536,21 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
15381
15536
  const virtualizerHostRef = useRef13(null);
15382
15537
  const [virtualScrollElement, setVirtualScrollElement] = useState25(null);
15383
15538
  const participantHeadersEnabled = participantPresentation?.enabled === true;
15384
- const transcriptRowSet = useMemo8(() => {
15385
- const rows = participantHeadersEnabled ? attachLeadingToolRowsToFollowingMessages(conversation.rows) : conversation.rows;
15386
- return { rows, rowKeys: rows.map(transcriptRowKey) };
15387
- }, [conversation.rows, participantHeadersEnabled]);
15539
+ const transcriptRowSet = useAgentTranscriptDisplayRows(
15540
+ conversation.rows,
15541
+ participantHeadersEnabled
15542
+ );
15388
15543
  const displayRows = transcriptRowSet.rows;
15389
15544
  const rowKeys = transcriptRowSet.rowKeys;
15390
- const turnGroups = useMemo8(
15545
+ const turnGroups = useMemo9(
15391
15546
  () => buildAgentTranscriptTurnGroups(displayRows, rowKeys),
15392
15547
  [displayRows, rowKeys]
15393
15548
  );
15394
- const turnGroupIndexByRowIndex = useMemo8(
15549
+ const turnGroupIndexByRowIndex = useMemo9(
15395
15550
  () => buildTurnGroupIndexByRowIndex(turnGroups),
15396
15551
  [turnGroups]
15397
15552
  );
15398
- const userMessageLocatorItems = useMemo8(
15553
+ const userMessageLocatorItems = useMemo9(
15399
15554
  () => buildUserMessageLocatorItems(
15400
15555
  displayRows,
15401
15556
  rowKeys,
@@ -15418,13 +15573,13 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
15418
15573
  },
15419
15574
  []
15420
15575
  );
15421
- const turnIndexById = useMemo8(
15576
+ const turnIndexById = useMemo9(
15422
15577
  () => new Map(
15423
15578
  conversation.sourceDetail.turns.map((turn, index) => [turn.id, index])
15424
15579
  ),
15425
15580
  [conversation.sourceDetail.turns]
15426
15581
  );
15427
- const dividerRowIndexes = useMemo8(
15582
+ const dividerRowIndexes = useMemo9(
15428
15583
  () => participantHeadersEnabled ? findParticipantTurnDividerRowIndexes(displayRows) : findTurnDividerRowIndexes(turnIndexById, displayRows),
15429
15584
  [displayRows, turnIndexById, participantHeadersEnabled]
15430
15585
  );
@@ -15450,10 +15605,15 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
15450
15605
  ];
15451
15606
  })
15452
15607
  );
15608
+ const participantHeaderRenderKeys = participantHeadersEnabled ? findParticipantHeaderRenderKeys(
15609
+ turnGroups,
15610
+ rowKeys,
15611
+ turnWorkSectionModelByKey
15612
+ ) : null;
15453
15613
  const basePath = conversation.sourceDetail.cwd;
15454
15614
  const workspaceRoot = conversation.workspaceRoot;
15455
15615
  const provider = conversation.activity.agentProvider;
15456
- const shouldVirtualize = useMemo8(
15616
+ const shouldVirtualize = useMemo9(
15457
15617
  () => assessAgentTranscriptComplexity(turnGroups).shouldVirtualize,
15458
15618
  [turnGroups]
15459
15619
  );
@@ -15540,6 +15700,7 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
15540
15700
  workspaceAppIcons,
15541
15701
  showRawTimelineJson,
15542
15702
  participantPresentation,
15703
+ showParticipantHeader: participantHeaderRenderKeys?.has(rowKey) ?? false,
15543
15704
  toolGroupExpanded: row.kind === "tool-group" ? expandedToolRows[rowKey] === true : void 0,
15544
15705
  toolGroupExpansionKey: row.kind === "tool-group" ? rowKey : void 0,
15545
15706
  onToolGroupExpandedChange: handleToolGroupExpandedChange
@@ -15715,14 +15876,14 @@ var AgentConversationFlow = memo5(function AgentConversationFlow2({
15715
15876
  });
15716
15877
 
15717
15878
  // shared/agentConversation/projection/useProjectedAgentConversation.ts
15718
- import { useMemo as useMemo9, useRef as useRef14 } from "react";
15879
+ import { useMemo as useMemo10, useRef as useRef14 } from "react";
15719
15880
  function useProjectedAgentConversation({
15720
15881
  conversation,
15721
15882
  detail,
15722
15883
  avoidGroupingEdits = false
15723
15884
  }) {
15724
15885
  const previousConversationRef = useRef14(null);
15725
- return useMemo9(() => {
15886
+ return useMemo10(() => {
15726
15887
  if (!conversation && !detail) {
15727
15888
  previousConversationRef.current = null;
15728
15889
  return null;
@@ -15781,4 +15942,4 @@ export {
15781
15942
  AgentConversationFlow,
15782
15943
  useProjectedAgentConversation
15783
15944
  };
15784
- //# sourceMappingURL=chunk-YY5WM3OE.js.map
15945
+ //# sourceMappingURL=chunk-PZWBLTYH.js.map