Spaces:
Runtime error
Runtime error
| /** | |
| * Database module: AgentBridgeState | |
| * CRUD operations for agent_bridge_state table. | |
| */ | |
| import { getDbInstance } from "./core.ts"; | |
| import type { AgentBridgeStateRow } from "./_rowTypes.ts"; | |
| // SQLite stores booleans as 0/1 integers | |
| interface AgentBridgeStateDbRow { | |
| agent_id: string; | |
| dns_enabled: number; | |
| cert_trusted: number; | |
| setup_completed: number; | |
| last_started_at: string | null; | |
| last_error: string | null; | |
| } | |
| function mapRow(row: AgentBridgeStateDbRow): AgentBridgeStateRow { | |
| return { | |
| agent_id: row.agent_id, | |
| dns_enabled: row.dns_enabled === 1, | |
| cert_trusted: row.cert_trusted === 1, | |
| setup_completed: row.setup_completed === 1, | |
| last_started_at: row.last_started_at, | |
| last_error: row.last_error, | |
| }; | |
| } | |
| export function getAllAgentBridgeStates(): AgentBridgeStateRow[] { | |
| const db = getDbInstance(); | |
| const rows = db | |
| .prepare("SELECT * FROM agent_bridge_state ORDER BY agent_id ASC") | |
| .all() as AgentBridgeStateDbRow[]; | |
| return rows.map(mapRow); | |
| } | |
| export function getAgentBridgeState(agentId: string): AgentBridgeStateRow | null { | |
| const db = getDbInstance(); | |
| const row = db.prepare("SELECT * FROM agent_bridge_state WHERE agent_id = ?").get(agentId) as | |
| | AgentBridgeStateDbRow | |
| | undefined; | |
| return row ? mapRow(row) : null; | |
| } | |
| export function upsertAgentBridgeState( | |
| row: Partial<AgentBridgeStateRow> & { agent_id: string } | |
| ): void { | |
| const db = getDbInstance(); | |
| const existing = getAgentBridgeState(row.agent_id); | |
| if (!existing) { | |
| db.prepare( | |
| `INSERT INTO agent_bridge_state | |
| (agent_id, dns_enabled, cert_trusted, setup_completed, last_started_at, last_error) | |
| VALUES (?, ?, ?, ?, ?, ?)` | |
| ).run( | |
| row.agent_id, | |
| row.dns_enabled !== undefined ? (row.dns_enabled ? 1 : 0) : 0, | |
| row.cert_trusted !== undefined ? (row.cert_trusted ? 1 : 0) : 0, | |
| row.setup_completed !== undefined ? (row.setup_completed ? 1 : 0) : 0, | |
| row.last_started_at ?? null, | |
| row.last_error ?? null | |
| ); | |
| } else { | |
| const fields: string[] = []; | |
| const values: (string | number | null)[] = []; | |
| if (row.dns_enabled !== undefined) { | |
| fields.push("dns_enabled = ?"); | |
| values.push(row.dns_enabled ? 1 : 0); | |
| } | |
| if (row.cert_trusted !== undefined) { | |
| fields.push("cert_trusted = ?"); | |
| values.push(row.cert_trusted ? 1 : 0); | |
| } | |
| if (row.setup_completed !== undefined) { | |
| fields.push("setup_completed = ?"); | |
| values.push(row.setup_completed ? 1 : 0); | |
| } | |
| if (row.last_started_at !== undefined) { | |
| fields.push("last_started_at = ?"); | |
| values.push(row.last_started_at); | |
| } | |
| if (row.last_error !== undefined) { | |
| fields.push("last_error = ?"); | |
| values.push(row.last_error); | |
| } | |
| if (fields.length === 0) return; | |
| values.push(row.agent_id); | |
| db.prepare(`UPDATE agent_bridge_state SET ${fields.join(", ")} WHERE agent_id = ?`).run( | |
| ...values | |
| ); | |
| } | |
| } | |
| export function setLastStarted(agentId: string, ts: string): void { | |
| const db = getDbInstance(); | |
| db.prepare( | |
| `INSERT INTO agent_bridge_state (agent_id, last_started_at) | |
| VALUES (?, ?) | |
| ON CONFLICT(agent_id) DO UPDATE SET last_started_at = excluded.last_started_at` | |
| ).run(agentId, ts); | |
| } | |
| export function setLastError(agentId: string, err: string | null): void { | |
| const db = getDbInstance(); | |
| db.prepare( | |
| `INSERT INTO agent_bridge_state (agent_id, last_error) | |
| VALUES (?, ?) | |
| ON CONFLICT(agent_id) DO UPDATE SET last_error = excluded.last_error` | |
| ).run(agentId, err); | |
| } | |