fix(web): 会话进度行时长从本轮开始算到结论正文,不再显示 0 秒(FIX-9)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-30 19:27:43 +08:00
1 parent 41a39f3cc8
commit c5987a9db3
3 files changed
+74 -12

No files matched your search

@@ -291,13 +291,23 @@ export function buildConversation(
return out;
}
/** 一段进度的起止时间(毫秒);没有工具调用为 null */
export function activitySpan(activity: ActivityItem[]): number | null {
const calls = activity.flatMap((a) => (a.kind === "tool" ? [a.call] : []));
if (!calls.length) return null;
const start = Math.min(...calls.map((c) => Date.parse(c.startedAt)));
const end = Math.max(...calls.map((c) => Date.parse(c.endedAt ?? c.startedAt)));
return Number.isFinite(start) && Number.isFinite(end) ? end - start : null;
/**
* 一段进度的时长(毫秒):从这一轮开始(since,如会话开始 / 用户消息的时间)或首个步骤,
* 到最后一个步骤结束或结论正文开始(until)。只算工具起止会漏掉模型思考的时间(整轮 7 秒显示成 0 秒)。
* 没有任何步骤为 null。
*/
export function activitySpan(
activity: ActivityItem[],
bounds: { since?: string | null; until?: string | null } = {},
): number | null {
if (!activity.length) return null;
const starts = activity.map((a) => Date.parse(a.kind === "tool" ? a.call.startedAt : a.at));
const ends = activity.map((a) => Date.parse(a.kind === "tool" ? (a.call.endedAt ?? a.call.startedAt) : a.at));
const since = bounds.since ? Date.parse(bounds.since) : Number.NaN;
const until = bounds.until ? Date.parse(bounds.until) : Number.NaN;
const start = Math.min(...starts.filter(Number.isFinite), ...(Number.isFinite(since) ? [since] : []));
const end = Math.max(...ends.filter(Number.isFinite), ...(Number.isFinite(until) ? [until] : []));
return Number.isFinite(start) && Number.isFinite(end) && end >= start ? end - start : null;
}
/** 长正文:超过 ~12 行或 600 字按长文处理(收起时限高) */