| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import { getDbInstance } from "./core";
|
|
|
|
|
|
|
| export interface MemoryVecMeta {
|
| activeDim: number | null;
|
| embeddingSignature: string | null;
|
| lastResetAt: string | null;
|
| vecLoaded: boolean;
|
| }
|
|
|
|
|
|
|
| |
| |
| |
| |
|
|
| export function getMemoryVecMeta(): MemoryVecMeta {
|
| const db = getDbInstance();
|
| const row = db
|
| .prepare(
|
| "SELECT active_dim, embedding_signature, last_reset_at, vec_loaded FROM memory_vec_meta WHERE id = 1"
|
| )
|
| .get() as
|
| | {
|
| active_dim: number | null;
|
| embedding_signature: string | null;
|
| last_reset_at: string | null;
|
| vec_loaded: number;
|
| }
|
| | undefined;
|
|
|
| if (!row) {
|
| return {
|
| activeDim: null,
|
| embeddingSignature: null,
|
| lastResetAt: null,
|
| vecLoaded: false,
|
| };
|
| }
|
|
|
| return {
|
| activeDim: row.active_dim,
|
| embeddingSignature: row.embedding_signature,
|
| lastResetAt: row.last_reset_at,
|
| vecLoaded: row.vec_loaded === 1,
|
| };
|
| }
|
|
|
| |
| |
| |
| |
|
|
| export function setMemoryVecMeta(meta: Partial<MemoryVecMeta>): void {
|
| const db = getDbInstance();
|
|
|
|
|
| const current = getMemoryVecMeta();
|
|
|
| const activeDim = "activeDim" in meta ? meta.activeDim ?? null : current.activeDim;
|
| const embeddingSignature =
|
| "embeddingSignature" in meta
|
| ? meta.embeddingSignature ?? null
|
| : current.embeddingSignature;
|
| const lastResetAt =
|
| "lastResetAt" in meta ? meta.lastResetAt ?? null : current.lastResetAt;
|
| const vecLoaded =
|
| "vecLoaded" in meta ? (meta.vecLoaded ? 1 : 0) : current.vecLoaded ? 1 : 0;
|
|
|
| db.prepare(
|
| `INSERT OR REPLACE INTO memory_vec_meta
|
| (id, active_dim, embedding_signature, last_reset_at, vec_loaded)
|
| VALUES (1, ?, ?, ?, ?)`
|
| ).run(activeDim, embeddingSignature, lastResetAt, vecLoaded);
|
| }
|
|
|
|
|
|
|
| |
| |
|
|
| export function markMemoryNeedsReindex(id: string, needs: boolean): void {
|
| const db = getDbInstance();
|
| db.prepare("UPDATE memories SET needs_reindex = ? WHERE id = ?").run(needs ? 1 : 0, id);
|
| }
|
|
|
| |
| |
| |
|
|
| export function markAllMemoriesNeedReindex(): number {
|
| const db = getDbInstance();
|
| const result = db.prepare("UPDATE memories SET needs_reindex = 1").run();
|
| return result.changes;
|
| }
|
|
|
| |
| |
| |
|
|
| export function getMemoryReindexQueue(
|
| limit: number
|
| ): Array<{ id: string; content: string; key: string }> {
|
| const db = getDbInstance();
|
| return db
|
| .prepare(
|
| `SELECT id, content, COALESCE(key, '') AS key
|
| FROM memories
|
| WHERE needs_reindex = 1
|
| ORDER BY created_at ASC
|
| LIMIT ?`
|
| )
|
| .all(limit) as Array<{ id: string; content: string; key: string }>;
|
| }
|
|
|
| |
| |
|
|
| export function countMemoryReindexPending(): number {
|
| const db = getDbInstance();
|
| const row = db
|
| .prepare("SELECT COUNT(*) AS cnt FROM memories WHERE needs_reindex = 1")
|
| .get() as { cnt: number };
|
| return row.cnt;
|
| }
|
|
|