From 3b01a29391a7ea5446a23f847f8e73c781721a5a Mon Sep 17 00:00:00 2001 From: LIU9293 Date: Sat, 28 Feb 2026 04:39:25 +0000 Subject: [PATCH] fix: prevent stale status overwrites after final result Stop in-flight progress updates before completion so late status ticks cannot overwrite final output, and bump the project version to 0.1.18. --- package.json | 2 +- packages/core/kernel/request-run.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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));