@tutti-os/agent-gui 0.0.16 → 0.0.17

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 (29) hide show
  1. package/dist/agent-conversation/index.js +4 -4
  2. package/dist/agent-message-center/index.d.ts +4 -1
  3. package/dist/agent-message-center/index.js +172 -9
  4. package/dist/agent-message-center/index.js.map +1 -1
  5. package/dist/app/renderer/agentactivity.css +32 -0
  6. package/dist/{chunk-SIDWRR5I.js → chunk-65YMY2M3.js} +5 -1
  7. package/dist/chunk-65YMY2M3.js.map +1 -0
  8. package/dist/{chunk-EKATXC3W.js → chunk-CDTTIUPL.js} +2 -2
  9. package/dist/{chunk-267VY3EJ.js → chunk-HVOPJU2K.js} +4 -4
  10. package/dist/{chunk-FJYH2ZPX.js → chunk-K44WER5Z.js} +2 -2
  11. package/dist/{chunk-KWPL3JYS.js → chunk-KHTIC52P.js} +2 -2
  12. package/dist/{chunk-CABHBFYH.js → chunk-OJ5WX7SZ.js} +2 -2
  13. package/dist/{chunk-LWRYYGPZ.js → chunk-VNAQ6QFE.js} +4 -4
  14. package/dist/{chunk-LW2S255I.js → chunk-VO2TZNKV.js} +4 -4
  15. package/dist/context-mention-palette/index.js +5 -5
  16. package/dist/i18n/index.d.ts +4 -0
  17. package/dist/i18n/index.js +1 -1
  18. package/dist/index.js +194 -43
  19. package/dist/index.js.map +1 -1
  20. package/dist/workspace-agent-generated-files.js +2 -2
  21. package/package.json +12 -12
  22. package/dist/chunk-SIDWRR5I.js.map +0 -1
  23. /package/dist/{chunk-EKATXC3W.js.map → chunk-CDTTIUPL.js.map} +0 -0
  24. /package/dist/{chunk-267VY3EJ.js.map → chunk-HVOPJU2K.js.map} +0 -0
  25. /package/dist/{chunk-FJYH2ZPX.js.map → chunk-K44WER5Z.js.map} +0 -0
  26. /package/dist/{chunk-KWPL3JYS.js.map → chunk-KHTIC52P.js.map} +0 -0
  27. /package/dist/{chunk-CABHBFYH.js.map → chunk-OJ5WX7SZ.js.map} +0 -0
  28. /package/dist/{chunk-LWRYYGPZ.js.map → chunk-VNAQ6QFE.js.map} +0 -0
  29. /package/dist/{chunk-LW2S255I.js.map → chunk-VO2TZNKV.js.map} +0 -0
@@ -6,15 +6,15 @@ import {
6
6
  projectAgentConversationVM,
7
7
  reconcileProjectedAgentConversationVM,
8
8
  useProjectedAgentConversation
9
- } from "../chunk-267VY3EJ.js";
10
- import "../chunk-FJYH2ZPX.js";
11
- import "../chunk-KWPL3JYS.js";
9
+ } from "../chunk-HVOPJU2K.js";
10
+ import "../chunk-K44WER5Z.js";
11
+ import "../chunk-KHTIC52P.js";
12
12
  import "../chunk-XJ34OIEQ.js";
13
13
  import "../chunk-O5TUTXHT.js";
14
14
  import "../chunk-TYGL25EL.js";
15
15
  import {
16
16
  translate
17
- } from "../chunk-SIDWRR5I.js";
17
+ } from "../chunk-65YMY2M3.js";
18
18
  import "../chunk-LUGELG5V.js";
19
19
  import "../chunk-PJP5BUU6.js";
20
20
 
@@ -57,6 +57,7 @@ interface WorkspaceAgentMessageCenterTurnOutcome {
57
57
  interface BuildWorkspaceAgentMessageCenterOptions {
58
58
  avoidGroupingEdits?: boolean;
59
59
  identityBySessionId?: Record<string, WorkspaceAgentMessageCenterIdentity>;
60
+ itemCutoffUnixMs?: number | null;
60
61
  promptFallbackLabels?: WorkspaceAgentMessageCenterPromptFallbackLabels;
61
62
  workspaceRoot?: string | null;
62
63
  }
@@ -226,4 +227,6 @@ declare function approvalOptionDisplayLabel(option: {
226
227
  feedback?: boolean;
227
228
  }): string;
228
229
 
229
- export { AgentInteractivePromptSurface, type BuildWorkspaceAgentMessageCenterOptions, type PromptToolDetail, WorkspaceAgentMessageCenterCard, type WorkspaceAgentMessageCenterCardProps, type WorkspaceAgentMessageCenterCounts, type WorkspaceAgentMessageCenterDigest, type WorkspaceAgentMessageCenterDigestPrimary, type WorkspaceAgentMessageCenterDigestPrimaryKind, type WorkspaceAgentMessageCenterIdentity, type WorkspaceAgentMessageCenterItem, type WorkspaceAgentMessageCenterModel, WorkspaceAgentMessageCenterPanel, type WorkspaceAgentMessageCenterPanelProps, approvalOptionDisplayLabel, buildWorkspaceAgentInteractivePromptLabels, buildWorkspaceAgentMessageCenterModel, getPromptToolDetails, isPromptRequestIdTitle, isWaitingMessageCenterItem, managedAgentRoundedIconUrl, userAvatarPlaceholderUrl, workspaceAgentActivityStatusLabel };
230
+ declare function stabilizeWorkspaceAgentMessageCenterModel(previous: WorkspaceAgentMessageCenterModel | null, next: WorkspaceAgentMessageCenterModel): WorkspaceAgentMessageCenterModel;
231
+
232
+ export { AgentInteractivePromptSurface, type BuildWorkspaceAgentMessageCenterOptions, type PromptToolDetail, WorkspaceAgentMessageCenterCard, type WorkspaceAgentMessageCenterCardProps, type WorkspaceAgentMessageCenterCounts, type WorkspaceAgentMessageCenterDigest, type WorkspaceAgentMessageCenterDigestPrimary, type WorkspaceAgentMessageCenterDigestPrimaryKind, type WorkspaceAgentMessageCenterIdentity, type WorkspaceAgentMessageCenterItem, type WorkspaceAgentMessageCenterModel, WorkspaceAgentMessageCenterPanel, type WorkspaceAgentMessageCenterPanelProps, approvalOptionDisplayLabel, buildWorkspaceAgentInteractivePromptLabels, buildWorkspaceAgentMessageCenterModel, getPromptToolDetails, isPromptRequestIdTitle, isWaitingMessageCenterItem, managedAgentRoundedIconUrl, stabilizeWorkspaceAgentMessageCenterModel, userAvatarPlaceholderUrl, workspaceAgentActivityStatusLabel };
@@ -3,7 +3,7 @@ import {
3
3
  approvalOptionDisplayLabel,
4
4
  getPromptToolDetails,
5
5
  isPromptRequestIdTitle
6
- } from "../chunk-LW2S255I.js";
6
+ } from "../chunk-VO2TZNKV.js";
7
7
  import {
8
8
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
9
9
  PLAN_IMPLEMENTATION_PROMPT,
@@ -16,12 +16,12 @@ import {
16
16
  cn,
17
17
  extractAgentMcpToolTarget,
18
18
  normalizeAskUserQuestions
19
- } from "../chunk-FJYH2ZPX.js";
19
+ } from "../chunk-K44WER5Z.js";
20
20
  import {
21
21
  managedAgentRoundedIconUrl,
22
22
  userAvatarPlaceholderUrl,
23
23
  workspaceAgentActivityStatusLabel
24
- } from "../chunk-EKATXC3W.js";
24
+ } from "../chunk-CDTTIUPL.js";
25
25
  import "../chunk-MTFSQWZ6.js";
26
26
  import {
27
27
  resolveWorkspaceAgentSessionSortTimeUnixMs
@@ -36,7 +36,7 @@ import {
36
36
  import {
37
37
  AgentGuiI18nProvider,
38
38
  useTranslation
39
- } from "../chunk-SIDWRR5I.js";
39
+ } from "../chunk-65YMY2M3.js";
40
40
  import "../chunk-PJP5BUU6.js";
41
41
 
42
42
  // agent-message-center/WorkspaceAgentMessageCenterPanel.tsx
@@ -507,7 +507,9 @@ function buildWorkspaceAgentMessageCenterModel(snapshot, options = {}) {
507
507
  latestTurnOutcome: latestTurnOutcome(session.agentSessionId, messages),
508
508
  sortTimeUnixMs
509
509
  };
510
- });
510
+ }).filter(
511
+ (item) => isWithinMessageCenterItemCutoff(item, options.itemCutoffUnixMs)
512
+ );
511
513
  return {
512
514
  waitingCount: items.filter(isWaitingMessageCenterItem).length,
513
515
  items: items.sort(compareMessageCenterItems),
@@ -539,6 +541,16 @@ function isWaitingMessageCenterItem(item) {
539
541
  function isInteractiveMessageCenterItem(item) {
540
542
  return item.pendingPrompt !== null;
541
543
  }
544
+ function isWithinMessageCenterItemCutoff(item, cutoffUnixMs) {
545
+ if (!Number.isFinite(cutoffUnixMs)) {
546
+ return true;
547
+ }
548
+ if (isWaitingMessageCenterItem(item)) {
549
+ return true;
550
+ }
551
+ const timestamp = item.sortTimeUnixMs || item.lastAgentMessageAtUnixMs || 0;
552
+ return timestamp >= Number(cutoffUnixMs);
553
+ }
542
554
  function selectMessageCenterAttentionDeckItems(items) {
543
555
  return items.filter(isInteractiveMessageCenterItem);
544
556
  }
@@ -1229,8 +1241,35 @@ var WorkspaceAgentMessageCenterStack = memo(
1229
1241
  ]
1230
1242
  }
1231
1243
  );
1232
- }
1244
+ },
1245
+ areMessageCenterStackPropsEqual
1233
1246
  );
1247
+ function areMessageCenterStackPropsEqual(previous, next) {
1248
+ if (previous.className !== next.className || previous.expanded !== next.expanded || previous.groupId !== next.groupId || previous.onCollapse !== next.onCollapse || previous.onExpand !== next.onExpand || previous.renderCard !== next.renderCard) {
1249
+ return false;
1250
+ }
1251
+ if (next.expanded) {
1252
+ return previous.highlightedItemId === next.highlightedItemId && previous.items === next.items;
1253
+ }
1254
+ return messageCenterCollapsedStackSignature(previous.items) === messageCenterCollapsedStackSignature(next.items);
1255
+ }
1256
+ function messageCenterCollapsedStackSignature(items) {
1257
+ const firstItem = items[0];
1258
+ if (!firstItem) {
1259
+ return "0";
1260
+ }
1261
+ const hasWaiting = items.some(isWaitingMessageCenterItem) ? "1" : "0";
1262
+ return [
1263
+ items.length,
1264
+ firstItem.id,
1265
+ firstItem.provider,
1266
+ firstItem.userId ?? "",
1267
+ firstItem.identity?.userName ?? "",
1268
+ firstItem.identity?.agentName ?? "",
1269
+ hasWaiting,
1270
+ messageCenterStackPreviewText(firstItem)
1271
+ ].join(":");
1272
+ }
1234
1273
  function useBatchedMessageCenterStackItems({
1235
1274
  expanded,
1236
1275
  highlightedItemId,
@@ -2043,6 +2082,40 @@ function messageCenterAgentUserStackId(item) {
2043
2082
  const userId = item.userId?.trim() || "unknown-user";
2044
2083
  return `agent-user:${provider}:${userId}`;
2045
2084
  }
2085
+ function messageCenterStackRenderId(groupId, stackId) {
2086
+ return groupId === stackId ? stackId : `${groupId}:${stackId}`;
2087
+ }
2088
+ function messageCenterStackScrollSyncSegment({
2089
+ expanded,
2090
+ groupId,
2091
+ stack
2092
+ }) {
2093
+ const stackId = messageCenterStackRenderId(groupId, stack.id);
2094
+ if (expanded) {
2095
+ return `expanded:${stackId}:${stack.items.map((item) => item.id).join("|")}`;
2096
+ }
2097
+ return `collapsed:${stackId}:${messageCenterCollapsedStackSignature2(
2098
+ stack.items
2099
+ )}`;
2100
+ }
2101
+ function messageCenterCollapsedStackSignature2(items) {
2102
+ const firstItem = items[0];
2103
+ if (!firstItem) {
2104
+ return "0";
2105
+ }
2106
+ const hasWaiting = items.some(isWaitingMessageCenterItem) ? "1" : "0";
2107
+ const summary = firstItem.digest.primary.summary.trim() || firstItem.lastAgentMessageSummary.trim() || firstItem.title.trim();
2108
+ return [
2109
+ items.length,
2110
+ firstItem.id,
2111
+ firstItem.provider,
2112
+ firstItem.userId ?? "",
2113
+ firstItem.identity?.userName ?? "",
2114
+ firstItem.identity?.agentName ?? "",
2115
+ hasWaiting,
2116
+ summary
2117
+ ].join(":");
2118
+ }
2046
2119
  function buildMessageCenterStatusOptions(counts, t) {
2047
2120
  return [
2048
2121
  {
@@ -2502,6 +2575,24 @@ function WorkspaceAgentMessageCenterPanelContent({
2502
2575
  [highlightedItemId, model.items]
2503
2576
  );
2504
2577
  const activeStatusSummary = statusFilterSummary(statusFilters, statusOptions);
2578
+ const scrollSyncKey = useMemo2(
2579
+ () => [
2580
+ groupBy,
2581
+ activeStatusSummary,
2582
+ ...deckItems.map((item) => `deck:${item.id}`),
2583
+ ...itemGroupStacks.flatMap(
2584
+ (group) => group.stacks.map((stack) => {
2585
+ const stackId = messageCenterStackRenderId(group.id, stack.id);
2586
+ return messageCenterStackScrollSyncSegment({
2587
+ expanded: expandedStackIds.has(stackId),
2588
+ groupId: group.id,
2589
+ stack
2590
+ });
2591
+ })
2592
+ )
2593
+ ].join("|"),
2594
+ [activeStatusSummary, deckItems, expandedStackIds, groupBy, itemGroupStacks]
2595
+ );
2505
2596
  const hasActiveFilters = statusFilters !== null || providerFilters !== null;
2506
2597
  const headerSummary = useMemo2(() => {
2507
2598
  if (hasActiveFilters) {
@@ -2652,7 +2743,7 @@ function WorkspaceAgentMessageCenterPanelContent({
2652
2743
  for (const group of itemGroupStacks) {
2653
2744
  for (const stack of group.stacks) {
2654
2745
  if (stack.items.length > 1 && stack.items.some((item) => item.id === highlightedItemId)) {
2655
- expandStack(`${group.id}:${stack.id}`);
2746
+ expandStack(messageCenterStackRenderId(group.id, stack.id));
2656
2747
  return;
2657
2748
  }
2658
2749
  }
@@ -2792,7 +2883,7 @@ function WorkspaceAgentMessageCenterPanelContent({
2792
2883
  className: "min-h-0 flex-1",
2793
2884
  viewportClassName: "flex h-full w-full flex-col px-3.5 pt-4 pb-4",
2794
2885
  scrollbarClassName: "top-4 bottom-4",
2795
- syncKey: `${groupBy}:${activeStatusSummary}:${[...deckItems, ...visibleItems].map((item) => item.id).join("|")}`,
2886
+ syncKey: scrollSyncKey,
2796
2887
  children: deckItems.length > 0 || listItems.length > 0 ? /* @__PURE__ */ jsxs4("div", { className: "flex w-full min-w-0 flex-col gap-4", children: [
2797
2888
  deckItems.length > 0 ? /* @__PURE__ */ jsx5(
2798
2889
  WorkspaceAgentMessageCenterAttentionDeck,
@@ -2822,7 +2913,10 @@ function WorkspaceAgentMessageCenterPanelContent({
2822
2913
  if (stack.items.length === 1) {
2823
2914
  return renderMessageCenterCard(firstItem);
2824
2915
  }
2825
- const stackId = group.id === stack.id ? stack.id : `${group.id}:${stack.id}`;
2916
+ const stackId = messageCenterStackRenderId(
2917
+ group.id,
2918
+ stack.id
2919
+ );
2826
2920
  return /* @__PURE__ */ jsx5(
2827
2921
  MessageCenterStack,
2828
2922
  {
@@ -2945,6 +3039,74 @@ function MessageCenterGroupHeading({
2945
3039
  group.items.length
2946
3040
  ] });
2947
3041
  }
3042
+
3043
+ // agent-message-center/workspaceAgentMessageCenterModelStability.ts
3044
+ function stabilizeWorkspaceAgentMessageCenterModel(previous, next) {
3045
+ if (!previous) {
3046
+ return next;
3047
+ }
3048
+ const previousItemsById = new Map(
3049
+ previous.items.map((item) => [item.id, item])
3050
+ );
3051
+ let itemsChanged = previous.items.length !== next.items.length;
3052
+ const items = next.items.map((nextItem, index) => {
3053
+ const previousItem = previousItemsById.get(nextItem.id);
3054
+ const stableItem = previousItem && messageCenterItemsEqual(previousItem, nextItem) ? previousItem : nextItem;
3055
+ if (stableItem !== previous.items[index]) {
3056
+ itemsChanged = true;
3057
+ }
3058
+ return stableItem;
3059
+ });
3060
+ const stableItems = itemsChanged ? items : previous.items;
3061
+ const stableCounts = messageCenterCountsEqual(previous.counts, next.counts) ? previous.counts : next.counts;
3062
+ if (previous.waitingCount === next.waitingCount && stableItems === previous.items && stableCounts === previous.counts) {
3063
+ return previous;
3064
+ }
3065
+ return {
3066
+ ...next,
3067
+ counts: stableCounts,
3068
+ items: stableItems
3069
+ };
3070
+ }
3071
+ function messageCenterItemsEqual(left, right) {
3072
+ return left.id === right.id && left.agentSessionId === right.agentSessionId && left.provider === right.provider && left.userId === right.userId && left.title === right.title && left.cwd === right.cwd && left.status === right.status && left.lastAgentMessageSummary === right.lastAgentMessageSummary && left.lastAgentMessageAtUnixMs === right.lastAgentMessageAtUnixMs && left.needsAttentionKind === right.needsAttentionKind && left.needsAttentionSummary === right.needsAttentionSummary && left.sortTimeUnixMs === right.sortTimeUnixMs && messageCenterIdentityEqual(left.identity, right.identity) && messageCenterDigestEqual(left.digest, right.digest) && messageCenterPromptEqual(left.pendingPrompt, right.pendingPrompt) && messageCenterTurnOutcomeEqual(
3073
+ left.latestTurnOutcome ?? null,
3074
+ right.latestTurnOutcome ?? null
3075
+ );
3076
+ }
3077
+ function messageCenterCountsEqual(left, right) {
3078
+ return left.all === right.all && left.working === right.working && left.waiting === right.waiting && left.completed === right.completed && left.failed === right.failed;
3079
+ }
3080
+ function messageCenterIdentityEqual(left, right) {
3081
+ if (left === right) {
3082
+ return true;
3083
+ }
3084
+ if (!left || !right) {
3085
+ return false;
3086
+ }
3087
+ return left.userName === right.userName && left.userAvatarUrl === right.userAvatarUrl && left.agentName === right.agentName && left.agentAvatarUrl === right.agentAvatarUrl;
3088
+ }
3089
+ function messageCenterDigestEqual(left, right) {
3090
+ return left.primary.kind === right.primary.kind && left.primary.summary === right.primary.summary && left.primary.occurredAtUnixMs === right.primary.occurredAtUnixMs;
3091
+ }
3092
+ function messageCenterTurnOutcomeEqual(left, right) {
3093
+ if (left === right) {
3094
+ return true;
3095
+ }
3096
+ if (!left || !right) {
3097
+ return false;
3098
+ }
3099
+ return left.notificationKey === right.notificationKey && left.status === right.status && left.turnId === right.turnId;
3100
+ }
3101
+ function messageCenterPromptEqual(left, right) {
3102
+ if (left === right) {
3103
+ return true;
3104
+ }
3105
+ if (!left || !right || left.kind !== right.kind) {
3106
+ return false;
3107
+ }
3108
+ return JSON.stringify(left) === JSON.stringify(right);
3109
+ }
2948
3110
  export {
2949
3111
  AgentInteractivePromptSurface,
2950
3112
  PLAN_IMPLEMENTATION_ACTION_IMPLEMENT,
@@ -2958,6 +3120,7 @@ export {
2958
3120
  isPromptRequestIdTitle,
2959
3121
  isWaitingMessageCenterItem,
2960
3122
  managedAgentRoundedIconUrl,
3123
+ stabilizeWorkspaceAgentMessageCenterModel,
2961
3124
  userAvatarPlaceholderUrl,
2962
3125
  workspaceAgentActivityStatusLabel
2963
3126
  };