mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 19:54:32 +00:00
refactor(memory): share stale index cleanup
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import type { DatabaseSync } from "node:sqlite";
|
import type { DatabaseSync } from "node:sqlite";
|
||||||
import { createSubsystemLogger } from "../logging/subsystem.js";
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
||||||
import { buildFileEntry, listMemoryFiles, type MemoryFileEntry } from "./internal.js";
|
import { buildFileEntry, listMemoryFiles, type MemoryFileEntry } from "./internal.js";
|
||||||
|
import { deleteStaleIndexedPaths } from "./sync-stale.js";
|
||||||
|
|
||||||
const log = createSubsystemLogger("memory");
|
const log = createSubsystemLogger("memory");
|
||||||
|
|
||||||
@@ -74,29 +75,14 @@ export async function syncMemoryFiles(params: {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await params.runWithConcurrency(tasks, params.concurrency);
|
await params.runWithConcurrency(tasks, params.concurrency);
|
||||||
|
deleteStaleIndexedPaths({
|
||||||
const staleRows = params.db
|
db: params.db,
|
||||||
.prepare(`SELECT path FROM files WHERE source = ?`)
|
source: "memory",
|
||||||
.all("memory") as Array<{ path: string }>;
|
activePaths,
|
||||||
for (const stale of staleRows) {
|
vectorTable: params.vectorTable,
|
||||||
if (activePaths.has(stale.path)) {
|
ftsTable: params.ftsTable,
|
||||||
continue;
|
ftsEnabled: params.ftsEnabled,
|
||||||
}
|
ftsAvailable: params.ftsAvailable,
|
||||||
params.db.prepare(`DELETE FROM files WHERE path = ? AND source = ?`).run(stale.path, "memory");
|
model: params.model,
|
||||||
try {
|
});
|
||||||
params.db
|
|
||||||
.prepare(
|
|
||||||
`DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`,
|
|
||||||
)
|
|
||||||
.run(stale.path, "memory");
|
|
||||||
} catch {}
|
|
||||||
params.db.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`).run(stale.path, "memory");
|
|
||||||
if (params.ftsEnabled && params.ftsAvailable) {
|
|
||||||
try {
|
|
||||||
params.db
|
|
||||||
.prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`)
|
|
||||||
.run(stale.path, "memory", params.model);
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
listSessionFilesForAgent,
|
listSessionFilesForAgent,
|
||||||
sessionPathForFile,
|
sessionPathForFile,
|
||||||
} from "./session-files.js";
|
} from "./session-files.js";
|
||||||
|
import { deleteStaleIndexedPaths } from "./sync-stale.js";
|
||||||
|
|
||||||
const log = createSubsystemLogger("memory");
|
const log = createSubsystemLogger("memory");
|
||||||
|
|
||||||
@@ -99,33 +100,14 @@ export async function syncSessionFiles(params: {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await params.runWithConcurrency(tasks, params.concurrency);
|
await params.runWithConcurrency(tasks, params.concurrency);
|
||||||
|
deleteStaleIndexedPaths({
|
||||||
const staleRows = params.db
|
db: params.db,
|
||||||
.prepare(`SELECT path FROM files WHERE source = ?`)
|
source: "sessions",
|
||||||
.all("sessions") as Array<{ path: string }>;
|
activePaths,
|
||||||
for (const stale of staleRows) {
|
vectorTable: params.vectorTable,
|
||||||
if (activePaths.has(stale.path)) {
|
ftsTable: params.ftsTable,
|
||||||
continue;
|
ftsEnabled: params.ftsEnabled,
|
||||||
}
|
ftsAvailable: params.ftsAvailable,
|
||||||
params.db
|
model: params.model,
|
||||||
.prepare(`DELETE FROM files WHERE path = ? AND source = ?`)
|
});
|
||||||
.run(stale.path, "sessions");
|
|
||||||
try {
|
|
||||||
params.db
|
|
||||||
.prepare(
|
|
||||||
`DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`,
|
|
||||||
)
|
|
||||||
.run(stale.path, "sessions");
|
|
||||||
} catch {}
|
|
||||||
params.db
|
|
||||||
.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`)
|
|
||||||
.run(stale.path, "sessions");
|
|
||||||
if (params.ftsEnabled && params.ftsAvailable) {
|
|
||||||
try {
|
|
||||||
params.db
|
|
||||||
.prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`)
|
|
||||||
.run(stale.path, "sessions", params.model);
|
|
||||||
} catch {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
42
src/memory/sync-stale.ts
Normal file
42
src/memory/sync-stale.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import type { DatabaseSync } from "node:sqlite";
|
||||||
|
|
||||||
|
export function deleteStaleIndexedPaths(params: {
|
||||||
|
db: DatabaseSync;
|
||||||
|
source: string;
|
||||||
|
activePaths: Set<string>;
|
||||||
|
vectorTable: string;
|
||||||
|
ftsTable: string;
|
||||||
|
ftsEnabled: boolean;
|
||||||
|
ftsAvailable: boolean;
|
||||||
|
model: string;
|
||||||
|
}) {
|
||||||
|
const staleRows = params.db
|
||||||
|
.prepare(`SELECT path FROM files WHERE source = ?`)
|
||||||
|
.all(params.source) as Array<{ path: string }>;
|
||||||
|
|
||||||
|
for (const stale of staleRows) {
|
||||||
|
if (params.activePaths.has(stale.path)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
params.db
|
||||||
|
.prepare(`DELETE FROM files WHERE path = ? AND source = ?`)
|
||||||
|
.run(stale.path, params.source);
|
||||||
|
try {
|
||||||
|
params.db
|
||||||
|
.prepare(
|
||||||
|
`DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`,
|
||||||
|
)
|
||||||
|
.run(stale.path, params.source);
|
||||||
|
} catch {}
|
||||||
|
params.db
|
||||||
|
.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`)
|
||||||
|
.run(stale.path, params.source);
|
||||||
|
if (params.ftsEnabled && params.ftsAvailable) {
|
||||||
|
try {
|
||||||
|
params.db
|
||||||
|
.prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`)
|
||||||
|
.run(stale.path, params.source, params.model);
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user