@tutti-os/agent-gui 0.0.94 → 0.0.96

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 (163) hide show
  1. package/README.md +86 -38
  2. package/dist/AgentGUI-DWdvUV4x.d.ts +1038 -0
  3. package/dist/agent-conversation/index.d.ts +6 -7
  4. package/dist/agent-conversation/index.js +15 -10
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.d.ts +10 -36
  7. package/dist/agent-env/index.js +2 -57
  8. package/dist/agent-env/index.js.map +1 -1
  9. package/dist/agent-gui.d.ts +21 -0
  10. package/dist/agent-gui.js +39 -0
  11. package/dist/agent-message-center/index.d.ts +156 -124
  12. package/dist/agent-message-center/index.js +1656 -1463
  13. package/dist/agent-message-center/index.js.map +1 -1
  14. package/dist/{agentConversationVM-Cl4G0Lln.d.ts → agentConversationVM-C335TR6S.d.ts} +112 -7
  15. package/dist/agentFileMentionContracts-58IjMU-u.d.ts +108 -0
  16. package/dist/{agentGuiNodeTypes-CAioPXK9.d.ts → agentGuiNodeTypes-B9X4aWfv.d.ts} +123 -163
  17. package/dist/agentPlanPromptDispatch-C7cCMjve.d.ts +37 -0
  18. package/dist/agents.d.ts +13 -0
  19. package/dist/agents.js +13 -0
  20. package/dist/app/renderer/agentactivity.css +276 -83
  21. package/dist/app/renderer/assets/icons/agent-vinyls/tutti-vinyl.png +0 -0
  22. package/dist/app/renderer/assets/icons/open-link-lined.svg +4 -0
  23. package/dist/{chunk-7BUYFVRI.js → chunk-2HJEOO7W.js} +2931 -2946
  24. package/dist/chunk-2HJEOO7W.js.map +1 -0
  25. package/dist/{chunk-E5FOXRUM.js → chunk-3XXBDYAI.js} +293 -258
  26. package/dist/chunk-3XXBDYAI.js.map +1 -0
  27. package/dist/{chunk-ZUW4B5AT.js → chunk-3Y3F7CS5.js} +21 -32
  28. package/dist/chunk-3Y3F7CS5.js.map +1 -0
  29. package/dist/{chunk-SCLLP5DO.js → chunk-4PQPJ5OY.js} +50 -155
  30. package/dist/chunk-4PQPJ5OY.js.map +1 -0
  31. package/dist/chunk-4YG7YK7S.js +23 -0
  32. package/dist/chunk-4YG7YK7S.js.map +1 -0
  33. package/dist/chunk-5X7YDOC6.js +42 -0
  34. package/dist/chunk-5X7YDOC6.js.map +1 -0
  35. package/dist/{chunk-R2EWECUP.js → chunk-7BXWPI4F.js} +17 -2
  36. package/dist/{chunk-R2EWECUP.js.map → chunk-7BXWPI4F.js.map} +1 -1
  37. package/dist/chunk-AGT7MUTV.js +491 -0
  38. package/dist/chunk-AGT7MUTV.js.map +1 -0
  39. package/dist/chunk-C35SNDVZ.js +96 -0
  40. package/dist/chunk-C35SNDVZ.js.map +1 -0
  41. package/dist/{chunk-5FE7M42A.js → chunk-E4HQUTM3.js} +2 -2
  42. package/dist/chunk-FGLQZ6I4.js +9 -0
  43. package/dist/chunk-FGLQZ6I4.js.map +1 -0
  44. package/dist/chunk-H5F3QSCF.js +25 -0
  45. package/dist/chunk-H5F3QSCF.js.map +1 -0
  46. package/dist/chunk-H6IQ63DQ.js +14 -0
  47. package/dist/chunk-H6IQ63DQ.js.map +1 -0
  48. package/dist/{chunk-45FF4DQU.js → chunk-IYEXLOUE.js} +22 -27
  49. package/dist/chunk-IYEXLOUE.js.map +1 -0
  50. package/dist/{chunk-P72YLKC6.js → chunk-JKIZA7EJ.js} +3573 -3755
  51. package/dist/chunk-JKIZA7EJ.js.map +1 -0
  52. package/dist/chunk-KJQERFKX.js +259 -0
  53. package/dist/chunk-KJQERFKX.js.map +1 -0
  54. package/dist/{chunk-XW4CVBUH.js → chunk-L3GMMGRS.js} +25 -16
  55. package/dist/chunk-L3GMMGRS.js.map +1 -0
  56. package/dist/chunk-MASXZENX.js +231 -0
  57. package/dist/chunk-MASXZENX.js.map +1 -0
  58. package/dist/{chunk-BXVPOGYK.js → chunk-O3Q5SIJH.js} +505 -504
  59. package/dist/chunk-O3Q5SIJH.js.map +1 -0
  60. package/dist/{chunk-554VG7ZW.js → chunk-QVBF5BN5.js} +2 -2
  61. package/dist/{chunk-AWAIUYG4.js → chunk-RE4AXS27.js} +532 -565
  62. package/dist/chunk-RE4AXS27.js.map +1 -0
  63. package/dist/{chunk-7LMJXF4R.js → chunk-TVIGLNNI.js} +20 -16
  64. package/dist/chunk-TVIGLNNI.js.map +1 -0
  65. package/dist/{chunk-XDV4ZRVK.js → chunk-UGVI47X6.js} +98 -37
  66. package/dist/chunk-UGVI47X6.js.map +1 -0
  67. package/dist/{chunk-GAPTLVII.js → chunk-UHBCM6RO.js} +1 -1
  68. package/dist/chunk-UHBCM6RO.js.map +1 -0
  69. package/dist/{chunk-UBDPV34P.js → chunk-W6WAGPMD.js} +1385 -1305
  70. package/dist/chunk-W6WAGPMD.js.map +1 -0
  71. package/dist/chunk-WKSFPJHZ.js +33054 -0
  72. package/dist/chunk-WKSFPJHZ.js.map +1 -0
  73. package/dist/{chunk-IGY4ASUF.js → chunk-WMNS4MAQ.js} +1288 -1696
  74. package/dist/chunk-WMNS4MAQ.js.map +1 -0
  75. package/dist/{chunk-MATIJPGF.js → chunk-XPFHJMZP.js} +541 -401
  76. package/dist/chunk-XPFHJMZP.js.map +1 -0
  77. package/dist/chunk-YMXYBG7U.js +12 -0
  78. package/dist/chunk-YMXYBG7U.js.map +1 -0
  79. package/dist/context-mention-palette/index.d.ts +3 -2
  80. package/dist/context-mention-palette/index.js +17 -12
  81. package/dist/custom-mention.d.ts +42 -0
  82. package/dist/custom-mention.js +17 -0
  83. package/dist/custom-mention.js.map +1 -0
  84. package/dist/dock-icons.d.ts +4 -0
  85. package/dist/dock-icons.js +11 -0
  86. package/dist/dock-icons.js.map +1 -0
  87. package/dist/i18n/index.d.ts +880 -841
  88. package/dist/i18n/index.js +2 -2
  89. package/dist/index.d.ts +56 -1063
  90. package/dist/index.js +78 -35532
  91. package/dist/index.js.map +1 -1
  92. package/dist/mention-search.d.ts +226 -0
  93. package/dist/mention-search.js +29 -0
  94. package/dist/mention-search.js.map +1 -0
  95. package/dist/open-link-lined-JWEKUKME.svg +4 -0
  96. package/dist/pastedTextKinds-D-XuInaS.d.ts +4 -0
  97. package/dist/provider-icons.d.ts +6 -0
  98. package/dist/provider-icons.js +12 -0
  99. package/dist/provider-icons.js.map +1 -0
  100. package/dist/provider-identity.d.ts +9 -0
  101. package/dist/provider-identity.js +21 -0
  102. package/dist/provider-identity.js.map +1 -0
  103. package/dist/runtime-BBNdWgDU.d.ts +10 -0
  104. package/dist/startup-shell.d.ts +8 -0
  105. package/dist/startup-shell.js +184 -0
  106. package/dist/startup-shell.js.map +1 -0
  107. package/dist/{types-PLFZ8SBX.d.ts → types-CnT8rNUI.d.ts} +43 -87
  108. package/dist/workbench/contribution.d.ts +34 -41
  109. package/dist/workbench/contribution.js +10 -6
  110. package/dist/workbench/index.d.ts +5 -4
  111. package/dist/workbench/index.js +27 -25
  112. package/dist/workbench/launch.d.ts +4 -7
  113. package/dist/workbench/launch.js +4 -3
  114. package/dist/workbench/providerCatalog.d.ts +2 -2
  115. package/dist/workbench/providerCatalog.js +2 -1
  116. package/dist/workbench/sessionTitle.d.ts +11 -14
  117. package/dist/workbench/sessionTitle.js +6 -7
  118. package/dist/workbench/state.d.ts +1 -1
  119. package/dist/workbench/state.js +3 -2
  120. package/dist/workbench/types.d.ts +2 -4
  121. package/dist/workbench/types.js +1 -1
  122. package/dist/workspace-agent-generated-files.d.ts +20 -2
  123. package/dist/workspace-agent-generated-files.js +6 -5
  124. package/dist/workspaceAgentActivityListTypes-C7gPWYiA.d.ts +71 -0
  125. package/package.json +70 -26
  126. package/dist/AgentMentionSearchController-DD_WOred.d.ts +0 -241
  127. package/dist/AgentMessageMarkdown-DeYPURtF.d.ts +0 -7
  128. package/dist/chunk-45FF4DQU.js.map +0 -1
  129. package/dist/chunk-4HP6V2YA.js +0 -207
  130. package/dist/chunk-4HP6V2YA.js.map +0 -1
  131. package/dist/chunk-7BUYFVRI.js.map +0 -1
  132. package/dist/chunk-7LMJXF4R.js.map +0 -1
  133. package/dist/chunk-AWAIUYG4.js.map +0 -1
  134. package/dist/chunk-BXVPOGYK.js.map +0 -1
  135. package/dist/chunk-E5FOXRUM.js.map +0 -1
  136. package/dist/chunk-GAPTLVII.js.map +0 -1
  137. package/dist/chunk-IBIMGLCD.js +0 -66
  138. package/dist/chunk-IBIMGLCD.js.map +0 -1
  139. package/dist/chunk-IGY4ASUF.js.map +0 -1
  140. package/dist/chunk-LR4FA5X6.js +0 -368
  141. package/dist/chunk-LR4FA5X6.js.map +0 -1
  142. package/dist/chunk-MATIJPGF.js.map +0 -1
  143. package/dist/chunk-MKHDRIGN.js +0 -71
  144. package/dist/chunk-MKHDRIGN.js.map +0 -1
  145. package/dist/chunk-P72YLKC6.js.map +0 -1
  146. package/dist/chunk-SCLLP5DO.js.map +0 -1
  147. package/dist/chunk-UBDPV34P.js.map +0 -1
  148. package/dist/chunk-VAKFNNKT.js +0 -410
  149. package/dist/chunk-VAKFNNKT.js.map +0 -1
  150. package/dist/chunk-XDV4ZRVK.js.map +0 -1
  151. package/dist/chunk-XW4CVBUH.js.map +0 -1
  152. package/dist/chunk-ZUW4B5AT.js.map +0 -1
  153. package/dist/plan-decision-ops.d.ts +0 -70
  154. package/dist/plan-decision-ops.js +0 -19
  155. package/dist/queued-prompt-runtime.d.ts +0 -115
  156. package/dist/queued-prompt-runtime.js +0 -9
  157. package/dist/uiSettings-BQS9r2eo.d.ts +0 -6
  158. package/dist/workspaceAgentActivityListViewModel-BzV-cf0D.d.ts +0 -340
  159. package/dist/workspaceLinkActions-DS9LWqzI.d.ts +0 -74
  160. /package/dist/{plan-decision-ops.js.map → agent-gui.js.map} +0 -0
  161. /package/dist/{queued-prompt-runtime.js.map → agents.js.map} +0 -0
  162. /package/dist/{chunk-5FE7M42A.js.map → chunk-E4HQUTM3.js.map} +0 -0
  163. /package/dist/{chunk-554VG7ZW.js.map → chunk-QVBF5BN5.js.map} +0 -0
@@ -1,27 +1,23 @@
1
- import {
2
- resolveWorkspaceAgentSessionSortTimeUnixMs
3
- } from "./chunk-IBIMGLCD.js";
4
1
  import {
5
2
  fileChangePathsFromChanges,
6
3
  isWorkspaceAgentSyntheticControlMessage
7
4
  } from "./chunk-Y35GDLP2.js";
8
5
  import {
9
- isWorkspaceAgentActivityRuntimeSessionOrigin,
10
- workspaceAgentProviderLabel
11
- } from "./chunk-4HP6V2YA.js";
6
+ resolveWorkspaceAgentSessionSortTimeUnixMs
7
+ } from "./chunk-YMXYBG7U.js";
12
8
  import {
13
- translate,
14
- translateInUiLanguage
15
- } from "./chunk-5FE7M42A.js";
9
+ workspaceAgentProviderLabel
10
+ } from "./chunk-H5F3QSCF.js";
16
11
  import {
17
12
  normalizeAgentTitleText
18
13
  } from "./chunk-GCBDIQDX.js";
19
-
20
- // shared/workspaceAgentActivityListViewModel.ts
21
14
  import {
22
- normalizeAgentActivityDisplayStatus,
23
- resolveLatestAgentActivityMessageDisplayStatus
24
- } from "@tutti-os/agent-activity-core";
15
+ translate,
16
+ translateInUiLanguage
17
+ } from "./chunk-E4HQUTM3.js";
18
+
19
+ // shared/workspaceAgentActivityListProjection.ts
20
+ import { selectCanonicalAgentActivitySessions } from "@tutti-os/agent-activity-core";
25
21
 
26
22
  // shared/workspaceAgentLatestActivitySummary.ts
27
23
  function fallbackSummary(status) {
@@ -55,7 +51,7 @@ function localizedWorkspaceAgentLabelSet(key) {
55
51
 
56
52
  // shared/workspaceAgentSessionTitle.ts
57
53
  function resolveDisplayableWorkspaceAgentSessionTitle(session) {
58
- const title = normalizeAgentTitleText(session.title);
54
+ const title = session.title.trim();
59
55
  if (!title || isWorkspaceAgentUntitledTask(title) || isWorkspaceAgentSyntheticControlMessage(title)) {
60
56
  return "";
61
57
  }
@@ -66,13 +62,59 @@ function resolveDisplayableWorkspaceAgentSessionTitle(session) {
66
62
  return title;
67
63
  }
68
64
 
69
- // shared/workspaceAgentActivityListViewModel.ts
70
- function collectWorkspaceAgentGeneratedFiles(snapshot, options = {}) {
65
+ // shared/workspaceAgentActivityListOrdering.ts
66
+ function shouldHideEmptyRuntimePlaceholderSession(session, messages, status, options) {
67
+ if (messages.length > 0) {
68
+ return false;
69
+ }
70
+ if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {
71
+ return false;
72
+ }
73
+ if (!isRuntimePlaceholderTerminalStatus(status)) {
74
+ return false;
75
+ }
76
+ return resolveDisplayableWorkspaceAgentSessionTitle(session) === "";
77
+ }
78
+ function hasLoadedSessionMessageRecord(session, sessionMessagesById) {
79
+ if (!sessionMessagesById) {
80
+ return false;
81
+ }
82
+ return workspaceAgentSessionMessageAliases(session).some(
83
+ (alias) => alias in sessionMessagesById
84
+ );
85
+ }
86
+ function isRuntimePlaceholderTerminalStatus(status) {
87
+ return status === "idle" || status === "completed" || status === "canceled";
88
+ }
89
+ function compareActivities(left, right) {
90
+ const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;
91
+ if (timeDiff !== 0) {
92
+ return timeDiff;
93
+ }
94
+ return left.sessionId.localeCompare(right.sessionId);
95
+ }
96
+ function workspaceAgentSessionMessageAliases(session) {
97
+ const values = [session.agentSessionId, session.providerSessionId];
98
+ const seen = /* @__PURE__ */ new Set();
99
+ const aliases = [];
100
+ for (const value of values) {
101
+ const normalized = value?.trim() ?? "";
102
+ if (!normalized || seen.has(normalized)) {
103
+ continue;
104
+ }
105
+ seen.add(normalized);
106
+ aliases.push(normalized);
107
+ }
108
+ return aliases;
109
+ }
110
+
111
+ // shared/workspaceAgentGeneratedFiles.ts
112
+ function collectWorkspaceAgentGeneratedFiles(source, options = {}) {
71
113
  const sessionCwdFilter = normalizeComparablePath(options.sessionCwd ?? "");
72
- const workspaceRoot = sessionCwdFilter || normalizeComparablePath(options.workspaceRoot ?? "") || resolveWorkspaceRootFromSessions(snapshot.sessions);
73
- const sessions = sessionCwdFilter ? snapshot.sessions.filter(
114
+ const workspaceRoot = sessionCwdFilter || normalizeComparablePath(options.workspaceRoot ?? "") || resolveWorkspaceRootFromSessions(source.sessions);
115
+ const sessions = sessionCwdFilter ? source.sessions.filter(
74
116
  (session) => normalizeComparablePath(session.cwd ?? "") === sessionCwdFilter
75
- ) : snapshot.sessions;
117
+ ) : source.sessions;
76
118
  const filesByPath = /* @__PURE__ */ new Map();
77
119
  for (const session of sessions) {
78
120
  const sessionCwd = normalizeComparablePath(session.cwd ?? "") || workspaceRoot;
@@ -81,7 +123,7 @@ function collectWorkspaceAgentGeneratedFiles(snapshot, options = {}) {
81
123
  workspaceRoot
82
124
  });
83
125
  const messages = resolveWorkspaceAgentSessionMessages(
84
- snapshot.sessionMessagesById,
126
+ source.sessionMessagesById,
85
127
  session
86
128
  );
87
129
  if (messages.length === 0) {
@@ -107,206 +149,6 @@ function collectWorkspaceAgentGeneratedFiles(snapshot, options = {}) {
107
149
  }
108
150
  return applyShortestUniqueFileLabels([...filesByPath.values()]);
109
151
  }
110
- function buildWorkspaceAgentActivityListViewModel(snapshot, options = {}) {
111
- const presencesById = new Map(
112
- snapshot.presences.map((presence) => [presence.id, presence])
113
- );
114
- const activities = snapshot.sessions.map((session) => {
115
- const presence = session.presenceId === void 0 ? null : presencesById.get(session.presenceId) ?? null;
116
- const messages = resolveWorkspaceAgentSessionMessages(
117
- options.sessionMessagesById,
118
- session
119
- );
120
- const status = resolveWorkspaceAgentActivityStatus(session, messages);
121
- if (shouldHideEmptyRuntimePlaceholderSession(
122
- session,
123
- messages,
124
- status,
125
- options
126
- )) {
127
- return null;
128
- }
129
- const user = resolveActivityUser(session, presence, options);
130
- const agentProvider = resolveProvider(session, presence);
131
- const agentName = workspaceAgentProviderLabel(agentProvider);
132
- const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(
133
- session,
134
- {
135
- messages
136
- }
137
- );
138
- const latestActivity = resolveLatestActivity(messages, status, {
139
- agentName,
140
- userName: user.userName
141
- });
142
- const activity = {
143
- id: `activity-${session.agentSessionId}`,
144
- sessionId: session.agentSessionId,
145
- userId: user.userId,
146
- userName: user.userName,
147
- ...user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {},
148
- agentProvider,
149
- agentName,
150
- title: resolveWorkspaceAgentActivityTitle(session, messages),
151
- status,
152
- latestActivitySummary: latestActivity.summary,
153
- latestActivityActorName: latestActivity.actorName,
154
- changedFiles: changedFilesForSession(messages),
155
- sortTimeUnixMs: resolvedSortTimeUnixMs,
156
- readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)
157
- };
158
- return activity;
159
- }).filter(
160
- (activity) => activity !== null
161
- ).sort(compareActivities);
162
- return { activities };
163
- }
164
- function reuseWorkspaceAgentActivityListViewModelIfUnchanged(previous, next) {
165
- if (!previous) {
166
- return next;
167
- }
168
- if (next.activities.length === 0) {
169
- return previous.activities.length === 0 ? previous : next;
170
- }
171
- const previousActivitiesById = new Map(
172
- previous.activities.map((activity) => [activity.id, activity])
173
- );
174
- const activities = next.activities.map((activity) => {
175
- const previousActivity = previousActivitiesById.get(activity.id);
176
- if (!previousActivity || !workspaceAgentActivityCardEquals(previousActivity, activity)) {
177
- return activity;
178
- }
179
- return previousActivity;
180
- });
181
- const reusedEveryActivityInPlace = previous.activities.length === activities.length && previous.activities.every(
182
- (activity, index) => activity === activities[index]
183
- );
184
- return reusedEveryActivityInPlace ? previous : { activities };
185
- }
186
- function shouldHideEmptyRuntimePlaceholderSession(session, messages, status, options) {
187
- if (!isWorkspaceAgentActivityRuntimeSessionOrigin(session.sessionOrigin)) {
188
- return false;
189
- }
190
- if (messages.length > 0) {
191
- return false;
192
- }
193
- if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {
194
- return false;
195
- }
196
- if (!isRuntimePlaceholderTerminalStatus(status)) {
197
- return false;
198
- }
199
- return resolveDisplayableWorkspaceAgentSessionTitle(session) === "";
200
- }
201
- function hasLoadedSessionMessageRecord(session, sessionMessagesById) {
202
- if (!sessionMessagesById) {
203
- return false;
204
- }
205
- return workspaceAgentSessionMessageAliases(session).some(
206
- (alias) => alias in sessionMessagesById
207
- );
208
- }
209
- function isRuntimePlaceholderTerminalStatus(status) {
210
- return status === "idle" || status === "completed" || status === "canceled";
211
- }
212
- function workspaceAgentActivityCardEquals(left, right) {
213
- return left.id === right.id && left.sessionId === right.sessionId && left.userId === right.userId && left.userName === right.userName && left.userAvatarUrl === right.userAvatarUrl && left.agentProvider === right.agentProvider && left.agentName === right.agentName && left.title === right.title && left.status === right.status && left.latestActivitySummary === right.latestActivitySummary && left.latestActivityActorName === right.latestActivityActorName && left.sortTimeUnixMs === right.sortTimeUnixMs && JSON.stringify(left.conversationPreview ?? []) === JSON.stringify(right.conversationPreview ?? []) && JSON.stringify(left.toolCalls ?? []) === JSON.stringify(right.toolCalls ?? []) && JSON.stringify(left.changedFiles) === JSON.stringify(right.changedFiles);
214
- }
215
- function resolveWorkspaceAgentSessionMessages(sessionMessagesById, session) {
216
- if (!sessionMessagesById) {
217
- return [];
218
- }
219
- for (const alias of workspaceAgentSessionMessageAliases(session)) {
220
- const messages = sessionMessagesById[alias];
221
- if (messages) {
222
- return messages;
223
- }
224
- }
225
- return [];
226
- }
227
- function resolveActivityUser(session, presence, options) {
228
- if (presence) {
229
- return resolveUserFromId(presence.userId ?? "", options);
230
- }
231
- const sessionUserId = session.userId?.trim() ?? "";
232
- if (sessionUserId) {
233
- return resolveUserFromId(sessionUserId, options);
234
- }
235
- return {
236
- userId: null,
237
- userName: "Unknown member"
238
- };
239
- }
240
- function resolveUserFromId(rawUserId, options) {
241
- const userId = rawUserId.trim();
242
- const profile = options.userProfilesById?.[userId];
243
- const profileName = compactText2(profile?.name ?? "");
244
- const profileAvatar = profile?.avatar?.trim();
245
- const rawName = profileName || userId || "Unknown member";
246
- return {
247
- userId,
248
- userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,
249
- ...profileAvatar ? { userAvatarUrl: profileAvatar } : {}
250
- };
251
- }
252
- function resolveProvider(session, presence) {
253
- const sessionProvider = normalizeProvider(session.provider);
254
- if (sessionProvider) {
255
- return sessionProvider;
256
- }
257
- const presenceProvider = normalizeProvider(presence?.provider);
258
- if (presenceProvider) {
259
- return presenceProvider;
260
- }
261
- return "unknown";
262
- }
263
- function normalizeProvider(provider) {
264
- const trimmed = provider?.trim();
265
- return trimmed ? trimmed.toLowerCase() : null;
266
- }
267
- function resolveWorkspaceAgentActivityStatus(session, messages = []) {
268
- const sessionStatus = normalizeAgentActivityDisplayStatus(session.status, {
269
- currentPhase: session.currentPhase,
270
- turnLifecycleOutcome: session.turnLifecycle?.outcome,
271
- turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase
272
- });
273
- const normalized = sessionStatus === "failed" ? resolveLatestAgentActivityMessageDisplayStatus(messages) ?? sessionStatus : sessionStatus;
274
- switch (normalized) {
275
- case "failed":
276
- return "failed";
277
- case "canceled":
278
- return "canceled";
279
- case "completed":
280
- return "completed";
281
- case "waiting":
282
- return "waiting";
283
- case "working":
284
- return "working";
285
- default:
286
- return "idle";
287
- }
288
- }
289
- function resolveWorkspaceAgentActivityTitle(session, messages = []) {
290
- const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);
291
- const userMessageTitle = firstUserMessageText(messages);
292
- if (sessionTitle) {
293
- return sessionTitle;
294
- }
295
- return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();
296
- }
297
- function resolveLatestActivity(messages, status, actors) {
298
- const latestMessage = latestDisplayableMessage(messages);
299
- if (latestMessage) {
300
- return {
301
- actorName: messageRole(latestMessage.message) === "user" ? actors.userName : actors.agentName,
302
- summary: latestMessage.text
303
- };
304
- }
305
- return {
306
- actorName: actors.agentName,
307
- summary: fallbackSummary(status)
308
- };
309
- }
310
152
  function changedFilesForSession(messages, normalizePath = defaultChangedFilePathNormalizer, options = {}) {
311
153
  const changedFilesByPath = /* @__PURE__ */ new Map();
312
154
  const appendPath = (path) => {
@@ -726,11 +568,87 @@ function isStructuredPayloadPath(path) {
726
568
  return false;
727
569
  }
728
570
  }
729
- function readTimeUnixMs(session, status, fallbackUnixMs) {
730
- if (status === "completed" || status === "failed") {
731
- return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;
571
+ function resolveWorkspaceAgentSessionMessages(sessionMessagesById, session) {
572
+ if (!sessionMessagesById) {
573
+ return [];
732
574
  }
733
- return fallbackUnixMs;
575
+ for (const alias of workspaceAgentSessionMessageAliases(session)) {
576
+ const messages = sessionMessagesById[alias];
577
+ if (messages) {
578
+ return messages;
579
+ }
580
+ }
581
+ return [];
582
+ }
583
+ function normalizeToken(value) {
584
+ return value?.trim().toLowerCase() ?? "";
585
+ }
586
+
587
+ // shared/workspaceAgentActivityStatus.ts
588
+ function resolveWorkspaceAgentActivityStatus(session) {
589
+ const normalized = canonicalSessionStatus(session);
590
+ switch (normalized) {
591
+ case "failed":
592
+ return "failed";
593
+ case "canceled":
594
+ return "canceled";
595
+ case "completed":
596
+ return "completed";
597
+ case "waiting":
598
+ return "waiting";
599
+ case "working":
600
+ return "working";
601
+ default:
602
+ return "idle";
603
+ }
604
+ }
605
+ function canonicalSessionStatus(session) {
606
+ if ((session.pendingInteractions?.length ?? 0) > 0) return "waiting";
607
+ if (session.activeTurn && session.activeTurn.phase !== "settled") {
608
+ return session.activeTurn.phase === "waiting" ? "waiting" : "working";
609
+ }
610
+ switch (session.latestTurn?.outcome) {
611
+ case "completed":
612
+ return "completed";
613
+ case "failed":
614
+ return "failed";
615
+ case "canceled":
616
+ case "interrupted":
617
+ return "canceled";
618
+ default:
619
+ return "idle";
620
+ }
621
+ }
622
+
623
+ // shared/workspaceAgentActivitySummary.ts
624
+ function resolveWorkspaceAgentActivityTitle(session, messages = []) {
625
+ const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);
626
+ const userMessageTitle = firstUserMessageText(messages);
627
+ if (sessionTitle && !isProviderPlaceholderTitleForSession(sessionTitle, session)) {
628
+ return sessionTitle;
629
+ }
630
+ return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();
631
+ }
632
+ function isProviderPlaceholderTitleForSession(title, session) {
633
+ const provider = normalizeProvider(session.provider);
634
+ if (!provider) {
635
+ return false;
636
+ }
637
+ const normalizedTitle = title.trim().toLowerCase();
638
+ return workspaceAgentProviderLabel(provider).toLowerCase() === normalizedTitle;
639
+ }
640
+ function resolveLatestActivity(messages, status, actors) {
641
+ const latestMessage = latestDisplayableMessage(messages);
642
+ if (latestMessage) {
643
+ return {
644
+ actorName: messageRole(latestMessage.message) === "user" ? actors.userName : actors.agentName,
645
+ summary: latestMessage.text
646
+ };
647
+ }
648
+ return {
649
+ actorName: actors.agentName,
650
+ summary: fallbackSummary(status)
651
+ };
734
652
  }
735
653
  function firstUserMessageText(messages) {
736
654
  const firstUserMessage = messages.map((message) => ({
@@ -744,7 +662,7 @@ function firstUserMessageText(messages) {
744
662
  if (timeDiff !== 0) {
745
663
  return timeDiff;
746
664
  }
747
- return (left.message.id ?? 0) - (right.message.id ?? 0) || left.message.messageId.localeCompare(right.message.messageId);
665
+ return left.message.messageId.localeCompare(right.message.messageId);
748
666
  })[0];
749
667
  return firstUserMessage?.text ?? "";
750
668
  }
@@ -754,40 +672,33 @@ function latestDisplayableMessage(messages) {
754
672
  text: messageDisplayText(message),
755
673
  time: messageTime(message)
756
674
  })).filter(
757
- (item) => item.text.length > 0 && normalizeToken(item.message.kind) !== "tool_call"
675
+ (item) => item.text.length > 0 && normalizeToken2(item.message.kind) !== "tool_call"
758
676
  ).sort((left, right) => {
759
677
  const timeDiff = (right.time ?? 0) - (left.time ?? 0);
760
678
  if (timeDiff !== 0) {
761
679
  return timeDiff;
762
680
  }
763
- return (right.message.id ?? 0) - (left.message.id ?? 0) || right.message.messageId.localeCompare(left.message.messageId);
681
+ return right.message.messageId.localeCompare(left.message.messageId);
764
682
  })[0] ?? null;
765
683
  }
766
684
  function messageDisplayText(message) {
767
685
  const payload = message.payload ?? {};
768
686
  const text = normalizeAgentTitleText(
769
687
  compactText2(
770
- stringValue(payload.displayPrompt) || stringValue(payload.text) || stringValue(payload.content) || stringValue(payload.message) || stringValue(payload.body) || stringValue(payload.title) || ""
688
+ stringValue2(payload.displayPrompt) || stringValue2(payload.text) || stringValue2(payload.content) || stringValue2(payload.message) || stringValue2(payload.body) || stringValue2(payload.title) || ""
771
689
  )
772
690
  );
773
691
  return isWorkspaceAgentSyntheticControlMessage(text) ? "" : text;
774
692
  }
775
693
  function messageRole(message) {
776
- return normalizeToken(message.role);
694
+ return normalizeToken2(message.role);
777
695
  }
778
696
  function messageTime(message) {
779
697
  return message.occurredAtUnixMs ?? message.completedAtUnixMs ?? message.startedAtUnixMs;
780
698
  }
781
- function normalizeToken(value) {
699
+ function normalizeToken2(value) {
782
700
  return value?.trim().toLowerCase() ?? "";
783
701
  }
784
- function compareActivities(left, right) {
785
- const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;
786
- if (timeDiff !== 0) {
787
- return timeDiff;
788
- }
789
- return left.sessionId.localeCompare(right.sessionId);
790
- }
791
702
  function compactText2(value) {
792
703
  return value.replace(/\s+/g, " ").trim();
793
704
  }
@@ -796,34 +707,158 @@ function workspaceAgentUntitledTaskLabel() {
796
707
  translate("agentHost.workspaceAgentsUntitledTask")
797
708
  );
798
709
  }
799
- function workspaceAgentSessionMessageAliases(session) {
800
- const values = [
801
- session.syncState?.agentSessionId,
802
- session.agentSessionId,
803
- session.providerSessionId
804
- ];
805
- const seen = /* @__PURE__ */ new Set();
806
- const aliases = [];
807
- for (const value of values) {
808
- const normalized = value?.trim() ?? "";
809
- if (!normalized || seen.has(normalized)) {
810
- continue;
710
+ function normalizeProvider(provider) {
711
+ const trimmed = provider?.trim();
712
+ return trimmed ? trimmed.toLowerCase() : null;
713
+ }
714
+ function stringValue2(value) {
715
+ return typeof value === "string" && value.trim() ? value.trim() : null;
716
+ }
717
+
718
+ // shared/workspaceAgentActivityListProjection.ts
719
+ function buildWorkspaceAgentActivityListViewModel(snapshot, options = {}) {
720
+ const activities = selectCanonicalAgentActivitySessions(snapshot).map((session) => {
721
+ const presence = snapshot.presences.find(
722
+ (candidate) => candidate.provider === session.provider && Boolean(candidate.userId) && candidate.userId === session.userId
723
+ ) ?? null;
724
+ const messages = resolveWorkspaceAgentSessionMessages2(
725
+ options.sessionMessagesById,
726
+ session
727
+ );
728
+ const status = resolveWorkspaceAgentActivityStatus(session);
729
+ if (shouldHideEmptyRuntimePlaceholderSession(
730
+ session,
731
+ messages,
732
+ status,
733
+ options
734
+ )) {
735
+ return null;
811
736
  }
812
- seen.add(normalized);
813
- aliases.push(normalized);
737
+ const user = resolveActivityUser(session, presence, options);
738
+ const agentProvider = resolveProvider(session, presence);
739
+ const agentName = workspaceAgentProviderLabel(agentProvider);
740
+ const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(session);
741
+ const latestActivity = resolveLatestActivity(messages, status, {
742
+ agentName,
743
+ userName: user.userName
744
+ });
745
+ const activity = {
746
+ id: `activity-${session.agentSessionId}`,
747
+ sessionId: session.agentSessionId,
748
+ userId: user.userId,
749
+ userName: user.userName,
750
+ ...user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {},
751
+ agentProvider,
752
+ agentName,
753
+ title: resolveWorkspaceAgentActivityTitle(session, messages),
754
+ status,
755
+ latestActivitySummary: latestActivity.summary,
756
+ latestActivityActorName: latestActivity.actorName,
757
+ changedFiles: changedFilesForSession(messages),
758
+ sortTimeUnixMs: resolvedSortTimeUnixMs,
759
+ readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)
760
+ };
761
+ return activity;
762
+ }).filter(
763
+ (activity) => activity !== null
764
+ ).sort(compareActivities);
765
+ return { activities };
766
+ }
767
+ function reuseWorkspaceAgentActivityListViewModelIfUnchanged(previous, next) {
768
+ if (!previous) {
769
+ return next;
814
770
  }
815
- return aliases;
771
+ if (next.activities.length === 0) {
772
+ return previous.activities.length === 0 ? previous : next;
773
+ }
774
+ const previousActivitiesById = new Map(
775
+ previous.activities.map((activity) => [activity.id, activity])
776
+ );
777
+ const activities = next.activities.map((activity) => {
778
+ const previousActivity = previousActivitiesById.get(activity.id);
779
+ if (!previousActivity || !workspaceAgentActivityCardEquals(previousActivity, activity)) {
780
+ return activity;
781
+ }
782
+ return previousActivity;
783
+ });
784
+ const reusedEveryActivityInPlace = previous.activities.length === activities.length && previous.activities.every(
785
+ (activity, index) => activity === activities[index]
786
+ );
787
+ return reusedEveryActivityInPlace ? previous : { activities };
788
+ }
789
+ function workspaceAgentActivityCardEquals(left, right) {
790
+ return left.id === right.id && left.sessionId === right.sessionId && left.userId === right.userId && left.userName === right.userName && left.userAvatarUrl === right.userAvatarUrl && left.agentProvider === right.agentProvider && left.agentName === right.agentName && left.title === right.title && left.status === right.status && left.latestActivitySummary === right.latestActivitySummary && left.latestActivityActorName === right.latestActivityActorName && left.sortTimeUnixMs === right.sortTimeUnixMs && JSON.stringify(left.conversationPreview ?? []) === JSON.stringify(right.conversationPreview ?? []) && JSON.stringify(left.toolCalls ?? []) === JSON.stringify(right.toolCalls ?? []) && JSON.stringify(left.changedFiles) === JSON.stringify(right.changedFiles);
791
+ }
792
+ function resolveWorkspaceAgentSessionMessages2(sessionMessagesById, session) {
793
+ if (!sessionMessagesById) {
794
+ return [];
795
+ }
796
+ for (const alias of workspaceAgentSessionMessageAliases(session)) {
797
+ const messages = sessionMessagesById[alias];
798
+ if (messages) {
799
+ return messages;
800
+ }
801
+ }
802
+ return [];
803
+ }
804
+ function resolveActivityUser(session, presence, options) {
805
+ if (presence) {
806
+ return resolveUserFromId(presence.userId ?? "", options);
807
+ }
808
+ const sessionUserId = session.userId?.trim() ?? "";
809
+ if (sessionUserId) {
810
+ return resolveUserFromId(sessionUserId, options);
811
+ }
812
+ return {
813
+ userId: null,
814
+ userName: "Unknown member"
815
+ };
816
+ }
817
+ function resolveUserFromId(rawUserId, options) {
818
+ const userId = rawUserId.trim();
819
+ const profile = options.userProfilesById?.[userId];
820
+ const profileName = compactText3(profile?.name ?? "");
821
+ const profileAvatar = profile?.avatar?.trim();
822
+ const rawName = profileName || userId || "Unknown member";
823
+ return {
824
+ userId,
825
+ userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,
826
+ ...profileAvatar ? { userAvatarUrl: profileAvatar } : {}
827
+ };
828
+ }
829
+ function resolveProvider(session, presence) {
830
+ const sessionProvider = normalizeProvider2(session.provider);
831
+ if (sessionProvider) {
832
+ return sessionProvider;
833
+ }
834
+ const presenceProvider = normalizeProvider2(presence?.provider);
835
+ if (presenceProvider) {
836
+ return presenceProvider;
837
+ }
838
+ return "unknown";
839
+ }
840
+ function normalizeProvider2(provider) {
841
+ const trimmed = provider?.trim();
842
+ return trimmed ? trimmed.toLowerCase() : null;
843
+ }
844
+ function readTimeUnixMs(session, status, fallbackUnixMs) {
845
+ if (status === "completed" || status === "failed") {
846
+ return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;
847
+ }
848
+ return fallbackUnixMs;
816
849
  }
817
850
  function stripTrailingParentheticalEmailFromLabel(label) {
818
851
  return label.trim().replace(/\s*\([^)]*@[^)]+\)\s*$/u, "").trim();
819
852
  }
853
+ function compactText3(value) {
854
+ return value.replace(/\s+/g, " ").trim();
855
+ }
820
856
 
821
857
  export {
822
- isWorkspaceAgentUntitledTask,
823
858
  collectWorkspaceAgentGeneratedFiles,
824
- buildWorkspaceAgentActivityListViewModel,
825
- reuseWorkspaceAgentActivityListViewModelIfUnchanged,
826
859
  resolveWorkspaceAgentActivityStatus,
827
- resolveWorkspaceAgentActivityTitle
860
+ resolveWorkspaceAgentActivityTitle,
861
+ buildWorkspaceAgentActivityListViewModel,
862
+ reuseWorkspaceAgentActivityListViewModelIfUnchanged
828
863
  };
829
- //# sourceMappingURL=chunk-E5FOXRUM.js.map
864
+ //# sourceMappingURL=chunk-3XXBDYAI.js.map