From 3ef90bc6fe23d9c2bf29b0972f696f974f467c47 Mon Sep 17 00:00:00 2001 From: Phil Larson Date: Fri, 10 Jul 2026 20:43:31 -0700 Subject: [PATCH] fix(core): repair chat session thinkingLevel migration --- .../core/src/__tests__/db-migrate.test.ts | 34 +++++++++++++++++++ packages/core/src/db.ts | 19 ++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/core/src/__tests__/db-migrate.test.ts b/packages/core/src/__tests__/db-migrate.test.ts index 217afe9e9e..43e85034c0 100644 --- a/packages/core/src/__tests__/db-migrate.test.ts +++ b/packages/core/src/__tests__/db-migrate.test.ts @@ -716,6 +716,40 @@ describe("schema migration", () => { db.close(); }); + it("repairs v140 chat_sessions tables missing thinkingLevel", () => { + const db = new Database(fusionDir); + db.exec("CREATE TABLE IF NOT EXISTS __meta (key TEXT PRIMARY KEY, value TEXT)"); + db.exec(` + CREATE TABLE IF NOT EXISTS chat_sessions ( + id TEXT PRIMARY KEY, + agentId TEXT NOT NULL, + title TEXT, + status TEXT NOT NULL DEFAULT 'active', + projectId TEXT, + modelProvider TEXT, + modelId TEXT, + createdAt TEXT NOT NULL, + updatedAt TEXT NOT NULL, + cliSessionFile TEXT, + inFlightGeneration TEXT, + cliExecutorAdapterId TEXT + ) + `); + db.exec("INSERT INTO __meta (key, value) VALUES ('schemaVersion', '140')"); + db.exec("INSERT INTO __meta (key, value) VALUES ('lastModified', '1000')"); + db.exec(`INSERT INTO chat_sessions (id, agentId, createdAt, updatedAt) VALUES ('chat-legacy', 'agent-1', '2026-07-11T03:40:00.000Z', '2026-07-11T03:40:00.000Z')`); + + db.init(); + + const columns = db.prepare("PRAGMA table_info(chat_sessions)").all() as Array<{ name: string }>; + expect(columns.map((column) => column.name)).toContain("thinkingLevel"); + const row = db.prepare("SELECT id, thinkingLevel FROM chat_sessions WHERE id = 'chat-legacy'").get() as { id: string; thinkingLevel: string | null }; + expect(row).toEqual({ id: "chat-legacy", thinkingLevel: null }); + expect(db.getSchemaVersion()).toBe(SCHEMA_VERSION); + + db.close(); + }); + it("adds deletedAt column + index when migrating from schema version 86", () => { const db = new Database(fusionDir); db.exec("CREATE TABLE IF NOT EXISTS __meta (key TEXT PRIMARY KEY, value TEXT)"); diff --git a/packages/core/src/db.ts b/packages/core/src/db.ts index e484f009f6..488a215d60 100644 --- a/packages/core/src/db.ts +++ b/packages/core/src/db.ts @@ -184,7 +184,7 @@ export function isFts5CorruptionError(error: unknown): boolean { // ── Schema Definition ──────────────────────────────────────────────── -const SCHEMA_VERSION = 140; +const SCHEMA_VERSION = 141; const TASKS_FTS_AUTOMERGE = 8; const TASKS_FTS_CRISISMERGE = 16; @@ -1521,6 +1521,7 @@ export const MIGRATION_ONLY_TABLE_SCHEMAS: Record projectId: "TEXT", modelProvider: "TEXT", modelId: "TEXT", + thinkingLevel: "TEXT", createdAt: "TEXT NOT NULL", updatedAt: "TEXT NOT NULL", cliSessionFile: "TEXT", @@ -5656,6 +5657,22 @@ export class Database { }); } + if (version < 141) { + /* + * FNXC:Chat-ThinkingLevelRepair 2026-07-11-03:40: + * Some live project databases reached schemaVersion 140 without the + * chat_sessions.thinkingLevel column, which made POST /api/chat/sessions + * fail with "table chat_sessions has no column named thinkingLevel". + * Re-run the additive column repair under a fresh schema version so + * already-v140 databases converge instead of being skipped forever. + */ + this.applyMigration(141, () => { + if (this.hasTable("chat_sessions")) { + this.addColumnIfMissing("chat_sessions", "thinkingLevel", "TEXT"); + } + }); + } + } /**