sxng-cli 1.2.2 → 1.2.4
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 +118 -11
- package/dist/claims/deterministic-checks.d.ts +47 -0
- package/dist/claims/deterministic-checks.d.ts.map +1 -0
- package/dist/claims/deterministic-checks.js +143 -0
- package/dist/claims/deterministic-checks.js.map +1 -0
- package/dist/claims/policy.d.ts +25 -0
- package/dist/claims/policy.d.ts.map +1 -0
- package/dist/claims/policy.js +168 -0
- package/dist/claims/policy.js.map +1 -0
- package/dist/claims/store.d.ts +31 -0
- package/dist/claims/store.d.ts.map +1 -0
- package/dist/claims/store.js +127 -0
- package/dist/claims/store.js.map +1 -0
- package/dist/claims/types.d.ts +93 -0
- package/dist/claims/types.d.ts.map +1 -0
- package/dist/claims/types.js +9 -0
- package/dist/claims/types.js.map +1 -0
- package/dist/commands/build-graph.d.ts +0 -0
- package/dist/commands/build-graph.d.ts.map +0 -0
- package/dist/commands/build-graph.js +0 -0
- package/dist/commands/build-graph.js.map +0 -0
- package/dist/commands/claim.d.ts +13 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +121 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/doc-index.d.ts +0 -0
- package/dist/commands/doc-index.d.ts.map +1 -1
- package/dist/commands/doc-index.js +28 -29
- package/dist/commands/doc-index.js.map +1 -1
- package/dist/commands/doc-search.d.ts +0 -0
- package/dist/commands/doc-search.d.ts.map +1 -1
- package/dist/commands/doc-search.js +1 -0
- package/dist/commands/doc-search.js.map +1 -1
- package/dist/commands/evidence.d.ts +21 -0
- package/dist/commands/evidence.d.ts.map +1 -0
- package/dist/commands/evidence.js +191 -0
- package/dist/commands/evidence.js.map +1 -0
- package/dist/commands/extract.d.ts +0 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +9 -21
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/graph-add.d.ts +0 -0
- package/dist/commands/graph-add.d.ts.map +1 -1
- package/dist/commands/graph-add.d.ts.sync-conflict-20260629-232900-2SGIW5T.map +0 -0
- package/dist/commands/graph-add.js +13 -3
- package/dist/commands/graph-add.js.map +1 -1
- package/dist/commands/graph-add.js.sync-conflict-20260629-232916-2SGIW5T.map +0 -0
- package/dist/commands/graph-add.sync-conflict-20260629-232853-2SGIW5T.js +0 -0
- package/dist/commands/graph-drill.d.ts +0 -0
- package/dist/commands/graph-drill.d.ts.map +0 -0
- package/dist/commands/graph-drill.js +0 -0
- package/dist/commands/graph-drill.js.map +0 -0
- package/dist/commands/graph-explore.d.ts +0 -0
- package/dist/commands/graph-explore.d.ts.map +0 -0
- package/dist/commands/graph-explore.js +0 -0
- package/dist/commands/graph-explore.js.map +0 -0
- package/dist/commands/graph-obfuscate.d.ts +0 -0
- package/dist/commands/graph-obfuscate.d.ts.map +0 -0
- package/dist/commands/graph-obfuscate.js +0 -0
- package/dist/commands/graph-obfuscate.js.map +0 -0
- package/dist/commands/graph-search.d.ts +0 -0
- package/dist/commands/graph-search.d.ts.map +0 -0
- package/dist/commands/graph-search.js +0 -0
- package/dist/commands/graph-search.js.map +0 -0
- package/dist/commands/graph-traverse.d.ts +0 -0
- package/dist/commands/graph-traverse.d.ts.map +0 -0
- package/dist/commands/graph-traverse.js +0 -0
- package/dist/commands/graph-traverse.js.map +0 -0
- package/dist/commands/query-graph.d.ts +0 -0
- package/dist/commands/query-graph.d.ts.map +0 -0
- package/dist/commands/query-graph.js +0 -0
- package/dist/commands/query-graph.js.map +0 -0
- package/dist/commands/raw.d.ts +0 -0
- package/dist/commands/raw.d.ts.map +0 -0
- package/dist/commands/raw.js +0 -0
- package/dist/commands/raw.js.map +0 -0
- package/dist/commands/results-add.d.ts +1 -0
- package/dist/commands/results-add.d.ts.map +1 -1
- package/dist/commands/results-add.js +6 -2
- package/dist/commands/results-add.js.map +1 -1
- package/dist/commands/review.d.ts +12 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +111 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/session.d.ts +0 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +5 -0
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/verdict.d.ts +9 -0
- package/dist/commands/verdict.d.ts.map +1 -0
- package/dist/commands/verdict.js +29 -0
- package/dist/commands/verdict.js.map +1 -0
- package/dist/config.d.ts +0 -0
- package/dist/config.d.ts.map +0 -0
- package/dist/config.js +0 -0
- package/dist/config.js.map +0 -0
- package/dist/deep/co-occurrence.d.ts +0 -0
- package/dist/deep/co-occurrence.d.ts.map +0 -0
- package/dist/deep/co-occurrence.js +0 -0
- package/dist/deep/co-occurrence.js.map +0 -0
- package/dist/deep/dedupe.d.ts +9 -4
- package/dist/deep/dedupe.d.ts.map +1 -1
- package/dist/deep/dedupe.js +54 -11
- package/dist/deep/dedupe.js.map +1 -1
- package/dist/deep/degree-utils.d.ts +0 -0
- package/dist/deep/degree-utils.d.ts.map +0 -0
- package/dist/deep/degree-utils.js +0 -0
- package/dist/deep/degree-utils.js.map +0 -0
- package/dist/deep/extractor.d.sync-conflict-20260629-232902-2SGIW5T.ts +0 -0
- package/dist/deep/extractor.d.ts +0 -0
- package/dist/deep/extractor.d.ts.map +0 -0
- package/dist/deep/extractor.d.ts.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
- package/dist/deep/extractor.js +0 -0
- package/dist/deep/extractor.js.map +0 -0
- package/dist/deep/extractor.js.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
- package/dist/deep/extractor.sync-conflict-20260629-232903-2SGIW5T.js +0 -0
- package/dist/deep/graph-explore.d.ts +0 -0
- package/dist/deep/graph-explore.d.ts.map +0 -0
- package/dist/deep/graph-explore.js +0 -0
- package/dist/deep/graph-explore.js.map +0 -0
- package/dist/deep/graph-obfuscate.d.ts +0 -0
- package/dist/deep/graph-obfuscate.d.ts.map +0 -0
- package/dist/deep/graph-obfuscate.js +0 -0
- package/dist/deep/graph-obfuscate.js.map +0 -0
- package/dist/deep/graph-preprocess.d.ts +5 -0
- package/dist/deep/graph-preprocess.d.ts.map +1 -1
- package/dist/deep/graph-preprocess.js +6 -0
- package/dist/deep/graph-preprocess.js.map +1 -1
- package/dist/deep/graph-sampling.d.ts +0 -0
- package/dist/deep/graph-sampling.d.ts.map +0 -0
- package/dist/deep/graph-sampling.js +0 -0
- package/dist/deep/graph-sampling.js.map +0 -0
- package/dist/deep/graph.d.sync-conflict-20260629-232917-2SGIW5T.ts +0 -0
- package/dist/deep/graph.d.ts +1 -1
- package/dist/deep/graph.d.ts.map +1 -1
- package/dist/deep/graph.d.ts.sync-conflict-20260629-232911-2SGIW5T.map +0 -0
- package/dist/deep/graph.js +8 -4
- package/dist/deep/graph.js.map +1 -1
- package/dist/deep/graph.js.sync-conflict-20260629-232855-2SGIW5T.map +0 -0
- package/dist/deep/graph.sync-conflict-20260629-232907-2SGIW5T.js +0 -0
- package/dist/deep/index.d.ts +1 -1
- package/dist/deep/index.d.ts.map +1 -1
- package/dist/deep/index.js +1 -1
- package/dist/deep/index.js.map +1 -1
- package/dist/deep/iteration-data.d.ts +0 -0
- package/dist/deep/iteration-data.d.ts.map +1 -1
- package/dist/deep/iteration-data.js +2 -2
- package/dist/deep/iteration-data.js.map +1 -1
- package/dist/deep/keywords.d.ts +0 -0
- package/dist/deep/keywords.d.ts.map +0 -0
- package/dist/deep/keywords.js +0 -0
- package/dist/deep/keywords.js.map +0 -0
- package/dist/deep/local-doc/indexer.d.ts +16 -1
- package/dist/deep/local-doc/indexer.d.ts.map +1 -1
- package/dist/deep/local-doc/indexer.js +305 -22
- package/dist/deep/local-doc/indexer.js.map +1 -1
- package/dist/deep/local-doc/scanner.d.ts +6 -6
- package/dist/deep/local-doc/scanner.d.ts.map +1 -1
- package/dist/deep/local-doc/scanner.js +123 -128
- package/dist/deep/local-doc/scanner.js.map +1 -1
- package/dist/deep/local-doc/searcher.d.ts +1 -0
- package/dist/deep/local-doc/searcher.d.ts.map +1 -1
- package/dist/deep/local-doc/searcher.js +25 -7
- package/dist/deep/local-doc/searcher.js.map +1 -1
- package/dist/deep/local-doc/types.d.ts +21 -0
- package/dist/deep/local-doc/types.d.ts.map +1 -1
- package/dist/deep/local-doc/types.js +0 -0
- package/dist/deep/local-doc/types.js.map +1 -1
- package/dist/deep/path-extraction.d.ts +0 -0
- package/dist/deep/path-extraction.d.ts.map +0 -0
- package/dist/deep/path-extraction.js +0 -0
- package/dist/deep/path-extraction.js.map +0 -0
- package/dist/deep/quality-assess.d.ts +6 -4
- package/dist/deep/quality-assess.d.ts.map +1 -1
- package/dist/deep/quality-assess.js +37 -29
- package/dist/deep/quality-assess.js.map +1 -1
- package/dist/deep/query-redundancy.d.ts +0 -0
- package/dist/deep/query-redundancy.d.ts.map +0 -0
- package/dist/deep/query-redundancy.js +0 -0
- package/dist/deep/query-redundancy.js.map +0 -0
- package/dist/deep/query-suggest.d.ts +0 -0
- package/dist/deep/query-suggest.d.ts.map +0 -0
- package/dist/deep/query-suggest.js +0 -0
- package/dist/deep/query-suggest.js.map +0 -0
- package/dist/deep/recovery-analysis.d.ts +0 -0
- package/dist/deep/recovery-analysis.d.ts.map +0 -0
- package/dist/deep/recovery-analysis.js +0 -0
- package/dist/deep/recovery-analysis.js.map +0 -0
- package/dist/deep/rrf.d.ts +0 -0
- package/dist/deep/rrf.d.ts.map +0 -0
- package/dist/deep/rrf.js +0 -0
- package/dist/deep/rrf.js.map +0 -0
- package/dist/deep/search-strategy.d.ts +0 -0
- package/dist/deep/search-strategy.d.ts.map +0 -0
- package/dist/deep/search-strategy.js +0 -0
- package/dist/deep/search-strategy.js.map +0 -0
- package/dist/deep/session.d.sync-conflict-20260629-232917-2SGIW5T.ts +0 -0
- package/dist/deep/session.d.ts +10 -2
- package/dist/deep/session.d.ts.map +1 -1
- package/dist/deep/session.d.ts.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
- package/dist/deep/session.js +57 -33
- package/dist/deep/session.js.map +1 -1
- package/dist/deep/session.js.sync-conflict-20260629-232854-2SGIW5T.map +0 -0
- package/dist/deep/simhash.d.ts +0 -0
- package/dist/deep/simhash.d.ts.map +0 -0
- package/dist/deep/simhash.js +0 -0
- package/dist/deep/simhash.js.map +0 -0
- package/dist/deep/tfidf.d.ts +0 -0
- package/dist/deep/tfidf.d.ts.map +0 -0
- package/dist/deep/tfidf.js +0 -0
- package/dist/deep/tfidf.js.map +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +0 -0
- package/dist/index.js.map +0 -0
- package/dist/init.d.ts +0 -0
- package/dist/init.d.ts.map +0 -0
- package/dist/init.js +0 -0
- package/dist/init.js.map +0 -0
- package/dist/protocol.d.ts +0 -0
- package/dist/protocol.d.ts.map +0 -0
- package/dist/protocol.js +0 -0
- package/dist/protocol.js.map +0 -0
- package/dist/runCli.d.ts +0 -0
- package/dist/runCli.d.ts.map +1 -1
- package/dist/runCli.d.ts.sync-conflict-20260629-232854-2SGIW5T.map +0 -0
- package/dist/runCli.js +172 -17
- package/dist/runCli.js.map +1 -1
- package/dist/runCli.js.sync-conflict-20260629-232857-2SGIW5T.map +0 -0
- package/dist/runCli.sync-conflict-20260629-232915-2SGIW5T.js +0 -0
- package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.d.ts +0 -0
- package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.d.ts.map +0 -0
- package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.js +0 -0
- package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.js.map +0 -0
- package/dist/service.d.ts +0 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +3 -35
- package/dist/service.js.map +1 -1
- package/package.json +2 -2
- package/sxng.config.example.json +0 -0
|
@@ -6,12 +6,32 @@
|
|
|
6
6
|
* on subsequent searches.
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
|
|
9
|
-
import {
|
|
9
|
+
import { execFileSync } from 'child_process';
|
|
10
|
+
import { resolve, join, relative, extname, isAbsolute, sep } from 'path';
|
|
10
11
|
import { createHash } from 'crypto';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { freemem, totalmem } from 'os';
|
|
13
|
+
import { create, insertMultiple, load, removeMultiple } from '@orama/orama';
|
|
14
|
+
import { createTokenizer } from '@orama/tokenizers/mandarin';
|
|
15
|
+
import { persist } from '@orama/plugin-data-persistence';
|
|
16
|
+
import { ORAMA_SCHEMA, } from './types.js';
|
|
17
|
+
import { scanFiles } from './scanner.js';
|
|
14
18
|
const BATCH_SIZE = 500;
|
|
19
|
+
const MAX_INDEX_MEMORY_BYTES = 256 * 1024 * 1024;
|
|
20
|
+
const TOKENIZER_VERSION = 'mandarin-lowercase-v1';
|
|
21
|
+
export const INDEX_REFRESH_INTERVAL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
22
|
+
function createDocumentTokenizer() {
|
|
23
|
+
const tokenizer = createTokenizer();
|
|
24
|
+
const tokenize = tokenizer.tokenize;
|
|
25
|
+
tokenizer.tokenize = (raw, language, property, withCache) => tokenize(raw.toLowerCase(), language, property, withCache);
|
|
26
|
+
return tokenizer;
|
|
27
|
+
}
|
|
28
|
+
/** Reserve most memory for the process and OS; Orama expands raw text in memory. */
|
|
29
|
+
export function calculateIndexMemoryBudget(totalBytes, freeBytes) {
|
|
30
|
+
return Math.min(MAX_INDEX_MEMORY_BYTES, totalBytes * 0.05, freeBytes * 0.2);
|
|
31
|
+
}
|
|
32
|
+
export function getIndexMemoryBudget() {
|
|
33
|
+
return calculateIndexMemoryBudget(totalmem(), freemem());
|
|
34
|
+
}
|
|
15
35
|
// ── Path utilities ────────────────────────────────────────────────────
|
|
16
36
|
/** Get .sxng root directory (cwd-based) */
|
|
17
37
|
function getSxngRoot() {
|
|
@@ -27,47 +47,310 @@ export function getIndexPath(rootPath) {
|
|
|
27
47
|
const hash = createHash('sha256').update(abs).digest('hex').slice(0, 16);
|
|
28
48
|
return join(getDocsDir(), hash);
|
|
29
49
|
}
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
function normalizeExtensions(extensions) {
|
|
51
|
+
return (extensions ?? ['md', 'txt']).map(extension => extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`);
|
|
52
|
+
}
|
|
53
|
+
function pathWithinRoot(absPath, absRoot) {
|
|
54
|
+
const fromRoot = relative(absRoot, absPath);
|
|
55
|
+
return fromRoot !== ''
|
|
56
|
+
&& !isAbsolute(fromRoot)
|
|
57
|
+
&& fromRoot !== '..'
|
|
58
|
+
&& !fromRoot.startsWith(`..${sep}`);
|
|
59
|
+
}
|
|
60
|
+
function fileMetadata(file) {
|
|
61
|
+
return { contentHash: file.contentHash, chunkIds: file.chunks.map(chunk => chunk.id) };
|
|
62
|
+
}
|
|
63
|
+
function runGit(rootPath, args) {
|
|
64
|
+
try {
|
|
65
|
+
return execFileSync('git', ['-C', rootPath, ...args], {
|
|
66
|
+
encoding: 'utf-8',
|
|
67
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
68
|
+
}).trim();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function getGitState(rootPath, baseHead, extensions) {
|
|
32
75
|
const absRoot = resolve(rootPath);
|
|
76
|
+
const gitRoot = runGit(absRoot, ['rev-parse', '--show-toplevel']);
|
|
77
|
+
const head = runGit(absRoot, ['rev-parse', 'HEAD']);
|
|
78
|
+
if (!gitRoot || !head)
|
|
79
|
+
return null;
|
|
80
|
+
const allowedExtensions = new Set(normalizeExtensions(extensions));
|
|
81
|
+
const pathspec = relative(gitRoot, absRoot).replace(/\\/g, '/');
|
|
82
|
+
const scope = pathspec ? ['--', pathspec] : [];
|
|
83
|
+
const toRootRelativePath = (gitPath) => {
|
|
84
|
+
const absPath = resolve(gitRoot, gitPath);
|
|
85
|
+
if (!pathWithinRoot(absPath, absRoot) || !allowedExtensions.has(extname(absPath).toLowerCase())) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return relative(absRoot, absPath).replace(/\\/g, '/');
|
|
89
|
+
};
|
|
90
|
+
const untrackedOutput = runGit(gitRoot, ['ls-files', '--others', '--exclude-standard', ...scope]);
|
|
91
|
+
if (untrackedOutput === null)
|
|
92
|
+
return null;
|
|
93
|
+
const hasUntrackedIndexableFiles = untrackedOutput.split(/\r?\n/)
|
|
94
|
+
.filter(Boolean)
|
|
95
|
+
.some(path => toRootRelativePath(path) !== null);
|
|
96
|
+
const listChangedFiles = (base) => {
|
|
97
|
+
const output = runGit(gitRoot, [
|
|
98
|
+
'diff', '--no-renames', '--name-only', '--diff-filter=ACMRD', base, ...scope,
|
|
99
|
+
]);
|
|
100
|
+
if (output === null)
|
|
101
|
+
return null;
|
|
102
|
+
return output.split(/\r?\n/)
|
|
103
|
+
.filter(Boolean)
|
|
104
|
+
.map(toRootRelativePath)
|
|
105
|
+
.filter((path) => path !== null);
|
|
106
|
+
};
|
|
107
|
+
const changedFiles = listChangedFiles(baseHead ?? 'HEAD');
|
|
108
|
+
const uncommittedFiles = baseHead ? listChangedFiles('HEAD') : changedFiles;
|
|
109
|
+
if (changedFiles === null || uncommittedFiles === null)
|
|
110
|
+
return null;
|
|
111
|
+
return {
|
|
112
|
+
head,
|
|
113
|
+
changedFiles,
|
|
114
|
+
hasUncommittedTrackedIndexableChanges: uncommittedFiles.length > 0,
|
|
115
|
+
hasUntrackedIndexableFiles,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async function insertChunks(db, chunks) {
|
|
119
|
+
for (let offset = 0; offset < chunks.length; offset += BATCH_SIZE) {
|
|
120
|
+
await insertMultiple(db, chunks.slice(offset, offset + BATCH_SIZE));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function createMeta(absRoot, source, partial, memoryBudgetBytes) {
|
|
124
|
+
const files = source ? Object.keys(source.files).length : 0;
|
|
125
|
+
const chunks = source
|
|
126
|
+
? Object.values(source.files).reduce((total, file) => total + file.chunkIds.length, 0)
|
|
127
|
+
: 0;
|
|
128
|
+
return {
|
|
129
|
+
rootPath: absRoot,
|
|
130
|
+
files,
|
|
131
|
+
chunks,
|
|
132
|
+
indexedAt: Date.now(),
|
|
133
|
+
partial,
|
|
134
|
+
memoryBudgetBytes,
|
|
135
|
+
tokenizer: TOKENIZER_VERSION,
|
|
136
|
+
source,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async function persistIndex(rootPath, db, meta) {
|
|
33
140
|
const indexPath = getIndexPath(rootPath);
|
|
34
|
-
// Ensure directory exists
|
|
35
141
|
mkdirSync(indexPath, { recursive: true });
|
|
36
|
-
|
|
37
|
-
|
|
142
|
+
const json = await persist(db, 'json');
|
|
143
|
+
writeFileSync(join(indexPath, 'index.json'), json, 'utf-8');
|
|
144
|
+
writeFileSync(join(indexPath, 'meta.json'), JSON.stringify(meta, null, 2), 'utf-8');
|
|
145
|
+
return { indexPath, meta };
|
|
146
|
+
}
|
|
147
|
+
// ── Index building ────────────────────────────────────────────────────
|
|
148
|
+
export async function buildIndex(rootPath, chunks) {
|
|
149
|
+
const absRoot = resolve(rootPath);
|
|
38
150
|
const db = await create({
|
|
39
151
|
schema: ORAMA_SCHEMA,
|
|
152
|
+
components: { tokenizer: createDocumentTokenizer() },
|
|
40
153
|
});
|
|
41
154
|
if (chunks.length > 0) {
|
|
42
|
-
|
|
43
|
-
for (let i = 0; i < chunks.length; i += BATCH_SIZE) {
|
|
44
|
-
const batch = chunks.slice(i, i + BATCH_SIZE);
|
|
45
|
-
await insertMultiple(db, batch);
|
|
46
|
-
}
|
|
155
|
+
await insertChunks(db, chunks);
|
|
47
156
|
}
|
|
48
|
-
// Persist to JSON
|
|
49
|
-
const json = await persist(db, 'json');
|
|
50
|
-
writeFileSync(join(indexPath, 'index.json'), json, 'utf-8');
|
|
51
|
-
// Write meta
|
|
52
157
|
const meta = {
|
|
53
158
|
rootPath: absRoot,
|
|
54
159
|
files: new Set(chunks.map(c => c.filePath)).size,
|
|
55
160
|
chunks: chunks.length,
|
|
56
161
|
indexedAt: Date.now(),
|
|
162
|
+
partial: false,
|
|
163
|
+
memoryBudgetBytes: getIndexMemoryBudget(),
|
|
164
|
+
tokenizer: TOKENIZER_VERSION,
|
|
57
165
|
};
|
|
58
|
-
|
|
59
|
-
|
|
166
|
+
return persistIndex(rootPath, db, meta);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Build an index incrementally. Each yielded batch is released after insertion.
|
|
170
|
+
* The persisted index remains usable when the memory budget ends the scan early.
|
|
171
|
+
*/
|
|
172
|
+
export async function buildIndexFromBatches(rootPath, batches, memoryBudgetBytes = getIndexMemoryBudget()) {
|
|
173
|
+
const absRoot = resolve(rootPath);
|
|
174
|
+
const initialHeapBytes = process.memoryUsage().heapUsed;
|
|
175
|
+
const db = await create({
|
|
176
|
+
schema: ORAMA_SCHEMA,
|
|
177
|
+
components: { tokenizer: createDocumentTokenizer() },
|
|
178
|
+
});
|
|
179
|
+
let files = 0;
|
|
180
|
+
let chunks = 0;
|
|
181
|
+
let partial = false;
|
|
182
|
+
for (const batch of batches) {
|
|
183
|
+
const batchBytes = batch.reduce((total, item) => total + Buffer.byteLength(item.content, 'utf-8'), 0);
|
|
184
|
+
const heapUsed = process.memoryUsage().heapUsed - initialHeapBytes;
|
|
185
|
+
if (heapUsed >= memoryBudgetBytes || heapUsed + batchBytes * 4 > memoryBudgetBytes) {
|
|
186
|
+
partial = true;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
await insertChunks(db, batch);
|
|
190
|
+
files++;
|
|
191
|
+
chunks += batch.length;
|
|
192
|
+
}
|
|
193
|
+
if (chunks === 0) {
|
|
194
|
+
if (partial) {
|
|
195
|
+
throw Object.assign(new Error(`Index memory budget (${memoryBudgetBytes} bytes) is too small to index any files in ${absRoot}`), { code: 'MEMORY_LIMIT_REACHED' });
|
|
196
|
+
}
|
|
197
|
+
throw Object.assign(new Error(`No indexable files found in ${absRoot}`), { code: 'NO_INDEXABLE_FILES' });
|
|
198
|
+
}
|
|
199
|
+
const meta = {
|
|
200
|
+
rootPath: absRoot,
|
|
201
|
+
files,
|
|
202
|
+
chunks,
|
|
203
|
+
indexedAt: Date.now(),
|
|
204
|
+
partial,
|
|
205
|
+
memoryBudgetBytes,
|
|
206
|
+
tokenizer: TOKENIZER_VERSION,
|
|
207
|
+
};
|
|
208
|
+
return persistIndex(rootPath, db, meta);
|
|
209
|
+
}
|
|
210
|
+
/** Build a complete index and record file hashes for later incremental refreshes. */
|
|
211
|
+
export async function buildIndexFromScannedFiles(rootPath, files, memoryBudgetBytes = getIndexMemoryBudget(), extensions) {
|
|
212
|
+
const absRoot = resolve(rootPath);
|
|
213
|
+
const db = await create({
|
|
214
|
+
schema: ORAMA_SCHEMA,
|
|
215
|
+
components: { tokenizer: createDocumentTokenizer() },
|
|
216
|
+
});
|
|
217
|
+
const source = {
|
|
218
|
+
files: {},
|
|
219
|
+
extensions: normalizeExtensions(extensions),
|
|
220
|
+
};
|
|
221
|
+
const initialHeapBytes = process.memoryUsage().heapUsed;
|
|
222
|
+
let partial = false;
|
|
223
|
+
for (const file of files) {
|
|
224
|
+
const fileBytes = file.chunks.reduce((total, chunk) => total + Buffer.byteLength(chunk.content, 'utf-8'), 0);
|
|
225
|
+
const heapUsed = process.memoryUsage().heapUsed - initialHeapBytes;
|
|
226
|
+
if (heapUsed >= memoryBudgetBytes || heapUsed + fileBytes * 4 > memoryBudgetBytes) {
|
|
227
|
+
partial = true;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
await insertChunks(db, file.chunks);
|
|
231
|
+
source.files[file.filePath] = fileMetadata(file);
|
|
232
|
+
}
|
|
233
|
+
if (Object.keys(source.files).length === 0) {
|
|
234
|
+
if (partial) {
|
|
235
|
+
throw Object.assign(new Error(`Index memory budget (${memoryBudgetBytes} bytes) is too small to index any files in ${absRoot}`), { code: 'MEMORY_LIMIT_REACHED' });
|
|
236
|
+
}
|
|
237
|
+
throw Object.assign(new Error(`No indexable files found in ${absRoot}`), { code: 'NO_INDEXABLE_FILES' });
|
|
238
|
+
}
|
|
239
|
+
const git = getGitState(absRoot, undefined, source.extensions);
|
|
240
|
+
if (git && !git.hasUncommittedTrackedIndexableChanges && !git.hasUntrackedIndexableFiles) {
|
|
241
|
+
source.git = { head: git.head };
|
|
242
|
+
}
|
|
243
|
+
return persistIndex(rootPath, db, createMeta(absRoot, source, partial, memoryBudgetBytes));
|
|
244
|
+
}
|
|
245
|
+
async function replaceFile(db, source, file) {
|
|
246
|
+
const previous = source.files[file.filePath];
|
|
247
|
+
if (previous?.contentHash === file.contentHash)
|
|
248
|
+
return;
|
|
249
|
+
if (previous?.chunkIds.length)
|
|
250
|
+
await removeMultiple(db, previous.chunkIds, BATCH_SIZE);
|
|
251
|
+
await insertChunks(db, file.chunks);
|
|
252
|
+
source.files[file.filePath] = fileMetadata(file);
|
|
253
|
+
}
|
|
254
|
+
async function removeFile(db, source, filePath) {
|
|
255
|
+
const previous = source.files[filePath];
|
|
256
|
+
if (!previous)
|
|
257
|
+
return;
|
|
258
|
+
if (previous.chunkIds.length)
|
|
259
|
+
await removeMultiple(db, previous.chunkIds, BATCH_SIZE);
|
|
260
|
+
delete source.files[filePath];
|
|
261
|
+
}
|
|
262
|
+
function exceedsMemoryBudget(file, initialHeapBytes, memoryBudgetBytes) {
|
|
263
|
+
const fileBytes = file.chunks.reduce((total, chunk) => total + Buffer.byteLength(chunk.content, 'utf-8'), 0);
|
|
264
|
+
const heapUsed = process.memoryUsage().heapUsed - initialHeapBytes;
|
|
265
|
+
return heapUsed >= memoryBudgetBytes || heapUsed + fileBytes * 4 > memoryBudgetBytes;
|
|
266
|
+
}
|
|
267
|
+
async function refreshWithHashes(rootPath, db, source, memoryBudgetBytes) {
|
|
268
|
+
const initialHeapBytes = process.memoryUsage().heapUsed;
|
|
269
|
+
const seen = new Set();
|
|
270
|
+
for (const file of scanFiles(rootPath, {
|
|
271
|
+
extensions: source.extensions,
|
|
272
|
+
maxFileSize: Math.min(10 * 1024 * 1024, Math.floor(memoryBudgetBytes / 8)),
|
|
273
|
+
})) {
|
|
274
|
+
if (exceedsMemoryBudget(file, initialHeapBytes, memoryBudgetBytes))
|
|
275
|
+
return true;
|
|
276
|
+
seen.add(file.filePath);
|
|
277
|
+
await replaceFile(db, source, file);
|
|
278
|
+
}
|
|
279
|
+
for (const filePath of Object.keys(source.files)) {
|
|
280
|
+
if (!seen.has(filePath))
|
|
281
|
+
await removeFile(db, source, filePath);
|
|
282
|
+
}
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
async function refreshWithGit(rootPath, db, source, changedFiles, memoryBudgetBytes) {
|
|
286
|
+
const initialHeapBytes = process.memoryUsage().heapUsed;
|
|
287
|
+
const pending = new Set(changedFiles);
|
|
288
|
+
for (const file of scanFiles(rootPath, { extensions: source.extensions }, pending)) {
|
|
289
|
+
if (exceedsMemoryBudget(file, initialHeapBytes, memoryBudgetBytes))
|
|
290
|
+
return true;
|
|
291
|
+
pending.delete(file.filePath);
|
|
292
|
+
await replaceFile(db, source, file);
|
|
293
|
+
}
|
|
294
|
+
for (const filePath of pending)
|
|
295
|
+
await removeFile(db, source, filePath);
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
/** Refresh a complete index by Git diff when possible, otherwise by file hashes. */
|
|
299
|
+
export async function refreshIndex(rootPath) {
|
|
300
|
+
const absRoot = resolve(rootPath);
|
|
301
|
+
const previous = getIndexMeta(absRoot);
|
|
302
|
+
const source = previous?.source;
|
|
303
|
+
if (!previous || previous.partial || !source) {
|
|
304
|
+
return buildIndexFromScannedFiles(absRoot, scanFiles(absRoot));
|
|
305
|
+
}
|
|
306
|
+
const memoryBudgetBytes = getIndexMemoryBudget();
|
|
307
|
+
const db = await loadIndex(absRoot);
|
|
308
|
+
const git = getGitState(absRoot, source.git?.head, source.extensions);
|
|
309
|
+
let partial = false;
|
|
310
|
+
if (git && source.git
|
|
311
|
+
&& !git.hasUncommittedTrackedIndexableChanges
|
|
312
|
+
&& !git.hasUntrackedIndexableFiles) {
|
|
313
|
+
partial = await refreshWithGit(absRoot, db, source, git.changedFiles, memoryBudgetBytes);
|
|
314
|
+
if (!partial)
|
|
315
|
+
source.git = { head: git.head };
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
partial = await refreshWithHashes(absRoot, db, source, memoryBudgetBytes);
|
|
319
|
+
if (!partial) {
|
|
320
|
+
const currentGit = getGitState(absRoot, undefined, source.extensions);
|
|
321
|
+
if (currentGit && !currentGit.hasUncommittedTrackedIndexableChanges && !currentGit.hasUntrackedIndexableFiles) {
|
|
322
|
+
source.git = { head: currentGit.head };
|
|
323
|
+
}
|
|
324
|
+
else
|
|
325
|
+
delete source.git;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return persistIndex(absRoot, db, createMeta(absRoot, source, partial, memoryBudgetBytes));
|
|
329
|
+
}
|
|
330
|
+
/** Refresh only when the index has exceeded its maximum age. */
|
|
331
|
+
export async function refreshIndexIfStale(rootPath) {
|
|
332
|
+
const meta = getIndexMeta(rootPath);
|
|
333
|
+
if (!meta || Date.now() - meta.indexedAt < INDEX_REFRESH_INTERVAL_MS)
|
|
334
|
+
return false;
|
|
335
|
+
await refreshIndex(rootPath);
|
|
336
|
+
return true;
|
|
60
337
|
}
|
|
61
338
|
// ── Index loading ─────────────────────────────────────────────────────
|
|
62
339
|
export async function loadIndex(rootPath) {
|
|
63
340
|
const indexPath = getIndexPath(rootPath);
|
|
64
341
|
const data = readFileSync(join(indexPath, 'index.json'), 'utf-8');
|
|
65
|
-
|
|
342
|
+
const db = await create({
|
|
343
|
+
schema: ORAMA_SCHEMA,
|
|
344
|
+
components: { tokenizer: createDocumentTokenizer() },
|
|
345
|
+
});
|
|
346
|
+
load(db, JSON.parse(data));
|
|
347
|
+
return db;
|
|
66
348
|
}
|
|
67
349
|
// ── Index detection ───────────────────────────────────────────────────
|
|
68
350
|
export function hasIndex(rootPath) {
|
|
69
351
|
const indexPath = getIndexPath(rootPath);
|
|
70
|
-
return existsSync(join(indexPath, 'index.json'))
|
|
352
|
+
return existsSync(join(indexPath, 'index.json'))
|
|
353
|
+
&& getIndexMeta(rootPath)?.tokenizer === TOKENIZER_VERSION;
|
|
71
354
|
}
|
|
72
355
|
// ── Index metadata ────────────────────────────────────────────────────
|
|
73
356
|
export function getIndexMeta(rootPath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/deep/local-doc/indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/deep/local-doc/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scanner
|
|
3
|
-
*
|
|
4
|
-
* Scans a directory for documents, parses YAML frontmatter,
|
|
5
|
-
* and splits content into chunks using chunk-smart (markdown)
|
|
6
|
-
* or paragraph splitting (plain text).
|
|
2
|
+
* Scanner - file scanning and structure-aware chunking.
|
|
7
3
|
*/
|
|
8
|
-
import { ScannedChunk, ScannerOptions } from './types.js';
|
|
4
|
+
import { ScannedChunk, ScannedFile, ScannerOptions } from './types.js';
|
|
5
|
+
/** Yield one file at a time, with a hash for incremental change detection. */
|
|
6
|
+
export declare function scanFiles(rootPath: string, options?: ScannerOptions, filePaths?: Iterable<string>): Generator<ScannedFile>;
|
|
7
|
+
/** Yield one file batch at a time so callers can index and release them. */
|
|
8
|
+
export declare function scanBatches(rootPath: string, options?: ScannerOptions): Generator<ScannedChunk[]>;
|
|
9
9
|
export declare function scan(rootPath: string, options?: ScannerOptions): ScannedChunk[];
|
|
10
10
|
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/scanner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/deep/local-doc/scanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA8JvE,8EAA8E;AAC9E,wBAAiB,SAAS,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,SAAS,CAAC,WAAW,CAAC,CAYxB;AAED,4EAA4E;AAC5E,wBAAiB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAIlG;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE,CAI/E"}
|