@jcode.labs/ragmir 2.6.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/README.md +4 -2
- 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 +77 -7
- package/dist/chunking.js.map +1 -1
- package/dist/cli-options.d.ts +2 -0
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +8 -0
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +106 -29
- 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 +2 -0
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +7 -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 +89 -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 +14 -4
- 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 +119 -53
- 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 +4 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +84 -18
- 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-sanitizer.d.ts +8 -0
- package/dist/query-sanitizer.d.ts.map +1 -0
- package/dist/query-sanitizer.js +170 -0
- package/dist/query-sanitizer.js.map +1 -0
- package/dist/query.d.ts +2 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +285 -29
- package/dist/query.js.map +1 -1
- package/dist/research.d.ts.map +1 -1
- package/dist/research.js +42 -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 +4 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +86 -55
- 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 +131 -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 +22 -0
- package/examples/document-evidence-benchmark/README.md +36 -0
- package/examples/document-evidence-benchmark/golden-queries.json +41 -0
- package/examples/document-evidence-benchmark/raw/contracts/master-services-agreement.md +11 -0
- package/examples/document-evidence-benchmark/raw/contracts/pdf-control-evidence.pdf +32 -0
- package/examples/document-evidence-benchmark/raw/legal-tax/residency-review-note.md +10 -0
- package/examples/document-evidence-benchmark/raw/rfp/security-questionnaire.md +12 -0
- package/examples/document-evidence-benchmark/raw/runbooks/incident-response-runbook.md +11 -0
- package/examples/document-evidence-benchmark/raw/specs/agent-integration-spec.md +11 -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,11 +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;
|
|
11
|
+
lexicalIndexWarning: string | null;
|
|
9
12
|
}
|
|
10
13
|
export declare function writeRows(rows: VectorRow[], config: Config): Promise<IndexWriteResult>;
|
|
14
|
+
export declare function updateRows(rows: VectorRow[], replacePaths: string[], config: Config): Promise<IndexWriteResult>;
|
|
11
15
|
export declare function writeIndexManifest(manifest: IndexManifest, config: Config): Promise<void>;
|
|
12
16
|
export declare function readIndexManifest(config: Config): Promise<IndexManifest | null>;
|
|
13
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,87 +1,76 @@
|
|
|
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 { INDEX_MANIFEST_FILENAME } from "./defaults.js";
|
|
4
5
|
import { isRecord } from "./guards.js";
|
|
6
|
+
import { ensurePrivateDirectory, hardenPrivateFile } from "./permissions.js";
|
|
5
7
|
const EMPTY_TEXT_FILES_MANIFEST = "empty-text-files.json";
|
|
6
|
-
const INDEX_MANIFEST = "index-manifest.json";
|
|
7
|
-
/**
|
|
8
|
-
* LanceDB requires a minimum number of rows to train an IVF_PQ vector index.
|
|
9
|
-
* Below this threshold, brute-force (flat) scan is used instead, which is
|
|
10
|
-
* optimal for small corpora and avoids wasted index-training work.
|
|
11
|
-
*/
|
|
12
|
-
const MIN_INDEX_ROWS = 256;
|
|
13
|
-
/**
|
|
14
|
-
* IVF partition count heuristic: roughly sqrt(row_count), bounded to keep both
|
|
15
|
-
* small corpora (too many empty partitions) and very large corpora (training
|
|
16
|
-
* cost) well-behaved. See LanceDB production guidance.
|
|
17
|
-
*/
|
|
18
|
-
const MIN_IVF_PARTITIONS = 8;
|
|
19
|
-
const MAX_IVF_PARTITIONS = 1024;
|
|
20
8
|
export async function writeRows(rows, config) {
|
|
21
|
-
await
|
|
9
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
22
10
|
const db = await lancedb.connect(config.storageDir);
|
|
23
11
|
if (rows.length === 0) {
|
|
24
12
|
const tableNames = await db.tableNames();
|
|
25
13
|
if (tableNames.includes(config.tableName)) {
|
|
26
14
|
await db.dropTable(config.tableName);
|
|
27
15
|
}
|
|
28
|
-
await rm(path.join(config.storageDir,
|
|
29
|
-
return { vectorIndexWarning: null };
|
|
16
|
+
await rm(path.join(config.storageDir, INDEX_MANIFEST_FILENAME), { force: true });
|
|
17
|
+
return { vectorIndexWarning: null, lexicalIndexWarning: null };
|
|
30
18
|
}
|
|
31
|
-
const records = rows
|
|
19
|
+
const records = storedRows(rows);
|
|
32
20
|
const table = await db.createTable(config.tableName, records, {
|
|
33
21
|
mode: "overwrite",
|
|
34
22
|
});
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
23
|
+
const lexicalResult = await ensureLexicalIndex(table);
|
|
24
|
+
return {
|
|
25
|
+
vectorIndexWarning: null,
|
|
26
|
+
lexicalIndexWarning: lexicalResult.warning,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function updateRows(rows, replacePaths, config) {
|
|
30
|
+
const table = await openRowsTable(config);
|
|
31
|
+
if (!table) {
|
|
32
|
+
return writeRows(rows, config);
|
|
33
|
+
}
|
|
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
|
+
}
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
if (rows.length > 0) {
|
|
40
|
+
await table.add(storedRows(rows));
|
|
41
|
+
}
|
|
42
|
+
const lexicalResult = await ensureLexicalIndex(table);
|
|
43
|
+
return { vectorIndexWarning: null, lexicalIndexWarning: lexicalResult.warning };
|
|
44
44
|
}
|
|
45
|
-
async function
|
|
45
|
+
async function ensureLexicalIndex(table) {
|
|
46
46
|
const existing = await table.listIndices();
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
47
|
+
const hasTextIndex = existing.some((index) => index.name === "text_idx");
|
|
48
|
+
if (hasTextIndex) {
|
|
49
49
|
return { created: false, warning: null };
|
|
50
50
|
}
|
|
51
|
-
// numSubVectors must divide the vector dimension evenly. 16 is a safe default
|
|
52
|
-
// for the 384-dim local-hash and mxbai-xsmall models; LanceDB validates and
|
|
53
|
-
// will reject a value that does not divide evenly, so larger models still
|
|
54
|
-
// fall back to flat scan rather than corrupting the index.
|
|
55
|
-
const numSubVectors = 16;
|
|
56
|
-
const numPartitions = clampIvfPartitions(Math.round(Math.sqrt(rowCount)));
|
|
57
51
|
try {
|
|
58
|
-
await table.createIndex("
|
|
59
|
-
config: lancedb.Index.
|
|
52
|
+
await table.createIndex("text", {
|
|
53
|
+
config: lancedb.Index.fts({ asciiFolding: true, lowercase: true }),
|
|
60
54
|
});
|
|
61
55
|
return { created: true, warning: null };
|
|
62
56
|
}
|
|
63
57
|
catch (error) {
|
|
64
|
-
// Index training can fail on edge-case dimensionality or tiny effective
|
|
65
|
-
// corpora; the table remains usable via flat scan, but the operator
|
|
66
|
-
// deserves to know queries will be slower than expected.
|
|
67
58
|
const detail = error instanceof Error ? error.message : String(error);
|
|
68
59
|
return {
|
|
69
60
|
created: false,
|
|
70
|
-
warning: `
|
|
61
|
+
warning: `Full-text index training failed (${detail}). Falling back to bounded lexical scans; keyword recall may be lower on large corpora.`,
|
|
71
62
|
};
|
|
72
63
|
}
|
|
73
64
|
}
|
|
74
|
-
function clampIvfPartitions(value) {
|
|
75
|
-
return Math.min(MAX_IVF_PARTITIONS, Math.max(MIN_IVF_PARTITIONS, value));
|
|
76
|
-
}
|
|
77
65
|
export async function writeIndexManifest(manifest, config) {
|
|
78
|
-
await
|
|
79
|
-
const manifestPath = path.join(config.storageDir,
|
|
66
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
67
|
+
const manifestPath = path.join(config.storageDir, INDEX_MANIFEST_FILENAME);
|
|
80
68
|
await writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
|
|
69
|
+
await hardenPrivateFile(manifestPath);
|
|
81
70
|
}
|
|
82
71
|
export async function readIndexManifest(config) {
|
|
83
72
|
try {
|
|
84
|
-
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"));
|
|
85
74
|
if (!isRecord(raw)) {
|
|
86
75
|
return null;
|
|
87
76
|
}
|
|
@@ -109,10 +98,23 @@ function isIndexManifest(value) {
|
|
|
109
98
|
typeof value.ragmirVersion === "string" &&
|
|
110
99
|
(value.embeddingProvider === "local-hash" || value.embeddingProvider === "transformers") &&
|
|
111
100
|
typeof value.embeddingModel === "string" &&
|
|
101
|
+
(!("indexPolicyFingerprint" in value) || typeof value.indexPolicyFingerprint === "string") &&
|
|
102
|
+
(!("vectorDimension" in value) || typeof value.vectorDimension === "number") &&
|
|
103
|
+
(!("vectorDistanceMetric" in value) || typeof value.vectorDistanceMetric === "string") &&
|
|
112
104
|
typeof value.chunkSize === "number" &&
|
|
113
105
|
typeof value.chunkOverlap === "number" &&
|
|
114
106
|
typeof value.fileCount === "number" &&
|
|
115
|
-
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"));
|
|
116
118
|
}
|
|
117
119
|
export async function writeEmptyTextFiles(records, config) {
|
|
118
120
|
const manifestPath = path.join(config.storageDir, EMPTY_TEXT_FILES_MANIFEST);
|
|
@@ -120,9 +122,10 @@ export async function writeEmptyTextFiles(records, config) {
|
|
|
120
122
|
await rm(manifestPath, { force: true });
|
|
121
123
|
return;
|
|
122
124
|
}
|
|
123
|
-
await
|
|
125
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
124
126
|
const sortedRecords = [...records].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
125
127
|
await writeFile(manifestPath, JSON.stringify({ version: 1, files: sortedRecords }, null, 2), "utf8");
|
|
128
|
+
await hardenPrivateFile(manifestPath);
|
|
126
129
|
}
|
|
127
130
|
export async function readEmptyTextFiles(config) {
|
|
128
131
|
try {
|
|
@@ -140,6 +143,7 @@ export async function readEmptyTextFiles(config) {
|
|
|
140
143
|
}
|
|
141
144
|
}
|
|
142
145
|
export async function openRowsTable(config) {
|
|
146
|
+
await ensurePrivateDirectory(config.storageDir);
|
|
143
147
|
const db = await lancedb.connect(config.storageDir);
|
|
144
148
|
const tableNames = await db.tableNames();
|
|
145
149
|
if (!tableNames.includes(config.tableName)) {
|
|
@@ -152,15 +156,38 @@ export async function readRows(config) {
|
|
|
152
156
|
if (!table) {
|
|
153
157
|
return [];
|
|
154
158
|
}
|
|
155
|
-
return (await table.query().toArray()).map(
|
|
156
|
-
...row,
|
|
157
|
-
vector: normalizeVector(row.vector),
|
|
158
|
-
}));
|
|
159
|
+
return (await table.query().toArray()).map(vectorRowFromStored);
|
|
159
160
|
}
|
|
160
161
|
export async function countRows(config) {
|
|
161
162
|
const table = await openRowsTable(config);
|
|
162
163
|
return table ? table.countRows() : 0;
|
|
163
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
|
+
}
|
|
164
191
|
function normalizeVector(vector) {
|
|
165
192
|
if (Array.isArray(vector) && vector.every((value) => typeof value === "number")) {
|
|
166
193
|
return vector;
|
|
@@ -182,7 +209,11 @@ function hasIndexedNumberGetter(value) {
|
|
|
182
209
|
typeof value.get === "function");
|
|
183
210
|
}
|
|
184
211
|
function isEmptyTextFileRecord(value) {
|
|
185
|
-
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"));
|
|
186
217
|
}
|
|
187
218
|
function isNodeError(error) {
|
|
188
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAG5E,MAAM,yBAAyB,GAAG,uBAAuB,CAAA;AAczD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAiB,EAAE,MAAc;IAC/D,MAAM,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAEnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAA;QACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAChF,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAA;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE;QAC5D,IAAI,EAAE,WAAW;KAClB,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACrD,OAAO;QACL,kBAAkB,EAAE,IAAI;QACxB,mBAAmB,EAAE,aAAa,CAAC,OAAO;KAC3C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAiB,EACjB,YAAsB,EACtB,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACrD,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,aAAa,CAAC,OAAO,EAAE,CAAA;AACjF,CAAC;AAOD,KAAK,UAAU,kBAAkB,CAAC,KAAoB;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;IAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;IACxE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE;YAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACnE,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oCAAoC,MAAM,yFAAyF;SAC7I,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAuB,EAAE,MAAc;IAC9E,MAAM,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;IAC1E,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACxE,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CACnE,CAAA;QACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,yEAAyE;QACzE,wBAAwB;QACxB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,CACL,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,CAAC,KAAK,CAAC,iBAAiB,KAAK,YAAY,IAAI,KAAK,CAAC,iBAAiB,KAAK,cAAc,CAAC;QACxF,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QACxC,CAAC,CAAC,CAAC,wBAAwB,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ,CAAC;QAC1F,CAAC,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC;QAC5E,CAAC,CAAC,CAAC,sBAAsB,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ,CAAC;QACtF,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,CAAC,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CACxF,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;QACxD,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAC7D,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA8B,EAC9B,MAAc;IAEd,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;IAC5E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACvC,OAAM;IACR,CAAC;IAED,MAAM,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IAC/F,MAAM,SAAS,CACb,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7D,MAAM,CACP,CAAA;IACD,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,CACrE,CAAA;QACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,EAAE,CAAA;QACX,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,MAAM,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAA;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAQ,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAuB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACtC,CAAC;AAQD,SAAS,UAAU,CAAC,IAAiB;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,GAAG,GAAG;QACN,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC;KAC1B,CAAC,CAAC,CAAA;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAoB;IAC/C,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAA;IAC3C,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QACnC,GAAG,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,SAAS,OAAO,CAAI,MAAW,EAAE,IAAY;IAC3C,MAAM,MAAM,GAAU,EAAE,CAAA;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAsC,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/E,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAI5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,IAAI,KAAK;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,CAChC,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;QACxD,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAC7D,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAA;AAClD,CAAC"}
|
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"}
|