diff --git a/src/db.ts b/src/db.ts index 45fe31f..aaaded1 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,7 +1,18 @@ // SQLite database schema and queries import { Database } from "bun:sqlite"; -import type { Device, OutputLog, Prompt, Session } from "./types"; +import type { Device, OutputLog, Session, PromptData } from "./types"; + +// Extend Prompt interface to include prompt_json field +export interface Prompt { + id: number; + session_id: number; + created_at: number; + prompt_text: string; + response: string | null; + responded_at: number | null; + prompt_json: PromptData | null; +} let db: Database; @@ -50,6 +61,7 @@ export function initDb(path = "claude-remote.db"): Database { session_id INTEGER NOT NULL, created_at INTEGER NOT NULL, prompt_text TEXT NOT NULL, + prompt_json TEXT, response TEXT, responded_at INTEGER ); @@ -79,7 +91,7 @@ export function initDb(path = "claude-remote.db"): Database { "SELECT * FROM sessions WHERE ended_at IS NULL ORDER BY started_at DESC", ); createPromptStmt = db.prepare( - "INSERT INTO prompts (session_id, created_at, prompt_text) VALUES (?, ?, ?) RETURNING *", + "INSERT INTO prompts (session_id, created_at, prompt_text, prompt_json) VALUES (?, ?, ?, ?) RETURNING *", ); getPromptStmt = db.prepare("SELECT * FROM prompts WHERE id = ?"); respondToPromptStmt = db.prepare( @@ -141,13 +153,39 @@ export function getActiveSessions(): Session[] { // Prompt functions -export function createPrompt(sessionId: number, promptText: string): Prompt { +export function createPrompt(sessionId: number, promptText: string, promptJson?: string): Prompt { const now = Date.now(); - return createPromptStmt.get(sessionId, now, promptText) as Prompt; + const row = createPromptStmt.get(sessionId, now, promptText, promptJson ?? null); + const prompt = row as any; + + // Parse prompt_json if present + if (prompt.prompt_json) { + try { + prompt.prompt_json = JSON.parse(prompt.prompt_json); + } catch { + prompt.prompt_json = null; + } + } + + return prompt as Prompt; } export function getPrompt(promptId: number): Prompt | null { - return (getPromptStmt.get(promptId) as Prompt) ?? null; + const row = getPromptStmt.get(promptId); + if (!row) return null; + + const prompt = row as any; + + // Parse prompt_json if present + if (prompt.prompt_json) { + try { + prompt.prompt_json = JSON.parse(prompt.prompt_json); + } catch { + prompt.prompt_json = null; + } + } + + return prompt as Prompt; } export function respondToPrompt(promptId: number, response: string): void { @@ -155,7 +193,19 @@ export function respondToPrompt(promptId: number, response: string): void { } export function getPendingPrompts(): Prompt[] { - return getPendingPromptsStmt.all() as Prompt[]; + const rows = getPendingPromptsStmt.all(); + + return rows.map((row: any) => { + // Parse prompt_json if present + if (row.prompt_json) { + try { + row.prompt_json = JSON.parse(row.prompt_json); + } catch { + row.prompt_json = null; + } + } + return row as Prompt; + }); } // OutputLog functions