Project Files
vectorStore.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getIndex = getIndex;
exports.ensureIndex = ensureIndex;
exports.insertChunks = insertChunks;
exports.queryChunks = queryChunks;
exports.deleteBySource = deleteBySource;
exports.listSources = listSources;
exports.indexStats = indexStats;
const vectra_1 = require("vectra");
const path_1 = require("path");
const promises_1 = require("fs/promises");
const _indexes = new Map();
function getIndex(dataPath, collection) {
const key = `${dataPath}::${collection}`;
let idx = _indexes.get(key);
if (!idx) {
idx = new vectra_1.LocalIndex((0, path_1.join)(dataPath, collection));
_indexes.set(key, idx);
}
return idx;
}
async function ensureIndex(idx) {
await (0, promises_1.mkdir)(idx.folderPath, { recursive: true });
if (!(await idx.isIndexCreated())) {
await idx.createIndex({ version: 1 });
}
}
async function insertChunks(idx, chunks) {
await ensureIndex(idx);
await idx.batchInsertItems(chunks.map(c => ({ vector: c.vector, metadata: c.metadata })));
}
async function queryChunks(idx, vector, topK) {
await ensureIndex(idx);
const results = await idx.queryItems(vector, "", topK);
return results.map(r => ({ score: r.score, metadata: r.item.metadata }));
}
async function deleteBySource(idx, sourcePath) {
await ensureIndex(idx);
const items = await idx.listItemsByMetadata({ source: { $eq: sourcePath } });
if (items.length === 0)
return 0;
await idx.deleteItems(items.map(i => i.id));
return items.length;
}
async function listSources(idx) {
await ensureIndex(idx);
const items = await idx.listItems();
const map = new Map();
for (const item of items) {
const { source, fileName, ingestedAt } = item.metadata;
const existing = map.get(source);
if (!existing) {
map.set(source, { fileName, chunks: 1, ingestedAt });
}
else {
existing.chunks++;
}
}
return Array.from(map.entries())
.map(([source, v]) => ({ source, ...v }))
.sort((a, b) => a.source.localeCompare(b.source));
}
async function indexStats(idx) {
await ensureIndex(idx);
const items = await idx.listItems();
const sources = new Set(items.map(i => i.metadata.source));
return { documents: sources.size, chunks: items.length };
}