v0.4.7
Fixed
-
Dashboard: simultaneous cooldown + running badges during TTFT retry:
capture-row-item.tsxgroupedcooling_downwithstreamingin the
running-badge condition, causing both "running" and "cooldown Ns"
badges to render simultaneously during TTFT-watchdog cooldown. The
running badge now shows only forstate === "streaming"; the cooldown
badge shows wheneverstate === "cooling_down"with a fallback static
"cooldown" label whencooldownEndsAtis absent. -
Dashboard: cooldown badge lost after page refresh: the
cooling_downstate is transient WS-only — the DBstatecolumn
staysstreamingduring cooldown, so/capturesreturned no cooldown
signal after a refresh. AddedInFlightCooldowns, an in-memory tracker
that the/capturesand/captures/:idREST endpoints use to enrich
responses with livecooling_downstate +cooldownEndsAt. The proxy
registers cooldown start/end; afinallyblock clears entries on all
terminal paths (abort, error, success). -
Dashboard: detail view showed no state badge during cooldown:
capture-detail.tsxshowed a green "live" badge only forstreaming,
notcooling_down. Added an amber "cooldown Ns" badge to the detail
header for parity with the list view. -
Dashboard: stale
cooldownEndsAtafter cooldown ended: the WS
onCaptureStatehandler left the oldcooldownEndsAtvalue in memory
when the proxy broadcaststate: "streaming"after cooldown (the WS
message omitscooldownEndsAt). The handler now explicitly clears
cooldownEndsAttoundefinedwhenstatetransitions away from
cooling_down. -
Type-safety: server
CaptureSummarymissing transient fields: the
serverCaptureSummarytype did not declareretryAttempt?or
cooldownEndsAt?, so theenrich()method's return type understated
the runtime shape. Added the optional fields to match the dashboard
type and tightened theenrichgeneric constraint from
{id, state: string}to{id, state: CaptureState}.