diff --git a/assistant/src/memory/db-init.ts b/assistant/src/memory/db-init.ts index 352fcfc91c7..c85332c4941 100644 --- a/assistant/src/memory/db-init.ts +++ b/assistant/src/memory/db-init.ts @@ -16,6 +16,7 @@ import { migrateGuardianActionTables, migrateBackfillInboxThreadStateFromBindings, migrateDropActiveSearchIndex, + migrateMemorySegmentsIndexes, validateMigrationState, } from './schema-migration.js'; @@ -1267,5 +1268,7 @@ export function initializeDb(): void { migrateMemoryFtsBackfill(database); + migrateMemorySegmentsIndexes(database); + validateMigrationState(database); } diff --git a/assistant/src/memory/migrations/016-memory-segments-indexes.ts b/assistant/src/memory/migrations/016-memory-segments-indexes.ts new file mode 100644 index 00000000000..97aff7d50d3 --- /dev/null +++ b/assistant/src/memory/migrations/016-memory-segments-indexes.ts @@ -0,0 +1,11 @@ +import type { DrizzleDb } from '../db-connection.js'; + +/** + * Idempotent migration to ensure memory_segments has indexes on scope_id and + * conversation_id for faster lookups. scope_id was already covered by + * db-init, but we include both here for completeness. + */ +export function migrateMemorySegmentsIndexes(database: DrizzleDb): void { + database.run(/*sql*/ `CREATE INDEX IF NOT EXISTS idx_memory_segments_scope_id ON memory_segments(scope_id)`); + database.run(/*sql*/ `CREATE INDEX IF NOT EXISTS idx_memory_segments_conversation_id ON memory_segments(conversation_id)`); +} diff --git a/assistant/src/memory/migrations/index.ts b/assistant/src/memory/migrations/index.ts index ee4e81e38f8..b4dc9f7aace 100644 --- a/assistant/src/memory/migrations/index.ts +++ b/assistant/src/memory/migrations/index.ts @@ -19,3 +19,4 @@ export { migrateCallSessionsAddInitiatedFrom } from './012-call-sessions-add-ini export { migrateGuardianActionTables } from './013-guardian-action-tables.js'; export { migrateBackfillInboxThreadStateFromBindings } from './014-backfill-inbox-thread-state.js'; export { migrateDropActiveSearchIndex } from './015-drop-active-search-index.js'; +export { migrateMemorySegmentsIndexes } from './016-memory-segments-indexes.js'; diff --git a/assistant/src/memory/schema-migration.ts b/assistant/src/memory/schema-migration.ts index cbb56660310..cda2986010c 100644 --- a/assistant/src/memory/schema-migration.ts +++ b/assistant/src/memory/schema-migration.ts @@ -19,4 +19,5 @@ export { migrateGuardianActionTables, migrateBackfillInboxThreadStateFromBindings, migrateDropActiveSearchIndex, + migrateMemorySegmentsIndexes, } from './migrations/index.js'; diff --git a/assistant/src/memory/schema.ts b/assistant/src/memory/schema.ts index 143cc5c22b8..ad4e9385548 100644 --- a/assistant/src/memory/schema.ts +++ b/assistant/src/memory/schema.ts @@ -1,4 +1,4 @@ -import { sqliteTable, text, integer, real, blob } from 'drizzle-orm/sqlite-core'; +import { sqliteTable, text, integer, real, blob, index } from 'drizzle-orm/sqlite-core'; export const conversations = sqliteTable('conversations', { id: text('id').primaryKey(), @@ -58,7 +58,10 @@ export const memorySegments = sqliteTable('memory_segments', { contentHash: text('content_hash'), createdAt: integer('created_at').notNull(), updatedAt: integer('updated_at').notNull(), -}); +}, (table) => [ + index('idx_memory_segments_scope_id').on(table.scopeId), + index('idx_memory_segments_conversation_id').on(table.conversationId), +]); export const memoryItems = sqliteTable('memory_items', { id: text('id').primaryKey(),