@tutti-os/agent-gui 0.0.36 → 0.0.38

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 (39) hide show
  1. package/dist/{AgentMessageMarkdown-0sV8Biv3.d.ts → AgentMessageMarkdown-Cq-7DSV2.d.ts} +3 -2
  2. package/dist/agent-conversation/index.d.ts +4 -4
  3. package/dist/agent-conversation/index.js +4 -4
  4. package/dist/agent-message-center/index.d.ts +3 -2
  5. package/dist/agent-message-center/index.js +12 -5
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/{agentConversationVM-xuzmD5IL.d.ts → agentConversationVM-1QgRwvwZ.d.ts} +1 -1
  8. package/dist/app/renderer/agentactivity.css +25 -7
  9. package/dist/{chunk-CMXRLF64.js → chunk-44YASHVW.js} +90 -95
  10. package/dist/chunk-44YASHVW.js.map +1 -0
  11. package/dist/{chunk-O56P2KSZ.js → chunk-7F4M55U3.js} +53 -16
  12. package/dist/chunk-7F4M55U3.js.map +1 -0
  13. package/dist/{chunk-KFMD33UD.js → chunk-JL2WNRYC.js} +7 -7
  14. package/dist/chunk-JL2WNRYC.js.map +1 -0
  15. package/dist/{chunk-JYH2ITNL.js → chunk-L7FBT3VR.js} +4 -4
  16. package/dist/{chunk-U3D7YI47.js → chunk-MKSRP5XS.js} +8 -7
  17. package/dist/{chunk-U3D7YI47.js.map → chunk-MKSRP5XS.js.map} +1 -1
  18. package/dist/{chunk-UN4XGHLQ.js → chunk-SS5YEVAI.js} +79 -107
  19. package/dist/chunk-SS5YEVAI.js.map +1 -0
  20. package/dist/{chunk-3LEUGNCT.js → chunk-WHWZZYBV.js} +2 -2
  21. package/dist/{chunk-VPC55T7P.js → chunk-XROBPALT.js} +2 -2
  22. package/dist/context-mention-palette/index.js +5 -5
  23. package/dist/i18n/index.d.ts +6 -6
  24. package/dist/i18n/index.js +1 -1
  25. package/dist/index.d.ts +7 -5
  26. package/dist/index.js +413 -96
  27. package/dist/index.js.map +1 -1
  28. package/dist/plan-decision-ops.d.ts +2 -2
  29. package/dist/workspace-agent-generated-files.d.ts +1 -1
  30. package/dist/workspace-agent-generated-files.js +2 -2
  31. package/dist/{workspaceAgentActivityListViewModel-DwpbJGDx.d.ts → workspaceAgentActivityListViewModel-DLnMBMoh.d.ts} +3 -4
  32. package/package.json +12 -12
  33. package/dist/chunk-CMXRLF64.js.map +0 -1
  34. package/dist/chunk-KFMD33UD.js.map +0 -1
  35. package/dist/chunk-O56P2KSZ.js.map +0 -1
  36. package/dist/chunk-UN4XGHLQ.js.map +0 -1
  37. /package/dist/{chunk-JYH2ITNL.js.map → chunk-L7FBT3VR.js.map} +0 -0
  38. /package/dist/{chunk-3LEUGNCT.js.map → chunk-WHWZZYBV.js.map} +0 -0
  39. /package/dist/{chunk-VPC55T7P.js.map → chunk-XROBPALT.js.map} +0 -0
@@ -14,97 +14,10 @@ import {
14
14
  import {
15
15
  translate,
16
16
  translateInUiLanguage
17
- } from "./chunk-KFMD33UD.js";
17
+ } from "./chunk-JL2WNRYC.js";
18
18
 
19
- // shared/workspaceAgentStatusNormalizer.ts
20
- var FAILED_STATUS_TOKENS = /* @__PURE__ */ new Set(["failed", "error"]);
21
- var CANCELED_STATUS_TOKENS = /* @__PURE__ */ new Set(["canceled"]);
22
- var COMPLETED_STATUS_TOKENS = /* @__PURE__ */ new Set(["completed", "ended", "end"]);
23
- var WAITING_APPROVAL_TOKENS = /* @__PURE__ */ new Set([
24
- "waiting_approval",
25
- "awaiting_approval"
26
- ]);
27
- var WAITING_INPUT_TOKENS = /* @__PURE__ */ new Set(["waiting_input"]);
28
- var WAITING_STATUS_TOKENS = /* @__PURE__ */ new Set(["waiting"]);
29
- var WORKING_STATUS_TOKENS = /* @__PURE__ */ new Set([
30
- "submitted",
31
- "working",
32
- "running",
33
- "streaming"
34
- ]);
35
- var READY_STATUS_TOKENS = /* @__PURE__ */ new Set(["ready", "idle"]);
36
- function normalizeWorkspaceAgentStatus(input) {
37
- return normalizeOptionalWorkspaceAgentStatus(input) ?? { kind: "ready" };
38
- }
39
- function normalizeOptionalWorkspaceAgentStatus(input) {
40
- const lifecycleStatus = normalizeStatusToken(input.lifecycleStatus);
41
- const effectiveStatus = normalizeStatusToken(input.effectiveStatus);
42
- const sessionStatus = normalizeStatusToken(input.status);
43
- const turnPhase = normalizeStatusToken(input.turnPhase);
44
- const currentPhase = normalizeStatusToken(input.currentPhase);
45
- const tokens = [
46
- lifecycleStatus,
47
- effectiveStatus,
48
- sessionStatus,
49
- turnPhase,
50
- currentPhase
51
- ].filter(Boolean);
52
- if (tokens.length === 0) {
53
- return null;
54
- }
55
- if ([lifecycleStatus, effectiveStatus, sessionStatus, currentPhase].some(
56
- (token) => FAILED_STATUS_TOKENS.has(token)
57
- )) {
58
- return { kind: "failed" };
59
- }
60
- if ([lifecycleStatus, effectiveStatus, sessionStatus].some(
61
- (token) => CANCELED_STATUS_TOKENS.has(token)
62
- )) {
63
- return { kind: "canceled" };
64
- }
65
- if ([lifecycleStatus, effectiveStatus, sessionStatus].some(
66
- (token) => COMPLETED_STATUS_TOKENS.has(token)
67
- )) {
68
- return { kind: "completed" };
69
- }
70
- const waitKind = waitingKindFromTokens([
71
- currentPhase,
72
- turnPhase,
73
- effectiveStatus,
74
- sessionStatus
75
- ]);
76
- if (waitKind) {
77
- return { kind: "waiting", waitKind };
78
- }
79
- if ([currentPhase, turnPhase, effectiveStatus, sessionStatus].some(
80
- (token) => WAITING_STATUS_TOKENS.has(token)
81
- )) {
82
- return { kind: "waiting" };
83
- }
84
- if ([currentPhase, turnPhase, effectiveStatus, sessionStatus].some(
85
- (token) => WORKING_STATUS_TOKENS.has(token)
86
- )) {
87
- return { kind: "working" };
88
- }
89
- if (lifecycleStatus === "active" || lifecycleStatus === "ready" || [currentPhase, turnPhase, effectiveStatus, sessionStatus].some(
90
- (token) => READY_STATUS_TOKENS.has(token)
91
- )) {
92
- return { kind: "ready" };
93
- }
94
- return null;
95
- }
96
- function waitingKindFromTokens(tokens) {
97
- if (tokens.some((token) => WAITING_APPROVAL_TOKENS.has(token))) {
98
- return "approval";
99
- }
100
- if (tokens.some((token) => WAITING_INPUT_TOKENS.has(token))) {
101
- return "input";
102
- }
103
- return void 0;
104
- }
105
- function normalizeStatusToken(status) {
106
- return status?.trim().toLowerCase() ?? "";
107
- }
19
+ // shared/workspaceAgentActivityListViewModel.ts
20
+ import { normalizeAgentActivityDisplayStatus } from "@tutti-os/agent-activity-core";
108
21
 
109
22
  // shared/workspaceAgentLatestActivitySummary.ts
110
23
  function fallbackSummary(status) {
@@ -314,7 +227,9 @@ function collectWorkspaceAgentGeneratedFiles(snapshot, options = {}) {
314
227
  if (messages.length === 0) {
315
228
  continue;
316
229
  }
317
- for (const file of changedFilesForSession(messages, normalizePath)) {
230
+ for (const file of changedFilesForSession(messages, normalizePath, {
231
+ requireSuccessfulFileChangeTool: true
232
+ })) {
318
233
  filesByPath.set(file.path, file);
319
234
  }
320
235
  for (const path of imageGenerationPathsFromMessages(
@@ -501,7 +416,11 @@ function normalizeProvider(provider) {
501
416
  return trimmed ? trimmed.toLowerCase() : null;
502
417
  }
503
418
  function resolveWorkspaceAgentActivityStatus(session) {
504
- const normalized = normalizeWorkspaceAgentStatus(session).kind;
419
+ const normalized = normalizeAgentActivityDisplayStatus(session.status, {
420
+ currentPhase: session.currentPhase,
421
+ turnLifecycleOutcome: session.turnLifecycle?.outcome,
422
+ turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase
423
+ });
505
424
  switch (normalized) {
506
425
  case "failed":
507
426
  return "failed";
@@ -513,7 +432,6 @@ function resolveWorkspaceAgentActivityStatus(session) {
513
432
  return "waiting";
514
433
  case "working":
515
434
  return "working";
516
- case "ready":
517
435
  default:
518
436
  return "idle";
519
437
  }
@@ -547,7 +465,7 @@ function resolveLatestActivity(messages, status, actors) {
547
465
  summary: fallbackSummary(status)
548
466
  };
549
467
  }
550
- function changedFilesForSession(messages, normalizePath = defaultChangedFilePathNormalizer) {
468
+ function changedFilesForSession(messages, normalizePath = defaultChangedFilePathNormalizer, options = {}) {
551
469
  const changedFilesByPath = /* @__PURE__ */ new Map();
552
470
  const appendPath = (path) => {
553
471
  if (!path || changedFilesByPath.has(path)) {
@@ -559,13 +477,21 @@ function changedFilesForSession(messages, normalizePath = defaultChangedFilePath
559
477
  });
560
478
  };
561
479
  for (const message of messages) {
562
- for (const path of changedFilePathsFromMessage(message, normalizePath)) {
480
+ for (const path of changedFilePathsFromMessage(
481
+ message,
482
+ normalizePath,
483
+ options
484
+ )) {
563
485
  appendPath(path);
564
486
  }
565
487
  }
566
488
  return applyShortestUniqueFileLabels(Array.from(changedFilesByPath.values()));
567
489
  }
568
- function changedFilePathsFromMessage(message, normalizePath = defaultChangedFilePathNormalizer) {
490
+ function changedFilePathsFromMessage(message, normalizePath = defaultChangedFilePathNormalizer, options = {}) {
491
+ const isSuccessfulFileChangeTool = isSuccessfulFileChangeToolMessage(message);
492
+ if (options.requireSuccessfulFileChangeTool && !isSuccessfulFileChangeTool) {
493
+ return [];
494
+ }
569
495
  const payload = objectValue(message.payload);
570
496
  const explicitFileChanges = fileChangePaths(
571
497
  arrayValue(objectValue(payload?.fileChanges)?.files),
@@ -574,7 +500,7 @@ function changedFilePathsFromMessage(message, normalizePath = defaultChangedFile
574
500
  if (explicitFileChanges.length > 0) {
575
501
  return explicitFileChanges;
576
502
  }
577
- if (!isSuccessfulFileChangeToolMessage(message)) {
503
+ if (!isSuccessfulFileChangeTool) {
578
504
  return [];
579
505
  }
580
506
  const toolState = objectValue(payload?.tool_state);
@@ -793,26 +719,70 @@ function isSuccessfulFileChangeToolMessage(message) {
793
719
  if (normalizeToken(message.kind) !== "tool_call") {
794
720
  return false;
795
721
  }
796
- const normalizedStatus = normalizeToken(message.status ?? void 0);
797
- if (normalizedStatus && normalizedStatus !== "completed" && normalizedStatus !== "success") {
722
+ if (!isSuccessfulFileChangeStatus(message.status ?? void 0)) {
798
723
  return false;
799
724
  }
800
725
  const payload = objectValue(message.payload);
801
- const activityKind = stringValue(payload?.activityKind);
802
- if (activityKind === "write_file" || activityKind === "edit_file" || activityKind === "delete_file") {
726
+ if (!isSuccessfulFileChangePayloadStatus(payload)) {
727
+ return false;
728
+ }
729
+ return hasFileChangeSignal(payload);
730
+ }
731
+ function isSuccessfulFileChangePayloadStatus(payload) {
732
+ if (!payload) {
803
733
  return true;
804
734
  }
805
- if (stringValue(payload?.fileChangeKind)) {
735
+ if (!isSuccessfulFileChangeRecordStatus(payload)) {
736
+ return false;
737
+ }
738
+ const output = objectValue(payload.output);
739
+ if (output && !isSuccessfulFileChangeRecordStatus(output)) {
740
+ return false;
741
+ }
742
+ return true;
743
+ }
744
+ function isSuccessfulFileChangeRecordStatus(record) {
745
+ const status = stringValue(record.status);
746
+ if (status && !isSuccessfulFileChangeStatus(status)) {
747
+ return false;
748
+ }
749
+ const success = booleanValue(record.success);
750
+ if (success === false) {
751
+ return false;
752
+ }
753
+ return true;
754
+ }
755
+ function isSuccessfulFileChangeStatus(value) {
756
+ const normalizedStatus = normalizeToken(value);
757
+ return !normalizedStatus || normalizedStatus === "completed" || normalizedStatus === "success" || normalizedStatus === "succeeded" || normalizedStatus === "ok";
758
+ }
759
+ function hasFileChangeSignal(payload) {
760
+ if (!payload) {
761
+ return false;
762
+ }
763
+ const toolState = objectValue(payload.tool_state);
764
+ return [
765
+ payload,
766
+ objectValue(payload.input),
767
+ objectValue(payload.output),
768
+ objectValue(toolState?.input)
769
+ ].some((record) => record !== null && recordHasFileChangeToolSignal(record));
770
+ }
771
+ function recordHasFileChangeToolSignal(record) {
772
+ const activityKind = stringValue(record.activityKind);
773
+ if (activityKind && isFileChangeNormalizedToolName(normalizeToolName(activityKind))) {
774
+ return true;
775
+ }
776
+ if (stringValue(record.fileChangeKind)) {
806
777
  return true;
807
778
  }
808
- const input = objectValue(payload?.input);
809
- const toolCall = objectValue(input?.toolCall) ?? objectValue(payload?.toolCall);
779
+ const toolCall = objectValue(record.toolCall);
810
780
  const toolCallKind = normalizeToken(stringValue(toolCall?.kind) ?? void 0);
811
781
  if (toolCallKind === "write" || toolCallKind === "edit" || toolCallKind === "delete") {
812
782
  return true;
813
783
  }
814
784
  const toolName = normalizeToolName(
815
- stringValue(payload?.toolName) ?? stringValue(payload?.title) ?? stringValue(payload?.name) ?? ""
785
+ stringValue(record.toolName) ?? stringValue(record.title) ?? stringValue(record.name) ?? ""
816
786
  );
817
787
  return isFileChangeNormalizedToolName(toolName);
818
788
  }
@@ -885,6 +855,9 @@ function arrayValue(value) {
885
855
  function stringValue(value) {
886
856
  return typeof value === "string" && value.trim() ? value.trim() : null;
887
857
  }
858
+ function booleanValue(value) {
859
+ return typeof value === "boolean" ? value : null;
860
+ }
888
861
  function dedupeStrings(values) {
889
862
  return [
890
863
  ...new Set(
@@ -1004,7 +977,6 @@ function stripTrailingParentheticalEmailFromLabel(label) {
1004
977
  }
1005
978
 
1006
979
  export {
1007
- normalizeOptionalWorkspaceAgentStatus,
1008
980
  isWorkspaceAgentUntitledTask,
1009
981
  WORKSPACE_AGENT_ACTIVITY_RUNTIME_SESSION_ORIGIN,
1010
982
  isWorkspaceAgentActivityRuntimeSessionOrigin,
@@ -1018,4 +990,4 @@ export {
1018
990
  resolveWorkspaceAgentActivityStatus,
1019
991
  resolveWorkspaceAgentActivityTitle
1020
992
  };
1021
- //# sourceMappingURL=chunk-UN4XGHLQ.js.map
993
+ //# sourceMappingURL=chunk-SS5YEVAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/workspaceAgentActivityListViewModel.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts","../shared/workspaceAgentActivityTypes.ts"],"sourcesContent":["import { normalizeAgentActivityDisplayStatus } from \"@tutti-os/agent-activity-core\";\nimport type { AgentHostUserInfo } from \"./contracts/dto\";\nimport { translate } from \"../i18n/index\";\nimport { fileChangePathsFromChanges } from \"./workspaceAgentFileChangePayload\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport 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 requireSuccessfulFileChangeTool: true\n })) {\n filesByPath.set(file.path, file);\n }\n for (const path of imageGenerationPathsFromMessages(\n messages,\n normalizePath\n )) {\n if (filesByPath.has(path)) {\n continue;\n }\n filesByPath.set(path, {\n path,\n label: path.split(\"/\").filter(Boolean).at(-1) ?? path\n });\n }\n }\n\n return applyShortestUniqueFileLabels([...filesByPath.values()]);\n}\n\nexport function buildWorkspaceAgentActivityListViewModel(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: BuildWorkspaceAgentActivityListOptions = {}\n): WorkspaceAgentActivityListViewModel {\n const presencesById = new Map(\n snapshot.presences.map((presence) => [presence.id, presence])\n );\n\n const activities = snapshot.sessions\n .map((session): WorkspaceAgentActivityCard | null => {\n const presence =\n session.presenceId === undefined\n ? null\n : (presencesById.get(session.presenceId) ?? null);\n const messages = resolveWorkspaceAgentSessionMessages(\n options.sessionMessagesById,\n session\n );\n const status = resolveWorkspaceAgentActivityStatus(session);\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 = normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase\n });\n switch (normalized) {\n case \"failed\":\n return \"failed\";\n case \"canceled\":\n return \"canceled\";\n case \"completed\":\n return \"completed\";\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n default:\n return \"idle\";\n }\n}\n\nexport function resolveWorkspaceAgentActivityTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): string {\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);\n const userMessageTitle = firstUserMessageText(messages);\n if (\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\ninterface ChangedFileCollectionOptions {\n requireSuccessfulFileChangeTool?: boolean;\n}\n\nfunction changedFilesForSession(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): WorkspaceAgentChangedFile[] {\n const changedFilesByPath = new Map<string, WorkspaceAgentChangedFile>();\n const appendPath = (path: string | null): void => {\n if (!path || changedFilesByPath.has(path)) {\n return;\n }\n changedFilesByPath.set(path, {\n path,\n label: path\n });\n };\n\n for (const message of messages) {\n for (const path of changedFilePathsFromMessage(\n message,\n normalizePath,\n options\n )) {\n appendPath(path);\n }\n }\n\n return applyShortestUniqueFileLabels(Array.from(changedFilesByPath.values()));\n}\n\nfunction changedFilePathsFromMessage(\n message: WorkspaceAgentActivityMessage,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): string[] {\n const isSuccessfulFileChangeTool = isSuccessfulFileChangeToolMessage(message);\n if (options.requireSuccessfulFileChangeTool && !isSuccessfulFileChangeTool) {\n return [];\n }\n const payload = objectValue(message.payload);\n const explicitFileChanges = fileChangePaths(\n arrayValue(objectValue(payload?.fileChanges)?.files),\n normalizePath\n );\n if (explicitFileChanges.length > 0) {\n return explicitFileChanges;\n }\n if (!isSuccessfulFileChangeTool) {\n return [];\n }\n\n const toolState = objectValue(payload?.tool_state);\n const input =\n objectValue(payload?.input) ?? objectValue(toolState?.input) ?? null;\n const output = objectValue(payload?.output);\n const paths = dedupeStrings([\n ...pathsValue(payload?.paths, normalizePath),\n ...pathsValue(output?.paths, normalizePath),\n ...pathsValue(input?.paths, normalizePath),\n ...changeMapPaths(payload?.changes, normalizePath),\n ...changeMapPaths(output?.changes, normalizePath),\n ...changeMapPaths(input?.changes, normalizePath),\n ...contentDiffPaths(payload?.content, normalizePath),\n ...contentDiffPaths(output?.content, normalizePath),\n ...contentDiffPaths(input?.content, normalizePath),\n stringValue(payload?.path),\n stringValue(payload?.filePath),\n stringValue(payload?.file_path),\n stringValue(input?.path),\n stringValue(input?.filePath),\n stringValue(input?.file_path),\n stringValue(output?.path),\n stringValue(output?.filePath),\n stringValue(output?.file_path)\n ]);\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction defaultChangedFilePathNormalizer(value: unknown): string | null {\n return normalizedChangedFilePath(value);\n}\n\nfunction resolveWorkspaceRootFromSessions(\n sessions: readonly WorkspaceAgentActivitySession[]\n): string {\n for (const session of sessions) {\n const cwd = normalizeComparablePath(session.cwd ?? \"\");\n if (cwd) {\n return cwd;\n }\n }\n return \"\";\n}\n\nfunction normalizeComparablePath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction createAgentGeneratedFilePathNormalizer(input: {\n sessionCwd?: string | null;\n workspaceRoot?: string | null;\n}): ChangedFilePathNormalizer {\n const workspaceRoot = input.workspaceRoot?.trim().replace(/\\/+$/, \"\") ?? \"\";\n const sessionCwd =\n input.sessionCwd?.trim().replace(/\\/+$/, \"\") || workspaceRoot;\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return null;\n }\n return resolveAgentGeneratedFilePath(value, workspaceRoot, sessionCwd);\n };\n}\n\nfunction resolveAgentGeneratedFilePath(\n rawPath: string,\n workspaceRoot: string,\n sessionCwd: string\n): string | null {\n const path = rawPath.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (path.startsWith(\"/workspace/\")) {\n return path;\n }\n if (isAgentStateGeneratedImagePath(path)) {\n return path;\n }\n if (isAbsoluteAgentGeneratedFilePath(path)) {\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(path, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(path)\n ) {\n return null;\n }\n return path.replace(/\\\\/g, \"/\");\n }\n\n const base = sessionCwd || workspaceRoot;\n if (!base) {\n return null;\n }\n const resolved = joinAgentGeneratedFilePath(base, path.replace(/^\\.?\\//, \"\"));\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(resolved, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(resolved)\n ) {\n return null;\n }\n return resolved;\n}\n\nfunction isAbsoluteAgentGeneratedFilePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(path);\n}\n\nfunction isPathInsideOrEqual(path: string, root: string): boolean {\n const normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!normalizedRoot) {\n return false;\n }\n return (\n normalizedPath === normalizedRoot ||\n normalizedPath.startsWith(`${normalizedRoot}/`)\n );\n}\n\nfunction joinAgentGeneratedFilePath(\n base: string,\n relativePath: string\n): string {\n const normalizedBase = base.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRelative = relativePath.replace(/\\\\/g, \"/\");\n return `${normalizedBase}/${normalizedRelative}`;\n}\n\nfunction imageGenerationPathsFromMessages(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer\n): string[] {\n const paths: string[] = [];\n for (const message of messages) {\n const payload = objectValue(message.payload);\n if (!payload) {\n continue;\n }\n const output = objectValue(payload.output);\n for (const uri of [\n ...imageGenerationUris(payload.content),\n ...imageGenerationUris(output?.content)\n ]) {\n const normalized = normalizePath(uri);\n if (normalized) {\n paths.push(normalized);\n }\n }\n }\n return dedupeStrings(paths);\n}\n\nfunction imageGenerationUris(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const uris: string[] = [];\n for (const item of value) {\n const record = objectValue(item);\n if (!record) {\n continue;\n }\n const type = stringValue(record.type)?.toLowerCase();\n const uri = stringValue(record.uri) ?? stringValue(record.path);\n if (!uri) {\n continue;\n }\n if (\n type === \"image\" ||\n uri.toLowerCase().includes(\"generated_images\") ||\n /\\.(?:png|jpe?g|gif|webp|bmp|svg)$/i.test(uri)\n ) {\n uris.push(uri);\n }\n }\n return uris;\n}\n\nfunction isAgentStateGeneratedImagePath(path: string): boolean {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return false;\n }\n const statePath = segments.slice(stateRootIndex);\n return (\n statePath[1] === \"agent\" &&\n statePath[2] === \"runs\" &&\n statePath.includes(\"generated_images\")\n );\n}\n\nfunction normalizedChangedFilePath(\n value: unknown,\n options: { allowRelative?: boolean } = {}\n): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const path = value.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (!options.allowRelative && !path.startsWith(\"/workspace/\")) {\n return null;\n }\n return path;\n}\n\nfunction applyShortestUniqueFileLabels(\n files: WorkspaceAgentChangedFile[]\n): WorkspaceAgentChangedFile[] {\n const suffixByPath = shortestUniquePathSuffixByPath(\n files.map((file) => file.path)\n );\n return files.map((file) => ({\n ...file,\n label: suffixByPath.get(file.path) ?? file.label\n }));\n}\n\nfunction shortestUniquePathSuffixByPath(paths: string[]): Map<string, string> {\n const partsByPath = new Map(\n paths.map((path) => [path, splitPathSegments(path)])\n );\n const labels = new Map<string, string>();\n const unresolved = new Set(paths);\n\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const suffix = parts.slice(-Math.min(depth, parts.length)).join(\"/\");\n const fallback = parts.at(-1) ?? path;\n const label = suffix || fallback;\n const group = grouped.get(label);\n if (group) {\n group.push(path);\n } else {\n grouped.set(label, [path]);\n }\n }\n\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1) {\n continue;\n }\n const path = group[0];\n if (!path) {\n continue;\n }\n labels.set(path, label);\n unresolved.delete(path);\n resolvedCount += 1;\n }\n\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n\n return labels;\n}\n\nfunction splitPathSegments(path: string): string[] {\n return path.trim().split(/[\\\\/]/).filter(Boolean);\n}\n\nfunction isSuccessfulFileChangeToolMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n if (normalizeToken(message.kind) !== \"tool_call\") {\n return false;\n }\n if (!isSuccessfulFileChangeStatus(message.status ?? undefined)) {\n return false;\n }\n const payload = objectValue(message.payload);\n if (!isSuccessfulFileChangePayloadStatus(payload)) {\n return false;\n }\n return hasFileChangeSignal(payload);\n}\n\nfunction isSuccessfulFileChangePayloadStatus(\n payload: Record<string, unknown> | null\n): boolean {\n if (!payload) {\n return true;\n }\n if (!isSuccessfulFileChangeRecordStatus(payload)) {\n return false;\n }\n const output = objectValue(payload.output);\n if (output && !isSuccessfulFileChangeRecordStatus(output)) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeRecordStatus(\n record: Record<string, unknown>\n): boolean {\n const status = stringValue(record.status);\n if (status && !isSuccessfulFileChangeStatus(status)) {\n return false;\n }\n const success = booleanValue(record.success);\n if (success === false) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeStatus(value: string | undefined): boolean {\n const normalizedStatus = normalizeToken(value);\n return (\n !normalizedStatus ||\n normalizedStatus === \"completed\" ||\n normalizedStatus === \"success\" ||\n normalizedStatus === \"succeeded\" ||\n normalizedStatus === \"ok\"\n );\n}\n\nfunction hasFileChangeSignal(payload: Record<string, unknown> | null): boolean {\n if (!payload) {\n return false;\n }\n const toolState = objectValue(payload.tool_state);\n return [\n payload,\n objectValue(payload.input),\n objectValue(payload.output),\n objectValue(toolState?.input)\n ].some((record) => record !== null && recordHasFileChangeToolSignal(record));\n}\n\nfunction recordHasFileChangeToolSignal(\n record: Record<string, unknown>\n): boolean {\n const activityKind = stringValue(record.activityKind);\n if (\n activityKind &&\n isFileChangeNormalizedToolName(normalizeToolName(activityKind))\n ) {\n return true;\n }\n if (stringValue(record.fileChangeKind)) {\n return true;\n }\n const toolCall = objectValue(record.toolCall);\n const toolCallKind = normalizeToken(stringValue(toolCall?.kind) ?? undefined);\n if (\n toolCallKind === \"write\" ||\n toolCallKind === \"edit\" ||\n toolCallKind === \"delete\"\n ) {\n return true;\n }\n const toolName = normalizeToolName(\n stringValue(record.toolName) ??\n stringValue(record.title) ??\n stringValue(record.name) ??\n \"\"\n );\n return isFileChangeNormalizedToolName(toolName);\n}\n\nfunction isFileChangeNormalizedToolName(normalizedToolName: string): boolean {\n if (!normalizedToolName) {\n return false;\n }\n const exactMatches = new Set([\n \"write\",\n \"writefile\",\n \"create\",\n \"createfile\",\n \"delete\",\n \"deletefile\",\n \"edit\",\n \"editfile\",\n \"multiedit\",\n \"applypatch\",\n \"move\",\n \"notebookedit\"\n ]);\n if (exactMatches.has(normalizedToolName)) {\n return true;\n }\n for (const prefix of exactMatches) {\n if (normalizedToolName.startsWith(`${prefix}/`)) {\n return true;\n }\n }\n return false;\n}\n\nfunction fileChangePaths(\n files: readonly unknown[] | null,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n if (!files) {\n return [];\n }\n return files\n .map((file) => normalizePath(objectValue(file)?.path))\n .filter((path): path is string => path !== null);\n}\n\nfunction changeMapPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n return fileChangePathsFromChanges(value)\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction contentDiffPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const content = arrayValue(value);\n if (!content) {\n return [];\n }\n return content\n .map((entry) => {\n const record = objectValue(entry);\n if (!record || stringValue(record.type) !== \"diff\") {\n return null;\n }\n return normalizePath(record.path);\n })\n .filter((path): path is string => path !== null);\n}\n\nfunction pathsValue(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const paths = arrayValue(value);\n if (!paths) {\n return [];\n }\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction dedupeStrings(values: Array<string | null>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0\n )\n )\n ];\n}\n\nfunction normalizeToolName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replaceAll(\"_\", \"\")\n .replaceAll(\"-\", \"\")\n .replaceAll(\" \", \"\");\n}\n\nfunction isStructuredPayloadPath(path: string): boolean {\n if (/[\\r\\n]/.test(path)) {\n return true;\n }\n if (!path.startsWith(\"{\") && !path.startsWith(\"[\")) {\n return false;\n }\n try {\n JSON.parse(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readTimeUnixMs(\n session: WorkspaceAgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n fallbackUnixMs: number\n): number {\n if (status === \"completed\" || status === \"failed\") {\n return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;\n }\n return fallbackUnixMs;\n}\n\nfunction firstUserMessageText(\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n const firstUserMessage = messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) => messageRole(item.message) === \"user\" && item.text.length > 0\n )\n .sort((left, right) => {\n const timeDiff = (left.time ?? 0) - (right.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (left.message.id ?? 0) - (right.message.id ?? 0) ||\n left.message.messageId.localeCompare(right.message.messageId)\n );\n })[0];\n\n return firstUserMessage?.text ?? \"\";\n}\n\nfunction latestDisplayableMessage(\n messages: readonly WorkspaceAgentActivityMessage[]\n): {\n message: WorkspaceAgentActivityMessage;\n text: string;\n time?: number;\n} | null {\n return (\n messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) =>\n item.text.length > 0 &&\n normalizeToken(item.message.kind) !== \"tool_call\"\n )\n .sort((left, right) => {\n const timeDiff = (right.time ?? 0) - (left.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (right.message.id ?? 0) - (left.message.id ?? 0) ||\n right.message.messageId.localeCompare(left.message.messageId)\n );\n })[0] ?? null\n );\n}\n\nfunction messageDisplayText(message: WorkspaceAgentActivityMessage): string {\n const payload = message.payload ?? {};\n const text = normalizeAgentTitleText(\n compactText(\n stringValue(payload.displayPrompt) ||\n stringValue(payload.text) ||\n stringValue(payload.content) ||\n stringValue(payload.message) ||\n stringValue(payload.body) ||\n stringValue(payload.title) ||\n \"\"\n )\n );\n return isWorkspaceAgentSyntheticControlMessage(text) ? \"\" : text;\n}\n\nfunction messageRole(message: WorkspaceAgentActivityMessage): string {\n return normalizeToken(message.role);\n}\n\nfunction messageTime(\n message: WorkspaceAgentActivityMessage\n): number | undefined {\n return (\n message.occurredAtUnixMs ??\n message.completedAtUnixMs ??\n message.startedAtUnixMs\n );\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n\nfunction compareActivities(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): number {\n const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return left.sessionId.localeCompare(right.sessionId);\n}\n\nfunction compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return normalizeAgentTitleText(\n translate(\"agentHost.workspaceAgentsUntitledTask\")\n );\n}\n\nfunction workspaceAgentSessionMessageAliases(\n session: WorkspaceAgentActivitySession\n): string[] {\n const values = [\n session.syncState?.agentSessionId,\n session.agentSessionId,\n session.providerSessionId\n ];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\n/** Remove trailing ` (user@host...)` that some APIs pack into names. */\nfunction stripTrailingParentheticalEmailFromLabel(label: string): string {\n return label\n .trim()\n .replace(/\\s*\\([^)]*@[^)]+\\)\\s*$/u, \"\")\n .trim();\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\nimport { translate, translateInUiLanguage } from \"../i18n/index\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\n\nexport type WorkspaceAgentLatestActivityStatus =\n | \"working\"\n | \"waiting\"\n | \"idle\"\n | \"completed\"\n | \"canceled\"\n | \"failed\";\n\nexport interface WorkspaceAgentLatestActivityActors {\n agentName: string;\n userName: string;\n}\n\nexport interface WorkspaceAgentLatestActivitySummary {\n actorName: string;\n summary: string;\n}\n\nexport interface WorkspaceAgentConversationPreviewLine {\n actorName: string;\n summary: string;\n}\n\nexport function activityTitleFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n fallbackTitle = \"\"\n): string {\n return (\n compactText(fallbackTitle) ||\n latestUserMessageText(timelineItems) ||\n workspaceAgentUntitledTaskLabel()\n );\n}\n\nexport function resolveLatestActivitySummary(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n status: WorkspaceAgentLatestActivityStatus,\n actors: WorkspaceAgentLatestActivityActors\n): WorkspaceAgentLatestActivitySummary {\n for (const item of [...timelineItems].sort(compareTimelineItemsDescending)) {\n const summary = displayableActivitySummary(item);\n if (summary) {\n return {\n actorName: activityActorName(item, actors),\n summary\n };\n }\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\nexport function fallbackSummary(\n status: WorkspaceAgentLatestActivityStatus\n): string {\n switch (status) {\n case \"working\":\n return translate(\"agentHost.workspaceAgentActivityStatusWorking\");\n case \"waiting\":\n return translate(\"agentHost.workspaceAgentActivityStatusWaiting\");\n case \"idle\":\n return translate(\"agentHost.workspaceAgentActivityStatusIdle\");\n case \"canceled\":\n case \"completed\":\n return translate(\"agentHost.workspaceAgentActivityStatusEnd\");\n case \"failed\":\n return translate(\"agentHost.workspaceAgentActivityStatusFailed\");\n }\n}\n\nexport function isWorkspaceAgentIdleSummary(summary: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentActivityStatusIdle\"\n ).has(compactText(summary));\n}\n\nexport function isWorkspaceAgentUntitledTask(title: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentsUntitledTask\"\n ).has(compactText(title));\n}\n\nexport function latestUserMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestUserMessageText(timelineItems);\n}\n\nexport function latestAgentMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestAgentMessageText(timelineItems);\n}\n\nexport function buildUserAndAgentConversationPreview(input: {\n timelineItems: WorkspaceAgentActivityTimelineItem[];\n userName: string;\n agentName: string;\n userPromptFallback?: string;\n status: WorkspaceAgentLatestActivityStatus;\n}): WorkspaceAgentConversationPreviewLine[] {\n const timeline = input.timelineItems ?? [];\n const lines: WorkspaceAgentConversationPreviewLine[] = [];\n const userMessage =\n compactText(input.userPromptFallback ?? \"\") ||\n latestUserMessageFromTimeline(timeline);\n\n if (userMessage) {\n lines.push({ actorName: input.userName, summary: userMessage });\n }\n\n const agentMessage = latestAgentMessageFromTimeline(timeline);\n if (agentMessage) {\n lines.push({ actorName: input.agentName, summary: agentMessage });\n } else if (userMessage || timeline.length > 0) {\n const latestActivity = resolveLatestActivitySummary(\n timeline,\n input.status,\n {\n userName: input.userName,\n agentName: input.agentName\n }\n );\n if (\n latestActivity.actorName === input.agentName &&\n latestActivity.summary\n ) {\n lines.push({\n actorName: input.agentName,\n summary: latestActivity.summary\n });\n } else {\n lines.push({\n actorName: input.agentName,\n summary: fallbackSummary(input.status)\n });\n }\n }\n\n return lines;\n}\n\nfunction latestUserMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestUserMessage = [...timelineItems]\n .filter(isUserMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestUserMessage) {\n return \"\";\n }\n\n return firstPresentText(\n stringPayloadValue(latestUserMessage, \"displayPrompt\"),\n stringPayloadValue(latestUserMessage, \"text\"),\n stringPayloadValue(latestUserMessage, \"content\"),\n latestUserMessage.content\n );\n}\n\nfunction displayableActivitySummary(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n if (messageRole(item)) {\n return messageContent(item);\n }\n\n return \"\";\n}\n\nfunction activityActorName(\n item: WorkspaceAgentActivityTimelineItem,\n actors: WorkspaceAgentLatestActivityActors\n): string {\n return messageRole(item) === \"user\" ? actors.userName : actors.agentName;\n}\n\nfunction isUserMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"user\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction latestAgentMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestAgentMessage = [...timelineItems]\n .filter(isAgentMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestAgentMessage) {\n return \"\";\n }\n\n return messageContent(latestAgentMessage);\n}\n\nfunction isAgentMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"agent\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction isMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return item.itemType === \"message\" || item.itemType.startsWith(\"message.\");\n}\n\nfunction messageRole(\n item: WorkspaceAgentActivityTimelineItem\n): \"user\" | \"agent\" | null {\n const explicitRole = item.role?.trim().toLowerCase();\n if (explicitRole === \"user\") {\n return \"user\";\n }\n if (explicitRole === \"assistant\" || explicitRole === \"agent\") {\n return \"agent\";\n }\n\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType === \"message.user\") {\n return \"user\";\n }\n if (itemType === \"message.agent\" || itemType === \"message.assistant\") {\n return \"agent\";\n }\n return null;\n}\n\nfunction messageContent(item: WorkspaceAgentActivityTimelineItem): string {\n const content = firstPresentText(\n stringPayloadValue(item, \"displayPrompt\"),\n stringPayloadValue(item, \"text\"),\n stringPayloadValue(item, \"content\"),\n item.content\n );\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n}\n\nfunction stringPayloadValue(\n item: WorkspaceAgentActivityTimelineItem,\n key: \"content\" | \"displayPrompt\" | \"summary\" | \"text\"\n): string {\n const value = item.payload?.[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction compareTimelineItemsDescending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n const leftTime = timelineTime(left);\n const rightTime = timelineTime(right);\n const timeDiff = (rightTime ?? 0) - (leftTime ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return right.id - left.id || right.eventId.localeCompare(left.eventId);\n}\n\nfunction timelineTime(\n item: WorkspaceAgentActivityTimelineItem | null | undefined\n): number | null {\n if (!item) {\n return null;\n }\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null;\n}\n\nfunction firstPresentText(...values: Array<string | undefined>): string {\n for (const value of values) {\n const text = compactText(value ?? \"\");\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nfunction compactText(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return translate(\"agentHost.workspaceAgentsUntitledTask\");\n}\n\nfunction localizedWorkspaceAgentLabelSet(key: string): Set<string> {\n return new Set(\n ([\"en\", \"zh-CN\"] as const)\n .map((language) => compactText(translateInUiLanguage(language, key)))\n .filter(Boolean)\n );\n}\n","import { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { isWorkspaceAgentUntitledTask } from \"./workspaceAgentLatestActivitySummary\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivitySession } from \"./workspaceAgentActivityTypes\";\n\nexport function resolveDisplayableWorkspaceAgentSessionTitle(\n session: Pick<WorkspaceAgentActivitySession, \"title\" | \"provider\">\n): string {\n const title = normalizeAgentTitleText(session.title);\n if (\n !title ||\n isWorkspaceAgentUntitledTask(title) ||\n isWorkspaceAgentSyntheticControlMessage(title)\n ) {\n return \"\";\n }\n const provider = session.provider?.trim();\n if (\n provider &&\n workspaceAgentProviderLabel(provider).toLowerCase() === title.toLowerCase()\n ) {\n return \"\";\n }\n return title;\n}\n","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\" | \"status\"\n> {\n id?: number;\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"],"mappings":"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","names":["compactText"]}
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-MTFSQWZ6.js";
15
15
  import {
16
16
  translate
17
- } from "./chunk-KFMD33UD.js";
17
+ } from "./chunk-JL2WNRYC.js";
18
18
 
19
19
  // shared/managedAgentProviders.ts
20
20
  function normalizeManagedAgentProvider(provider) {
@@ -113,4 +113,4 @@ export {
113
113
  userAvatarPlaceholderUrl,
114
114
  workspaceAgentActivityStatusLabel
115
115
  };
116
- //# sourceMappingURL=chunk-3LEUGNCT.js.map
116
+ //# sourceMappingURL=chunk-WHWZZYBV.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  translate,
3
3
  useTranslation
4
- } from "./chunk-KFMD33UD.js";
4
+ } from "./chunk-JL2WNRYC.js";
5
5
  import {
6
6
  resolveAgentMentionFileThumbnailUrl,
7
7
  resolveAgentMentionFileVisualKind
@@ -1205,4 +1205,4 @@ export {
1205
1205
  mentionItemToAttrs,
1206
1206
  attrsToMentionItem
1207
1207
  };
1208
- //# sourceMappingURL=chunk-VPC55T7P.js.map
1208
+ //# sourceMappingURL=chunk-XROBPALT.js.map
@@ -4,12 +4,12 @@ import {
4
4
  AgentMentionSearchController,
5
5
  flattenAgentMentionPaletteEntries,
6
6
  groupStartKeys
7
- } from "../chunk-U3D7YI47.js";
8
- import "../chunk-UN4XGHLQ.js";
9
- import "../chunk-3LEUGNCT.js";
7
+ } from "../chunk-MKSRP5XS.js";
8
+ import "../chunk-SS5YEVAI.js";
9
+ import "../chunk-WHWZZYBV.js";
10
10
  import "../chunk-MTFSQWZ6.js";
11
11
  import "../chunk-IBIMGLCD.js";
12
- import "../chunk-VPC55T7P.js";
12
+ import "../chunk-XROBPALT.js";
13
13
  import "../chunk-Y35GDLP2.js";
14
14
  import "../chunk-2ADVHCST.js";
15
15
  import "../chunk-TYGL25EL.js";
@@ -17,7 +17,7 @@ import {
17
17
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
18
18
  } from "../chunk-JM24HADP.js";
19
19
  import "../chunk-GCBDIQDX.js";
20
- import "../chunk-KFMD33UD.js";
20
+ import "../chunk-JL2WNRYC.js";
21
21
  import "../chunk-LUGELG5V.js";
22
22
  import "../chunk-PJP5BUU6.js";
23
23
  export {
@@ -324,7 +324,7 @@ declare const agentGuiI18nResources: {
324
324
  readonly agentGui: {
325
325
  readonly initialPlaceholder: "Type @ to reference sessions, files, tasks, and apps";
326
326
  readonly followupPlaceholder: "Request follow-up changes from {{provider}}";
327
- readonly installRequiredPlaceholder: "Install {{provider}} from the dock to send messages";
327
+ readonly installRequiredPlaceholder: "Finish setting up {{provider}} to send messages";
328
328
  readonly installRequiredAction: "Set up";
329
329
  readonly collaboratorSessionReadOnlyPlaceholder: "This session belongs to another user and cannot be replied to directly";
330
330
  readonly send: "Send";
@@ -1565,11 +1565,11 @@ declare const agentGuiI18nResources: {
1565
1565
  readonly taskRunningCount: "{{count}} running";
1566
1566
  readonly taskPendingAcceptanceCount: "{{count}} pending acceptance";
1567
1567
  readonly taskCompletedCount: "{{count}} completed";
1568
- readonly issueStatusNotStarted: "To run";
1568
+ readonly issueStatusNotStarted: "Todo";
1569
1569
  readonly issueStatusRunning: "Running";
1570
1570
  readonly issueStatusInProgress: "Running";
1571
- readonly issueStatusPendingAcceptance: "Pending acceptance";
1572
- readonly issueStatusCompleted: "Completed";
1571
+ readonly issueStatusPendingAcceptance: "In review";
1572
+ readonly issueStatusCompleted: "Done";
1573
1573
  readonly issueStatusFailed: "Failed";
1574
1574
  readonly issueStatusCanceled: "Canceled";
1575
1575
  readonly issueStatusUnknown: "Unknown status";
@@ -2713,7 +2713,7 @@ declare const agentGuiI18nResources: {
2713
2713
  readonly agentGui: {
2714
2714
  readonly initialPlaceholder: "输入 @ 引用会话、文件、任务和应用";
2715
2715
  readonly followupPlaceholder: "要求 {{provider}} 继续后续变更";
2716
- readonly installRequiredPlaceholder: "请先从 Dock 安装 {{provider}},然后再发送消息";
2716
+ readonly installRequiredPlaceholder: "请先完成 {{provider}} 配置,然后再发送消息";
2717
2717
  readonly installRequiredAction: "设置";
2718
2718
  readonly collaboratorSessionReadOnlyPlaceholder: "非当前用户会话,不可直接对话";
2719
2719
  readonly send: "发送";
@@ -3954,7 +3954,7 @@ declare const agentGuiI18nResources: {
3954
3954
  readonly taskRunningCount: "{{count}} 个执行中";
3955
3955
  readonly taskPendingAcceptanceCount: "{{count}} 个待验收";
3956
3956
  readonly taskCompletedCount: "{{count}} 个已完成";
3957
- readonly issueStatusNotStarted: "未启动";
3957
+ readonly issueStatusNotStarted: "待开始";
3958
3958
  readonly issueStatusRunning: "执行中";
3959
3959
  readonly issueStatusInProgress: "执行中";
3960
3960
  readonly issueStatusPendingAcceptance: "待验收";
@@ -6,7 +6,7 @@ import {
6
6
  translate,
7
7
  translateInUiLanguage,
8
8
  useTranslation
9
- } from "../chunk-KFMD33UD.js";
9
+ } from "../chunk-JL2WNRYC.js";
10
10
  export {
11
11
  AgentGuiI18nProvider,
12
12
  agentGuiI18nModule,
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import { AgentActivityNeedsAttentionItem, AgentActivitySnapshot, AgentActivityCancelSessionInput, AgentActivityCancelSessionResult, AgentActivityCreateSessionInput, AgentActivitySession, AgentActivityDeleteSessionInput, AgentActivityDeleteSessionResult, AgentActivitySendInput, AgentActivityMessageOrder, AgentActivityMessagePage, AgentActivitySendInputResult, AgentActivitySubmitInteractiveInput, AgentActivitySnapshotListener } from '@tutti-os/agent-activity-core';
2
2
  export { AgentActivityAdapter, AgentActivityController, AgentActivityMessage, AgentActivityNeedsAttentionItem, AgentActivitySnapshot, selectNeedsAttentionCount, selectNeedsAttentionItems } from '@tutti-os/agent-activity-core';
3
- import { m as WorkspaceAgentActivityListViewModel, g as AgentHostWorkspaceAgentSession, f as AgentHostWorkspaceAgentMessage, l as AgentHostWorkspaceAgentSnapshot, B as BuildWorkspaceAgentActivityListOptions, d as AgentHostRuntimeOpenclawGatewayWarmupResult, c as AgentHostManagedAgentsState } from './workspaceAgentActivityListViewModel-DwpbJGDx.js';
3
+ import { m as WorkspaceAgentActivityListViewModel, g as AgentHostWorkspaceAgentSession, f as AgentHostWorkspaceAgentMessage, l as AgentHostWorkspaceAgentSnapshot, B as BuildWorkspaceAgentActivityListOptions, d as AgentHostRuntimeOpenclawGatewayWarmupResult, c as AgentHostManagedAgentsState } from './workspaceAgentActivityListViewModel-DLnMBMoh.js';
4
4
  import * as react from 'react';
5
5
  import { PropsWithChildren, JSX } from 'react';
6
6
  import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
7
- import { d as AgentHostAgentSessionComposerSettings, c as AgentHostActivateAgentSessionResult, k as AgentHostUpdateAgentSessionSettingsResult, e as AgentHostAgentSessionState, j as AgentHostUnactivateAgentSessionResult, o as AgentProvider, n as AgentProbeSnapshot, a as AgentGUINodeViewModel, A as AgentGUINodeData, t as Point, N as NodeFrame, l as AgentMessageMarkdownWorkspaceAppIcon, g as AgentHostInputApi } from './AgentMessageMarkdown-0sV8Biv3.js';
8
- export { f as AgentHostApi, h as AgentHostRuntimeApi, i as AgentHostSelectFilesInput, m as AgentProbeProvider, p as AgentProviderProbeListInput, q as AgentProviderProbeListResult, r as AgentUsageQuota, s as AgentUsageSnapshot, P as PersistWriteResult, R as ReadWorkspaceAgentReadStateInput, W as WorkspaceAgentReadStateSnapshot, u as WriteWorkspaceAgentReadStateInput } from './AgentMessageMarkdown-0sV8Biv3.js';
7
+ import { d as AgentHostAgentSessionComposerSettings, c as AgentHostActivateAgentSessionResult, k as AgentHostUpdateAgentSessionSettingsResult, e as AgentHostAgentSessionState, j as AgentHostUnactivateAgentSessionResult, o as AgentProvider, n as AgentProbeSnapshot, a as AgentGUINodeViewModel, A as AgentGUINodeData, t as Point, N as NodeFrame, l as AgentMessageMarkdownWorkspaceAppIcon, g as AgentHostInputApi } from './AgentMessageMarkdown-Cq-7DSV2.js';
8
+ export { f as AgentHostApi, h as AgentHostRuntimeApi, i as AgentHostSelectFilesInput, m as AgentProbeProvider, p as AgentProviderProbeListInput, q as AgentProviderProbeListResult, r as AgentUsageQuota, s as AgentUsageSnapshot, P as PersistWriteResult, R as ReadWorkspaceAgentReadStateInput, W as WorkspaceAgentReadStateSnapshot, u as WriteWorkspaceAgentReadStateInput } from './AgentMessageMarkdown-Cq-7DSV2.js';
9
9
  import { ReferenceLocateTarget, WorkspaceFileReferenceAdapter, WorkspaceFileReference } from '@tutti-os/workspace-file-reference/contracts';
10
10
  import { ReferenceSourceAggregator } from '@tutti-os/workspace-file-reference/core';
11
11
  import { W as WorkspaceLinkAction } from './workspaceLinkActions-C6POH38D.js';
@@ -15,7 +15,7 @@ import { AgentContextMentionProvider } from './context-mention-provider.js';
15
15
  export { AGENT_CONTEXT_MENTION_PROVIDER_IDS, AgentContextMentionProviderId } from './context-mention-provider.js';
16
16
  import { AgentGuiI18nLocale } from './i18n/index.js';
17
17
  export { AgentGuiI18nProvider, agentGuiI18nModule, agentGuiI18nResources } from './i18n/index.js';
18
- import './agentConversationVM-xuzmD5IL.js';
18
+ import './agentConversationVM-1QgRwvwZ.js';
19
19
  import '@tutti-os/workspace-user-project/contracts';
20
20
  import '@tutti-os/workspace-issue-manager/core';
21
21
  import '@tutti-os/ui-rich-text/at-panel';
@@ -397,6 +397,9 @@ interface AgentGUINodeProps {
397
397
  workspacePath: string;
398
398
  workspaceFileReferenceAdapter?: WorkspaceFileReferenceAdapter | null;
399
399
  onRequestGitBranches?: AgentComposerGitBranchLoader | null;
400
+ selectProjectDirectory?: () => Promise<{
401
+ path: string;
402
+ } | null>;
400
403
  referenceSourceAggregator?: ReferenceSourceAggregator | null;
401
404
  resolveMentionReferenceTarget?: AgentMentionReferenceTargetResolver | null;
402
405
  resolveWorkspaceReferenceInitialTarget?: AgentWorkspaceReferenceInitialTargetResolver | null;
@@ -424,7 +427,6 @@ interface AgentGUINodeProps {
424
427
  composerFocusRequestSequence?: number | null;
425
428
  openSessionRequest?: AgentGUIOpenSessionRequest | null;
426
429
  prefillPromptRequest?: AgentGUIPrefillPromptRequest | null;
427
- showProjectSelector?: boolean;
428
430
  isMuted?: boolean;
429
431
  newConversationRequestSequence?: number | null;
430
432
  onMinimize?: () => void;