fix: retry trace hydration pages

This commit is contained in:
lyon
2026-06-16 23:56:11 +08:00
parent 101b8e5576
commit de14d135c4
+20 -1
View File
@@ -10,6 +10,8 @@ const DEFAULT_CODE_AGENT_TIMEOUT_MS = 1_800_000;
const DEFAULT_GATEWAY_TIMEOUT_MS = 120_000;
const TRACE_HYDRATION_PAGE_LIMIT = 100;
const TRACE_HYDRATION_MAX_PAGES = 60;
const TRACE_HYDRATION_MAX_ATTEMPTS = 3;
const TRACE_HYDRATION_RETRY_DELAY_MS = 700;
export const useWorkbenchStore = defineStore("workbench", () => {
const projectId = ref(resolveInitialWorkbenchProjectId());
@@ -383,7 +385,7 @@ export const useWorkbenchStore = defineStore("workbench", () => {
try {
let sinceSeq = traceHydrationSinceSeq(message.runnerTrace);
for (let page = 0; page < TRACE_HYDRATION_MAX_PAGES; page += 1) {
const result = await api.agent.getAgentTrace(traceId, activeProjectId.value, codeAgentTimeoutMs.value, () => activityRef.value, { sinceSeq, limit: TRACE_HYDRATION_PAGE_LIMIT });
const result = await fetchTraceHydrationPage(traceId, sinceSeq);
if (!result.ok || !result.data) return;
applyTraceHydrationResult(traceId, result.data);
const nextSinceSeq = traceNextSinceSeq(result.data, sinceSeq);
@@ -395,6 +397,23 @@ export const useWorkbenchStore = defineStore("workbench", () => {
}
}
async function fetchTraceHydrationPage(traceId: string, sinceSeq: number): Promise<ApiResult<AgentChatResultResponse>> {
let lastResult: ApiResult<AgentChatResultResponse> | null = null;
for (let attempt = 0; attempt < TRACE_HYDRATION_MAX_ATTEMPTS; attempt += 1) {
const result = await api.agent.getAgentTrace(traceId, activeProjectId.value, codeAgentTimeoutMs.value, () => activityRef.value, { sinceSeq, limit: TRACE_HYDRATION_PAGE_LIMIT });
if (result.ok && result.data) return result;
lastResult = result;
if (attempt < TRACE_HYDRATION_MAX_ATTEMPTS - 1) {
await delayTraceHydrationRetry(TRACE_HYDRATION_RETRY_DELAY_MS * (attempt + 1));
}
}
return lastResult ?? { ok: false, status: 0, data: null, error: "trace_hydration_failed" };
}
function delayTraceHydrationRetry(ms: number): Promise<void> {
return new Promise((resolve) => window.setTimeout(resolve, ms));
}
async function hydrateTraceEvents(source: ChatMessage[] = messages.value): Promise<void> {
await Promise.all(source.filter(messageNeedsTraceHydration).slice(-12).map((message) => hydrateTraceEventsForMessage(message)));
}