Add prompt_json column to store rich prompt data

This commit is contained in:
Jared Miller 2026-01-28 12:55:47 -05:00
parent 2aeec48627
commit cd7d1c0ea8
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C

View file

@ -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