openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
128 lines (127 loc) • 4.2 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js";
import { h as formatErrorMessage } from "./memory-schema-CqyUjI_b.js";
import { createRequire } from "node:module";
//#region packages/memory-host-sdk/src/host/sqlite-vec-platform-variant.ts
const PLATFORM_VARIANTS = {
"linux-x64": {
pkg: "sqlite-vec-linux-x64",
file: "vec0.so"
},
"linux-arm64": {
pkg: "sqlite-vec-linux-arm64",
file: "vec0.so"
},
"darwin-x64": {
pkg: "sqlite-vec-darwin-x64",
file: "vec0.dylib"
},
"darwin-arm64": {
pkg: "sqlite-vec-darwin-arm64",
file: "vec0.dylib"
},
"win32-x64": {
pkg: "sqlite-vec-windows-x64",
file: "vec0.dll"
}
};
/** Resolve the installed sqlite-vec native extension for the current platform if present. */
function resolveSqliteVecPlatformVariant() {
const entry = PLATFORM_VARIANTS[`${process.platform}-${process.arch}`];
if (!entry) return;
try {
const extensionPath = createRequire(import.meta.url).resolve(`${entry.pkg}/${entry.file}`);
return {
pkg: entry.pkg,
extensionPath
};
} catch {
return;
}
}
//#endregion
//#region packages/memory-host-sdk/src/host/sqlite-vec.ts
const SQLITE_VEC_MODULE_ID = "sqlite-vec";
const SQLITE_VEC_CONFIG_HINT = "Set memory.search.store.vector.extensionPath, or an agent-specific memory.search.store.vector.extensionPath, to a sqlite-vec loadable extension path.";
async function loadSqliteVecModule() {
return import(SQLITE_VEC_MODULE_ID);
}
function isMissingSqliteVecPackageError(err) {
const message = formatErrorMessage(err);
const code = err && typeof err === "object" && "code" in err ? err.code : void 0;
return /Cannot find (?:package|module) ['"]sqlite-vec['"]/u.test(message) && (code === void 0 || code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND");
}
function assertSqliteVecAvailable(db, source) {
try {
const row = db.prepare("SELECT vec_version() AS version").get();
if (typeof row?.version !== "string" || row.version.trim().length === 0) throw new Error("vec_version() did not return a version");
} catch (err) {
throw new Error(`sqlite-vec health check failed after loading ${source}`, { cause: err });
}
}
function loadExtensionAndVerify(db, extensionPath) {
if (!db.isOpen) throw new Error("SQLite database is closed; reacquire before loading sqlite-vec");
db.enableLoadExtension(true);
try {
db.loadExtension(extensionPath);
assertSqliteVecAvailable(db, extensionPath);
} finally {
db.enableLoadExtension(false);
}
}
async function loadSqliteVecExtension(params) {
try {
const resolvedPath = normalizeOptionalString(params.extensionPath);
if (resolvedPath) {
loadExtensionAndVerify(params.db, resolvedPath);
return {
ok: true,
extensionPath: resolvedPath
};
}
try {
const extensionPath = (await loadSqliteVecModule()).getLoadablePath();
loadExtensionAndVerify(params.db, extensionPath);
return {
ok: true,
extensionPath
};
} catch (err) {
const variant = resolveSqliteVecPlatformVariant();
if (!variant) {
if (!isMissingSqliteVecPackageError(err)) throw err;
const message = formatErrorMessage(err);
return {
ok: false,
error: `sqlite-vec package is not installed. ${SQLITE_VEC_CONFIG_HINT} Original error: ${message}`
};
}
try {
loadExtensionAndVerify(params.db, variant.extensionPath);
return {
ok: true,
extensionPath: variant.extensionPath
};
} catch (variantErr) {
const message = formatErrorMessage(variantErr);
if (!isMissingSqliteVecPackageError(err)) {
const packageMessage = formatErrorMessage(err);
return {
ok: false,
error: `sqlite-vec package failed to load, and platform variant ${variant.pkg} failed to load from ${variant.extensionPath}. ${SQLITE_VEC_CONFIG_HINT} Package error: ${packageMessage}. Variant error: ${message}`
};
}
return {
ok: false,
error: `sqlite-vec platform variant ${variant.pkg} failed to load from ${variant.extensionPath}. ${SQLITE_VEC_CONFIG_HINT} Original error: ${message}`
};
}
}
} catch (err) {
return {
ok: false,
error: formatErrorMessage(err)
};
}
}
//#endregion
export { loadSqliteVecExtension as t };