fix: stabilize live activity updates
This commit is contained in:
@@ -165,20 +165,29 @@ export function ActivityPanel({ asDrawer = false }: { asDrawer?: boolean } = {})
|
||||
() => collectLiveRunItems(liveRunStatus),
|
||||
[liveRunStatus],
|
||||
);
|
||||
const selectedMessageId = selectedId ? activityMessageId(selectedId) : null;
|
||||
const liveRunActive = hasActiveRun(liveRunStatus) && liveItems.length > 0;
|
||||
const mergedItems = useMemo(
|
||||
() =>
|
||||
liveRunActive
|
||||
? mergeActivityItems(messageItems, liveItems)
|
||||
: messageItems,
|
||||
[liveRunActive, messageItems, liveItems],
|
||||
);
|
||||
const selectedMessageId = selectedId ? activityMessageId(selectedId) : null;
|
||||
const selectedMessageItems = selectedMessageId
|
||||
? messageItems.filter(
|
||||
? mergedItems.filter(
|
||||
(item) => activityMessageId(item.id) === selectedMessageId,
|
||||
)
|
||||
: [];
|
||||
const shouldUseLiveItems = Boolean(activeSessionId && liveRunActive);
|
||||
const items = shouldUseLiveItems ? liveItems : messageItems;
|
||||
const items = shouldUseLiveItems ? mergedItems : messageItems;
|
||||
const selectedItems = selectedMessageId
|
||||
? items.filter((item) => activityMessageId(item.id) === selectedMessageId)
|
||||
: [];
|
||||
const visibleItems = shouldUseLiveItems
|
||||
? liveItems
|
||||
? selectedMessageId && selectedMessageItems.length > 0
|
||||
? selectedMessageItems
|
||||
: items
|
||||
: selectedMessageId && selectedMessageItems.length > 0
|
||||
? selectedMessageItems
|
||||
: selectedMessageId && selectedItems.length > 0
|
||||
@@ -1013,6 +1022,37 @@ function collectLiveRunItems(runStatus: ClawRunStatus | null) {
|
||||
return items;
|
||||
}
|
||||
|
||||
function mergeActivityItems(
|
||||
messageItems: readonly ActivityItem[],
|
||||
liveItems: readonly ActivityItem[],
|
||||
) {
|
||||
if (!liveItems.length) return [...messageItems];
|
||||
if (!messageItems.length) return [...liveItems];
|
||||
const merged = [...messageItems];
|
||||
const seen = new Set(
|
||||
messageItems.map((item) =>
|
||||
[
|
||||
item.kind,
|
||||
item.title,
|
||||
item.argsText ?? "",
|
||||
item.summary,
|
||||
].join("\u0000"),
|
||||
),
|
||||
);
|
||||
for (const item of liveItems) {
|
||||
const key = [
|
||||
item.kind,
|
||||
item.title,
|
||||
item.argsText ?? "",
|
||||
item.summary,
|
||||
].join("\u0000");
|
||||
if (seen.has(key)) continue;
|
||||
seen.add(key);
|
||||
merged.push(item);
|
||||
}
|
||||
return merged;
|
||||
}
|
||||
|
||||
function summarizeLiveRunEvents(
|
||||
runStatus: ClawRunStatus,
|
||||
events: readonly LiveRunEvent[],
|
||||
|
||||
Reference in New Issue
Block a user