Files
EJClaw/src/db/router-state.ts

88 lines
2.5 KiB
TypeScript

import { Database } from 'bun:sqlite';
import { normalizeServiceId } from '../config.js';
import { AgentType } from '../types.js';
export function getRouterStateFromDatabase(
database: Database,
key: string,
currentServiceId: string,
): string | undefined {
const row = database
.prepare('SELECT value FROM router_state WHERE key = ?')
.get(key) as { value: string } | undefined;
if (row) return row.value;
const prefixedKey = `${normalizeServiceId(currentServiceId)}:${key}`;
const prefixedRow = database
.prepare('SELECT value FROM router_state WHERE key = ?')
.get(prefixedKey) as { value: string } | undefined;
if (!prefixedRow) return undefined;
database
.prepare('INSERT OR REPLACE INTO router_state (key, value) VALUES (?, ?)')
.run(key, prefixedRow.value);
database.prepare('DELETE FROM router_state WHERE key = ?').run(prefixedKey);
return prefixedRow.value;
}
export function getRouterStateForServiceFromDatabase(
database: Database,
key: string,
serviceId: string,
): string | undefined {
const prefixedKey = `${normalizeServiceId(serviceId)}:${key}`;
const row = database
.prepare('SELECT value FROM router_state WHERE key = ?')
.get(prefixedKey) as { value: string } | undefined;
if (row) return row.value;
const canonical = database
.prepare('SELECT value FROM router_state WHERE key = ?')
.get(key) as { value: string } | undefined;
return canonical?.value;
}
export function setRouterStateInDatabase(
database: Database,
key: string,
value: string,
): void {
database
.prepare('INSERT OR REPLACE INTO router_state (key, value) VALUES (?, ?)')
.run(key, value);
}
export function setRouterStateForServiceInDatabase(
database: Database,
key: string,
value: string,
serviceId: string,
): void {
const prefixedKey = `${normalizeServiceId(serviceId)}:${key}`;
database
.prepare('INSERT OR REPLACE INTO router_state (key, value) VALUES (?, ?)')
.run(prefixedKey, value);
}
export function getLastRespondingAgentTypeFromDatabase(
database: Database,
chatJid: string,
): AgentType | undefined {
const row = database
.prepare(
`SELECT sender FROM messages
WHERE chat_jid = ? AND is_bot_message = 1
ORDER BY timestamp DESC, seq DESC
LIMIT 1`,
)
.get(chatJid) as { sender: string } | undefined;
if (!row) return undefined;
const sender = row.sender.toLowerCase();
if (sender.includes('claude')) return 'claude-code';
if (sender.includes('codex')) return 'codex';
return undefined;
}