From c299f430ac165cf2a53cb7f9db6bda0157efbf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Troed=20S=C3=A5ngberg?= Date: Sat, 13 Jun 2026 23:27:21 +0200 Subject: [PATCH] fix: v0.0.48 - track max n_decoded globally to handle slot disappear/reappear - Use generateMaxDecoded to track highest n_decoded seen across all polls - Detect resets when nd drops below max (even if slot disappeared and reappeared) - Simplified logic: only compare against max, not per-slot baseline - Removed generateSlotId tracking (no longer needed) --- package.json | 2 +- tui.tsx | 40 +++++++++++++++++----------------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index bbebfc2..f77583f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@troed/oc-ls-stats", - "version": "0.0.47", + "version": "0.0.48", "type": "module", "exports": { "./tui": { diff --git a/tui.tsx b/tui.tsx index 72a28fe..08909ac 100644 --- a/tui.tsx +++ b/tui.tsx @@ -50,6 +50,7 @@ type TrackerState = { generateSlotId: number | null generateCapturedDecoded: number | null generateStartAt: number + generateMaxDecoded: number } function estimateStreamTokens(delta: string) { @@ -271,6 +272,7 @@ const tui: TuiPlugin = async (api) => { generateSlotId: null, generateCapturedDecoded: null, generateStartAt: 0, + generateMaxDecoded: 0, } const [version, setVersion] = createSignal(0) const [clock, setClock] = createSignal(Date.now()) @@ -390,34 +392,26 @@ const tui: TuiPlugin = async (api) => { const now = Date.now() const nd = generateSlot.next_token?.[0]?.n_decoded ?? 0 - debug(`gen slot=${slotId} nd=${nd} prevNd=${tracker.generateCapturedDecoded} same=${tracker.generateSlotId === slotId} tps=${tracker.lastGeneratedTps}`) - - if (tracker.generateSlotId === slotId) { - if (tracker.generateCapturedDecoded !== null) { - if (nd < tracker.generateCapturedDecoded) { - tracker.generateCapturedDecoded = nd - tracker.generateStartAt = now - tracker.lastGeneratedTps = 0 - debug(`gen counter reset nd=${nd}`) - } else { - const dt = (now - tracker.generateStartAt) / 1000 - const delta = nd - tracker.generateCapturedDecoded - if (dt > 0 && delta > 0) { - tracker.lastGeneratedTps = delta / dt - debug(`gen delta=${delta} dt=${dt.toFixed(2)} tps=${tracker.lastGeneratedTps.toFixed(1)}`) - } else if (delta === 0) { - tracker.lastGeneratedTps = 0 - genEnded = true - debug(`gen stalled delta=${delta}`) - } - } + if (nd > tracker.generateMaxDecoded) { + const delta = nd - tracker.generateMaxDecoded + const dt = (now - tracker.generateStartAt) / 1000 + if (delta > 0 && dt > 0) { + tracker.lastGeneratedTps = delta / dt + debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} delta=${delta} dt=${dt.toFixed(2)} tps=${tracker.lastGeneratedTps.toFixed(1)}`) } - } else { + tracker.generateMaxDecoded = nd + tracker.generateCapturedDecoded = nd + tracker.generateStartAt = now tracker.generateSlotId = slotId + } else if (nd < tracker.generateMaxDecoded) { tracker.generateCapturedDecoded = nd tracker.generateStartAt = now tracker.lastGeneratedTps = 0 - debug(`gen new slot id=${slotId} nd=${nd}`) + debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} counter reset`) + } else { + debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} stalled`) + tracker.lastGeneratedTps = 0 + genEnded = true } } else { if (tracker.isGenerating) {