diff --git a/data/clarc.db b/data/clarc.db new file mode 100644 index 0000000..e69de29 diff --git a/src/db.ts b/src/db.ts index 12da341..458e2b8 100644 --- a/src/db.ts +++ b/src/db.ts @@ -31,6 +31,7 @@ let getPendingPromptsStmt: ReturnType; let appendOutputStmt: ReturnType; let getSessionOutputStmt: ReturnType; let updateSessionStatsStmt: ReturnType; +let endAllSessionsStmt: ReturnType; // Migration function to add new columns to existing tables function runMigrations(): void { @@ -153,6 +154,9 @@ export function initDb( git_branch = ?, git_files_json = ? WHERE id = ? `); + endAllSessionsStmt = db.prepare( + "UPDATE sessions SET ended_at = ? WHERE ended_at IS NULL", + ); return db; } @@ -198,6 +202,11 @@ export function getActiveSessions(): Session[] { return getActiveSessionsStmt.all() as Session[]; } +export function endAllSessions(): number { + const result = endAllSessionsStmt.run(Date.now()); + return result.changes; +} + // Prompt functions export function createPrompt( diff --git a/src/server.ts b/src/server.ts index d9dc1cd..55f4750 100644 --- a/src/server.ts +++ b/src/server.ts @@ -7,6 +7,7 @@ import { createDevice, createPrompt, createSession, + endAllSessions, endSession, getActiveSessions, getDeviceBySecret, @@ -82,6 +83,14 @@ function broadcastSSE(event: SSEEvent): void { const port = Number.parseInt(process.env.PORT || "7200", 10); initDb(); +// Clean up ghost sessions from previous runs +const cleanedSessions = endAllSessions(); +if (cleanedSessions > 0) { + console.log( + `Cleaned up ${cleanedSessions} ghost session(s) from previous runs`, + ); +} + // Auto-seed device from env if configured const envSecret = process.env.CLAUDE_REMOTE_SECRET; if (envSecret) {