diff --git a/package.json b/package.json index 03a1e05..0a7d9c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ode", - "version": "0.1.17", + "version": "0.1.18", "description": "Coding anywhere with your coding agents connected", "module": "packages/core/index.ts", "type": "module", diff --git a/packages/core/kernel/request-run.ts b/packages/core/kernel/request-run.ts index 5698ac1..05b15a7 100644 --- a/packages/core/kernel/request-run.ts +++ b/packages/core/kernel/request-run.ts @@ -426,6 +426,13 @@ export async function runTrackedRequest( let progressTimer: ReturnType | null = null; let stopWatcher: (() => void) | null = null; + const waitForProgressDrain = async (): Promise => { + const deadline = Date.now() + Math.max(progressIntervalMs, 1_000); + while (progressInFlight && Date.now() < deadline) { + await new Promise((resolve) => setTimeout(resolve, 25)); + } + }; + const runProgressTick = async (): Promise => { if (request.state !== "processing") return; if (progressInFlight) return; @@ -461,6 +468,12 @@ export async function runTrackedRequest( stopSignal.promise.then(() => ({ type: "stop" as const })), ]); + if (progressTimer) { + clearInterval(progressTimer); + progressTimer = null; + } + await waitForProgressDrain(); + if (isExternallySettled(request)) { liveEventHistory.delete(getStatusMessageKey(request)); liveParsedState.delete(getStatusMessageKey(request)); @@ -468,6 +481,7 @@ export async function runTrackedRequest( } request.state = "completed"; + request.statusFrozen = true; liveEventHistory.delete(getStatusMessageKey(request)); liveParsedState.delete(getStatusMessageKey(request));