From 43648f7d60e216477257204ba2df81b198c7b44c Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Sat, 31 Jan 2026 09:51:13 -0500 Subject: [PATCH] Add initial_state SSE event for reconnect sync (Phase 3) When a dashboard connects via SSE, it now receives the current terminal state for all active sessions. This allows dashboards to immediately display the full terminal content without waiting for new output. --- src/server.ts | 20 +++++++++++++++++++- src/types.ts | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/server.ts b/src/server.ts index 1b155e3..7fd0fc1 100644 --- a/src/server.ts +++ b/src/server.ts @@ -135,8 +135,26 @@ const server = Bun.serve({ start(controller) { ctrl = controller; sseClients.add(controller); - // Send initial headers + // Send initial connection acknowledgment controller.enqueue(": connected\n\n"); + + // Send current terminal state for all active sessions + for (const [sessionId, termSession] of sessionTerminals.entries()) { + const session = getSession(sessionId); + if (!session || session.ended_at) continue; + + // Serialize full terminal state as HTML + const html = serializeAsHTML(termSession); + + // Send as initial_state event + const event: SSEEvent = { + type: "initial_state", + session_id: sessionId, + html, + }; + const eventStr = `event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`; + controller.enqueue(eventStr); + } }, cancel() { sseClients.delete(ctrl); diff --git a/src/types.ts b/src/types.ts index 551522c..aad26c8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -157,6 +157,7 @@ export type ServerMessage = // SSE events (Server -> Dashboard) export type SSEEvent = + | { type: "initial_state"; session_id: number; html: string } | { type: "session_start"; session_id: number;