openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
145 lines (144 loc) • 5.68 kB
JavaScript
import { t as formatErrorMessage } from "./errors-BSdPMFao.mjs";
import { i as getNodeSqliteKysely, n as executeSqliteQuerySync } from "./kysely-sync-BMSZn9yz.mjs";
import { t as openNodeSqliteDatabase } from "./node-sqlite-DWTcT2ek.mjs";
import { c as MEMORY_INDEX_META_TABLE, f as MEMORY_INDEX_CHUNKS_TABLE, h as MEMORY_INDEX_SOURCES_TABLE } from "./memory-schema-WSfu1Pr6.mjs";
import { n as openOpenClawAgentDatabaseReadOnly } from "./openclaw-agent-db-readonly-open-B276KcEv.mjs";
import { n as withOpenClawAgentDatabaseReadOnly } from "./openclaw-agent-db-readonly-C4g5X1l9.mjs";
import { n as serveWorkerTasks } from "./worker-task-server-CF3aSh39.mjs";
import "./memory-core-host-engine-knn-C0aMbdIa.mjs";
import "./error-runtime-C9z8-Tyo.mjs";
import "./worker-task-server-TOWocWCm.mjs";
import { a as readCuratedProjectMemoryCandidates, i as readCuratedMemoryTriggerCandidates } from "./engine-storage-LvM3BquN.mjs";
import "./memory-core-host-engine-storage-CTEDJ14W.mjs";
import "./sqlite-runtime-COSukRWw.mjs";
import { c as readMemoryRecallData, h as buildFtsQuery, i as searchChunksByEmbedding, l as readMemoryRetrievalIndexState, m as bm25RankToScore, n as searchKeyword, r as searchPathKeyword } from "./manager-search-Cghb_ACB.mjs";
import "./memory-core-host-engine-schema-Bv75zkix.mjs";
//#region extensions/memory-core/src/memory/manager-status-presence.ts
const MEMORY_INDEX_META_KEY = "memory_index_meta_v1";
/** Inspect existing memory tables without constructing or migrating a manager. */
function inspectMemoryIndexPresenceInWorker(databasePath) {
let db;
try {
db = openNodeSqliteDatabase(databasePath, { readOnly: true });
const builtInMemoryTableSets = [{
meta: MEMORY_INDEX_META_TABLE,
sources: MEMORY_INDEX_SOURCES_TABLE,
chunks: MEMORY_INDEX_CHUNKS_TABLE
}, {
meta: "meta",
sources: "files",
chunks: "chunks"
}];
const builtInMemoryTables = builtInMemoryTableSets.flatMap(({ meta, sources, chunks }) => [
meta,
sources,
chunks
]);
const tableNames = new Set(db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name IN (${builtInMemoryTables.map(() => "?").join(", ")})`).all(...builtInMemoryTables).map((row) => row.name).filter((name) => typeof name === "string"));
for (const tables of builtInMemoryTableSets) {
if (tableNames.has(tables.meta) && db.prepare(`SELECT 1 AS ok FROM ${tables.meta} WHERE key = ? LIMIT 1`).get(MEMORY_INDEX_META_KEY)) return true;
for (const tableName of [tables.sources, tables.chunks]) if (tableNames.has(tableName) && db.prepare(`SELECT 1 AS ok FROM ${tableName} LIMIT 1`).get()) return true;
}
return false;
} catch {
return false;
} finally {
try {
db?.close();
} catch {}
}
}
//#endregion
//#region extensions/memory-core/src/memory/manager-search.worker.ts
serveWorkerTasks(async (input) => {
const request = input;
if (request.kind === "prewarm") return { kind: "prewarm" };
if (request.kind === "presence") return {
kind: "presence",
present: inspectMemoryIndexPresenceInWorker(request.databasePath)
};
if (request.kind === "recall-metadata") {
const result = withOpenClawAgentDatabaseReadOnly(({ db }) => readMemoryRecallData(db, request), {
agentId: request.agentId,
path: request.databasePath
});
if (!result.found) throw new Error(`Memory search database unavailable: ${result.reason}`);
return {
kind: "recall-metadata",
...result.value
};
}
const opened = openOpenClawAgentDatabaseReadOnly({
agentId: request.agentId,
path: request.databasePath
});
if (!opened.found) {
if (opened.reason === "database-missing" && (request.kind === "index-state" || request.kind === "keyword" && request.includeIndexState)) {
const state = {
meta: null,
hasIndexedChunks: false,
hasFtsContent: false,
vectorState: { state: "empty" }
};
return request.kind === "index-state" ? {
kind: "index-state",
state
} : {
kind: "keyword",
indexState: state,
body: { rows: [] },
path: { rows: [] }
};
}
throw new Error(`Memory search database unavailable: ${opened.reason}`);
}
const { db } = opened.database;
try {
if (request.kind === "index-state") return {
kind: "index-state",
state: readMemoryRetrievalIndexState(db)
};
if (request.kind === "curated") {
const provenanceRepairPending = request.checkProvenanceRepair && executeSqliteQuerySync(db, getNodeSqliteKysely(db).selectFrom("memory_index_sources").select("hash").where("source", "=", "memory").where("hash", "=", "").limit(1)).rows.length > 0;
return {
kind: "curated",
provenanceRepairPending,
rows: provenanceRepairPending ? [] : request.projectsOnly ? readCuratedProjectMemoryCandidates(db, request.limit, request.activeProjectKeys ?? []) : readCuratedMemoryTriggerCandidates(db, request.limit, request.activeProjectKeys)
};
}
if (request.kind === "vector") return {
kind: "vector",
rows: await searchChunksByEmbedding({
...request.query,
db
})
};
const indexState = request.includeIndexState ? readMemoryRetrievalIndexState(db) : void 0;
return {
kind: "keyword",
body: await searchKeyword({
...request.query.body,
db,
buildFtsQuery,
bm25RankToScore
}).then((rows) => ({ rows })).catch((error) => ({
rows: [],
error: formatErrorMessage(error)
})),
path: await searchPathKeyword({
...request.query.path,
db,
buildFtsQuery,
bm25RankToScore
}).then((rows) => ({ rows })).catch((error) => ({
rows: [],
error: formatErrorMessage(error)
})),
...indexState ? { indexState } : {}
};
} finally {
opened.database.close();
}
});
//#endregion
export {};