diff --git a/src/services/sqlite/SessionStore.ts b/src/services/sqlite/SessionStore.ts index c5ece703..d7d853a7 100644 --- a/src/services/sqlite/SessionStore.ts +++ b/src/services/sqlite/SessionStore.ts @@ -2615,6 +2615,23 @@ export class SessionStore { return { imported: true, id: result.lastInsertRowid as number }; } + /** + * Rebuild the FTS5 index for observations. + * Should be called after bulk imports to ensure imported rows are searchable. + * No-op if observations_fts table does not exist. + */ + rebuildObservationsFTSIndex(): void { + const hasFTS = (this.db.prepare( + "SELECT name FROM sqlite_master WHERE type='table' AND name='observations_fts'" + ).all() as { name: string }[]).length > 0; + + if (!hasFTS) { + return; + } + + this.db.run("INSERT INTO observations_fts(observations_fts) VALUES('rebuild')"); + } + /** * Import user prompt with duplicate checking * Duplicates are identified by content_session_id + prompt_number diff --git a/src/services/worker/http/routes/DataRoutes.ts b/src/services/worker/http/routes/DataRoutes.ts index 01013d5d..b476a3d9 100644 --- a/src/services/worker/http/routes/DataRoutes.ts +++ b/src/services/worker/http/routes/DataRoutes.ts @@ -391,6 +391,13 @@ export class DataRoutes extends BaseRouteHandler { stats.observationsSkipped++; } } + + // Rebuild FTS index so imported observations are immediately searchable. + // The FTS5 content table relies on triggers for incremental updates, but + // those triggers may not have fired correctly for all import paths. + if (stats.observationsImported > 0) { + store.rebuildObservationsFTSIndex(); + } } // Import prompts (depends on sessions)