@jcode.labs/ragmir 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-log.d.ts.map +1 -1
- package/dist/access-log.js +65 -8
- package/dist/access-log.js.map +1 -1
- package/dist/chunking.d.ts.map +1 -1
- package/dist/chunking.js +29 -3
- package/dist/chunking.js.map +1 -1
- package/dist/cli.js +81 -21
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +73 -29
- package/dist/config.js.map +1 -1
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +6 -1
- package/dist/defaults.js.map +1 -1
- package/dist/destroy.d.ts.map +1 -1
- package/dist/destroy.js +23 -1
- package/dist/destroy.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +40 -9
- package/dist/doctor.js.map +1 -1
- package/dist/embeddings.d.ts +4 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +62 -14
- package/dist/embeddings.js.map +1 -1
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +48 -4
- package/dist/evaluate.js.map +1 -1
- package/dist/files.d.ts +8 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +44 -8
- package/dist/files.js.map +1 -1
- package/dist/index-diagnostics.d.ts +1 -1
- package/dist/index-diagnostics.d.ts.map +1 -1
- package/dist/index-diagnostics.js +8 -3
- package/dist/index-diagnostics.js.map +1 -1
- package/dist/index-policy.d.ts +3 -0
- package/dist/index-policy.d.ts.map +1 -0
- package/dist/index-policy.js +28 -0
- package/dist/index-policy.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +112 -54
- package/dist/ingest.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +15 -3
- package/dist/init.js.map +1 -1
- package/dist/limits.d.ts +9 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +25 -0
- package/dist/limits.js.map +1 -0
- package/dist/mcp.d.ts +3 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +71 -14
- package/dist/mcp.js.map +1 -1
- package/dist/parsing.d.ts.map +1 -1
- package/dist/parsing.js +124 -24
- package/dist/parsing.js.map +1 -1
- package/dist/permissions.d.ts +3 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +13 -0
- package/dist/permissions.js.map +1 -0
- package/dist/query.d.ts +2 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +198 -39
- package/dist/query.js.map +1 -1
- package/dist/research.d.ts.map +1 -1
- package/dist/research.js +33 -4
- package/dist/research.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +110 -14
- package/dist/security.js.map +1 -1
- package/dist/store.d.ts +3 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +71 -72
- package/dist/store.js.map +1 -1
- package/dist/text.d.ts.map +1 -1
- package/dist/text.js +13 -1
- package/dist/text.js.map +1 -1
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/examples/document-evidence-benchmark/.ragmir/config.json +2 -1
- package/examples/document-evidence-benchmark/README.md +5 -2
- package/examples/document-evidence-benchmark/golden-queries.json +6 -0
- package/examples/document-evidence-benchmark/raw/contracts/pdf-control-evidence.pdf +32 -0
- package/examples/sovereign-rag-demo/.ragmir/config.json +2 -1
- package/examples/sovereign-rag-demo/README.md +9 -1
- package/package.json +3 -3
- package/skills/ragmir/SKILL.md +11 -3
package/dist/security.js
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
1
2
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { readFile, stat } from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
4
|
-
import { loadConfig } from "./config.js";
|
|
5
|
-
import { LEGACY_KB_DIR, LEGACY_KB_GITIGNORE_ENTRY, LEGACY_PRIVATE_DIR, LEGACY_PRIVATE_GITIGNORE_ENTRY,
|
|
5
|
+
import { findProjectConfig, loadConfig } from "./config.js";
|
|
6
|
+
import { LEGACY_KB_DIR, LEGACY_KB_GITIGNORE_ENTRY, LEGACY_PRIVATE_DIR, LEGACY_PRIVATE_GITIGNORE_ENTRY, RAGMIR_GITIGNORE_ENTRY, } from "./defaults.js";
|
|
6
7
|
export async function securityAudit(cwd = process.cwd()) {
|
|
7
8
|
const config = await loadConfig(cwd);
|
|
8
9
|
const gitignore = await readGitignore(config.projectRoot);
|
|
9
10
|
const warnings = [];
|
|
10
|
-
const legacyKbIgnored = hasGitignoreEntry(gitignore, LEGACY_KB_GITIGNORE_ENTRY);
|
|
11
|
-
const ragmirIgnored = hasGitignoreEntry(gitignore, RAGMIR_GITIGNORE_ENTRY);
|
|
12
|
-
const legacyPrivateIgnored = hasGitignoreEntry(gitignore, LEGACY_PRIVATE_GITIGNORE_ENTRY) ||
|
|
13
|
-
hasGitignoreEntry(gitignore, LEGACY_PRIVATE_GITIGNORE_FALLBACK_ENTRY);
|
|
14
11
|
const usesLegacyKb = [config.storageDir, config.sourcesFile, config.accessLogPath].some((filePath) => usesProjectDirectory(config.projectRoot, filePath, LEGACY_KB_DIR));
|
|
15
12
|
const usesLegacyPrivate = usesProjectDirectory(config.projectRoot, config.rawDir, LEGACY_PRIVATE_DIR);
|
|
16
|
-
const storageGitIgnored =
|
|
17
|
-
|
|
13
|
+
const [legacyKbIgnored, ragmirIgnored, legacyPrivateIgnored, storageGitIgnored, accessLogGitIgnored,] = await Promise.all([
|
|
14
|
+
isPathIgnored(config.projectRoot, path.join(config.projectRoot, LEGACY_KB_GITIGNORE_ENTRY), gitignore),
|
|
15
|
+
isPathIgnored(config.projectRoot, path.join(config.projectRoot, RAGMIR_GITIGNORE_ENTRY), gitignore),
|
|
16
|
+
isPathIgnored(config.projectRoot, path.join(config.projectRoot, LEGACY_PRIVATE_GITIGNORE_ENTRY), gitignore),
|
|
17
|
+
isPathIgnored(config.projectRoot, config.storageDir, gitignore),
|
|
18
|
+
isPathIgnored(config.projectRoot, config.accessLogPath, gitignore),
|
|
19
|
+
]);
|
|
20
|
+
const permissions = await inspectPermissions({
|
|
21
|
+
configPath: findProjectConfig(cwd).configPath,
|
|
22
|
+
rawDir: config.rawDir,
|
|
23
|
+
storageDir: config.storageDir,
|
|
24
|
+
accessLogPath: config.accessLogPath,
|
|
25
|
+
});
|
|
26
|
+
if (config.privacyProfile !== "trusted" &&
|
|
27
|
+
config.embeddingProvider === "transformers" &&
|
|
28
|
+
config.transformersAllowRemoteModels) {
|
|
18
29
|
warnings.push("Transformers remote model loading is enabled; model files can be downloaded from Hugging Face.");
|
|
19
30
|
}
|
|
20
|
-
if (!config.redaction.enabled) {
|
|
31
|
+
if (config.privacyProfile !== "trusted" && !config.redaction.enabled) {
|
|
21
32
|
warnings.push("Redaction is disabled; secrets and identifiers may be embedded in the index.");
|
|
22
33
|
}
|
|
23
34
|
if (!ragmirIgnored) {
|
|
@@ -29,12 +40,27 @@ export async function securityAudit(cwd = process.cwd()) {
|
|
|
29
40
|
if (usesLegacyPrivate && !legacyPrivateIgnored) {
|
|
30
41
|
warnings.push(`${LEGACY_PRIVATE_GITIGNORE_ENTRY} is not ignored by Git.`);
|
|
31
42
|
}
|
|
43
|
+
if (!storageGitIgnored) {
|
|
44
|
+
warnings.push("The configured storageDir is not ignored by Git.");
|
|
45
|
+
}
|
|
46
|
+
if (config.accessLog && !accessLogGitIgnored) {
|
|
47
|
+
warnings.push("The configured accessLogPath is not ignored by Git.");
|
|
48
|
+
}
|
|
49
|
+
addPermissionWarning(warnings, permissions.configPrivate, "Ragmir config file");
|
|
50
|
+
addPermissionWarning(warnings, permissions.rawDirPrivate, "raw document directory");
|
|
51
|
+
addPermissionWarning(warnings, permissions.storageDirPrivate, "index storage directory");
|
|
52
|
+
if (config.accessLog) {
|
|
53
|
+
addPermissionWarning(warnings, permissions.accessLogPrivate, "access log");
|
|
54
|
+
}
|
|
32
55
|
return {
|
|
33
56
|
projectRoot: config.projectRoot,
|
|
34
57
|
zeroTelemetry: true,
|
|
58
|
+
privacyProfile: config.privacyProfile,
|
|
59
|
+
retrievalProfile: config.retrievalProfile,
|
|
35
60
|
providers: {
|
|
36
61
|
embedding: config.embeddingProvider,
|
|
37
62
|
embeddingModel: config.embeddingModel,
|
|
63
|
+
embeddingModelRevision: config.embeddingModelRevision,
|
|
38
64
|
embeddingModelPath: config.embeddingModelPath,
|
|
39
65
|
transformersAllowRemoteModels: config.transformersAllowRemoteModels,
|
|
40
66
|
llmGeneration: false,
|
|
@@ -54,6 +80,7 @@ export async function securityAudit(cwd = process.cwd()) {
|
|
|
54
80
|
gitIgnored: storageGitIgnored,
|
|
55
81
|
encryptedAtRest: "external-required",
|
|
56
82
|
},
|
|
83
|
+
permissions,
|
|
57
84
|
mcp: {
|
|
58
85
|
maxTopK: config.mcpMaxTopK,
|
|
59
86
|
destructiveToolsExposed: false,
|
|
@@ -72,6 +99,50 @@ export async function securityAudit(cwd = process.cwd()) {
|
|
|
72
99
|
warnings,
|
|
73
100
|
};
|
|
74
101
|
}
|
|
102
|
+
async function inspectPermissions(paths) {
|
|
103
|
+
if (process.platform === "win32") {
|
|
104
|
+
return {
|
|
105
|
+
checked: false,
|
|
106
|
+
configPrivate: null,
|
|
107
|
+
rawDirPrivate: null,
|
|
108
|
+
storageDirPrivate: null,
|
|
109
|
+
accessLogPrivate: null,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const [configPrivate, rawDirPrivate, storageDirPrivate, accessLogPrivate] = await Promise.all([
|
|
113
|
+
isPrivatePath(paths.configPath),
|
|
114
|
+
isPrivatePath(paths.rawDir),
|
|
115
|
+
isPrivatePath(paths.storageDir),
|
|
116
|
+
isPrivatePath(paths.accessLogPath),
|
|
117
|
+
]);
|
|
118
|
+
return {
|
|
119
|
+
checked: true,
|
|
120
|
+
configPrivate,
|
|
121
|
+
rawDirPrivate,
|
|
122
|
+
storageDirPrivate,
|
|
123
|
+
accessLogPrivate,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function isPrivatePath(filePath) {
|
|
127
|
+
try {
|
|
128
|
+
const mode = (await stat(filePath)).mode & 0o777;
|
|
129
|
+
return (mode & 0o077) === 0;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function addPermissionWarning(warnings, privatePath, label) {
|
|
139
|
+
if (privatePath === false) {
|
|
140
|
+
warnings.push(`The ${label} is readable or writable by group/other users; restrict it to owner-only permissions or run \`rgr doctor --fix\` for Ragmir-owned default paths.`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function isNodeError(error) {
|
|
144
|
+
return error instanceof Error && "code" in error;
|
|
145
|
+
}
|
|
75
146
|
async function readGitignore(projectRoot) {
|
|
76
147
|
const gitignorePath = path.join(projectRoot, ".gitignore");
|
|
77
148
|
if (!existsSync(gitignorePath)) {
|
|
@@ -82,15 +153,37 @@ async function readGitignore(projectRoot) {
|
|
|
82
153
|
.map((line) => line.trim())
|
|
83
154
|
.filter(Boolean));
|
|
84
155
|
}
|
|
85
|
-
function hasGitignoreEntry(lines, entry) {
|
|
86
|
-
return lines.has(entry);
|
|
87
|
-
}
|
|
88
156
|
function usesProjectDirectory(projectRoot, filePath, directory) {
|
|
89
157
|
const relativePath = normalizeRelativePath(projectRoot, filePath);
|
|
90
158
|
return relativePath === directory || relativePath.startsWith(`${directory}/`);
|
|
91
159
|
}
|
|
92
|
-
function isPathIgnored(projectRoot, filePath, lines) {
|
|
160
|
+
async function isPathIgnored(projectRoot, filePath, lines) {
|
|
93
161
|
const relativePath = normalizeRelativePath(projectRoot, filePath);
|
|
162
|
+
if (isOutsideProject(relativePath)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const gitResult = await checkGitIgnored(projectRoot, relativePath);
|
|
166
|
+
if (gitResult !== null) {
|
|
167
|
+
return gitResult;
|
|
168
|
+
}
|
|
169
|
+
return isPathIgnoredByEntries(relativePath, lines);
|
|
170
|
+
}
|
|
171
|
+
function checkGitIgnored(projectRoot, relativePath) {
|
|
172
|
+
return new Promise((resolve) => {
|
|
173
|
+
execFile("git", ["check-ignore", "--quiet", "--", relativePath], { cwd: projectRoot, windowsHide: true }, (error) => {
|
|
174
|
+
if (!error) {
|
|
175
|
+
resolve(true);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (error.code === 1) {
|
|
179
|
+
resolve(false);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
resolve(null);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
function isPathIgnoredByEntries(relativePath, lines) {
|
|
94
187
|
const segments = relativePath.split("/");
|
|
95
188
|
for (let index = 1; index <= segments.length; index += 1) {
|
|
96
189
|
const prefix = segments.slice(0, index).join("/");
|
|
@@ -100,6 +193,9 @@ function isPathIgnored(projectRoot, filePath, lines) {
|
|
|
100
193
|
}
|
|
101
194
|
return false;
|
|
102
195
|
}
|
|
196
|
+
function isOutsideProject(relativePath) {
|
|
197
|
+
return relativePath === ".." || relativePath.startsWith("../") || path.isAbsolute(relativePath);
|
|
198
|
+
}
|
|
103
199
|
function normalizeRelativePath(projectRoot, filePath) {
|
|
104
200
|
return path.relative(projectRoot, filePath).split(path.sep).join("/");
|
|
105
201
|
}
|
package/dist/security.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -3,12 +3,15 @@ import type { Config, IndexManifest, VectorRow } from "./types.js";
|
|
|
3
3
|
export interface EmptyTextFileRecord {
|
|
4
4
|
relativePath: string;
|
|
5
5
|
checksum: string;
|
|
6
|
+
bytes?: number;
|
|
7
|
+
mtimeMs?: number;
|
|
6
8
|
}
|
|
7
9
|
export interface IndexWriteResult {
|
|
8
10
|
vectorIndexWarning: string | null;
|
|
9
11
|
lexicalIndexWarning: string | null;
|
|
10
12
|
}
|
|
11
13
|
export declare function writeRows(rows: VectorRow[], config: Config): Promise<IndexWriteResult>;
|
|
14
|
+
export declare function updateRows(rows: VectorRow[], replacePaths: string[], config: Config): Promise<IndexWriteResult>;
|
|
12
15
|
export declare function writeIndexManifest(manifest: IndexManifest, config: Config): Promise<void>;
|
|
13
16
|
export declare function readIndexManifest(config: Config): Promise<IndexManifest | null>;
|
|
14
17
|
export declare function writeEmptyTextFiles(records: EmptyTextFileRecord[], config: Config): Promise<void>;
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAI3C,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAIlE,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;CACnC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuB5F;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EAAE,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CAiB3B;AA4BD,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAqBrF;AAmCD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAevF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAQjF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAMnE;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/D"}
|
package/dist/store.js
CHANGED
|
@@ -1,85 +1,46 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile, rm, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import * as lancedb from "@lancedb/lancedb";
|
|
4
|
-
import {
|
|
4
|
+
import { INDEX_MANIFEST_FILENAME } from "./defaults.js";
|
|
5
5
|
import { isRecord } from "./guards.js";
|
|
6
|
+
import { ensurePrivateDirectory, hardenPrivateFile } from "./permissions.js";
|
|
6
7
|
const EMPTY_TEXT_FILES_MANIFEST = "empty-text-files.json";
|
|
7
|
-
const INDEX_MANIFEST = "index-manifest.json";
|
|
8
|
-
/**
|
|
9
|
-
* LanceDB requires a minimum number of rows to train an IVF_PQ vector index.
|
|
10
|
-
* Below this threshold, brute-force (flat) scan is used instead, which is
|
|
11
|
-
* optimal for small corpora and avoids wasted index-training work.
|
|
12
|
-
*/
|
|
13
|
-
const MIN_INDEX_ROWS = 256;
|
|
14
|
-
/**
|
|
15
|
-
* IVF partition count heuristic: roughly sqrt(row_count), bounded to keep both
|
|
16
|
-
* small corpora (too many empty partitions) and very large corpora (training
|
|
17
|
-
* cost) well-behaved. See LanceDB production guidance.
|
|
18
|
-
*/
|
|
19
|
-
const MIN_IVF_PARTITIONS = 8;
|
|
20
|
-
const MAX_IVF_PARTITIONS = 1024;
|
|
21
8
|
export async function writeRows(rows, config) {
|
|
22
|
-
await
|
|
9
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
23
10
|
const db = await lancedb.connect(config.storageDir);
|
|
24
11
|
if (rows.length === 0) {
|
|
25
12
|
const tableNames = await db.tableNames();
|
|
26
13
|
if (tableNames.includes(config.tableName)) {
|
|
27
14
|
await db.dropTable(config.tableName);
|
|
28
15
|
}
|
|
29
|
-
await rm(path.join(config.storageDir,
|
|
16
|
+
await rm(path.join(config.storageDir, INDEX_MANIFEST_FILENAME), { force: true });
|
|
30
17
|
return { vectorIndexWarning: null, lexicalIndexWarning: null };
|
|
31
18
|
}
|
|
32
|
-
const records = rows
|
|
19
|
+
const records = storedRows(rows);
|
|
33
20
|
const table = await db.createTable(config.tableName, records, {
|
|
34
21
|
mode: "overwrite",
|
|
35
22
|
});
|
|
36
|
-
// Train an IVF_PQ vector index once the corpus is large enough to benefit
|
|
37
|
-
// from approximate nearest-neighbour search. Below the threshold, LanceDB
|
|
38
|
-
// falls back to an exact flat scan, which is faster for small corpora and
|
|
39
|
-
// avoids wasting work training an index on too few vectors.
|
|
40
|
-
if (rows.length < MIN_INDEX_ROWS) {
|
|
41
|
-
const lexicalResult = await ensureLexicalIndex(table);
|
|
42
|
-
return { vectorIndexWarning: null, lexicalIndexWarning: lexicalResult.warning };
|
|
43
|
-
}
|
|
44
|
-
const vectorResult = await ensureVectorIndex(table, rows.length);
|
|
45
23
|
const lexicalResult = await ensureLexicalIndex(table);
|
|
46
24
|
return {
|
|
47
|
-
vectorIndexWarning:
|
|
25
|
+
vectorIndexWarning: null,
|
|
48
26
|
lexicalIndexWarning: lexicalResult.warning,
|
|
49
27
|
};
|
|
50
28
|
}
|
|
51
|
-
async function
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return { created: false, warning: null };
|
|
29
|
+
export async function updateRows(rows, replacePaths, config) {
|
|
30
|
+
const table = await openRowsTable(config);
|
|
31
|
+
if (!table) {
|
|
32
|
+
return writeRows(rows, config);
|
|
56
33
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const numSubVectors = 16;
|
|
62
|
-
const numPartitions = clampIvfPartitions(Math.round(Math.sqrt(rowCount)));
|
|
63
|
-
try {
|
|
64
|
-
await table.createIndex("vector", {
|
|
65
|
-
config: lancedb.Index.ivfPq({
|
|
66
|
-
numPartitions,
|
|
67
|
-
numSubVectors,
|
|
68
|
-
distanceType: VECTOR_DISTANCE_METRIC,
|
|
69
|
-
}),
|
|
70
|
-
});
|
|
71
|
-
return { created: true, warning: null };
|
|
34
|
+
for (const paths of batches([...new Set(replacePaths)], 200)) {
|
|
35
|
+
if (paths.length > 0) {
|
|
36
|
+
await table.delete(`relativePath IN (${paths.map(sqlString).join(", ")})`);
|
|
37
|
+
}
|
|
72
38
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
// corpora; the table remains usable via flat scan, but the operator
|
|
76
|
-
// deserves to know queries will be slower than expected.
|
|
77
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
78
|
-
return {
|
|
79
|
-
created: false,
|
|
80
|
-
warning: `Vector index training failed (${detail}). Falling back to flat scan; queries will be slower on large corpora.`,
|
|
81
|
-
};
|
|
39
|
+
if (rows.length > 0) {
|
|
40
|
+
await table.add(storedRows(rows));
|
|
82
41
|
}
|
|
42
|
+
const lexicalResult = await ensureLexicalIndex(table);
|
|
43
|
+
return { vectorIndexWarning: null, lexicalIndexWarning: lexicalResult.warning };
|
|
83
44
|
}
|
|
84
45
|
async function ensureLexicalIndex(table) {
|
|
85
46
|
const existing = await table.listIndices();
|
|
@@ -89,7 +50,7 @@ async function ensureLexicalIndex(table) {
|
|
|
89
50
|
}
|
|
90
51
|
try {
|
|
91
52
|
await table.createIndex("text", {
|
|
92
|
-
config: lancedb.Index.fts(),
|
|
53
|
+
config: lancedb.Index.fts({ asciiFolding: true, lowercase: true }),
|
|
93
54
|
});
|
|
94
55
|
return { created: true, warning: null };
|
|
95
56
|
}
|
|
@@ -101,17 +62,15 @@ async function ensureLexicalIndex(table) {
|
|
|
101
62
|
};
|
|
102
63
|
}
|
|
103
64
|
}
|
|
104
|
-
function clampIvfPartitions(value) {
|
|
105
|
-
return Math.min(MAX_IVF_PARTITIONS, Math.max(MIN_IVF_PARTITIONS, value));
|
|
106
|
-
}
|
|
107
65
|
export async function writeIndexManifest(manifest, config) {
|
|
108
|
-
await
|
|
109
|
-
const manifestPath = path.join(config.storageDir,
|
|
66
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
67
|
+
const manifestPath = path.join(config.storageDir, INDEX_MANIFEST_FILENAME);
|
|
110
68
|
await writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
|
|
69
|
+
await hardenPrivateFile(manifestPath);
|
|
111
70
|
}
|
|
112
71
|
export async function readIndexManifest(config) {
|
|
113
72
|
try {
|
|
114
|
-
const raw = JSON.parse(await readFile(path.join(config.storageDir,
|
|
73
|
+
const raw = JSON.parse(await readFile(path.join(config.storageDir, INDEX_MANIFEST_FILENAME), "utf8"));
|
|
115
74
|
if (!isRecord(raw)) {
|
|
116
75
|
return null;
|
|
117
76
|
}
|
|
@@ -139,12 +98,23 @@ function isIndexManifest(value) {
|
|
|
139
98
|
typeof value.ragmirVersion === "string" &&
|
|
140
99
|
(value.embeddingProvider === "local-hash" || value.embeddingProvider === "transformers") &&
|
|
141
100
|
typeof value.embeddingModel === "string" &&
|
|
101
|
+
(!("indexPolicyFingerprint" in value) || typeof value.indexPolicyFingerprint === "string") &&
|
|
142
102
|
(!("vectorDimension" in value) || typeof value.vectorDimension === "number") &&
|
|
143
103
|
(!("vectorDistanceMetric" in value) || typeof value.vectorDistanceMetric === "string") &&
|
|
144
104
|
typeof value.chunkSize === "number" &&
|
|
145
105
|
typeof value.chunkOverlap === "number" &&
|
|
146
106
|
typeof value.fileCount === "number" &&
|
|
147
|
-
typeof value.chunkCount === "number"
|
|
107
|
+
typeof value.chunkCount === "number" &&
|
|
108
|
+
(!("indexedFiles" in value) ||
|
|
109
|
+
(Array.isArray(value.indexedFiles) && value.indexedFiles.every(isIndexManifestFile))));
|
|
110
|
+
}
|
|
111
|
+
function isIndexManifestFile(value) {
|
|
112
|
+
return (isRecord(value) &&
|
|
113
|
+
typeof value.relativePath === "string" &&
|
|
114
|
+
typeof value.checksum === "string" &&
|
|
115
|
+
typeof value.chunkCount === "number" &&
|
|
116
|
+
(!("bytes" in value) || typeof value.bytes === "number") &&
|
|
117
|
+
(!("mtimeMs" in value) || typeof value.mtimeMs === "number"));
|
|
148
118
|
}
|
|
149
119
|
export async function writeEmptyTextFiles(records, config) {
|
|
150
120
|
const manifestPath = path.join(config.storageDir, EMPTY_TEXT_FILES_MANIFEST);
|
|
@@ -152,9 +122,10 @@ export async function writeEmptyTextFiles(records, config) {
|
|
|
152
122
|
await rm(manifestPath, { force: true });
|
|
153
123
|
return;
|
|
154
124
|
}
|
|
155
|
-
await
|
|
125
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
156
126
|
const sortedRecords = [...records].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
157
127
|
await writeFile(manifestPath, JSON.stringify({ version: 1, files: sortedRecords }, null, 2), "utf8");
|
|
128
|
+
await hardenPrivateFile(manifestPath);
|
|
158
129
|
}
|
|
159
130
|
export async function readEmptyTextFiles(config) {
|
|
160
131
|
try {
|
|
@@ -172,6 +143,7 @@ export async function readEmptyTextFiles(config) {
|
|
|
172
143
|
}
|
|
173
144
|
}
|
|
174
145
|
export async function openRowsTable(config) {
|
|
146
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
175
147
|
const db = await lancedb.connect(config.storageDir);
|
|
176
148
|
const tableNames = await db.tableNames();
|
|
177
149
|
if (!tableNames.includes(config.tableName)) {
|
|
@@ -184,15 +156,38 @@ export async function readRows(config) {
|
|
|
184
156
|
if (!table) {
|
|
185
157
|
return [];
|
|
186
158
|
}
|
|
187
|
-
return (await table.query().toArray()).map(
|
|
188
|
-
...row,
|
|
189
|
-
vector: normalizeVector(row.vector),
|
|
190
|
-
}));
|
|
159
|
+
return (await table.query().toArray()).map(vectorRowFromStored);
|
|
191
160
|
}
|
|
192
161
|
export async function countRows(config) {
|
|
193
162
|
const table = await openRowsTable(config);
|
|
194
163
|
return table ? table.countRows() : 0;
|
|
195
164
|
}
|
|
165
|
+
function storedRows(rows) {
|
|
166
|
+
return rows.map((row) => ({
|
|
167
|
+
...row,
|
|
168
|
+
pageStart: row.pageStart ?? 0,
|
|
169
|
+
pageEnd: row.pageEnd ?? 0,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
function vectorRowFromStored(row) {
|
|
173
|
+
const { pageStart, pageEnd, ...rest } = row;
|
|
174
|
+
return {
|
|
175
|
+
...rest,
|
|
176
|
+
vector: normalizeVector(row.vector),
|
|
177
|
+
...(typeof pageStart === "number" && pageStart > 0 ? { pageStart } : {}),
|
|
178
|
+
...(typeof pageEnd === "number" && pageEnd > 0 ? { pageEnd } : {}),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function sqlString(value) {
|
|
182
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
183
|
+
}
|
|
184
|
+
function batches(values, size) {
|
|
185
|
+
const result = [];
|
|
186
|
+
for (let index = 0; index < values.length; index += size) {
|
|
187
|
+
result.push(values.slice(index, index + size));
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
196
191
|
function normalizeVector(vector) {
|
|
197
192
|
if (Array.isArray(vector) && vector.every((value) => typeof value === "number")) {
|
|
198
193
|
return vector;
|
|
@@ -214,7 +209,11 @@ function hasIndexedNumberGetter(value) {
|
|
|
214
209
|
typeof value.get === "function");
|
|
215
210
|
}
|
|
216
211
|
function isEmptyTextFileRecord(value) {
|
|
217
|
-
return (isRecord(value) &&
|
|
212
|
+
return (isRecord(value) &&
|
|
213
|
+
typeof value.relativePath === "string" &&
|
|
214
|
+
typeof value.checksum === "string" &&
|
|
215
|
+
(!("bytes" in value) || typeof value.bytes === "number") &&
|
|
216
|
+
(!("mtimeMs" in value) || typeof value.mtimeMs === "number"));
|
|
218
217
|
}
|
|
219
218
|
function isNodeError(error) {
|
|
220
219
|
return error instanceof Error && "code" in error;
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB/C"}
|
package/dist/text.js
CHANGED
|
@@ -5,6 +5,18 @@ export function normalizeForMatch(text) {
|
|
|
5
5
|
.replace(/\p{Diacritic}/gu, "");
|
|
6
6
|
}
|
|
7
7
|
export function tokenize(text) {
|
|
8
|
-
|
|
8
|
+
const normalized = normalizeForMatch(text);
|
|
9
|
+
const tokens = [];
|
|
10
|
+
const segmenter = new Intl.Segmenter("und", { granularity: "word" });
|
|
11
|
+
for (const segment of segmenter.segment(normalized)) {
|
|
12
|
+
if (!segment.isWordLike) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const token = segment.segment;
|
|
16
|
+
if (token.length >= 2 || /[^\p{Script=Latin}\p{N}]/u.test(token)) {
|
|
17
|
+
tokens.push(token);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return tokens;
|
|
9
21
|
}
|
|
10
22
|
//# sourceMappingURL=text.js.map
|
package/dist/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAA;IAEpE,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAA;QAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|