From 97d64752086ecb6c9e03be374c62a21405b2c8c5 Mon Sep 17 00:00:00 2001 From: leubeem Date: Wed, 10 Jun 2026 23:17:14 +0200 Subject: [PATCH] feat(pm): recover gracefully when the backend session expires The radio backend now expires sessions idle for 5+ hours and may restart without in-memory state. A 404 on transmit previously left the monitor screen stuck; now it clears the session, returns to the scenario picker, and shows a dismissible "session expired" alert there. Co-Authored-By: Claude Fable 5 --- app/pages/pm.vue | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/app/pages/pm.vue b/app/pages/pm.vue index d9def89..16aa269 100644 --- a/app/pages/pm.vue +++ b/app/pages/pm.vue @@ -128,6 +128,18 @@ + + {{ error }} + +

@@ -2765,7 +2777,17 @@ const handlePilotTransmission = async (message: string, source: 'text' | 'ptt' = completedScenario.value = activeScenario.value currentScreen.value = 'complete' } - } catch (e) { + } catch (e: any) { + const status = e?.status ?? e?.response?.status + if (status === 404) { + // Session expired (idle timeout) or backend restarted without the + // persisted session — reset to scenario selection for a clean restart. + pmLog.error('SESSION GONE (404) — resetting to scenario selection', { session: backendSessionId.value }) + backendSessionId.value = null + error.value = 'Session expired — please start the scenario again.' + currentScreen.value = 'scenario' + return + } pmLog.error('TRANSMIT FAILED', { transcript, session: backendSessionId.value, error: e }) console.error('Backend transmission failed', e) setLastTransmission(`${prefix}: ${transcript} (backend failed)`) @@ -2857,6 +2879,7 @@ const startMonitoring = async (flightPlan: any, scenario: Scenario) => { // 4. Create a backend session with the flight-plan-derived variables try { + error.value = '' const session = await radioBackend.createSession( scenario.startFlow, backendVariables,