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.
Files changed (240) hide show
  1. package/README.md +118 -11
  2. package/dist/claims/deterministic-checks.d.ts +47 -0
  3. package/dist/claims/deterministic-checks.d.ts.map +1 -0
  4. package/dist/claims/deterministic-checks.js +143 -0
  5. package/dist/claims/deterministic-checks.js.map +1 -0
  6. package/dist/claims/policy.d.ts +25 -0
  7. package/dist/claims/policy.d.ts.map +1 -0
  8. package/dist/claims/policy.js +168 -0
  9. package/dist/claims/policy.js.map +1 -0
  10. package/dist/claims/store.d.ts +31 -0
  11. package/dist/claims/store.d.ts.map +1 -0
  12. package/dist/claims/store.js +127 -0
  13. package/dist/claims/store.js.map +1 -0
  14. package/dist/claims/types.d.ts +93 -0
  15. package/dist/claims/types.d.ts.map +1 -0
  16. package/dist/claims/types.js +9 -0
  17. package/dist/claims/types.js.map +1 -0
  18. package/dist/commands/build-graph.d.ts +0 -0
  19. package/dist/commands/build-graph.d.ts.map +0 -0
  20. package/dist/commands/build-graph.js +0 -0
  21. package/dist/commands/build-graph.js.map +0 -0
  22. package/dist/commands/claim.d.ts +13 -0
  23. package/dist/commands/claim.d.ts.map +1 -0
  24. package/dist/commands/claim.js +121 -0
  25. package/dist/commands/claim.js.map +1 -0
  26. package/dist/commands/doc-index.d.ts +0 -0
  27. package/dist/commands/doc-index.d.ts.map +1 -1
  28. package/dist/commands/doc-index.js +28 -29
  29. package/dist/commands/doc-index.js.map +1 -1
  30. package/dist/commands/doc-search.d.ts +0 -0
  31. package/dist/commands/doc-search.d.ts.map +1 -1
  32. package/dist/commands/doc-search.js +1 -0
  33. package/dist/commands/doc-search.js.map +1 -1
  34. package/dist/commands/evidence.d.ts +21 -0
  35. package/dist/commands/evidence.d.ts.map +1 -0
  36. package/dist/commands/evidence.js +191 -0
  37. package/dist/commands/evidence.js.map +1 -0
  38. package/dist/commands/extract.d.ts +0 -0
  39. package/dist/commands/extract.d.ts.map +1 -1
  40. package/dist/commands/extract.js +9 -21
  41. package/dist/commands/extract.js.map +1 -1
  42. package/dist/commands/graph-add.d.ts +0 -0
  43. package/dist/commands/graph-add.d.ts.map +1 -1
  44. package/dist/commands/graph-add.d.ts.sync-conflict-20260629-232900-2SGIW5T.map +0 -0
  45. package/dist/commands/graph-add.js +13 -3
  46. package/dist/commands/graph-add.js.map +1 -1
  47. package/dist/commands/graph-add.js.sync-conflict-20260629-232916-2SGIW5T.map +0 -0
  48. package/dist/commands/graph-add.sync-conflict-20260629-232853-2SGIW5T.js +0 -0
  49. package/dist/commands/graph-drill.d.ts +0 -0
  50. package/dist/commands/graph-drill.d.ts.map +0 -0
  51. package/dist/commands/graph-drill.js +0 -0
  52. package/dist/commands/graph-drill.js.map +0 -0
  53. package/dist/commands/graph-explore.d.ts +0 -0
  54. package/dist/commands/graph-explore.d.ts.map +0 -0
  55. package/dist/commands/graph-explore.js +0 -0
  56. package/dist/commands/graph-explore.js.map +0 -0
  57. package/dist/commands/graph-obfuscate.d.ts +0 -0
  58. package/dist/commands/graph-obfuscate.d.ts.map +0 -0
  59. package/dist/commands/graph-obfuscate.js +0 -0
  60. package/dist/commands/graph-obfuscate.js.map +0 -0
  61. package/dist/commands/graph-search.d.ts +0 -0
  62. package/dist/commands/graph-search.d.ts.map +0 -0
  63. package/dist/commands/graph-search.js +0 -0
  64. package/dist/commands/graph-search.js.map +0 -0
  65. package/dist/commands/graph-traverse.d.ts +0 -0
  66. package/dist/commands/graph-traverse.d.ts.map +0 -0
  67. package/dist/commands/graph-traverse.js +0 -0
  68. package/dist/commands/graph-traverse.js.map +0 -0
  69. package/dist/commands/query-graph.d.ts +0 -0
  70. package/dist/commands/query-graph.d.ts.map +0 -0
  71. package/dist/commands/query-graph.js +0 -0
  72. package/dist/commands/query-graph.js.map +0 -0
  73. package/dist/commands/raw.d.ts +0 -0
  74. package/dist/commands/raw.d.ts.map +0 -0
  75. package/dist/commands/raw.js +0 -0
  76. package/dist/commands/raw.js.map +0 -0
  77. package/dist/commands/results-add.d.ts +1 -0
  78. package/dist/commands/results-add.d.ts.map +1 -1
  79. package/dist/commands/results-add.js +6 -2
  80. package/dist/commands/results-add.js.map +1 -1
  81. package/dist/commands/review.d.ts +12 -0
  82. package/dist/commands/review.d.ts.map +1 -0
  83. package/dist/commands/review.js +111 -0
  84. package/dist/commands/review.js.map +1 -0
  85. package/dist/commands/session.d.ts +0 -0
  86. package/dist/commands/session.d.ts.map +1 -1
  87. package/dist/commands/session.js +5 -0
  88. package/dist/commands/session.js.map +1 -1
  89. package/dist/commands/verdict.d.ts +9 -0
  90. package/dist/commands/verdict.d.ts.map +1 -0
  91. package/dist/commands/verdict.js +29 -0
  92. package/dist/commands/verdict.js.map +1 -0
  93. package/dist/config.d.ts +0 -0
  94. package/dist/config.d.ts.map +0 -0
  95. package/dist/config.js +0 -0
  96. package/dist/config.js.map +0 -0
  97. package/dist/deep/co-occurrence.d.ts +0 -0
  98. package/dist/deep/co-occurrence.d.ts.map +0 -0
  99. package/dist/deep/co-occurrence.js +0 -0
  100. package/dist/deep/co-occurrence.js.map +0 -0
  101. package/dist/deep/dedupe.d.ts +9 -4
  102. package/dist/deep/dedupe.d.ts.map +1 -1
  103. package/dist/deep/dedupe.js +54 -11
  104. package/dist/deep/dedupe.js.map +1 -1
  105. package/dist/deep/degree-utils.d.ts +0 -0
  106. package/dist/deep/degree-utils.d.ts.map +0 -0
  107. package/dist/deep/degree-utils.js +0 -0
  108. package/dist/deep/degree-utils.js.map +0 -0
  109. package/dist/deep/extractor.d.sync-conflict-20260629-232902-2SGIW5T.ts +0 -0
  110. package/dist/deep/extractor.d.ts +0 -0
  111. package/dist/deep/extractor.d.ts.map +0 -0
  112. package/dist/deep/extractor.d.ts.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
  113. package/dist/deep/extractor.js +0 -0
  114. package/dist/deep/extractor.js.map +0 -0
  115. package/dist/deep/extractor.js.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
  116. package/dist/deep/extractor.sync-conflict-20260629-232903-2SGIW5T.js +0 -0
  117. package/dist/deep/graph-explore.d.ts +0 -0
  118. package/dist/deep/graph-explore.d.ts.map +0 -0
  119. package/dist/deep/graph-explore.js +0 -0
  120. package/dist/deep/graph-explore.js.map +0 -0
  121. package/dist/deep/graph-obfuscate.d.ts +0 -0
  122. package/dist/deep/graph-obfuscate.d.ts.map +0 -0
  123. package/dist/deep/graph-obfuscate.js +0 -0
  124. package/dist/deep/graph-obfuscate.js.map +0 -0
  125. package/dist/deep/graph-preprocess.d.ts +5 -0
  126. package/dist/deep/graph-preprocess.d.ts.map +1 -1
  127. package/dist/deep/graph-preprocess.js +6 -0
  128. package/dist/deep/graph-preprocess.js.map +1 -1
  129. package/dist/deep/graph-sampling.d.ts +0 -0
  130. package/dist/deep/graph-sampling.d.ts.map +0 -0
  131. package/dist/deep/graph-sampling.js +0 -0
  132. package/dist/deep/graph-sampling.js.map +0 -0
  133. package/dist/deep/graph.d.sync-conflict-20260629-232917-2SGIW5T.ts +0 -0
  134. package/dist/deep/graph.d.ts +1 -1
  135. package/dist/deep/graph.d.ts.map +1 -1
  136. package/dist/deep/graph.d.ts.sync-conflict-20260629-232911-2SGIW5T.map +0 -0
  137. package/dist/deep/graph.js +8 -4
  138. package/dist/deep/graph.js.map +1 -1
  139. package/dist/deep/graph.js.sync-conflict-20260629-232855-2SGIW5T.map +0 -0
  140. package/dist/deep/graph.sync-conflict-20260629-232907-2SGIW5T.js +0 -0
  141. package/dist/deep/index.d.ts +1 -1
  142. package/dist/deep/index.d.ts.map +1 -1
  143. package/dist/deep/index.js +1 -1
  144. package/dist/deep/index.js.map +1 -1
  145. package/dist/deep/iteration-data.d.ts +0 -0
  146. package/dist/deep/iteration-data.d.ts.map +1 -1
  147. package/dist/deep/iteration-data.js +2 -2
  148. package/dist/deep/iteration-data.js.map +1 -1
  149. package/dist/deep/keywords.d.ts +0 -0
  150. package/dist/deep/keywords.d.ts.map +0 -0
  151. package/dist/deep/keywords.js +0 -0
  152. package/dist/deep/keywords.js.map +0 -0
  153. package/dist/deep/local-doc/indexer.d.ts +16 -1
  154. package/dist/deep/local-doc/indexer.d.ts.map +1 -1
  155. package/dist/deep/local-doc/indexer.js +305 -22
  156. package/dist/deep/local-doc/indexer.js.map +1 -1
  157. package/dist/deep/local-doc/scanner.d.ts +6 -6
  158. package/dist/deep/local-doc/scanner.d.ts.map +1 -1
  159. package/dist/deep/local-doc/scanner.js +123 -128
  160. package/dist/deep/local-doc/scanner.js.map +1 -1
  161. package/dist/deep/local-doc/searcher.d.ts +1 -0
  162. package/dist/deep/local-doc/searcher.d.ts.map +1 -1
  163. package/dist/deep/local-doc/searcher.js +25 -7
  164. package/dist/deep/local-doc/searcher.js.map +1 -1
  165. package/dist/deep/local-doc/types.d.ts +21 -0
  166. package/dist/deep/local-doc/types.d.ts.map +1 -1
  167. package/dist/deep/local-doc/types.js +0 -0
  168. package/dist/deep/local-doc/types.js.map +1 -1
  169. package/dist/deep/path-extraction.d.ts +0 -0
  170. package/dist/deep/path-extraction.d.ts.map +0 -0
  171. package/dist/deep/path-extraction.js +0 -0
  172. package/dist/deep/path-extraction.js.map +0 -0
  173. package/dist/deep/quality-assess.d.ts +6 -4
  174. package/dist/deep/quality-assess.d.ts.map +1 -1
  175. package/dist/deep/quality-assess.js +37 -29
  176. package/dist/deep/quality-assess.js.map +1 -1
  177. package/dist/deep/query-redundancy.d.ts +0 -0
  178. package/dist/deep/query-redundancy.d.ts.map +0 -0
  179. package/dist/deep/query-redundancy.js +0 -0
  180. package/dist/deep/query-redundancy.js.map +0 -0
  181. package/dist/deep/query-suggest.d.ts +0 -0
  182. package/dist/deep/query-suggest.d.ts.map +0 -0
  183. package/dist/deep/query-suggest.js +0 -0
  184. package/dist/deep/query-suggest.js.map +0 -0
  185. package/dist/deep/recovery-analysis.d.ts +0 -0
  186. package/dist/deep/recovery-analysis.d.ts.map +0 -0
  187. package/dist/deep/recovery-analysis.js +0 -0
  188. package/dist/deep/recovery-analysis.js.map +0 -0
  189. package/dist/deep/rrf.d.ts +0 -0
  190. package/dist/deep/rrf.d.ts.map +0 -0
  191. package/dist/deep/rrf.js +0 -0
  192. package/dist/deep/rrf.js.map +0 -0
  193. package/dist/deep/search-strategy.d.ts +0 -0
  194. package/dist/deep/search-strategy.d.ts.map +0 -0
  195. package/dist/deep/search-strategy.js +0 -0
  196. package/dist/deep/search-strategy.js.map +0 -0
  197. package/dist/deep/session.d.sync-conflict-20260629-232917-2SGIW5T.ts +0 -0
  198. package/dist/deep/session.d.ts +10 -2
  199. package/dist/deep/session.d.ts.map +1 -1
  200. package/dist/deep/session.d.ts.sync-conflict-20260629-232921-2SGIW5T.map +0 -0
  201. package/dist/deep/session.js +57 -33
  202. package/dist/deep/session.js.map +1 -1
  203. package/dist/deep/session.js.sync-conflict-20260629-232854-2SGIW5T.map +0 -0
  204. package/dist/deep/simhash.d.ts +0 -0
  205. package/dist/deep/simhash.d.ts.map +0 -0
  206. package/dist/deep/simhash.js +0 -0
  207. package/dist/deep/simhash.js.map +0 -0
  208. package/dist/deep/tfidf.d.ts +0 -0
  209. package/dist/deep/tfidf.d.ts.map +0 -0
  210. package/dist/deep/tfidf.js +0 -0
  211. package/dist/deep/tfidf.js.map +0 -0
  212. package/dist/index.d.ts +0 -0
  213. package/dist/index.d.ts.map +0 -0
  214. package/dist/index.js +0 -0
  215. package/dist/index.js.map +0 -0
  216. package/dist/init.d.ts +0 -0
  217. package/dist/init.d.ts.map +0 -0
  218. package/dist/init.js +0 -0
  219. package/dist/init.js.map +0 -0
  220. package/dist/protocol.d.ts +0 -0
  221. package/dist/protocol.d.ts.map +0 -0
  222. package/dist/protocol.js +0 -0
  223. package/dist/protocol.js.map +0 -0
  224. package/dist/runCli.d.ts +0 -0
  225. package/dist/runCli.d.ts.map +1 -1
  226. package/dist/runCli.d.ts.sync-conflict-20260629-232854-2SGIW5T.map +0 -0
  227. package/dist/runCli.js +172 -17
  228. package/dist/runCli.js.map +1 -1
  229. package/dist/runCli.js.sync-conflict-20260629-232857-2SGIW5T.map +0 -0
  230. package/dist/runCli.sync-conflict-20260629-232915-2SGIW5T.js +0 -0
  231. package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.d.ts +0 -0
  232. package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.d.ts.map +0 -0
  233. package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.js +0 -0
  234. package/dist/runCli.sync-conflict-20260629-233530-JAULAPO.js.map +0 -0
  235. package/dist/service.d.ts +0 -0
  236. package/dist/service.d.ts.map +1 -1
  237. package/dist/service.js +3 -35
  238. package/dist/service.js.map +1 -1
  239. package/package.json +2 -2
  240. 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 { resolve, join } from 'path';
9
+ import { execFileSync } from 'child_process';
10
+ import { resolve, join, relative, extname, isAbsolute, sep } from 'path';
10
11
  import { createHash } from 'crypto';
11
- import { create, insertMultiple } from '@orama/orama';
12
- import { persist, restore } from '@orama/plugin-data-persistence';
13
- import { ORAMA_SCHEMA } from './types.js';
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
- // ── Index building ────────────────────────────────────────────────────
31
- export async function buildIndex(rootPath, chunks) {
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
- // Create index with default tokenizer (handles Latin text)
37
- // CJK support: use @orama/tokenizers/mandarin via components.tokenizer if needed
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
- // Batch insert to avoid issues with very large arrays
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
- writeFileSync(join(indexPath, 'meta.json'), JSON.stringify(meta, null, 2), 'utf-8');
59
- return { indexPath, meta };
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
- return restore('json', data);
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 file scanning + structure-aware chunking
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;;;;;;GAMG;AAMH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwD1D,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE,CA4I/E"}
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"}