@tutti-os/agent-gui 0.0.28 → 0.0.30
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.
- package/dist/{AgentMentionSearchController-2Vjvmzh3.d.ts → AgentMentionSearchController-D5ks45fN.d.ts} +1 -0
- package/dist/{AgentMessageMarkdown-CZaG-QW3.d.ts → AgentMessageMarkdown-Cp70W-Z2.d.ts} +20 -2
- package/dist/agent-conversation/index.d.ts +4 -4
- package/dist/agent-conversation/index.js +6 -6
- package/dist/agent-message-center/index.d.ts +2 -2
- package/dist/agent-message-center/index.js +5 -5
- package/dist/{agentConversationVM-BvlmCNOm.d.ts → agentConversationVM-BElW2LNR.d.ts} +1 -1
- package/dist/app/renderer/agentactivity.css +40 -9
- package/dist/{chunk-IBQO76IY.js → chunk-AFTAFV2C.js} +3 -3
- package/dist/{chunk-XAQQN6MP.js → chunk-FG66NW5M.js} +2 -2
- package/dist/{chunk-LKT3EFGR.js → chunk-J2DMJREM.js} +127 -46
- package/dist/chunk-J2DMJREM.js.map +1 -0
- package/dist/{chunk-ILBFIZCI.js → chunk-MFWZKYZ4.js} +31 -40
- package/dist/chunk-MFWZKYZ4.js.map +1 -0
- package/dist/{chunk-B7DTDZVT.js → chunk-OOQIJXCA.js} +114 -12
- package/dist/chunk-OOQIJXCA.js.map +1 -0
- package/dist/{chunk-LHN26OIP.js → chunk-RDCBACWR.js} +5 -5
- package/dist/{chunk-GLDKFIWM.js → chunk-RQ3HEF42.js} +7 -7
- package/dist/chunk-RQ3HEF42.js.map +1 -0
- package/dist/{chunk-EWWAG26H.js → chunk-SGQ4C7JE.js} +1 -1
- package/dist/chunk-SGQ4C7JE.js.map +1 -0
- package/dist/{chunk-F7XLV7M3.js → chunk-WPWZKKKV.js} +2 -2
- package/dist/chunk-Y35GDLP2.js +88 -0
- package/dist/chunk-Y35GDLP2.js.map +1 -0
- package/dist/context-mention-palette/index.d.ts +4 -3
- package/dist/context-mention-palette/index.js +7 -7
- package/dist/i18n/index.d.ts +6 -6
- package/dist/i18n/index.js +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.js +557 -79
- package/dist/index.js.map +1 -1
- package/dist/plan-decision-ops.d.ts +2 -2
- package/dist/workspace-agent-generated-files.d.ts +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/dist/{workspaceAgentActivityListViewModel-jRF8cP37.d.ts → workspaceAgentActivityListViewModel-DwpbJGDx.d.ts} +4 -1
- package/package.json +12 -12
- package/dist/chunk-B7DTDZVT.js.map +0 -1
- package/dist/chunk-EWWAG26H.js.map +0 -1
- package/dist/chunk-GLDKFIWM.js.map +0 -1
- package/dist/chunk-ILBFIZCI.js.map +0 -1
- package/dist/chunk-LKT3EFGR.js.map +0 -1
- package/dist/chunk-XJ34OIEQ.js +0 -18
- package/dist/chunk-XJ34OIEQ.js.map +0 -1
- /package/dist/{chunk-IBQO76IY.js.map → chunk-AFTAFV2C.js.map} +0 -0
- /package/dist/{chunk-XAQQN6MP.js.map → chunk-FG66NW5M.js.map} +0 -0
- /package/dist/{chunk-LHN26OIP.js.map → chunk-RDCBACWR.js.map} +0 -0
- /package/dist/{chunk-F7XLV7M3.js.map → chunk-WPWZKKKV.js.map} +0 -0
|
@@ -2,8 +2,9 @@ import {
|
|
|
2
2
|
resolveWorkspaceAgentSessionSortTimeUnixMs
|
|
3
3
|
} from "./chunk-IBIMGLCD.js";
|
|
4
4
|
import {
|
|
5
|
+
fileChangePathsFromChanges,
|
|
5
6
|
isWorkspaceAgentSyntheticControlMessage
|
|
6
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Y35GDLP2.js";
|
|
7
8
|
import {
|
|
8
9
|
workspaceAgentProviderLabel
|
|
9
10
|
} from "./chunk-TYGL25EL.js";
|
|
@@ -13,7 +14,7 @@ import {
|
|
|
13
14
|
import {
|
|
14
15
|
translate,
|
|
15
16
|
translateInUiLanguage
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-RQ3HEF42.js";
|
|
17
18
|
|
|
18
19
|
// shared/workspaceAgentStatusNormalizer.ts
|
|
19
20
|
var FAILED_STATUS_TOKENS = /* @__PURE__ */ new Set(["failed", "error"]);
|
|
@@ -25,7 +26,12 @@ var WAITING_APPROVAL_TOKENS = /* @__PURE__ */ new Set([
|
|
|
25
26
|
]);
|
|
26
27
|
var WAITING_INPUT_TOKENS = /* @__PURE__ */ new Set(["waiting_input"]);
|
|
27
28
|
var WAITING_STATUS_TOKENS = /* @__PURE__ */ new Set(["waiting"]);
|
|
28
|
-
var WORKING_STATUS_TOKENS = /* @__PURE__ */ new Set([
|
|
29
|
+
var WORKING_STATUS_TOKENS = /* @__PURE__ */ new Set([
|
|
30
|
+
"submitted",
|
|
31
|
+
"working",
|
|
32
|
+
"running",
|
|
33
|
+
"streaming"
|
|
34
|
+
]);
|
|
29
35
|
var READY_STATUS_TOKENS = /* @__PURE__ */ new Set(["ready", "idle"]);
|
|
30
36
|
function normalizeWorkspaceAgentStatus(input) {
|
|
31
37
|
return normalizeOptionalWorkspaceAgentStatus(input) ?? { kind: "ready" };
|
|
@@ -152,6 +158,10 @@ function isWorkspaceAgentActivityRuntimeSessionOrigin(sessionOrigin) {
|
|
|
152
158
|
const normalized = sessionOrigin?.trim() ?? "";
|
|
153
159
|
return normalized === "" || normalized === WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN;
|
|
154
160
|
}
|
|
161
|
+
function createWorkspaceAgentActivityUserMessageIdFromClientSubmitId(clientSubmitId) {
|
|
162
|
+
const normalized = clientSubmitId.trim();
|
|
163
|
+
return normalized ? `client-submit:user:${normalized}` : null;
|
|
164
|
+
}
|
|
155
165
|
function isWorkspaceAgentActivityOptimisticMessage(message) {
|
|
156
166
|
return message.payload?.__agentGuiOptimisticPrompt === true;
|
|
157
167
|
}
|
|
@@ -164,12 +174,28 @@ function selectWorkspaceAgentActivityOverlayMessages(input) {
|
|
|
164
174
|
const durableIdentities = new Set(
|
|
165
175
|
durableMessages.map(workspaceAgentActivityMessageIdentity).filter((identity) => identity !== null)
|
|
166
176
|
);
|
|
177
|
+
const durableClientSubmitIds = new Set(
|
|
178
|
+
durableMessages.map(workspaceAgentActivityClientSubmitId).filter(
|
|
179
|
+
(clientSubmitId) => clientSubmitId !== null
|
|
180
|
+
)
|
|
181
|
+
);
|
|
182
|
+
const durableUserPromptSignatures = new Set(
|
|
183
|
+
durableMessages.map(workspaceAgentActivityUserPromptSignature).filter((signature) => signature !== null)
|
|
184
|
+
);
|
|
167
185
|
return localMessages.filter((message) => {
|
|
186
|
+
const identity = workspaceAgentActivityMessageIdentity(message);
|
|
187
|
+
if (identity !== null && durableIdentities.has(identity)) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
168
190
|
if (isWorkspaceAgentActivityOptimisticMessage(message)) {
|
|
169
|
-
|
|
191
|
+
const clientSubmitId = workspaceAgentActivityClientSubmitId(message);
|
|
192
|
+
if (clientSubmitId !== null && durableClientSubmitIds.has(clientSubmitId)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
const signature = workspaceAgentActivityUserPromptSignature(message);
|
|
196
|
+
return signature === null || !durableUserPromptSignatures.has(signature);
|
|
170
197
|
}
|
|
171
|
-
|
|
172
|
-
return identity === null || !durableIdentities.has(identity);
|
|
198
|
+
return true;
|
|
173
199
|
});
|
|
174
200
|
}
|
|
175
201
|
function mergeWorkspaceAgentActivityDurableAndOverlayMessages(input) {
|
|
@@ -187,6 +213,85 @@ function workspaceAgentActivityMessageIdentity(message) {
|
|
|
187
213
|
}
|
|
188
214
|
return null;
|
|
189
215
|
}
|
|
216
|
+
function workspaceAgentActivityClientSubmitId(message) {
|
|
217
|
+
const clientSubmitId = message.payload?.clientSubmitId;
|
|
218
|
+
return typeof clientSubmitId === "string" && clientSubmitId.trim() ? `${message.agentSessionId}\0${clientSubmitId.trim()}` : null;
|
|
219
|
+
}
|
|
220
|
+
function workspaceAgentActivityUserPromptSignature(message) {
|
|
221
|
+
if (message.role !== "user") {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const text = workspaceAgentActivityPayloadText(message.payload).trim();
|
|
225
|
+
const content = workspaceAgentActivityPayloadContentSignature(
|
|
226
|
+
message.payload
|
|
227
|
+
);
|
|
228
|
+
if (!text && content === null) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return [message.agentSessionId, text, content ?? ""].join("\0");
|
|
232
|
+
}
|
|
233
|
+
function workspaceAgentActivityPayloadText(payload) {
|
|
234
|
+
const text = payload?.text;
|
|
235
|
+
return typeof text === "string" ? text : "";
|
|
236
|
+
}
|
|
237
|
+
function workspaceAgentActivityPayloadContentSignature(payload) {
|
|
238
|
+
if (!payload || !Object.prototype.hasOwnProperty.call(payload, "content")) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const content = payload.content;
|
|
242
|
+
if (!Array.isArray(content)) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const parts = [];
|
|
246
|
+
for (const block of content) {
|
|
247
|
+
const signature = workspaceAgentActivityPromptBlockSignature(block);
|
|
248
|
+
if (signature === null) {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
parts.push(signature);
|
|
252
|
+
}
|
|
253
|
+
return parts.join("");
|
|
254
|
+
}
|
|
255
|
+
function workspaceAgentActivityPromptBlockSignature(block) {
|
|
256
|
+
if (!block || typeof block !== "object") {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
const record = block;
|
|
260
|
+
const type = workspaceAgentActivityStringField(record, "type");
|
|
261
|
+
if (!type) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
const fields = [
|
|
265
|
+
"text",
|
|
266
|
+
"mimeType",
|
|
267
|
+
"data",
|
|
268
|
+
"url",
|
|
269
|
+
"attachmentId",
|
|
270
|
+
"name",
|
|
271
|
+
"path",
|
|
272
|
+
"uri",
|
|
273
|
+
"hostPath",
|
|
274
|
+
"uploadStatus",
|
|
275
|
+
"assetId",
|
|
276
|
+
"kind"
|
|
277
|
+
];
|
|
278
|
+
const parts = [`type=${type}`];
|
|
279
|
+
for (const field of fields) {
|
|
280
|
+
const value = workspaceAgentActivityStringField(record, field);
|
|
281
|
+
if (value) {
|
|
282
|
+
parts.push(`${field}=${value}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const sizeBytes = record.sizeBytes;
|
|
286
|
+
if (typeof sizeBytes === "number" && Number.isFinite(sizeBytes)) {
|
|
287
|
+
parts.push(`sizeBytes=${sizeBytes}`);
|
|
288
|
+
}
|
|
289
|
+
return parts.join("");
|
|
290
|
+
}
|
|
291
|
+
function workspaceAgentActivityStringField(record, field) {
|
|
292
|
+
const value = record[field];
|
|
293
|
+
return typeof value === "string" ? value.trim() : "";
|
|
294
|
+
}
|
|
190
295
|
|
|
191
296
|
// shared/workspaceAgentActivityListViewModel.ts
|
|
192
297
|
function collectWorkspaceAgentGeneratedFiles(snapshot, options = {}) {
|
|
@@ -746,11 +851,7 @@ function fileChangePaths(files, normalizePath = defaultChangedFilePathNormalizer
|
|
|
746
851
|
return files.map((file) => normalizePath(objectValue(file)?.path)).filter((path) => path !== null);
|
|
747
852
|
}
|
|
748
853
|
function changeMapPaths(value, normalizePath = defaultChangedFilePathNormalizer) {
|
|
749
|
-
|
|
750
|
-
if (!changes) {
|
|
751
|
-
return [];
|
|
752
|
-
}
|
|
753
|
-
return Object.keys(changes).map((path) => normalizePath(path)).filter((path) => path !== null);
|
|
854
|
+
return fileChangePathsFromChanges(value).map((path) => normalizePath(path)).filter((path) => path !== null);
|
|
754
855
|
}
|
|
755
856
|
function contentDiffPaths(value, normalizePath = defaultChangedFilePathNormalizer) {
|
|
756
857
|
const content = arrayValue(value);
|
|
@@ -907,6 +1008,7 @@ export {
|
|
|
907
1008
|
isWorkspaceAgentUntitledTask,
|
|
908
1009
|
WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
|
|
909
1010
|
isWorkspaceAgentActivityRuntimeSessionOrigin,
|
|
1011
|
+
createWorkspaceAgentActivityUserMessageIdFromClientSubmitId,
|
|
910
1012
|
selectWorkspaceAgentActivityOverlayMessages,
|
|
911
1013
|
mergeWorkspaceAgentActivityDurableAndOverlayMessages,
|
|
912
1014
|
collectWorkspaceAgentGeneratedFiles,
|
|
@@ -915,4 +1017,4 @@ export {
|
|
|
915
1017
|
resolveWorkspaceAgentActivityStatus,
|
|
916
1018
|
resolveWorkspaceAgentActivityTitle
|
|
917
1019
|
};
|
|
918
|
-
//# sourceMappingURL=chunk-
|
|
1020
|
+
//# sourceMappingURL=chunk-OOQIJXCA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/workspaceAgentStatusNormalizer.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts","../shared/workspaceAgentActivityTypes.ts","../shared/workspaceAgentActivityListViewModel.ts"],"sourcesContent":["export type NormalizedWorkspaceAgentStatusKind =\n | \"ready\"\n | \"working\"\n | \"waiting\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\nexport interface NormalizedWorkspaceAgentStatus {\n kind: NormalizedWorkspaceAgentStatusKind;\n waitKind?: \"approval\" | \"input\";\n}\n\nexport interface RawWorkspaceAgentStatusLike {\n lifecycleStatus?: string | null;\n effectiveStatus?: string | null;\n status?: string | null;\n turnPhase?: string | null;\n currentPhase?: string | null;\n}\n\nconst FAILED_STATUS_TOKENS = new Set([\"failed\", \"error\"]);\nconst CANCELED_STATUS_TOKENS = new Set([\"canceled\"]);\nconst COMPLETED_STATUS_TOKENS = new Set([\"completed\", \"ended\", \"end\"]);\nconst WAITING_APPROVAL_TOKENS = new Set([\n \"waiting_approval\",\n \"awaiting_approval\"\n]);\nconst WAITING_INPUT_TOKENS = new Set([\"waiting_input\"]);\nconst WAITING_STATUS_TOKENS = new Set([\"waiting\"]);\nconst WORKING_STATUS_TOKENS = new Set([\n \"submitted\",\n \"working\",\n \"running\",\n \"streaming\"\n]);\nconst READY_STATUS_TOKENS = new Set([\"ready\", \"idle\"]);\n\nexport function normalizeWorkspaceAgentStatus(\n input: RawWorkspaceAgentStatusLike\n): NormalizedWorkspaceAgentStatus {\n return normalizeOptionalWorkspaceAgentStatus(input) ?? { kind: \"ready\" };\n}\n\nexport function normalizeOptionalWorkspaceAgentStatus(\n input: RawWorkspaceAgentStatusLike\n): NormalizedWorkspaceAgentStatus | null {\n const lifecycleStatus = normalizeStatusToken(input.lifecycleStatus);\n const effectiveStatus = normalizeStatusToken(input.effectiveStatus);\n const sessionStatus = normalizeStatusToken(input.status);\n const turnPhase = normalizeStatusToken(input.turnPhase);\n const currentPhase = normalizeStatusToken(input.currentPhase);\n const tokens = [\n lifecycleStatus,\n effectiveStatus,\n sessionStatus,\n turnPhase,\n currentPhase\n ].filter(Boolean);\n if (tokens.length === 0) {\n return null;\n }\n\n if (\n [lifecycleStatus, effectiveStatus, sessionStatus, currentPhase].some(\n (token) => FAILED_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"failed\" };\n }\n if (\n [lifecycleStatus, effectiveStatus, sessionStatus].some((token) =>\n CANCELED_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"canceled\" };\n }\n if (\n [lifecycleStatus, effectiveStatus, sessionStatus].some((token) =>\n COMPLETED_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"completed\" };\n }\n\n const waitKind = waitingKindFromTokens([\n currentPhase,\n turnPhase,\n effectiveStatus,\n sessionStatus\n ]);\n if (waitKind) {\n return { kind: \"waiting\", waitKind };\n }\n if (\n [currentPhase, turnPhase, effectiveStatus, sessionStatus].some((token) =>\n WAITING_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"waiting\" };\n }\n\n if (\n [currentPhase, turnPhase, effectiveStatus, sessionStatus].some((token) =>\n WORKING_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"working\" };\n }\n\n if (\n lifecycleStatus === \"active\" ||\n lifecycleStatus === \"ready\" ||\n [currentPhase, turnPhase, effectiveStatus, sessionStatus].some((token) =>\n READY_STATUS_TOKENS.has(token)\n )\n ) {\n return { kind: \"ready\" };\n }\n\n return null;\n}\n\nexport function isNormalizedWorkspaceAgentRunningStatus(\n input: RawWorkspaceAgentStatusLike\n): boolean {\n return normalizeWorkspaceAgentStatus(input).kind === \"working\";\n}\n\nfunction waitingKindFromTokens(\n tokens: readonly string[]\n): \"approval\" | \"input\" | undefined {\n if (tokens.some((token) => WAITING_APPROVAL_TOKENS.has(token))) {\n return \"approval\";\n }\n if (tokens.some((token) => WAITING_INPUT_TOKENS.has(token))) {\n return \"input\";\n }\n return undefined;\n}\n\nfunction normalizeStatusToken(status: string | null | undefined): string {\n return status?.trim().toLowerCase() ?? \"\";\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","import {\n mergeAgentActivityMessages,\n AgentActivityMessage,\n AgentActivityMessageSemantics,\n AgentActivityPresence,\n AgentActivitySession,\n AgentActivitySnapshot,\n AgentActivitySubmitAvailability,\n AgentActivityTurnLifecycle\n} from \"@tutti-os/agent-activity-core\";\n\nexport type WorkspaceAgentActivityProvider = \"codex\" | \"claude-code\" | string;\n\nexport interface WorkspaceAgentActivityComposerSettings {\n model?: string | null;\n reasoningEffort?: string | null;\n speed?: string | null;\n planMode?: boolean;\n browserUse?: boolean;\n permissionModeId?: string | null;\n}\n\nexport const WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN =\n \"WORKSPACE_AGENT_SESSION_ORIGIN_RUNTIME\";\n\nexport type WorkspaceAgentActivitySessionOrigin =\n | typeof WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN\n | string;\n\nexport function isWorkspaceAgentActivityRuntimeSessionOrigin(\n sessionOrigin: string | null | undefined\n): boolean {\n const normalized = sessionOrigin?.trim() ?? \"\";\n // Core-native AgentActivitySession does not carry the legacy host origin DTO.\n return (\n normalized === \"\" ||\n normalized === WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN\n );\n}\n\nexport function createWorkspaceAgentActivityUserMessageIdFromClientSubmitId(\n clientSubmitId: string\n): string | null {\n const normalized = clientSubmitId.trim();\n return normalized ? `client-submit:user:${normalized}` : null;\n}\n\nexport type WorkspaceAgentActivitySyncStatus =\n | \"pending\"\n | \"synced\"\n | \"failed\"\n | string;\n\nexport interface WorkspaceAgentActivitySyncState {\n workspaceId?: string;\n agentSessionId?: string;\n status: WorkspaceAgentActivitySyncStatus;\n pendingTimelineItemCount?: number;\n pendingStatePatchCount?: number;\n attemptCount?: number;\n failedReportCount?: number;\n lastError?: string;\n lastAttemptAtUnixMs?: number;\n lastSyncedAtUnixMs?: number;\n updatedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityPresence extends Omit<\n AgentActivityPresence,\n \"id\" | \"provider\" | \"status\"\n> {\n id: string | number;\n provider: WorkspaceAgentActivityProvider;\n status: string;\n userId?: string | null;\n}\n\nexport interface WorkspaceAgentActivitySession extends Omit<\n AgentActivitySession,\n | \"provider\"\n | \"providerSessionId\"\n | \"pinnedAtUnixMs\"\n | \"status\"\n | \"title\"\n | \"workspaceId\"\n> {\n id?: number;\n workspaceId?: string;\n presenceId?: string | number;\n userId?: string;\n provider?: WorkspaceAgentActivityProvider;\n providerSessionId?: string | null;\n resumable?: boolean;\n sessionOrigin?: WorkspaceAgentActivitySessionOrigin;\n lifecycleStatus?: string;\n turnPhase?: string;\n endedAtUnixMs?: number;\n effectiveStatus?: string;\n status?: string;\n turnLifecycle?: AgentActivityTurnLifecycle | null;\n submitAvailability?: AgentActivitySubmitAvailability | null;\n title?: string;\n pinnedAtUnixMs?: number | null;\n syncState?: WorkspaceAgentActivitySyncState;\n}\n\nexport interface WorkspaceAgentActivityFileChange {\n path: string;\n change?: \"added\" | \"modified\" | \"deleted\" | \"moved\" | string;\n tools?: string[];\n}\n\nexport interface WorkspaceAgentActivityFileChanges {\n coverage?: string;\n files?: WorkspaceAgentActivityFileChange[];\n}\n\nexport interface WorkspaceAgentActivityTimelineItem {\n id: number;\n workspaceId?: string;\n agentSessionId: string;\n seq?: number;\n turnId?: string;\n eventSource?: string;\n eventId: string;\n actorType: string;\n actorId: string;\n itemType: \"message\" | \"call\" | \"event\" | \"error\" | \"lifecycle\" | string;\n role?: string;\n callType?: \"tool\" | \"skill\" | \"subagent\" | \"approval\" | \"workflow\" | string;\n callId?: string;\n name?: string;\n status?: string | null;\n content?: string;\n payload?: Record<string, unknown> & {\n content?: unknown;\n text?: unknown;\n fileChanges?: WorkspaceAgentActivityFileChanges;\n };\n occurredAtUnixMs?: number;\n createdAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityMessage extends Omit<\n AgentActivityMessage,\n \"id\" | \"turnId\" | \"status\"\n> {\n id?: number;\n turnId?: string | null;\n status?: string | null;\n semantics?: AgentActivityMessageSemantics;\n}\n\nexport interface WorkspaceAgentActivitySnapshot extends Omit<\n AgentActivitySnapshot,\n \"sessions\" | \"presences\" | \"sessionMessagesById\" | \"workspaceId\"\n> {\n workspaceId?: string;\n presences: WorkspaceAgentActivityPresence[];\n sessions: WorkspaceAgentActivitySession[];\n sessionMessagesById?: Record<string, WorkspaceAgentActivityMessage[]>;\n}\n\nexport interface WorkspaceAgentActivityTurnStatePatch {\n turnId: string;\n phase?: string;\n outcome?: string;\n fileChanges?: Record<string, unknown>;\n startedAtUnixMs?: number;\n completedAtUnixMs?: number;\n activeTurnId?: string | null;\n settling?: boolean;\n completedCommand?: {\n kind: string;\n status: string;\n } | null;\n submitAvailability?: AgentActivitySubmitAvailability;\n}\n\nexport interface WorkspaceAgentActivityEntityStatePatch {\n callId: string;\n turnId?: string;\n callType?: string;\n name?: string;\n status?: string;\n input?: Record<string, unknown>;\n output?: Record<string, unknown>;\n error?: Record<string, unknown>;\n startedAtUnixMs?: number;\n completedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityStatePatch {\n workspaceId?: string;\n agentSessionId: string;\n provider?: string;\n providerSessionId?: string;\n model?: string;\n permissionModeId?: string;\n settings?: WorkspaceAgentActivityComposerSettings;\n runtimeContext?: Record<string, unknown>;\n cwd?: string;\n title?: string;\n lifecycleStatus?: string;\n currentPhase?: string;\n lastError?: string;\n occurredAtUnixMs?: number;\n submitAvailability?: AgentActivitySubmitAvailability;\n turn?: WorkspaceAgentActivityTurnStatePatch;\n entities?: WorkspaceAgentActivityEntityStatePatch[];\n}\n\nexport interface WorkspaceAgentActivitySessionSummaryItem {\n id?: number;\n turnId?: string;\n actorType?: string;\n actorId?: string;\n itemType?: string;\n role?: string;\n content?: string;\n title?: string;\n status?: string;\n callType?: string;\n name?: string;\n payload?: Record<string, unknown>;\n occurredAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivitySessionSummaryTurn {\n turnId: string;\n userItems?: WorkspaceAgentActivitySessionSummaryItem[];\n agentItems?: WorkspaceAgentActivitySessionSummaryItem[];\n}\n\nexport interface WorkspaceAgentActivitySessionExecutionStatus {\n currentOrFinalStatus?: string;\n updatedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivitySessionSummary {\n agentSessionId: string;\n latestUserRequirement?: string;\n initialUserRequirement?: string;\n latestTurn?: WorkspaceAgentActivitySessionSummaryTurn;\n recentAgentReplies?: string[];\n recentTurns?: WorkspaceAgentActivitySessionSummaryTurn[];\n currentOrFinalStatus?: string;\n executionStatus?: WorkspaceAgentActivitySessionExecutionStatus;\n}\n\nexport function isWorkspaceAgentActivityOptimisticMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n return message.payload?.__agentGuiOptimisticPrompt === true;\n}\n\nexport function selectWorkspaceAgentActivityOverlayMessages(input: {\n durableMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n localMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n}): WorkspaceAgentActivityMessage[] {\n const durableMessages = input.durableMessages ?? [];\n const localMessages = input.localMessages ?? [];\n if (localMessages.length === 0) {\n return [];\n }\n const durableIdentities = new Set(\n durableMessages\n .map(workspaceAgentActivityMessageIdentity)\n .filter((identity): identity is string => identity !== null)\n );\n const durableClientSubmitIds = new Set(\n durableMessages\n .map(workspaceAgentActivityClientSubmitId)\n .filter(\n (clientSubmitId): clientSubmitId is string => clientSubmitId !== null\n )\n );\n const durableUserPromptSignatures = new Set(\n durableMessages\n .map(workspaceAgentActivityUserPromptSignature)\n .filter((signature): signature is string => signature !== null)\n );\n return localMessages.filter((message) => {\n const identity = workspaceAgentActivityMessageIdentity(message);\n if (identity !== null && durableIdentities.has(identity)) {\n return false;\n }\n if (isWorkspaceAgentActivityOptimisticMessage(message)) {\n const clientSubmitId = workspaceAgentActivityClientSubmitId(message);\n if (\n clientSubmitId !== null &&\n durableClientSubmitIds.has(clientSubmitId)\n ) {\n return false;\n }\n const signature = workspaceAgentActivityUserPromptSignature(message);\n return signature === null || !durableUserPromptSignatures.has(signature);\n }\n return true;\n });\n}\n\nexport function mergeWorkspaceAgentActivityDurableAndOverlayMessages(input: {\n durableMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n localMessages?: readonly WorkspaceAgentActivityMessage[] | null;\n}): WorkspaceAgentActivityMessage[] {\n const durableMessages = input.durableMessages ?? [];\n const overlayMessages = selectWorkspaceAgentActivityOverlayMessages(input);\n return overlayMessages.length === 0\n ? [...durableMessages]\n : mergeAgentActivityMessages(durableMessages, overlayMessages);\n}\n\nfunction workspaceAgentActivityMessageIdentity(\n message: WorkspaceAgentActivityMessage\n): string | null {\n const messageId = message.messageId?.trim() ?? \"\";\n if (messageId) {\n return `message:${messageId}`;\n }\n if (typeof message.version === \"number\" && Number.isFinite(message.version)) {\n return `version:${message.version}`;\n }\n return null;\n}\n\nfunction workspaceAgentActivityClientSubmitId(\n message: WorkspaceAgentActivityMessage\n): string | null {\n const clientSubmitId = message.payload?.clientSubmitId;\n return typeof clientSubmitId === \"string\" && clientSubmitId.trim()\n ? `${message.agentSessionId}\\u0000${clientSubmitId.trim()}`\n : null;\n}\n\nfunction workspaceAgentActivityUserPromptSignature(\n message: WorkspaceAgentActivityMessage\n): string | null {\n if (message.role !== \"user\") {\n return null;\n }\n const text = workspaceAgentActivityPayloadText(message.payload).trim();\n const content = workspaceAgentActivityPayloadContentSignature(\n message.payload\n );\n if (!text && content === null) {\n return null;\n }\n return [message.agentSessionId, text, content ?? \"\"].join(\"\\u0000\");\n}\n\nfunction workspaceAgentActivityPayloadText(\n payload: Record<string, unknown> | undefined\n): string {\n const text = payload?.text;\n return typeof text === \"string\" ? text : \"\";\n}\n\nfunction workspaceAgentActivityPayloadContentSignature(\n payload: Record<string, unknown> | undefined\n): string | null {\n if (!payload || !Object.prototype.hasOwnProperty.call(payload, \"content\")) {\n return null;\n }\n const content = payload.content;\n if (!Array.isArray(content)) {\n return null;\n }\n const parts: string[] = [];\n for (const block of content) {\n const signature = workspaceAgentActivityPromptBlockSignature(block);\n if (signature === null) {\n return null;\n }\n parts.push(signature);\n }\n return parts.join(\"\\u0001\");\n}\n\nfunction workspaceAgentActivityPromptBlockSignature(\n block: unknown\n): string | null {\n if (!block || typeof block !== \"object\") {\n return null;\n }\n const record = block as Record<string, unknown>;\n const type = workspaceAgentActivityStringField(record, \"type\");\n if (!type) {\n return null;\n }\n const fields = [\n \"text\",\n \"mimeType\",\n \"data\",\n \"url\",\n \"attachmentId\",\n \"name\",\n \"path\",\n \"uri\",\n \"hostPath\",\n \"uploadStatus\",\n \"assetId\",\n \"kind\"\n ];\n const parts = [`type=${type}`];\n for (const field of fields) {\n const value = workspaceAgentActivityStringField(record, field);\n if (value) {\n parts.push(`${field}=${value}`);\n }\n }\n const sizeBytes = record.sizeBytes;\n if (typeof sizeBytes === \"number\" && Number.isFinite(sizeBytes)) {\n parts.push(`sizeBytes=${sizeBytes}`);\n }\n return parts.join(\"\\u0002\");\n}\n\nfunction workspaceAgentActivityStringField(\n record: Record<string, unknown>,\n field: string\n): string {\n const value = record[field];\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n","import type { AgentHostUserInfo } from \"./contracts/dto\";\nimport { translate } from \"../i18n/index\";\nimport { fileChangePathsFromChanges } from \"./workspaceAgentFileChangePayload\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { normalizeWorkspaceAgentStatus } from \"./workspaceAgentStatusNormalizer\";\nimport type { RoomShareMemberView } from \"./roomShare\";\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 fallbackMembers?: RoomShareMemberView[];\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 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);\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 const fallbackMember = selectFallbackMember(options.fallbackMembers ?? []);\n if (fallbackMember) {\n return {\n userId: fallbackMember.userId,\n userName: fallbackMember.label || \"Unknown member\",\n ...(fallbackMember.avatarUrl\n ? { userAvatarUrl: fallbackMember.avatarUrl }\n : {})\n };\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 selectFallbackMember(\n members: RoomShareMemberView[]\n): RoomShareMemberView | null {\n return (\n members.find((member) => member.role === \"owner\") ?? members[0] ?? null\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): WorkspaceAgentActivityStatus {\n const normalized = normalizeWorkspaceAgentStatus(session).kind;\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 case \"ready\":\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 (\n sessionTitle &&\n !isProviderPlaceholderTitleForSession(sessionTitle, session)\n ) {\n return sessionTitle;\n }\n return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();\n}\n\nfunction isProviderPlaceholderTitleForSession(\n title: string,\n session: WorkspaceAgentActivitySession\n): boolean {\n const provider = normalizeProvider(session.provider);\n if (!provider) {\n return false;\n }\n const normalizedTitle = title.trim().toLowerCase();\n return (\n workspaceAgentProviderLabel(provider).toLowerCase() === normalizedTitle\n );\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\nfunction changedFilesForSession(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\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(message, normalizePath)) {\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): string[] {\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 (!isSuccessfulFileChangeToolMessage(message)) {\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 const normalizedStatus = normalizeToken(message.status ?? undefined);\n if (\n normalizedStatus &&\n normalizedStatus !== \"completed\" &&\n normalizedStatus !== \"success\"\n ) {\n return false;\n }\n const payload = objectValue(message.payload);\n const activityKind = stringValue(payload?.activityKind);\n if (\n activityKind === \"write_file\" ||\n activityKind === \"edit_file\" ||\n activityKind === \"delete_file\"\n ) {\n return true;\n }\n if (stringValue(payload?.fileChangeKind)) {\n return true;\n }\n const input = objectValue(payload?.input);\n const toolCall =\n objectValue(input?.toolCall) ?? objectValue(payload?.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(payload?.toolName) ??\n stringValue(payload?.title) ??\n stringValue(payload?.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 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"],"mappings":"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","names":["compactText"]}
|
|
@@ -7,17 +7,17 @@ import {
|
|
|
7
7
|
AgentGUIConversation_styles_default,
|
|
8
8
|
MessageSquareMoreIcon,
|
|
9
9
|
extractAgentMcpToolTarget
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AFTAFV2C.js";
|
|
11
11
|
import {
|
|
12
12
|
Spinner
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-WPWZKKKV.js";
|
|
14
14
|
import {
|
|
15
15
|
getOptionalAgentHostApi,
|
|
16
16
|
useOptionalAgentHostApi
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-SGQ4C7JE.js";
|
|
18
18
|
import {
|
|
19
19
|
translate
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-RQ3HEF42.js";
|
|
21
21
|
|
|
22
22
|
// shared/agentConversation/approvalOptionPresentation.ts
|
|
23
23
|
function approvalOptionDisplayLabel(option, intent = {}) {
|
|
@@ -1120,4 +1120,4 @@ export {
|
|
|
1120
1120
|
isPromptRequestIdTitle,
|
|
1121
1121
|
AgentInteractivePromptSurface
|
|
1122
1122
|
};
|
|
1123
|
-
//# sourceMappingURL=chunk-
|
|
1123
|
+
//# sourceMappingURL=chunk-RDCBACWR.js.map
|
|
@@ -734,7 +734,6 @@ var en = {
|
|
|
734
734
|
conversationUnavailable: "Session unavailable.",
|
|
735
735
|
contextPickerBrowseHint: "Search workspace files based on your input",
|
|
736
736
|
contextPickerBrowseFileHint: "No opened or Agent-generated files yet. Type a file name to search your computer.",
|
|
737
|
-
mentionFileSearchMoreHint: "Type a file name to search for more files on your computer",
|
|
738
737
|
contextPickerBrowseAppHint: "Type to search apps",
|
|
739
738
|
contextPickerBrowseSessionHint: "Type to search agent sessions that I started",
|
|
740
739
|
contextPickerBrowseCollabHint: "Type to search teammate and agent sessions",
|
|
@@ -893,7 +892,7 @@ var en = {
|
|
|
893
892
|
fileMentionLoading: "Searching...",
|
|
894
893
|
fileMentionEmpty: "Search workspace files based on your input",
|
|
895
894
|
fileMentionError: "Unable to search Files.",
|
|
896
|
-
fileMentionTabHint: "Tab switch category |
|
|
895
|
+
fileMentionTabHint: "Tab switch category | \u2190\u2192 enter/leave folder | \u2191\u2193 switch selection",
|
|
897
896
|
addReference: "Add reference",
|
|
898
897
|
referenceWorkspaceFiles: "Reference workspace files",
|
|
899
898
|
referencePicker: {
|
|
@@ -936,6 +935,7 @@ var en = {
|
|
|
936
935
|
projectLocked: "Project cannot be changed after the session starts",
|
|
937
936
|
projectMissingDescription: "This conversation's working directory no longer exists",
|
|
938
937
|
fileMentionSwitchCategory: "Switch category",
|
|
938
|
+
fileMentionNavigateHierarchy: "Enter/leave folder",
|
|
939
939
|
fileMentionSwitchSelection: "Switch selection",
|
|
940
940
|
mentionFilterFile: "Files",
|
|
941
941
|
mentionFilterApp: "Apps",
|
|
@@ -961,7 +961,7 @@ var en = {
|
|
|
961
961
|
mentionEmptyDockFiles: "No open files in the dock yet. Type to search workspace files.",
|
|
962
962
|
mentionEmptyAgentGeneratedFiles: "No files generated by Agent yet",
|
|
963
963
|
mentionAgentGeneratedFolderBack: "Back",
|
|
964
|
-
mentionAgentGeneratedFolderFileCount: "{{count}} files",
|
|
964
|
+
mentionAgentGeneratedFolderFileCount: "Contains {{count}} files",
|
|
965
965
|
mentionNoMatchingFiles: "No matching files",
|
|
966
966
|
mentionOpenReferences: "View output files",
|
|
967
967
|
issueRunPrompt: {
|
|
@@ -3125,7 +3125,6 @@ var zhCN = {
|
|
|
3125
3125
|
conversationUnavailable: "\u4F1A\u8BDD\u4E0D\u53EF\u7528\u3002",
|
|
3126
3126
|
contextPickerBrowseHint: "\u6839\u636E\u4F60\u8F93\u5165\u7684\u5185\u5BB9\u641C\u7D22\u5DE5\u4F5C\u533A\u6587\u4EF6",
|
|
3127
3127
|
contextPickerBrowseFileHint: "\u6682\u65E0\u5DF2\u6253\u5F00\u6216 Agent \u751F\u6210\u7684\u6587\u4EF6\uFF0C\u7EE7\u7EED\u8F93\u5165\u6587\u4EF6\u540D\u53EF\u641C\u7D22\u672C\u673A\u6587\u4EF6",
|
|
3128
|
-
mentionFileSearchMoreHint: "\u7EE7\u7EED\u8F93\u5165\u6587\u4EF6\u540D\u53EF\u641C\u7D22\u66F4\u591A\u672C\u673A\u6587\u4EF6",
|
|
3129
3128
|
contextPickerBrowseAppHint: "\u8F93\u5165\u5185\u5BB9\u4EE5\u641C\u7D22\u5E94\u7528",
|
|
3130
3129
|
contextPickerBrowseSessionHint: "\u8F93\u5165\u5185\u5BB9\u4EE5\u641C\u7D22\u6211\u53D1\u8D77\u7684 Agent \u4F1A\u8BDD",
|
|
3131
3130
|
contextPickerBrowseCollabHint: "\u8F93\u5165\u5185\u5BB9\u4EE5\u641C\u7D22\u5176\u4ED6\u4EBA\u548C Agent \u7684\u4F1A\u8BDD",
|
|
@@ -3284,7 +3283,7 @@ var zhCN = {
|
|
|
3284
3283
|
fileMentionLoading: "\u6B63\u5728\u641C\u7D22\u5DE5\u4F5C\u533A...",
|
|
3285
3284
|
fileMentionEmpty: "\u6839\u636E\u4F60\u8F93\u5165\u7684\u5185\u5BB9\u641C\u7D22\u5DE5\u4F5C\u533A\u6587\u4EF6",
|
|
3286
3285
|
fileMentionError: "\u65E0\u6CD5\u641C\u7D22\u5DE5\u4F5C\u533A\u6587\u4EF6\u3002",
|
|
3287
|
-
fileMentionTabHint: "Tab \u5207\u6362\u5206\u7C7B \uFF5C \u2191\u2193 \u5207\u6362\u9009\u4E2D",
|
|
3286
|
+
fileMentionTabHint: "Tab \u5207\u6362\u5206\u7C7B \uFF5C \u2190\u2192 \u8FDB\u5165/\u8FD4\u56DE\u6587\u4EF6\u5939 \uFF5C \u2191\u2193 \u5207\u6362\u9009\u4E2D",
|
|
3288
3287
|
addReference: "\u6DFB\u52A0\u5F15\u7528",
|
|
3289
3288
|
referenceWorkspaceFiles: "\u5F15\u7528\u7A7A\u95F4\u6587\u4EF6",
|
|
3290
3289
|
referencePicker: {
|
|
@@ -3327,6 +3326,7 @@ var zhCN = {
|
|
|
3327
3326
|
projectLocked: "\u4F1A\u8BDD\u5F00\u59CB\u540E\u9879\u76EE\u4E0D\u53EF\u66F4\u6539",
|
|
3328
3327
|
projectMissingDescription: "\u6B64\u5BF9\u8BDD\u7684\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728",
|
|
3329
3328
|
fileMentionSwitchCategory: "\u5207\u6362\u5206\u7C7B",
|
|
3329
|
+
fileMentionNavigateHierarchy: "\u8FDB\u5165/\u8FD4\u56DE\u6587\u4EF6\u5939",
|
|
3330
3330
|
fileMentionSwitchSelection: "\u5207\u6362\u9009\u4E2D",
|
|
3331
3331
|
mentionFilterFile: "\u6587\u4EF6",
|
|
3332
3332
|
mentionFilterApp: "\u5E94\u7528",
|
|
@@ -3352,7 +3352,7 @@ var zhCN = {
|
|
|
3352
3352
|
mentionEmptyDockFiles: "Dock \u680F\u6682\u65E0\u5DF2\u6253\u5F00\u6587\u4EF6\uFF0C\u8F93\u5165\u5173\u952E\u8BCD\u53EF\u641C\u7D22\u5DE5\u4F5C\u533A\u6587\u4EF6",
|
|
3353
3353
|
mentionEmptyAgentGeneratedFiles: "\u6682\u65E0 Agent \u751F\u6210\u7684\u6587\u4EF6",
|
|
3354
3354
|
mentionAgentGeneratedFolderBack: "\u8FD4\u56DE",
|
|
3355
|
-
mentionAgentGeneratedFolderFileCount: "{{count}} \u4E2A\u6587\u4EF6",
|
|
3355
|
+
mentionAgentGeneratedFolderFileCount: "\u5305\u542B {{count}} \u4E2A\u6587\u4EF6",
|
|
3356
3356
|
mentionNoMatchingFiles: "\u6CA1\u6709\u5339\u914D\u5230\u6587\u4EF6",
|
|
3357
3357
|
mentionOpenReferences: "\u67E5\u770B\u4EA7\u7269\u6587\u4EF6",
|
|
3358
3358
|
issueRunPrompt: {
|
|
@@ -4896,4 +4896,4 @@ export {
|
|
|
4896
4896
|
AgentGuiI18nProvider,
|
|
4897
4897
|
useTranslation
|
|
4898
4898
|
};
|
|
4899
|
-
//# sourceMappingURL=chunk-
|
|
4899
|
+
//# sourceMappingURL=chunk-RQ3HEF42.js.map
|