@tutti-os/agent-gui 0.0.73 → 0.0.75

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 (95) hide show
  1. package/README.md +23 -2
  2. package/dist/agent-conversation/index.d.ts +5 -5
  3. package/dist/agent-conversation/index.js +8 -8
  4. package/dist/agent-message-center/index.d.ts +2 -2
  5. package/dist/agent-message-center/index.js +170 -12
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/{agentConversationVM-DPAgUJlR.d.ts → agentConversationVM-BgoqFyE9.d.ts} +1 -1
  8. package/dist/{agentGuiNodeTypes-aJ3AX7u2.d.ts → agentGuiNodeTypes-CmuJ7VDZ.d.ts} +17 -6
  9. package/dist/app/renderer/agentactivity.css +58 -33
  10. package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
  11. package/dist/app/renderer/assets/icons/agents/opencode-rounded.png +0 -0
  12. package/dist/app/renderer/assets/icons/agents/provider-rail-opencode-colorful.png +0 -0
  13. package/dist/{chunk-IVIXKAEH.js → chunk-3FYA2K4P.js} +76 -7
  14. package/dist/chunk-3FYA2K4P.js.map +1 -0
  15. package/dist/{chunk-4US2YHBY.js → chunk-4HP6V2YA.js} +16 -4
  16. package/dist/chunk-4HP6V2YA.js.map +1 -0
  17. package/dist/{chunk-G6BVEY7I.js → chunk-4TNM6ZEC.js} +3 -114
  18. package/dist/chunk-4TNM6ZEC.js.map +1 -0
  19. package/dist/{chunk-3PKRGSMH.js → chunk-52GTPN7X.js} +4 -23
  20. package/dist/chunk-52GTPN7X.js.map +1 -0
  21. package/dist/{chunk-OBJRIQPX.js → chunk-7GSBP5CN.js} +68 -34
  22. package/dist/chunk-7GSBP5CN.js.map +1 -0
  23. package/dist/{chunk-2I2WRI4F.js → chunk-BEM3KDOJ.js} +3 -4
  24. package/dist/chunk-BEM3KDOJ.js.map +1 -0
  25. package/dist/{chunk-ATEZXUHK.js → chunk-BT2DT2P7.js} +1 -1
  26. package/dist/chunk-BT2DT2P7.js.map +1 -0
  27. package/dist/{chunk-SVGIWXNK.js → chunk-GZX2SGAG.js} +2 -2
  28. package/dist/{chunk-KWQ4N4IZ.js → chunk-KELYWKTC.js} +28 -6
  29. package/dist/chunk-KELYWKTC.js.map +1 -0
  30. package/dist/{chunk-UAAXRSW2.js → chunk-L2ZMLLYL.js} +14 -7
  31. package/dist/chunk-L2ZMLLYL.js.map +1 -0
  32. package/dist/{chunk-5H6NINJY.js → chunk-M6FZ2YIR.js} +3 -8
  33. package/dist/chunk-M6FZ2YIR.js.map +1 -0
  34. package/dist/{chunk-XZF4QNT4.js → chunk-MNESUMOS.js} +2 -2
  35. package/dist/{chunk-466AWJTS.js → chunk-QDKD6RNC.js} +15 -6
  36. package/dist/{chunk-466AWJTS.js.map → chunk-QDKD6RNC.js.map} +1 -1
  37. package/dist/{chunk-GDFQXJMG.js → chunk-RIRFNGPB.js} +7 -7
  38. package/dist/chunk-RIRFNGPB.js.map +1 -0
  39. package/dist/{chunk-4I2VCAMW.js → chunk-SYWMKIRW.js} +4 -11
  40. package/dist/chunk-SYWMKIRW.js.map +1 -0
  41. package/dist/{chunk-SZF52NMJ.js → chunk-U6AZ3XQS.js} +38 -13
  42. package/dist/chunk-U6AZ3XQS.js.map +1 -0
  43. package/dist/{chunk-Q6AWM3RH.js → chunk-U6EDUTUO.js} +4 -4
  44. package/dist/{chunk-MYD37I32.js → chunk-VAKFNNKT.js} +1 -15
  45. package/dist/chunk-VAKFNNKT.js.map +1 -0
  46. package/dist/{chunk-BHNJN2TR.js → chunk-XW4CVBUH.js} +2 -5
  47. package/dist/chunk-XW4CVBUH.js.map +1 -0
  48. package/dist/{chunk-C7K3EFGI.js → chunk-YWQHNFYA.js} +2 -2
  49. package/dist/context-mention-palette/index.js +9 -9
  50. package/dist/i18n/index.d.ts +2 -110
  51. package/dist/i18n/index.js +2 -2
  52. package/dist/index.d.ts +86 -10
  53. package/dist/index.js +1284 -667
  54. package/dist/index.js.map +1 -1
  55. package/dist/plan-decision-ops.d.ts +2 -2
  56. package/dist/queued-prompt-runtime.d.ts +4 -6
  57. package/dist/queued-prompt-runtime.js +1 -1
  58. package/dist/{types-CrwMqBm1.d.ts → types-DUHHejs2.d.ts} +3 -3
  59. package/dist/workbench/contribution.d.ts +1 -1
  60. package/dist/workbench/contribution.js +6 -6
  61. package/dist/workbench/index.d.ts +1 -1
  62. package/dist/workbench/index.js +9 -9
  63. package/dist/workbench/launch.d.ts +2 -2
  64. package/dist/workbench/launch.js +3 -3
  65. package/dist/workbench/providerCatalog.d.ts +3 -3
  66. package/dist/workbench/providerCatalog.js +1 -1
  67. package/dist/workbench/sessionTitle.d.ts +1 -1
  68. package/dist/workbench/sessionTitle.js +3 -3
  69. package/dist/workbench/state.d.ts +1 -1
  70. package/dist/workbench/state.js +2 -2
  71. package/dist/workbench/types.d.ts +2 -2
  72. package/dist/workbench/types.js +1 -1
  73. package/dist/workspace-agent-generated-files.d.ts +1 -1
  74. package/dist/workspace-agent-generated-files.js +4 -4
  75. package/dist/{workspaceAgentActivityListViewModel-DJvAqZso.d.ts → workspaceAgentActivityListViewModel-TXH1VXrk.d.ts} +0 -10
  76. package/package.json +12 -12
  77. package/dist/chunk-2I2WRI4F.js.map +0 -1
  78. package/dist/chunk-3PKRGSMH.js.map +0 -1
  79. package/dist/chunk-4I2VCAMW.js.map +0 -1
  80. package/dist/chunk-4US2YHBY.js.map +0 -1
  81. package/dist/chunk-5H6NINJY.js.map +0 -1
  82. package/dist/chunk-ATEZXUHK.js.map +0 -1
  83. package/dist/chunk-BHNJN2TR.js.map +0 -1
  84. package/dist/chunk-G6BVEY7I.js.map +0 -1
  85. package/dist/chunk-GDFQXJMG.js.map +0 -1
  86. package/dist/chunk-IVIXKAEH.js.map +0 -1
  87. package/dist/chunk-KWQ4N4IZ.js.map +0 -1
  88. package/dist/chunk-MYD37I32.js.map +0 -1
  89. package/dist/chunk-OBJRIQPX.js.map +0 -1
  90. package/dist/chunk-SZF52NMJ.js.map +0 -1
  91. package/dist/chunk-UAAXRSW2.js.map +0 -1
  92. /package/dist/{chunk-SVGIWXNK.js.map → chunk-GZX2SGAG.js.map} +0 -0
  93. /package/dist/{chunk-XZF4QNT4.js.map → chunk-MNESUMOS.js.map} +0 -0
  94. /package/dist/{chunk-Q6AWM3RH.js.map → chunk-U6EDUTUO.js.map} +0 -0
  95. /package/dist/{chunk-C7K3EFGI.js.map → chunk-YWQHNFYA.js.map} +0 -0
@@ -8,11 +8,11 @@ import {
8
8
  import {
9
9
  isWorkspaceAgentActivityRuntimeSessionOrigin,
10
10
  workspaceAgentProviderLabel
11
- } from "./chunk-4US2YHBY.js";
11
+ } from "./chunk-4HP6V2YA.js";
12
12
  import {
13
13
  translate,
14
14
  translateInUiLanguage
15
- } from "./chunk-C7K3EFGI.js";
15
+ } from "./chunk-YWQHNFYA.js";
16
16
  import {
17
17
  normalizeAgentTitleText
18
18
  } from "./chunk-GCBDIQDX.js";
@@ -232,14 +232,6 @@ function resolveActivityUser(session, presence, options) {
232
232
  if (sessionUserId) {
233
233
  return resolveUserFromId(sessionUserId, options);
234
234
  }
235
- const fallbackMember = selectFallbackMember(options.fallbackMembers ?? []);
236
- if (fallbackMember) {
237
- return {
238
- userId: fallbackMember.userId,
239
- userName: fallbackMember.label || "Unknown member",
240
- ...fallbackMember.avatarUrl ? { userAvatarUrl: fallbackMember.avatarUrl } : {}
241
- };
242
- }
243
235
  return {
244
236
  userId: null,
245
237
  userName: "Unknown member"
@@ -257,9 +249,6 @@ function resolveUserFromId(rawUserId, options) {
257
249
  ...profileAvatar ? { userAvatarUrl: profileAvatar } : {}
258
250
  };
259
251
  }
260
- function selectFallbackMember(members) {
261
- return members.find((member) => member.role === "owner") ?? members[0] ?? null;
262
- }
263
252
  function resolveProvider(session, presence) {
264
253
  const sessionProvider = normalizeProvider(session.provider);
265
254
  if (sessionProvider) {
@@ -300,19 +289,11 @@ function resolveWorkspaceAgentActivityStatus(session, messages = []) {
300
289
  function resolveWorkspaceAgentActivityTitle(session, messages = []) {
301
290
  const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);
302
291
  const userMessageTitle = firstUserMessageText(messages);
303
- if (sessionTitle && !isProviderPlaceholderTitleForSession(sessionTitle, session)) {
292
+ if (sessionTitle) {
304
293
  return sessionTitle;
305
294
  }
306
295
  return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();
307
296
  }
308
- function isProviderPlaceholderTitleForSession(title, session) {
309
- const provider = normalizeProvider(session.provider);
310
- if (!provider) {
311
- return false;
312
- }
313
- const normalizedTitle = title.trim().toLowerCase();
314
- return workspaceAgentProviderLabel(provider).toLowerCase() === normalizedTitle;
315
- }
316
297
  function resolveLatestActivity(messages, status, actors) {
317
298
  const latestMessage = latestDisplayableMessage(messages);
318
299
  if (latestMessage) {
@@ -845,4 +826,4 @@ export {
845
826
  resolveWorkspaceAgentActivityStatus,
846
827
  resolveWorkspaceAgentActivityTitle
847
828
  };
848
- //# sourceMappingURL=chunk-3PKRGSMH.js.map
829
+ //# sourceMappingURL=chunk-52GTPN7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/workspaceAgentActivityListViewModel.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts"],"sourcesContent":["import {\n normalizeAgentActivityDisplayStatus,\n resolveLatestAgentActivityMessageDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentHostUserInfo } from \"./contracts/dto\";\nimport { translate } from \"../i18n/index\";\nimport { fileChangePathsFromChanges } from \"./workspaceAgentFileChangePayload\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"./workspaceAgentSessionTitle\";\nimport type { WorkspaceAgentToolCallDisplay } from \"./workspaceAgentToolCallDisplay\";\nimport {\n fallbackSummary,\n type WorkspaceAgentConversationPreviewLine,\n type WorkspaceAgentLatestActivityStatus\n} from \"./workspaceAgentLatestActivitySummary\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport {\n isWorkspaceAgentActivityRuntimeSessionOrigin,\n type WorkspaceAgentActivityMessage,\n type WorkspaceAgentActivityPresence,\n type WorkspaceAgentActivitySession,\n type WorkspaceAgentActivitySnapshot\n} from \"./workspaceAgentActivityTypes\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"./workspaceAgentSessionSortTime\";\n\nexport type WorkspaceAgentActivityStatus = WorkspaceAgentLatestActivityStatus;\n\nexport interface WorkspaceAgentChangedFile {\n path: string;\n label: string;\n}\n\nexport interface WorkspaceAgentActivityCard {\n id: string;\n sessionId: string;\n userId: string | null;\n userName: string;\n userAvatarUrl?: string;\n agentProvider: string;\n agentName: string;\n title: string;\n status: WorkspaceAgentActivityStatus;\n latestActivitySummary: string;\n /** User prompt + latest agent reply for task/issue execution cards; room status list uses single-line summary only. */\n conversationPreview?: WorkspaceAgentConversationPreviewLine[];\n latestActivityActorName?: string;\n toolCalls?: WorkspaceAgentToolCallDisplay[];\n changedFiles: WorkspaceAgentChangedFile[];\n sortTimeUnixMs: number;\n readTimeUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityListViewModel {\n activities: WorkspaceAgentActivityCard[];\n}\n\nexport interface BuildWorkspaceAgentActivityListOptions {\n sessionMessagesById?: Record<string, WorkspaceAgentActivityMessage[]>;\n userProfilesById?: Record<string, AgentHostUserInfo>;\n}\n\nexport interface CollectWorkspaceAgentGeneratedFilesOptions {\n workspaceRoot?: string | null;\n /** When set, only include files from sessions whose cwd matches this path. */\n sessionCwd?: string | null;\n}\n\nexport function collectWorkspaceAgentGeneratedFiles(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: CollectWorkspaceAgentGeneratedFilesOptions = {}\n): WorkspaceAgentChangedFile[] {\n const sessionCwdFilter = normalizeComparablePath(options.sessionCwd ?? \"\");\n const workspaceRoot =\n sessionCwdFilter ||\n normalizeComparablePath(options.workspaceRoot ?? \"\") ||\n resolveWorkspaceRootFromSessions(snapshot.sessions);\n const sessions = sessionCwdFilter\n ? snapshot.sessions.filter(\n (session) =>\n normalizeComparablePath(session.cwd ?? \"\") === sessionCwdFilter\n )\n : snapshot.sessions;\n const filesByPath = new Map<string, WorkspaceAgentChangedFile>();\n\n for (const session of sessions) {\n const sessionCwd =\n normalizeComparablePath(session.cwd ?? \"\") || workspaceRoot;\n const normalizePath = createAgentGeneratedFilePathNormalizer({\n sessionCwd,\n workspaceRoot\n });\n const messages = resolveWorkspaceAgentSessionMessages(\n snapshot.sessionMessagesById,\n session\n );\n if (messages.length === 0) {\n continue;\n }\n for (const file of changedFilesForSession(messages, normalizePath, {\n requireSuccessfulFileChangeTool: true\n })) {\n filesByPath.set(file.path, file);\n }\n for (const path of imageGenerationPathsFromMessages(\n messages,\n normalizePath\n )) {\n if (filesByPath.has(path)) {\n continue;\n }\n filesByPath.set(path, {\n path,\n label: path.split(\"/\").filter(Boolean).at(-1) ?? path\n });\n }\n }\n\n return applyShortestUniqueFileLabels([...filesByPath.values()]);\n}\n\nexport function buildWorkspaceAgentActivityListViewModel(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: BuildWorkspaceAgentActivityListOptions = {}\n): WorkspaceAgentActivityListViewModel {\n const presencesById = new Map(\n snapshot.presences.map((presence) => [presence.id, presence])\n );\n\n const activities = snapshot.sessions\n .map((session): WorkspaceAgentActivityCard | null => {\n const presence =\n session.presenceId === undefined\n ? null\n : (presencesById.get(session.presenceId) ?? null);\n const messages = resolveWorkspaceAgentSessionMessages(\n options.sessionMessagesById,\n session\n );\n const status = resolveWorkspaceAgentActivityStatus(session, messages);\n if (\n shouldHideEmptyRuntimePlaceholderSession(\n session,\n messages,\n status,\n options\n )\n ) {\n return null;\n }\n const user = resolveActivityUser(session, presence, options);\n const agentProvider = resolveProvider(session, presence);\n const agentName = workspaceAgentProviderLabel(agentProvider);\n const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n const latestActivity = resolveLatestActivity(messages, status, {\n agentName,\n userName: user.userName\n });\n\n const activity: WorkspaceAgentActivityCard = {\n id: `activity-${session.agentSessionId}`,\n sessionId: session.agentSessionId,\n userId: user.userId,\n userName: user.userName,\n ...(user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {}),\n agentProvider,\n agentName,\n title: resolveWorkspaceAgentActivityTitle(session, messages),\n status,\n latestActivitySummary: latestActivity.summary,\n latestActivityActorName: latestActivity.actorName,\n changedFiles: changedFilesForSession(messages),\n sortTimeUnixMs: resolvedSortTimeUnixMs,\n readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)\n };\n\n return activity;\n })\n .filter(\n (activity): activity is WorkspaceAgentActivityCard => activity !== null\n )\n .sort(compareActivities);\n\n return { activities };\n}\n\nexport function reuseWorkspaceAgentActivityListViewModelIfUnchanged(\n previous: WorkspaceAgentActivityListViewModel | null,\n next: WorkspaceAgentActivityListViewModel\n): WorkspaceAgentActivityListViewModel {\n if (!previous) {\n return next;\n }\n if (next.activities.length === 0) {\n return previous.activities.length === 0 ? previous : next;\n }\n\n const previousActivitiesById = new Map(\n previous.activities.map((activity) => [activity.id, activity])\n );\n const activities = next.activities.map((activity) => {\n const previousActivity = previousActivitiesById.get(activity.id);\n if (\n !previousActivity ||\n !workspaceAgentActivityCardEquals(previousActivity, activity)\n ) {\n return activity;\n }\n return previousActivity;\n });\n const reusedEveryActivityInPlace =\n previous.activities.length === activities.length &&\n previous.activities.every(\n (activity, index) => activity === activities[index]\n );\n\n return reusedEveryActivityInPlace ? previous : { activities };\n}\nexport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\n\nfunction shouldHideEmptyRuntimePlaceholderSession(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n options: BuildWorkspaceAgentActivityListOptions\n): boolean {\n if (!isWorkspaceAgentActivityRuntimeSessionOrigin(session.sessionOrigin)) {\n return false;\n }\n if (messages.length > 0) {\n return false;\n }\n if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {\n return false;\n }\n if (!isRuntimePlaceholderTerminalStatus(status)) {\n return false;\n }\n return resolveDisplayableWorkspaceAgentSessionTitle(session) === \"\";\n}\n\nfunction hasLoadedSessionMessageRecord(\n session: WorkspaceAgentActivitySession,\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined\n): boolean {\n if (!sessionMessagesById) {\n return false;\n }\n return workspaceAgentSessionMessageAliases(session).some(\n (alias) => alias in sessionMessagesById\n );\n}\n\nfunction isRuntimePlaceholderTerminalStatus(\n status: WorkspaceAgentActivityStatus\n): boolean {\n return status === \"idle\" || status === \"completed\" || status === \"canceled\";\n}\n\nfunction workspaceAgentActivityCardEquals(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): boolean {\n return (\n left.id === right.id &&\n left.sessionId === right.sessionId &&\n left.userId === right.userId &&\n left.userName === right.userName &&\n left.userAvatarUrl === right.userAvatarUrl &&\n left.agentProvider === right.agentProvider &&\n left.agentName === right.agentName &&\n left.title === right.title &&\n left.status === right.status &&\n left.latestActivitySummary === right.latestActivitySummary &&\n left.latestActivityActorName === right.latestActivityActorName &&\n left.sortTimeUnixMs === right.sortTimeUnixMs &&\n JSON.stringify(left.conversationPreview ?? []) ===\n JSON.stringify(right.conversationPreview ?? []) &&\n JSON.stringify(left.toolCalls ?? []) ===\n JSON.stringify(right.toolCalls ?? []) &&\n JSON.stringify(left.changedFiles) === JSON.stringify(right.changedFiles)\n );\n}\n\nfunction resolveWorkspaceAgentSessionMessages(\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined,\n session: WorkspaceAgentActivitySession\n): WorkspaceAgentActivityMessage[] {\n if (!sessionMessagesById) {\n return [];\n }\n for (const alias of workspaceAgentSessionMessageAliases(session)) {\n const messages = sessionMessagesById[alias];\n if (messages) {\n return messages;\n }\n }\n return [];\n}\n\nfunction resolveActivityUser(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n if (presence) {\n return resolveUserFromId(presence.userId ?? \"\", options);\n }\n\n const sessionUserId = session.userId?.trim() ?? \"\";\n if (sessionUserId) {\n return resolveUserFromId(sessionUserId, options);\n }\n\n return {\n userId: null,\n userName: \"Unknown member\"\n };\n}\n\nfunction resolveUserFromId(\n rawUserId: string,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n const userId = rawUserId.trim();\n const profile = options.userProfilesById?.[userId];\n const profileName = compactText(profile?.name ?? \"\");\n const profileAvatar = profile?.avatar?.trim();\n const rawName = profileName || userId || \"Unknown member\";\n\n return {\n userId,\n userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,\n ...(profileAvatar ? { userAvatarUrl: profileAvatar } : {})\n };\n}\n\nfunction resolveProvider(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null\n): string {\n const sessionProvider = normalizeProvider(session.provider);\n if (sessionProvider) {\n return sessionProvider;\n }\n\n const presenceProvider = normalizeProvider(presence?.provider);\n if (presenceProvider) {\n return presenceProvider;\n }\n\n return \"unknown\";\n}\n\nfunction normalizeProvider(provider: string | undefined): string | null {\n const trimmed = provider?.trim();\n return trimmed ? trimmed.toLowerCase() : null;\n}\n\nexport function resolveWorkspaceAgentActivityStatus(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): WorkspaceAgentActivityStatus {\n const sessionStatus = normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase\n });\n const normalized =\n sessionStatus === \"failed\"\n ? (resolveLatestAgentActivityMessageDisplayStatus(messages) ??\n sessionStatus)\n : sessionStatus;\n switch (normalized) {\n case \"failed\":\n return \"failed\";\n case \"canceled\":\n return \"canceled\";\n case \"completed\":\n return \"completed\";\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n default:\n return \"idle\";\n }\n}\n\nexport function resolveWorkspaceAgentActivityTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): string {\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);\n const userMessageTitle = firstUserMessageText(messages);\n if (sessionTitle) {\n return sessionTitle;\n }\n return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();\n}\n\nfunction resolveLatestActivity(\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n actors: { agentName: string; userName: string }\n): { actorName: string; summary: string } {\n const latestMessage = latestDisplayableMessage(messages);\n if (latestMessage) {\n return {\n actorName:\n messageRole(latestMessage.message) === \"user\"\n ? actors.userName\n : actors.agentName,\n summary: latestMessage.text\n };\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\ntype ChangedFilePathNormalizer = (value: unknown) => string | null;\n\ninterface ChangedFileCollectionOptions {\n requireSuccessfulFileChangeTool?: boolean;\n}\n\nfunction changedFilesForSession(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): WorkspaceAgentChangedFile[] {\n const changedFilesByPath = new Map<string, WorkspaceAgentChangedFile>();\n const appendPath = (path: string | null): void => {\n if (!path || changedFilesByPath.has(path)) {\n return;\n }\n changedFilesByPath.set(path, {\n path,\n label: path\n });\n };\n\n for (const message of messages) {\n for (const path of changedFilePathsFromMessage(\n message,\n normalizePath,\n options\n )) {\n appendPath(path);\n }\n }\n\n return applyShortestUniqueFileLabels(Array.from(changedFilesByPath.values()));\n}\n\nfunction changedFilePathsFromMessage(\n message: WorkspaceAgentActivityMessage,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): string[] {\n const isSuccessfulFileChangeTool = isSuccessfulFileChangeToolMessage(message);\n if (options.requireSuccessfulFileChangeTool && !isSuccessfulFileChangeTool) {\n return [];\n }\n const payload = objectValue(message.payload);\n const explicitFileChanges = fileChangePaths(\n arrayValue(objectValue(payload?.fileChanges)?.files),\n normalizePath\n );\n if (explicitFileChanges.length > 0) {\n return explicitFileChanges;\n }\n if (!isSuccessfulFileChangeTool) {\n return [];\n }\n\n const toolState = objectValue(payload?.tool_state);\n const input =\n objectValue(payload?.input) ?? objectValue(toolState?.input) ?? null;\n const output = objectValue(payload?.output);\n const paths = dedupeStrings([\n ...pathsValue(payload?.paths, normalizePath),\n ...pathsValue(output?.paths, normalizePath),\n ...pathsValue(input?.paths, normalizePath),\n ...changeMapPaths(payload?.changes, normalizePath),\n ...changeMapPaths(output?.changes, normalizePath),\n ...changeMapPaths(input?.changes, normalizePath),\n ...contentDiffPaths(payload?.content, normalizePath),\n ...contentDiffPaths(output?.content, normalizePath),\n ...contentDiffPaths(input?.content, normalizePath),\n stringValue(payload?.path),\n stringValue(payload?.filePath),\n stringValue(payload?.file_path),\n stringValue(input?.path),\n stringValue(input?.filePath),\n stringValue(input?.file_path),\n stringValue(output?.path),\n stringValue(output?.filePath),\n stringValue(output?.file_path)\n ]);\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction defaultChangedFilePathNormalizer(value: unknown): string | null {\n return normalizedChangedFilePath(value);\n}\n\nfunction resolveWorkspaceRootFromSessions(\n sessions: readonly WorkspaceAgentActivitySession[]\n): string {\n for (const session of sessions) {\n const cwd = normalizeComparablePath(session.cwd ?? \"\");\n if (cwd) {\n return cwd;\n }\n }\n return \"\";\n}\n\nfunction normalizeComparablePath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction createAgentGeneratedFilePathNormalizer(input: {\n sessionCwd?: string | null;\n workspaceRoot?: string | null;\n}): ChangedFilePathNormalizer {\n const workspaceRoot = input.workspaceRoot?.trim().replace(/\\/+$/, \"\") ?? \"\";\n const sessionCwd =\n input.sessionCwd?.trim().replace(/\\/+$/, \"\") || workspaceRoot;\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return null;\n }\n return resolveAgentGeneratedFilePath(value, workspaceRoot, sessionCwd);\n };\n}\n\nfunction resolveAgentGeneratedFilePath(\n rawPath: string,\n workspaceRoot: string,\n sessionCwd: string\n): string | null {\n const path = rawPath.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (path.startsWith(\"/workspace/\")) {\n return path;\n }\n if (isAgentStateGeneratedImagePath(path)) {\n return path;\n }\n if (isAbsoluteAgentGeneratedFilePath(path)) {\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(path, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(path)\n ) {\n return null;\n }\n return path.replace(/\\\\/g, \"/\");\n }\n\n const base = sessionCwd || workspaceRoot;\n if (!base) {\n return null;\n }\n const resolved = joinAgentGeneratedFilePath(base, path.replace(/^\\.?\\//, \"\"));\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(resolved, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(resolved)\n ) {\n return null;\n }\n return resolved;\n}\n\nfunction isAbsoluteAgentGeneratedFilePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(path);\n}\n\nfunction isPathInsideOrEqual(path: string, root: string): boolean {\n const normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!normalizedRoot) {\n return false;\n }\n return (\n normalizedPath === normalizedRoot ||\n normalizedPath.startsWith(`${normalizedRoot}/`)\n );\n}\n\nfunction joinAgentGeneratedFilePath(\n base: string,\n relativePath: string\n): string {\n const normalizedBase = base.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRelative = relativePath.replace(/\\\\/g, \"/\");\n return `${normalizedBase}/${normalizedRelative}`;\n}\n\nfunction imageGenerationPathsFromMessages(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer\n): string[] {\n const paths: string[] = [];\n for (const message of messages) {\n const payload = objectValue(message.payload);\n if (!payload) {\n continue;\n }\n const output = objectValue(payload.output);\n for (const uri of [\n ...imageGenerationUris(payload.content),\n ...imageGenerationUris(output?.content)\n ]) {\n const normalized = normalizePath(uri);\n if (normalized) {\n paths.push(normalized);\n }\n }\n }\n return dedupeStrings(paths);\n}\n\nfunction imageGenerationUris(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const uris: string[] = [];\n for (const item of value) {\n const record = objectValue(item);\n if (!record) {\n continue;\n }\n const type = stringValue(record.type)?.toLowerCase();\n const uri = stringValue(record.uri) ?? stringValue(record.path);\n if (!uri) {\n continue;\n }\n if (\n type === \"image\" ||\n uri.toLowerCase().includes(\"generated_images\") ||\n /\\.(?:png|jpe?g|gif|webp|bmp|svg)$/i.test(uri)\n ) {\n uris.push(uri);\n }\n }\n return uris;\n}\n\nfunction isAgentStateGeneratedImagePath(path: string): boolean {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return false;\n }\n const statePath = segments.slice(stateRootIndex);\n return (\n statePath[1] === \"agent\" &&\n statePath[2] === \"runs\" &&\n statePath.includes(\"generated_images\")\n );\n}\n\nfunction normalizedChangedFilePath(\n value: unknown,\n options: { allowRelative?: boolean } = {}\n): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const path = value.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (!options.allowRelative && !path.startsWith(\"/workspace/\")) {\n return null;\n }\n return path;\n}\n\nfunction applyShortestUniqueFileLabels(\n files: WorkspaceAgentChangedFile[]\n): WorkspaceAgentChangedFile[] {\n const suffixByPath = shortestUniquePathSuffixByPath(\n files.map((file) => file.path)\n );\n return files.map((file) => ({\n ...file,\n label: suffixByPath.get(file.path) ?? file.label\n }));\n}\n\nfunction shortestUniquePathSuffixByPath(paths: string[]): Map<string, string> {\n const partsByPath = new Map(\n paths.map((path) => [path, splitPathSegments(path)])\n );\n const labels = new Map<string, string>();\n const unresolved = new Set(paths);\n\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const suffix = parts.slice(-Math.min(depth, parts.length)).join(\"/\");\n const fallback = parts.at(-1) ?? path;\n const label = suffix || fallback;\n const group = grouped.get(label);\n if (group) {\n group.push(path);\n } else {\n grouped.set(label, [path]);\n }\n }\n\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1) {\n continue;\n }\n const path = group[0];\n if (!path) {\n continue;\n }\n labels.set(path, label);\n unresolved.delete(path);\n resolvedCount += 1;\n }\n\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n\n return labels;\n}\n\nfunction splitPathSegments(path: string): string[] {\n return path.trim().split(/[\\\\/]/).filter(Boolean);\n}\n\nfunction isSuccessfulFileChangeToolMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n if (normalizeToken(message.kind) !== \"tool_call\") {\n return false;\n }\n if (!isSuccessfulFileChangeStatus(message.status ?? undefined)) {\n return false;\n }\n const payload = objectValue(message.payload);\n if (!isSuccessfulFileChangePayloadStatus(payload)) {\n return false;\n }\n return hasFileChangeSignal(payload);\n}\n\nfunction isSuccessfulFileChangePayloadStatus(\n payload: Record<string, unknown> | null\n): boolean {\n if (!payload) {\n return true;\n }\n if (!isSuccessfulFileChangeRecordStatus(payload)) {\n return false;\n }\n const output = objectValue(payload.output);\n if (output && !isSuccessfulFileChangeRecordStatus(output)) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeRecordStatus(\n record: Record<string, unknown>\n): boolean {\n const status = stringValue(record.status);\n if (status && !isSuccessfulFileChangeStatus(status)) {\n return false;\n }\n const success = booleanValue(record.success);\n if (success === false) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeStatus(value: string | undefined): boolean {\n const normalizedStatus = normalizeToken(value);\n return (\n !normalizedStatus ||\n normalizedStatus === \"completed\" ||\n normalizedStatus === \"success\" ||\n normalizedStatus === \"succeeded\" ||\n normalizedStatus === \"ok\"\n );\n}\n\nfunction hasFileChangeSignal(payload: Record<string, unknown> | null): boolean {\n if (!payload) {\n return false;\n }\n const toolState = objectValue(payload.tool_state);\n return [\n payload,\n objectValue(payload.input),\n objectValue(payload.output),\n objectValue(toolState?.input)\n ].some((record) => record !== null && recordHasFileChangeToolSignal(record));\n}\n\nfunction recordHasFileChangeToolSignal(\n record: Record<string, unknown>\n): boolean {\n const activityKind = stringValue(record.activityKind);\n if (\n activityKind &&\n isFileChangeNormalizedToolName(normalizeToolName(activityKind))\n ) {\n return true;\n }\n if (stringValue(record.fileChangeKind)) {\n return true;\n }\n const toolCall = objectValue(record.toolCall);\n const toolCallKind = normalizeToken(stringValue(toolCall?.kind) ?? undefined);\n if (\n toolCallKind === \"write\" ||\n toolCallKind === \"edit\" ||\n toolCallKind === \"delete\"\n ) {\n return true;\n }\n const toolName = normalizeToolName(\n stringValue(record.toolName) ??\n stringValue(record.title) ??\n stringValue(record.name) ??\n \"\"\n );\n return isFileChangeNormalizedToolName(toolName);\n}\n\nfunction isFileChangeNormalizedToolName(normalizedToolName: string): boolean {\n if (!normalizedToolName) {\n return false;\n }\n const exactMatches = new Set([\n \"write\",\n \"writefile\",\n \"create\",\n \"createfile\",\n \"delete\",\n \"deletefile\",\n \"edit\",\n \"editfile\",\n \"multiedit\",\n \"applypatch\",\n \"move\",\n \"notebookedit\"\n ]);\n if (exactMatches.has(normalizedToolName)) {\n return true;\n }\n for (const prefix of exactMatches) {\n if (normalizedToolName.startsWith(`${prefix}/`)) {\n return true;\n }\n }\n return false;\n}\n\nfunction fileChangePaths(\n files: readonly unknown[] | null,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n if (!files) {\n return [];\n }\n return files\n .map((file) => normalizePath(objectValue(file)?.path))\n .filter((path): path is string => path !== null);\n}\n\nfunction changeMapPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n return fileChangePathsFromChanges(value)\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction contentDiffPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const content = arrayValue(value);\n if (!content) {\n return [];\n }\n return content\n .map((entry) => {\n const record = objectValue(entry);\n if (!record || stringValue(record.type) !== \"diff\") {\n return null;\n }\n return normalizePath(record.path);\n })\n .filter((path): path is string => path !== null);\n}\n\nfunction pathsValue(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const paths = arrayValue(value);\n if (!paths) {\n return [];\n }\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction dedupeStrings(values: Array<string | null>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0\n )\n )\n ];\n}\n\nfunction normalizeToolName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replaceAll(\"_\", \"\")\n .replaceAll(\"-\", \"\")\n .replaceAll(\" \", \"\");\n}\n\nfunction isStructuredPayloadPath(path: string): boolean {\n if (/[\\r\\n]/.test(path)) {\n return true;\n }\n if (!path.startsWith(\"{\") && !path.startsWith(\"[\")) {\n return false;\n }\n try {\n JSON.parse(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readTimeUnixMs(\n session: WorkspaceAgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n fallbackUnixMs: number\n): number {\n if (status === \"completed\" || status === \"failed\") {\n return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;\n }\n return fallbackUnixMs;\n}\n\nfunction firstUserMessageText(\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n const firstUserMessage = messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) => messageRole(item.message) === \"user\" && item.text.length > 0\n )\n .sort((left, right) => {\n const timeDiff = (left.time ?? 0) - (right.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (left.message.id ?? 0) - (right.message.id ?? 0) ||\n left.message.messageId.localeCompare(right.message.messageId)\n );\n })[0];\n\n return firstUserMessage?.text ?? \"\";\n}\n\nfunction latestDisplayableMessage(\n messages: readonly WorkspaceAgentActivityMessage[]\n): {\n message: WorkspaceAgentActivityMessage;\n text: string;\n time?: number;\n} | null {\n return (\n messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) =>\n item.text.length > 0 &&\n normalizeToken(item.message.kind) !== \"tool_call\"\n )\n .sort((left, right) => {\n const timeDiff = (right.time ?? 0) - (left.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (right.message.id ?? 0) - (left.message.id ?? 0) ||\n right.message.messageId.localeCompare(left.message.messageId)\n );\n })[0] ?? null\n );\n}\n\nfunction messageDisplayText(message: WorkspaceAgentActivityMessage): string {\n const payload = message.payload ?? {};\n const text = normalizeAgentTitleText(\n compactText(\n stringValue(payload.displayPrompt) ||\n stringValue(payload.text) ||\n stringValue(payload.content) ||\n stringValue(payload.message) ||\n stringValue(payload.body) ||\n stringValue(payload.title) ||\n \"\"\n )\n );\n return isWorkspaceAgentSyntheticControlMessage(text) ? \"\" : text;\n}\n\nfunction messageRole(message: WorkspaceAgentActivityMessage): string {\n return normalizeToken(message.role);\n}\n\nfunction messageTime(\n message: WorkspaceAgentActivityMessage\n): number | undefined {\n return (\n message.occurredAtUnixMs ??\n message.completedAtUnixMs ??\n message.startedAtUnixMs\n );\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n\nfunction compareActivities(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): number {\n const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return left.sessionId.localeCompare(right.sessionId);\n}\n\nfunction compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return normalizeAgentTitleText(\n translate(\"agentHost.workspaceAgentsUntitledTask\")\n );\n}\n\nfunction workspaceAgentSessionMessageAliases(\n session: WorkspaceAgentActivitySession\n): string[] {\n const values = [\n session.syncState?.agentSessionId,\n session.agentSessionId,\n session.providerSessionId\n ];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\n/** Remove trailing ` (user@host...)` that some APIs pack into names. */\nfunction stripTrailingParentheticalEmailFromLabel(label: string): string {\n return label\n .trim()\n .replace(/\\s*\\([^)]*@[^)]+\\)\\s*$/u, \"\")\n .trim();\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\nimport { translate, translateInUiLanguage } from \"../i18n/index\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\n\nexport type WorkspaceAgentLatestActivityStatus =\n | \"working\"\n | \"waiting\"\n | \"idle\"\n | \"completed\"\n | \"canceled\"\n | \"failed\";\n\nexport interface WorkspaceAgentLatestActivityActors {\n agentName: string;\n userName: string;\n}\n\nexport interface WorkspaceAgentLatestActivitySummary {\n actorName: string;\n summary: string;\n}\n\nexport interface WorkspaceAgentConversationPreviewLine {\n actorName: string;\n summary: string;\n}\n\nexport function activityTitleFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n fallbackTitle = \"\"\n): string {\n return (\n compactText(fallbackTitle) ||\n latestUserMessageText(timelineItems) ||\n workspaceAgentUntitledTaskLabel()\n );\n}\n\nexport function resolveLatestActivitySummary(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n status: WorkspaceAgentLatestActivityStatus,\n actors: WorkspaceAgentLatestActivityActors\n): WorkspaceAgentLatestActivitySummary {\n for (const item of [...timelineItems].sort(compareTimelineItemsDescending)) {\n const summary = displayableActivitySummary(item);\n if (summary) {\n return {\n actorName: activityActorName(item, actors),\n summary\n };\n }\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\nexport function fallbackSummary(\n status: WorkspaceAgentLatestActivityStatus\n): string {\n switch (status) {\n case \"working\":\n return translate(\"agentHost.workspaceAgentActivityStatusWorking\");\n case \"waiting\":\n return translate(\"agentHost.workspaceAgentActivityStatusWaiting\");\n case \"idle\":\n return translate(\"agentHost.workspaceAgentActivityStatusIdle\");\n case \"canceled\":\n case \"completed\":\n return translate(\"agentHost.workspaceAgentActivityStatusEnd\");\n case \"failed\":\n return translate(\"agentHost.workspaceAgentActivityStatusFailed\");\n }\n}\n\nexport function isWorkspaceAgentIdleSummary(summary: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentActivityStatusIdle\"\n ).has(compactText(summary));\n}\n\nexport function isWorkspaceAgentUntitledTask(title: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentsUntitledTask\"\n ).has(compactText(title));\n}\n\nexport function latestUserMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestUserMessageText(timelineItems);\n}\n\nexport function latestAgentMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestAgentMessageText(timelineItems);\n}\n\nexport function buildUserAndAgentConversationPreview(input: {\n timelineItems: WorkspaceAgentActivityTimelineItem[];\n userName: string;\n agentName: string;\n userPromptFallback?: string;\n status: WorkspaceAgentLatestActivityStatus;\n}): WorkspaceAgentConversationPreviewLine[] {\n const timeline = input.timelineItems ?? [];\n const lines: WorkspaceAgentConversationPreviewLine[] = [];\n const userMessage =\n compactText(input.userPromptFallback ?? \"\") ||\n latestUserMessageFromTimeline(timeline);\n\n if (userMessage) {\n lines.push({ actorName: input.userName, summary: userMessage });\n }\n\n const agentMessage = latestAgentMessageFromTimeline(timeline);\n if (agentMessage) {\n lines.push({ actorName: input.agentName, summary: agentMessage });\n } else if (userMessage || timeline.length > 0) {\n const latestActivity = resolveLatestActivitySummary(\n timeline,\n input.status,\n {\n userName: input.userName,\n agentName: input.agentName\n }\n );\n if (\n latestActivity.actorName === input.agentName &&\n latestActivity.summary\n ) {\n lines.push({\n actorName: input.agentName,\n summary: latestActivity.summary\n });\n } else {\n lines.push({\n actorName: input.agentName,\n summary: fallbackSummary(input.status)\n });\n }\n }\n\n return lines;\n}\n\nfunction latestUserMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestUserMessage = [...timelineItems]\n .filter(isUserMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestUserMessage) {\n return \"\";\n }\n\n return firstPresentText(\n stringPayloadValue(latestUserMessage, \"displayPrompt\"),\n stringPayloadValue(latestUserMessage, \"text\"),\n stringPayloadValue(latestUserMessage, \"content\"),\n latestUserMessage.content\n );\n}\n\nfunction displayableActivitySummary(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n if (messageRole(item)) {\n return messageContent(item);\n }\n\n return \"\";\n}\n\nfunction activityActorName(\n item: WorkspaceAgentActivityTimelineItem,\n actors: WorkspaceAgentLatestActivityActors\n): string {\n return messageRole(item) === \"user\" ? actors.userName : actors.agentName;\n}\n\nfunction isUserMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"user\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction latestAgentMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestAgentMessage = [...timelineItems]\n .filter(isAgentMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestAgentMessage) {\n return \"\";\n }\n\n return messageContent(latestAgentMessage);\n}\n\nfunction isAgentMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"agent\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction isMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return item.itemType === \"message\" || item.itemType.startsWith(\"message.\");\n}\n\nfunction messageRole(\n item: WorkspaceAgentActivityTimelineItem\n): \"user\" | \"agent\" | null {\n const explicitRole = item.role?.trim().toLowerCase();\n if (explicitRole === \"user\") {\n return \"user\";\n }\n if (explicitRole === \"assistant\" || explicitRole === \"agent\") {\n return \"agent\";\n }\n\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType === \"message.user\") {\n return \"user\";\n }\n if (itemType === \"message.agent\" || itemType === \"message.assistant\") {\n return \"agent\";\n }\n return null;\n}\n\nfunction messageContent(item: WorkspaceAgentActivityTimelineItem): string {\n const content = firstPresentText(\n stringPayloadValue(item, \"displayPrompt\"),\n stringPayloadValue(item, \"text\"),\n stringPayloadValue(item, \"content\"),\n item.content\n );\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n}\n\nfunction stringPayloadValue(\n item: WorkspaceAgentActivityTimelineItem,\n key: \"content\" | \"displayPrompt\" | \"summary\" | \"text\"\n): string {\n const value = item.payload?.[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction compareTimelineItemsDescending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n const leftTime = timelineTime(left);\n const rightTime = timelineTime(right);\n const timeDiff = (rightTime ?? 0) - (leftTime ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return right.id - left.id || right.eventId.localeCompare(left.eventId);\n}\n\nfunction timelineTime(\n item: WorkspaceAgentActivityTimelineItem | null | undefined\n): number | null {\n if (!item) {\n return null;\n }\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null;\n}\n\nfunction firstPresentText(...values: Array<string | undefined>): string {\n for (const value of values) {\n const text = compactText(value ?? \"\");\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nfunction compactText(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return translate(\"agentHost.workspaceAgentsUntitledTask\");\n}\n\nfunction localizedWorkspaceAgentLabelSet(key: string): Set<string> {\n return new Set(\n ([\"en\", \"zh-CN\"] as const)\n .map((language) => compactText(translateInUiLanguage(language, key)))\n .filter(Boolean)\n );\n}\n","import { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { isWorkspaceAgentUntitledTask } from \"./workspaceAgentLatestActivitySummary\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivitySession } from \"./workspaceAgentActivityTypes\";\n\nexport function resolveDisplayableWorkspaceAgentSessionTitle(\n session: Pick<WorkspaceAgentActivitySession, \"title\" | \"provider\">\n): string {\n const title = normalizeAgentTitleText(session.title);\n if (\n !title ||\n isWorkspaceAgentUntitledTask(title) ||\n isWorkspaceAgentSyntheticControlMessage(title)\n ) {\n return \"\";\n }\n const provider = session.provider?.trim();\n if (\n provider &&\n workspaceAgentProviderLabel(provider).toLowerCase() === title.toLowerCase()\n ) {\n return \"\";\n }\n return title;\n}\n"],"mappings":"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","names":["compactText"]}
@@ -15,7 +15,7 @@ import {
15
15
  resolveWorkspaceFilePathCandidate,
16
16
  resolveWorkspaceLinkAction,
17
17
  useAgentTargetPresentations
18
- } from "./chunk-IVIXKAEH.js";
18
+ } from "./chunk-3FYA2K4P.js";
19
19
  import {
20
20
  classifyFailedAgentMessage,
21
21
  openAgentEnvPanel,
@@ -28,7 +28,7 @@ import {
28
28
  formatAgentMentionMarkdown,
29
29
  mentionItemToAttrs,
30
30
  parseAgentMentionMarkdown
31
- } from "./chunk-KWQ4N4IZ.js";
31
+ } from "./chunk-KELYWKTC.js";
32
32
  import {
33
33
  fileChangeCountFromChanges,
34
34
  fileChangeEntriesFromChanges,
@@ -38,14 +38,14 @@ import {
38
38
  import {
39
39
  getOptionalAgentActivityRuntime,
40
40
  useOptionalAgentHostApi
41
- } from "./chunk-GDFQXJMG.js";
41
+ } from "./chunk-RIRFNGPB.js";
42
42
  import {
43
43
  workspaceAgentProviderLabel
44
- } from "./chunk-4US2YHBY.js";
44
+ } from "./chunk-4HP6V2YA.js";
45
45
  import {
46
46
  getActiveUiLanguage,
47
47
  translate
48
- } from "./chunk-C7K3EFGI.js";
48
+ } from "./chunk-YWQHNFYA.js";
49
49
 
50
50
  // agent-gui/agentGuiNode/model/agentGuiNodeTypes.ts
51
51
  var AGENT_PASTED_TEXT_BLOCK_KIND = "pasted-text";
@@ -3826,10 +3826,6 @@ function projectAgentProcessingRow(detail, rows) {
3826
3826
  if (!detail.showProcessingIndicator) {
3827
3827
  return null;
3828
3828
  }
3829
- const status = detail.session.status?.trim().toLowerCase() ?? "";
3830
- if (!isWorkingSessionStatus2(status)) {
3831
- return null;
3832
- }
3833
3829
  if (hasSpecificProgressRow(rows)) {
3834
3830
  return null;
3835
3831
  }
@@ -3841,9 +3837,6 @@ function projectAgentProcessingRow(detail, rows) {
3841
3837
  occurredAtUnixMs: detail.session.updatedAtUnixMs ?? detail.session.createdAtUnixMs ?? null
3842
3838
  };
3843
3839
  }
3844
- function isWorkingSessionStatus2(status) {
3845
- return status === "working";
3846
- }
3847
3840
  function hasSpecificProgressRow(rows) {
3848
3841
  return rows.some((row) => {
3849
3842
  if (row.kind !== "tool-group") {
@@ -3957,15 +3950,16 @@ function normalizeAgentPromptContentBlocks(content) {
3957
3950
  }
3958
3951
  if (block.type === "image") {
3959
3952
  const mimeType = block.mimeType?.trim();
3953
+ const attachmentId = block.attachmentId?.trim();
3960
3954
  const data = block.data?.trim();
3961
3955
  const imagePath = block.path?.trim();
3962
- if (!data && !imagePath || mimeType !== "image/png" && mimeType !== "image/jpeg" && mimeType !== "image/webp") {
3956
+ if (!attachmentId && !data && !imagePath || mimeType !== "image/png" && mimeType !== "image/jpeg" && mimeType !== "image/webp") {
3963
3957
  continue;
3964
3958
  }
3965
3959
  result.push({
3966
3960
  type: "image",
3967
3961
  mimeType,
3968
- ...imagePath ? { path: imagePath } : { data },
3962
+ ...attachmentId ? { attachmentId } : imagePath ? { path: imagePath } : { data },
3969
3963
  ...block.name?.trim() ? { name: block.name.trim() } : {}
3970
3964
  });
3971
3965
  continue;
@@ -4008,7 +4002,7 @@ function agentPromptContentHasImage(content) {
4008
4002
  }
4009
4003
  function agentPromptContentImageBlocks(content) {
4010
4004
  return normalizeAgentPromptContentBlocks(content).filter(
4011
- (block) => block.type === "image" && (typeof block.data === "string" || typeof block.path === "string") && typeof block.mimeType === "string"
4005
+ (block) => block.type === "image" && (typeof block.attachmentId === "string" || typeof block.data === "string" || typeof block.path === "string") && typeof block.mimeType === "string"
4012
4006
  );
4013
4007
  }
4014
4008
  function agentPromptContentToComposerDraft(content, idPrefix) {
@@ -4220,6 +4214,7 @@ function agentPromptImageBlockToDraftImage(image, idPrefix, index) {
4220
4214
  id: `${idPrefix}:image:${index}`,
4221
4215
  name: image.name?.trim() || `image-${index + 1}`,
4222
4216
  mimeType: image.mimeType,
4217
+ ...image.attachmentId ? { attachmentId: image.attachmentId } : {},
4223
4218
  ...image.data ? { data: image.data } : {},
4224
4219
  ...image.path ? { path: image.path } : {},
4225
4220
  previewUrl: typeof image.data === "string" && image.data ? `data:${image.mimeType};base64,${image.data}` : image.path ?? ""
@@ -4781,17 +4776,32 @@ function collectMetadataFiles(messageId, toolName, occurredAtUnixMs, files, patc
4781
4776
  if (!path) {
4782
4777
  return [];
4783
4778
  }
4779
+ const fileUnifiedDiff = firstNonEmptyString(
4780
+ stringValue7(file?.diff),
4781
+ stringValue7(file?.patch),
4782
+ stringValue7(file?.unifiedDiff),
4783
+ stringValue7(file?.unified_diff)
4784
+ ) ?? patch;
4785
+ const fileOldString = firstPresentString6(
4786
+ literalStringValue(file?.oldString),
4787
+ literalStringValue(file?.old_string)
4788
+ ) ?? oldString;
4789
+ const fileNewString = firstPresentString6(
4790
+ literalStringValue(file?.newString),
4791
+ literalStringValue(file?.new_string)
4792
+ ) ?? newString;
4793
+ const fileContent = firstPresentString6(literalStringValue(file?.content)) ?? content;
4784
4794
  const change = normalizeChangeType(stringValue7(file?.change));
4785
4795
  return [
4786
4796
  buildFileChange({
4787
4797
  id: `${messageId}:${index + 1}`,
4788
4798
  toolName,
4789
4799
  path,
4790
- changeType: change ?? inferAgentPatchChangeType(patch),
4791
- unifiedDiff: patch,
4792
- oldString,
4793
- newString,
4794
- content,
4800
+ changeType: change ?? inferAgentPatchChangeType(fileUnifiedDiff),
4801
+ unifiedDiff: fileUnifiedDiff,
4802
+ oldString: fileOldString,
4803
+ newString: fileNewString,
4804
+ content: fileContent,
4795
4805
  occurredAtUnixMs
4796
4806
  })
4797
4807
  ];
@@ -5605,13 +5615,13 @@ function isLatestTurnSettled(detail) {
5605
5615
  }
5606
5616
  function isSessionWorking2(detail) {
5607
5617
  const status = normalizedSessionDisplayStatus(detail);
5608
- return isWorkingSessionStatus3(status);
5618
+ return isWorkingSessionStatus2(status);
5609
5619
  }
5610
- function isWorkingSessionStatus3(status) {
5620
+ function isWorkingSessionStatus2(status) {
5611
5621
  return status === "working";
5612
5622
  }
5613
5623
  function isUnsettledSessionStatus(status) {
5614
- return isWorkingSessionStatus3(status) || status === "waiting";
5624
+ return isWorkingSessionStatus2(status) || status === "waiting";
5615
5625
  }
5616
5626
  function normalizeStatusToken2(status) {
5617
5627
  return status?.trim().toLowerCase() ?? "";
@@ -8585,7 +8595,7 @@ function AgentProcessingRow({
8585
8595
  {
8586
8596
  "data-row-id": row.id,
8587
8597
  className: "workspace-agents-status-panel__detail-processing inline-flex items-center gap-1.5",
8588
- children: /* @__PURE__ */ jsxs8("span", { className: "inline-flex min-w-0 items-center gap-inherit font-semibold", children: [
8598
+ children: /* @__PURE__ */ jsxs8("span", { className: "inline-flex min-w-0 items-center gap-1 font-semibold", children: [
8589
8599
  /* @__PURE__ */ jsx13("span", { children: processingLabel(row, label) }),
8590
8600
  /* @__PURE__ */ jsx13(LoadingEllipsis2, {})
8591
8601
  ] })
@@ -9336,7 +9346,12 @@ function fileChangesFiles(value) {
9336
9346
  if (!path) {
9337
9347
  return [];
9338
9348
  }
9339
- const diff = firstString4(stringValue8(file?.diff), stringValue8(file?.patch));
9349
+ const unifiedDiff = firstString4(
9350
+ stringValue8(file?.diff),
9351
+ stringValue8(file?.patch),
9352
+ stringValue8(file?.unifiedDiff),
9353
+ stringValue8(file?.unified_diff)
9354
+ );
9340
9355
  const oldString = firstString4(
9341
9356
  stringValue8(file?.oldString),
9342
9357
  stringValue8(file?.old_string)
@@ -9349,11 +9364,11 @@ function fileChangesFiles(value) {
9349
9364
  const changeType = firstKnownChangeType(
9350
9365
  normalizeChangeType2(stringValue8(file?.change)),
9351
9366
  normalizeChangeType2(stringValue8(file?.kind)),
9352
- inferFileChangeType(null, diff, content, oldString, newString)
9367
+ inferFileChangeType(null, unifiedDiff, content, oldString, newString)
9353
9368
  );
9354
9369
  const stats = fileChangeStats(
9355
9370
  changeType,
9356
- diff,
9371
+ unifiedDiff,
9357
9372
  content,
9358
9373
  oldString,
9359
9374
  newString
@@ -9366,7 +9381,7 @@ function fileChangesFiles(value) {
9366
9381
  content,
9367
9382
  oldString,
9368
9383
  newString,
9369
- unifiedDiff: diff,
9384
+ unifiedDiff,
9370
9385
  added: stats.added,
9371
9386
  removed: stats.removed
9372
9387
  }
@@ -14598,9 +14613,9 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
14598
14613
  });
14599
14614
  const handleLocateUserMessage = useCallback10(
14600
14615
  (item) => {
14601
- const scrollParent = virtualizerHostRef.current?.parentElement ?? null;
14616
+ const queryRoot = virtualizerHostRef.current?.parentElement ?? document;
14602
14617
  const scrollToRenderedRow = () => {
14603
- const renderedRow = (scrollParent ?? document).querySelector(
14618
+ const renderedRow = queryRoot.querySelector(
14604
14619
  `[data-agent-transcript-row="${escapeCssString(item.rowKey)}"]`
14605
14620
  );
14606
14621
  if (!renderedRow) {
@@ -14608,7 +14623,7 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
14608
14623
  }
14609
14624
  scrollTranscriptRowIntoView(
14610
14625
  renderedRow,
14611
- scrollParent ?? findMessageLocatorScrollParent(renderedRow)
14626
+ findMessageLocatorScrollParent(renderedRow)
14612
14627
  );
14613
14628
  return true;
14614
14629
  };
@@ -14629,7 +14644,8 @@ var AgentTranscriptView = memo4(function AgentTranscriptView2({
14629
14644
  setVirtualScrollElement(null);
14630
14645
  return;
14631
14646
  }
14632
- setVirtualScrollElement(virtualizerHostRef.current?.parentElement ?? null);
14647
+ const host = virtualizerHostRef.current;
14648
+ setVirtualScrollElement(host ? findMessageLocatorScrollParent(host) : null);
14633
14649
  }, [shouldVirtualize]);
14634
14650
  const renderRow = (row, rowIndex) => {
14635
14651
  const rowKey = rowKeys[rowIndex] ?? transcriptRowKey(row);
@@ -14750,6 +14766,8 @@ function AgentMessageLocatorRail({
14750
14766
  const locatorRef = useRef8(null);
14751
14767
  const locatorViewportRef = useRef8(null);
14752
14768
  const closePanelTimeoutRef = useRef8(null);
14769
+ const suppressScrollSelectionRef = useRef8(false);
14770
+ const suppressScrollSelectionTimeoutRef = useRef8(null);
14753
14771
  const [isPanelOpen, setIsPanelOpen] = useState18(false);
14754
14772
  const [shouldRenderPanel, setShouldRenderPanel] = useState18(false);
14755
14773
  const [activeKey, setActiveKey] = useState18(null);
@@ -14773,6 +14791,9 @@ function AgentMessageLocatorRail({
14773
14791
  if (closePanelTimeoutRef.current !== null) {
14774
14792
  window.clearTimeout(closePanelTimeoutRef.current);
14775
14793
  }
14794
+ if (suppressScrollSelectionTimeoutRef.current !== null) {
14795
+ window.clearTimeout(suppressScrollSelectionTimeoutRef.current);
14796
+ }
14776
14797
  },
14777
14798
  []
14778
14799
  );
@@ -14865,6 +14886,9 @@ function AgentMessageLocatorRail({
14865
14886
  let animationFrame = null;
14866
14887
  const updateSelectedFromScroll = () => {
14867
14888
  animationFrame = null;
14889
+ if (suppressScrollSelectionRef.current) {
14890
+ return;
14891
+ }
14868
14892
  const nextSelectedKey = selectMessageLocatorItemAtViewportCenter(
14869
14893
  scrollParent,
14870
14894
  items
@@ -14922,6 +14946,14 @@ function AgentMessageLocatorRail({
14922
14946
  setSelectedKey(item.key);
14923
14947
  setActiveKey(item.key);
14924
14948
  markItemRead(item.key);
14949
+ suppressScrollSelectionRef.current = true;
14950
+ if (suppressScrollSelectionTimeoutRef.current !== null) {
14951
+ window.clearTimeout(suppressScrollSelectionTimeoutRef.current);
14952
+ }
14953
+ suppressScrollSelectionTimeoutRef.current = window.setTimeout(() => {
14954
+ suppressScrollSelectionRef.current = false;
14955
+ suppressScrollSelectionTimeoutRef.current = null;
14956
+ }, AGENT_MESSAGE_LOCATOR_SCROLL_DURATION_MS + 120);
14925
14957
  onLocate(item);
14926
14958
  };
14927
14959
  const itemFromPointerEvent = (event) => {
@@ -15024,7 +15056,9 @@ function AgentMessageLocatorRail({
15024
15056
  {
15025
15057
  className: "agent-gui-message-locator__track-segment",
15026
15058
  style: {
15027
- "--agent-message-locator-segment-position": `${index * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX + AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX}px`
15059
+ // Center each segment at the midpoint between the two dots it
15060
+ // connects so the gap above and below the line stays equal.
15061
+ "--agent-message-locator-segment-position": `${index * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX + AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX / 2 + AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX / 2}px`
15028
15062
  },
15029
15063
  "aria-hidden": "true"
15030
15064
  },
@@ -15445,4 +15479,4 @@ export {
15445
15479
  AgentConversationFlow,
15446
15480
  useProjectedAgentConversation
15447
15481
  };
15448
- //# sourceMappingURL=chunk-OBJRIQPX.js.map
15482
+ //# sourceMappingURL=chunk-7GSBP5CN.js.map