refactor: add canonical transcript assembly seam

This commit is contained in:
tommy0103
2026-07-21 00:58:34 +08:00
parent 3ee44de4e5
commit f79f1b3e3b
39 changed files with 1741 additions and 670 deletions
+34
View File
@@ -0,0 +1,34 @@
import type { SqliteDb } from './sqlite-types.ts';
const COLUMN_MIGRATIONS = [
['sessions', 'source', "TEXT DEFAULT 'claude'"],
['messages', 'content_type', 'TEXT'],
['messages', 'is_meta', 'INTEGER DEFAULT 0'],
['messages', 'visibility', "TEXT DEFAULT 'visible'"],
['messages', 'source', "TEXT DEFAULT 'claude'"],
['tool_calls', 'presentation', "TEXT DEFAULT 'default'"],
['workflows', 'parent_tool_use_id', 'TEXT'],
['memories', 'anchors', 'TEXT'],
['memories', 'deleted_at', 'TEXT'],
['memories', 'deleted_reason', 'TEXT'],
] as const;
function tableExists(db: SqliteDb, table: string): boolean {
return Boolean(db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=?").get(table));
}
/** Binding-agnostic additive migrations shared by the CLI and desktop app. */
export function migrateCoreSchemaColumns(db: SqliteDb): void {
const columnsByTable = new Map<string, Set<string>>();
for (const [table, column, definition] of COLUMN_MIGRATIONS) {
if (!tableExists(db, table)) continue;
let columns = columnsByTable.get(table);
if (!columns) {
columns = new Set(db.prepare(`PRAGMA table_info(${table})`).all().map((row) => String(row.name)));
columnsByTable.set(table, columns);
}
if (columns.has(column)) continue;
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
columns.add(column);
}
}