lmgrep 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +559 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.js +180 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/build.d.ts +7 -0
- package/dist/lib/build.js +222 -0
- package/dist/lib/build.js.map +1 -0
- package/dist/{chunker → lib/chunker}/context.d.ts +0 -4
- package/dist/{chunker → lib/chunker}/context.js +3 -76
- package/dist/lib/chunker/context.js.map +1 -0
- package/dist/lib/chunker/index.d.ts +7 -0
- package/dist/{chunker → lib/chunker}/index.js +10 -5
- package/dist/lib/chunker/index.js.map +1 -0
- package/dist/lib/chunker/languages.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.js +82 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/embedder.d.ts +55 -0
- package/dist/lib/embedder.js +221 -0
- package/dist/lib/embedder.js.map +1 -0
- package/dist/{providers.js → lib/providers.js} +0 -2
- package/dist/lib/providers.js.map +1 -0
- package/dist/lib/repair.d.ts +3 -0
- package/dist/lib/repair.js +104 -0
- package/dist/lib/repair.js.map +1 -0
- package/dist/lib/scanner.d.ts +34 -0
- package/dist/lib/scanner.js +219 -0
- package/dist/lib/scanner.js.map +1 -0
- package/dist/lib/serve.d.ts +11 -0
- package/dist/lib/serve.js +124 -0
- package/dist/lib/serve.js.map +1 -0
- package/dist/lib/store.d.ts +147 -0
- package/dist/lib/store.js +673 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/types.d.ts +118 -0
- package/dist/lib/types.js +13 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/mcp.js +160 -45
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunker/context.js.map +0 -1
- package/dist/chunker/index.d.ts +0 -3
- package/dist/chunker/index.js.map +0 -1
- package/dist/chunker/languages.js.map +0 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.js +0 -31
- package/dist/config.js.map +0 -1
- package/dist/embedder.d.ts +0 -3
- package/dist/embedder.js +0 -55
- package/dist/embedder.js.map +0 -1
- package/dist/index-cmd.d.ts +0 -9
- package/dist/index-cmd.js +0 -250
- package/dist/index-cmd.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/repair-cmd.d.ts +0 -5
- package/dist/repair-cmd.js +0 -112
- package/dist/repair-cmd.js.map +0 -1
- package/dist/search-cmd.d.ts +0 -10
- package/dist/search-cmd.js +0 -60
- package/dist/search-cmd.js.map +0 -1
- package/dist/serve-cmd.d.ts +0 -1
- package/dist/serve-cmd.js +0 -139
- package/dist/serve-cmd.js.map +0 -1
- package/dist/status-cmd.d.ts +0 -5
- package/dist/status-cmd.js +0 -119
- package/dist/status-cmd.js.map +0 -1
- package/dist/store.d.ts +0 -25
- package/dist/store.js +0 -207
- package/dist/store.js.map +0 -1
- package/dist/types.d.ts +0 -40
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/walker.d.ts +0 -3
- package/dist/walker.js +0 -90
- package/dist/walker.js.map +0 -1
- /package/dist/{chunker → lib/chunker}/languages.d.ts +0 -0
- /package/dist/{chunker → lib/chunker}/languages.js +0 -0
- /package/dist/{providers.d.ts → lib/providers.d.ts} +0 -0
package/dist/index-cmd.js
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { chunkFile } from "./chunker/index.js";
|
|
2
|
-
import { loadConfig } from "./config.js";
|
|
3
|
-
import { embedTexts } from "./embedder.js";
|
|
4
|
-
import { createHash } from "node:crypto";
|
|
5
|
-
import { readFileSync, statSync } from "node:fs";
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
import { deleteByFiles, getFileHashes, getIndexedHashes, resetIndex, upsertChunks, upsertFileHashes, } from "./store.js";
|
|
8
|
-
import { walkFiles } from "./walker.js";
|
|
9
|
-
function parseDuration(s) {
|
|
10
|
-
const match = s.match(/^(\d+)\s*(s|m|h|d)$/);
|
|
11
|
-
if (!match)
|
|
12
|
-
throw new Error(`Invalid duration "${s}". Use e.g. 10m, 2h, 1d`);
|
|
13
|
-
const n = Number.parseInt(match[1], 10);
|
|
14
|
-
const unit = match[2];
|
|
15
|
-
const multipliers = { s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 };
|
|
16
|
-
return n * multipliers[unit];
|
|
17
|
-
}
|
|
18
|
-
function log(msg) {
|
|
19
|
-
console.log(`[${new Date().toISOString()}] ${msg}`);
|
|
20
|
-
}
|
|
21
|
-
export async function indexCommand(cwd, opts) {
|
|
22
|
-
const config = loadConfig(cwd);
|
|
23
|
-
if (opts.reset) {
|
|
24
|
-
log("Resetting index...");
|
|
25
|
-
await resetIndex(cwd);
|
|
26
|
-
}
|
|
27
|
-
// Scan files
|
|
28
|
-
const allFiles = walkFiles(cwd);
|
|
29
|
-
// Filter by mtime if --since is provided
|
|
30
|
-
let files = allFiles;
|
|
31
|
-
if (opts.since) {
|
|
32
|
-
const cutoff = Date.now() - parseDuration(opts.since);
|
|
33
|
-
files = allFiles.filter((f) => {
|
|
34
|
-
try {
|
|
35
|
-
return statSync(join(cwd, f)).mtimeMs >= cutoff;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
log(`Found ${files.length} files modified in the last ${opts.since} (out of ${allFiles.length})`);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
log(`Found ${files.length} files`);
|
|
45
|
-
}
|
|
46
|
-
// Fast change detection via whole-file hash
|
|
47
|
-
const storedFileHashes = await getFileHashes(cwd);
|
|
48
|
-
const changedFiles = [];
|
|
49
|
-
const currentFileHashes = new Map();
|
|
50
|
-
for (const file of files) {
|
|
51
|
-
try {
|
|
52
|
-
const content = readFileSync(join(cwd, file));
|
|
53
|
-
const fileHash = createHash("sha256").update(content).digest("hex").slice(0, 16);
|
|
54
|
-
currentFileHashes.set(file, fileHash);
|
|
55
|
-
if (opts.force || storedFileHashes.get(file) !== fileHash) {
|
|
56
|
-
changedFiles.push(file);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// skip unreadable files
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
log(`${changedFiles.length} files changed out of ${files.length}`);
|
|
64
|
-
if (changedFiles.length === 0) {
|
|
65
|
-
log("No changes detected. Index is up to date.");
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
// Chunk only changed files
|
|
69
|
-
const allChunks = [];
|
|
70
|
-
for (let i = 0; i < changedFiles.length; i++) {
|
|
71
|
-
const file = changedFiles[i];
|
|
72
|
-
try {
|
|
73
|
-
const chunks = await chunkFile(file, cwd);
|
|
74
|
-
allChunks.push(...chunks);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// skip files that fail to parse
|
|
78
|
-
}
|
|
79
|
-
if ((i + 1) % 1000 === 0 || i === changedFiles.length - 1) {
|
|
80
|
-
log(`Chunking: ${i + 1}/${changedFiles.length} files, ${allChunks.length} chunks so far`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (allChunks.length === 0) {
|
|
84
|
-
log("No changes detected. Index is up to date.");
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (opts.dry) {
|
|
88
|
-
for (const f of changedFiles)
|
|
89
|
-
log(` ${f}`);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Delete old chunks for changed files so stale content doesn't linger
|
|
93
|
-
await deleteByFiles(changedFiles, cwd);
|
|
94
|
-
// Filter out chunks already indexed (by hash) — checked after delete
|
|
95
|
-
// so hashes from changed files don't cause false positives
|
|
96
|
-
const existingHashes = await getIndexedHashes(cwd);
|
|
97
|
-
let newChunks = allChunks.filter((c) => !existingHashes.has(c.hash));
|
|
98
|
-
const alreadyIndexed = allChunks.length - newChunks.length;
|
|
99
|
-
// Filter out chunks exceeding max token limit
|
|
100
|
-
let skippedOversize = 0;
|
|
101
|
-
if (config.maxTokens) {
|
|
102
|
-
const before = newChunks.length;
|
|
103
|
-
newChunks = newChunks.filter((c) => {
|
|
104
|
-
const estimatedTokens = Math.ceil((c.context.length + c.content.length) / 4);
|
|
105
|
-
return estimatedTokens <= config.maxTokens;
|
|
106
|
-
});
|
|
107
|
-
skippedOversize = before - newChunks.length;
|
|
108
|
-
}
|
|
109
|
-
log(`${changedFiles.length} files changed, ${allChunks.length} chunks total, ${newChunks.length} to embed (${alreadyIndexed} already indexed${skippedOversize > 0 ? `, ${skippedOversize} skipped as oversized` : ""})`);
|
|
110
|
-
if (newChunks.length === 0) {
|
|
111
|
-
// No new chunks to embed — safe to save all file hashes
|
|
112
|
-
const allChangedHashEntries = changedFiles
|
|
113
|
-
.filter((fp) => currentFileHashes.has(fp))
|
|
114
|
-
.map((fp) => ({ filePath: fp, fileHash: currentFileHashes.get(fp) }));
|
|
115
|
-
if (allChangedHashEntries.length > 0) {
|
|
116
|
-
await upsertFileHashes(allChangedHashEntries, cwd);
|
|
117
|
-
}
|
|
118
|
-
log("All chunks already indexed.");
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
// Embed and store in batches
|
|
122
|
-
const { succeeded, failed, failedFiles } = await embedAndStore(newChunks, config, cwd);
|
|
123
|
-
// Only save file hashes for files that had no embedding failures,
|
|
124
|
-
// so interrupted/failed files get retried on the next run.
|
|
125
|
-
const hashEntries = changedFiles
|
|
126
|
-
.filter((fp) => currentFileHashes.has(fp) && !failedFiles.has(fp))
|
|
127
|
-
.map((fp) => ({ filePath: fp, fileHash: currentFileHashes.get(fp) }));
|
|
128
|
-
if (hashEntries.length > 0) {
|
|
129
|
-
await upsertFileHashes(hashEntries, cwd);
|
|
130
|
-
}
|
|
131
|
-
log(`Done: ${succeeded} chunks indexed from ${changedFiles.length} files` +
|
|
132
|
-
(failed > 0 ? ` (${failed} failed)` : ""));
|
|
133
|
-
}
|
|
134
|
-
const BATCH_DELAY_MS = 200;
|
|
135
|
-
const MAX_CONSECUTIVE_FAILURES = 3;
|
|
136
|
-
const MAX_RELOADS = 10;
|
|
137
|
-
async function reloadModel(config) {
|
|
138
|
-
const modelId = config.model.split(":").slice(1).join(":");
|
|
139
|
-
const baseURL = config.baseURL ?? "http://localhost:1234";
|
|
140
|
-
const apiBase = baseURL.replace(/\/v1\/?$/, "");
|
|
141
|
-
try {
|
|
142
|
-
log(`Reloading model "${modelId}"...`);
|
|
143
|
-
await fetch(`${apiBase}/api/v1/models/unload`, {
|
|
144
|
-
method: "POST",
|
|
145
|
-
headers: { "Content-Type": "application/json" },
|
|
146
|
-
body: JSON.stringify({ instance_id: modelId }),
|
|
147
|
-
});
|
|
148
|
-
await new Promise((r) => setTimeout(r, 2000));
|
|
149
|
-
const res = await fetch(`${apiBase}/api/v1/models/load`, {
|
|
150
|
-
method: "POST",
|
|
151
|
-
headers: { "Content-Type": "application/json" },
|
|
152
|
-
body: JSON.stringify({ model: modelId, context_length: config.maxTokens ?? 8192 }),
|
|
153
|
-
});
|
|
154
|
-
const data = (await res.json());
|
|
155
|
-
if (data.status === "loaded") {
|
|
156
|
-
log("Model reloaded successfully");
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
log(`Model reload response: ${JSON.stringify(data)}`);
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
catch (err) {
|
|
163
|
-
log(`Failed to reload model: ${err instanceof Error ? err.message : err}`);
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async function embedAndStore(chunks, config, cwd) {
|
|
168
|
-
const batchSize = config.batchSize;
|
|
169
|
-
const total = chunks.length;
|
|
170
|
-
const totalBatches = Math.ceil(total / batchSize);
|
|
171
|
-
let succeeded = 0;
|
|
172
|
-
let failed = 0;
|
|
173
|
-
const failedFiles = new Set();
|
|
174
|
-
let consecutiveFailedBatches = 0;
|
|
175
|
-
let reloads = 0;
|
|
176
|
-
for (let i = 0; i < chunks.length; i += batchSize) {
|
|
177
|
-
const batchNum = Math.floor(i / batchSize) + 1;
|
|
178
|
-
const batchChunks = chunks.slice(i, i + batchSize);
|
|
179
|
-
const batchTexts = batchChunks.map((c) => `${c.context}\n${c.content}`);
|
|
180
|
-
const batchIndexed = [];
|
|
181
|
-
let batchFailed = 0;
|
|
182
|
-
try {
|
|
183
|
-
const vectors = await embedTexts(batchTexts, config);
|
|
184
|
-
for (let j = 0; j < batchChunks.length; j++) {
|
|
185
|
-
batchIndexed.push({ ...batchChunks[j], vector: vectors[j] });
|
|
186
|
-
}
|
|
187
|
-
succeeded += batchChunks.length;
|
|
188
|
-
consecutiveFailedBatches = 0;
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
// Batch failed — retry each item individually
|
|
192
|
-
for (let j = 0; j < batchChunks.length; j++) {
|
|
193
|
-
const tokenEstimate = Math.ceil(batchTexts[j].length / 4);
|
|
194
|
-
try {
|
|
195
|
-
const [vector] = await embedTexts([batchTexts[j]], config);
|
|
196
|
-
batchIndexed.push({ ...batchChunks[j], vector });
|
|
197
|
-
succeeded++;
|
|
198
|
-
}
|
|
199
|
-
catch (err) {
|
|
200
|
-
failed++;
|
|
201
|
-
batchFailed++;
|
|
202
|
-
failedFiles.add(batchChunks[j].filePath);
|
|
203
|
-
console.error(` ! Failed (~${tokenEstimate} tok): ${err instanceof Error ? err.message : err}`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
if (batchFailed === batchChunks.length) {
|
|
207
|
-
consecutiveFailedBatches++;
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
consecutiveFailedBatches = 0;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Store successful chunks from this batch immediately
|
|
214
|
-
if (batchIndexed.length > 0) {
|
|
215
|
-
await upsertChunks(batchIndexed, cwd);
|
|
216
|
-
}
|
|
217
|
-
log(`Batch ${batchNum}/${totalBatches}: ${succeeded} ok / ${failed} err / ${total} total`);
|
|
218
|
-
if (consecutiveFailedBatches >= MAX_CONSECUTIVE_FAILURES) {
|
|
219
|
-
if (reloads >= MAX_RELOADS) {
|
|
220
|
-
log(`Aborting: exhausted ${MAX_RELOADS} reload attempts.`);
|
|
221
|
-
// Mark all remaining unprocessed chunks' files as failed
|
|
222
|
-
for (let k = i + batchSize; k < chunks.length; k++) {
|
|
223
|
-
failedFiles.add(chunks[k].filePath);
|
|
224
|
-
}
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
reloads++;
|
|
228
|
-
log(`${MAX_CONSECUTIVE_FAILURES} consecutive failures — reloading model (attempt ${reloads}/${MAX_RELOADS})...`);
|
|
229
|
-
const ok = await reloadModel(config);
|
|
230
|
-
if (!ok) {
|
|
231
|
-
log("Aborting: could not reload model.");
|
|
232
|
-
// Mark all remaining unprocessed chunks' files as failed
|
|
233
|
-
for (let k = i + batchSize; k < chunks.length; k++) {
|
|
234
|
-
failedFiles.add(chunks[k].filePath);
|
|
235
|
-
}
|
|
236
|
-
break;
|
|
237
|
-
}
|
|
238
|
-
consecutiveFailedBatches = 0;
|
|
239
|
-
// Retry the failed batches by rewinding
|
|
240
|
-
i -= MAX_CONSECUTIVE_FAILURES * batchSize;
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
// Cooldown between batches to avoid GPU overheating
|
|
244
|
-
if (i + batchSize < chunks.length) {
|
|
245
|
-
await new Promise((r) => setTimeout(r, BATCH_DELAY_MS));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return { succeeded, failed, failedFiles };
|
|
249
|
-
}
|
|
250
|
-
//# sourceMappingURL=index-cmd.js.map
|
package/dist/index-cmd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../src/index-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/providers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,SAAS,yBAAyB;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,cAAc;IACd,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC5D,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;QACT,IAAI,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,aAAa;IACb,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC1D,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;QACT,IAAI,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,GAAW;IAEX,yDAAyD;IACzD,IAAI,CAAC;QACJ,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,gCAAgC;IAChC,KAAK,MAAM,UAAU,IAAI,yBAAyB,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,MAAM,IAAI,KAAK,CACd,aAAa,GAAG,gDAAgD,GAAG,IAAI,CACvE,CAAC;AACH,CAAC"}
|
package/dist/repair-cmd.d.ts
DELETED
package/dist/repair-cmd.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { chunkFile } from "./chunker/index.js";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { deleteByFiles, deleteFileHashes, getChunkCount, getFileHashes, getIndexedFiles, } from "./store.js";
|
|
6
|
-
import { walkFiles } from "./walker.js";
|
|
7
|
-
function log(msg) {
|
|
8
|
-
console.log(`[${new Date().toISOString()}] ${msg}`);
|
|
9
|
-
}
|
|
10
|
-
export async function repairCommand(cwd, opts) {
|
|
11
|
-
log("Scanning index for inconsistencies...");
|
|
12
|
-
const chunkCountBefore = await getChunkCount(cwd);
|
|
13
|
-
const indexedFiles = await getIndexedFiles(cwd);
|
|
14
|
-
const storedFileHashes = await getFileHashes(cwd);
|
|
15
|
-
const diskFiles = new Set(walkFiles(cwd));
|
|
16
|
-
// 1. Find orphaned files: indexed but no longer on disk
|
|
17
|
-
const orphanedFiles = [];
|
|
18
|
-
const allIndexedPaths = new Set([
|
|
19
|
-
...indexedFiles.keys(),
|
|
20
|
-
...storedFileHashes.keys(),
|
|
21
|
-
]);
|
|
22
|
-
for (const fp of allIndexedPaths) {
|
|
23
|
-
if (!diskFiles.has(fp)) {
|
|
24
|
-
orphanedFiles.push(fp);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
// 2. Find stale files: file hash in DB doesn't match current content
|
|
28
|
-
const staleFiles = [];
|
|
29
|
-
for (const fp of diskFiles) {
|
|
30
|
-
const storedHash = storedFileHashes.get(fp);
|
|
31
|
-
if (!storedHash)
|
|
32
|
-
continue; // not tracked, will be picked up by `index`
|
|
33
|
-
try {
|
|
34
|
-
const content = readFileSync(join(cwd, fp));
|
|
35
|
-
const currentHash = createHash("sha256")
|
|
36
|
-
.update(content)
|
|
37
|
-
.digest("hex")
|
|
38
|
-
.slice(0, 16);
|
|
39
|
-
if (storedHash !== currentHash) {
|
|
40
|
-
staleFiles.push(fp);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// unreadable, treat as orphaned
|
|
45
|
-
orphanedFiles.push(fp);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// 3. Find files with stale chunks: chunks in DB don't match what chunking produces
|
|
49
|
-
const chunkMismatchFiles = [];
|
|
50
|
-
for (const [fp, indexedHashes] of indexedFiles) {
|
|
51
|
-
if (orphanedFiles.includes(fp) || staleFiles.includes(fp))
|
|
52
|
-
continue;
|
|
53
|
-
if (!diskFiles.has(fp))
|
|
54
|
-
continue;
|
|
55
|
-
try {
|
|
56
|
-
const currentChunks = await chunkFile(fp, cwd);
|
|
57
|
-
const currentHashes = new Set(currentChunks.map((c) => c.hash));
|
|
58
|
-
const indexedSet = new Set(indexedHashes);
|
|
59
|
-
// Check if any indexed chunk is not in current chunks (stale)
|
|
60
|
-
// or if any current chunk is missing from index
|
|
61
|
-
const hasStale = indexedHashes.some((h) => !currentHashes.has(h));
|
|
62
|
-
const hasMissing = currentChunks.some((c) => !indexedSet.has(c.hash));
|
|
63
|
-
if (hasStale || hasMissing) {
|
|
64
|
-
chunkMismatchFiles.push(fp);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
// skip files that fail to parse
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
const totalProblems = orphanedFiles.length + staleFiles.length + chunkMismatchFiles.length;
|
|
72
|
-
if (totalProblems === 0) {
|
|
73
|
-
log("Index is consistent. No repairs needed.");
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
log(`Found ${totalProblems} issues:`);
|
|
77
|
-
if (orphanedFiles.length > 0) {
|
|
78
|
-
log(` ${orphanedFiles.length} orphaned files (deleted from disk)`);
|
|
79
|
-
}
|
|
80
|
-
if (staleFiles.length > 0) {
|
|
81
|
-
log(` ${staleFiles.length} stale files (content changed, hash outdated)`);
|
|
82
|
-
}
|
|
83
|
-
if (chunkMismatchFiles.length > 0) {
|
|
84
|
-
log(` ${chunkMismatchFiles.length} files with mismatched chunks`);
|
|
85
|
-
}
|
|
86
|
-
if (opts.dry) {
|
|
87
|
-
for (const fp of orphanedFiles)
|
|
88
|
-
log(` [orphan] ${fp}`);
|
|
89
|
-
for (const fp of staleFiles)
|
|
90
|
-
log(` [stale] ${fp}`);
|
|
91
|
-
for (const fp of chunkMismatchFiles)
|
|
92
|
-
log(` [mismatch] ${fp}`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
// Remove orphaned files from both tables
|
|
96
|
-
if (orphanedFiles.length > 0) {
|
|
97
|
-
await deleteByFiles(orphanedFiles, cwd);
|
|
98
|
-
await deleteFileHashes(orphanedFiles, cwd);
|
|
99
|
-
log(`Removed ${orphanedFiles.length} orphaned files from index`);
|
|
100
|
-
}
|
|
101
|
-
// Remove stale file hashes so `index` will re-process them
|
|
102
|
-
const filesToInvalidate = [...staleFiles, ...chunkMismatchFiles];
|
|
103
|
-
if (filesToInvalidate.length > 0) {
|
|
104
|
-
await deleteByFiles(filesToInvalidate, cwd);
|
|
105
|
-
await deleteFileHashes(filesToInvalidate, cwd);
|
|
106
|
-
log(`Invalidated ${filesToInvalidate.length} files — run \`lmgrep index\` to re-embed`);
|
|
107
|
-
}
|
|
108
|
-
const chunkCountAfter = await getChunkCount(cwd);
|
|
109
|
-
const removed = chunkCountBefore - chunkCountAfter;
|
|
110
|
-
log(`Repair complete. Removed ${removed} stale chunks.`);
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=repair-cmd.js.map
|
package/dist/repair-cmd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repair-cmd.js","sourceRoot":"","sources":["../src/repair-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/search-cmd.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
interface SearchOptions {
|
|
2
|
-
limit?: number;
|
|
3
|
-
scores?: boolean;
|
|
4
|
-
compact?: boolean;
|
|
5
|
-
minScore?: number;
|
|
6
|
-
filePrefix?: string;
|
|
7
|
-
not?: string;
|
|
8
|
-
}
|
|
9
|
-
export declare function searchCommand(query: string, cwd: string, opts: SearchOptions): Promise<void>;
|
|
10
|
-
export {};
|
package/dist/search-cmd.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { loadConfig } from "./config.js";
|
|
2
|
-
import { embedQuery } from "./embedder.js";
|
|
3
|
-
import { findIndexedAncestor, search } from "./store.js";
|
|
4
|
-
export async function searchCommand(query, cwd, opts) {
|
|
5
|
-
// Auto-detect indexed parent and use subdirectory as prefix
|
|
6
|
-
let searchCwd = cwd;
|
|
7
|
-
let filePrefix = opts.filePrefix;
|
|
8
|
-
const ancestor = findIndexedAncestor(cwd);
|
|
9
|
-
if (ancestor && ancestor.prefix) {
|
|
10
|
-
searchCwd = ancestor.root;
|
|
11
|
-
// Combine auto-detected prefix with explicit --file-prefix
|
|
12
|
-
filePrefix = filePrefix
|
|
13
|
-
? `${ancestor.prefix}/${filePrefix}`
|
|
14
|
-
: ancestor.prefix;
|
|
15
|
-
}
|
|
16
|
-
const config = loadConfig(searchCwd);
|
|
17
|
-
const limit = opts.limit ?? 25;
|
|
18
|
-
let queryVector = await embedQuery(query, config);
|
|
19
|
-
// Subtract the --not vector to push away from unwanted results
|
|
20
|
-
if (opts.not) {
|
|
21
|
-
const notVector = await embedQuery(opts.not, config);
|
|
22
|
-
queryVector = queryVector.map((v, i) => v - notVector[i] * 0.5);
|
|
23
|
-
}
|
|
24
|
-
let results = await search(queryVector, searchCwd, limit, filePrefix);
|
|
25
|
-
if (opts.minScore != null) {
|
|
26
|
-
results = results.filter((r) => r.score >= opts.minScore);
|
|
27
|
-
}
|
|
28
|
-
if (results.length === 0) {
|
|
29
|
-
console.log("No results found.");
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
if (opts.compact) {
|
|
33
|
-
printCompact(results);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
printFull(results, opts.scores);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
function printCompact(results) {
|
|
40
|
-
const seen = new Set();
|
|
41
|
-
for (const r of results) {
|
|
42
|
-
if (!seen.has(r.filePath)) {
|
|
43
|
-
seen.add(r.filePath);
|
|
44
|
-
console.log(r.filePath);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function printFull(results, showScores = false) {
|
|
49
|
-
for (const r of results) {
|
|
50
|
-
const header = `${r.filePath}:${r.startLine}-${r.endLine} [${r.type}] ${r.name}`;
|
|
51
|
-
const score = showScores ? ` (score: ${r.score.toFixed(3)})` : "";
|
|
52
|
-
console.log(`\n${"─".repeat(60)}`);
|
|
53
|
-
console.log(`${header}${score}`);
|
|
54
|
-
console.log(`${"─".repeat(60)}`);
|
|
55
|
-
console.log(r.context);
|
|
56
|
-
console.log();
|
|
57
|
-
console.log(r.content);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=search-cmd.js.map
|
package/dist/search-cmd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-cmd.js","sourceRoot":"","sources":["../src/search-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/serve-cmd.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function serveCommand(cwd: string): Promise<void>;
|
package/dist/serve-cmd.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { watch } from "node:fs";
|
|
2
|
-
import { readFileSync, writeFileSync, unlinkSync, existsSync } from "node:fs";
|
|
3
|
-
import { join, extname } from "node:path";
|
|
4
|
-
import { statSync as fstatSync } from "node:fs";
|
|
5
|
-
import { getDbPath, findIndexedAncestor } from "./store.js";
|
|
6
|
-
import { CODE_EXTENSIONS, DEFAULT_IGNORE } from "./walker.js";
|
|
7
|
-
import { indexCommand } from "./index-cmd.js";
|
|
8
|
-
import ignore from "ignore";
|
|
9
|
-
const DEBOUNCE_MS = 2000;
|
|
10
|
-
function getLockPath(cwd) {
|
|
11
|
-
return `${getDbPath(cwd)}.lock`;
|
|
12
|
-
}
|
|
13
|
-
function isProcessAlive(pid) {
|
|
14
|
-
try {
|
|
15
|
-
process.kill(pid, 0);
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function acquireLock(cwd) {
|
|
23
|
-
const lockPath = getLockPath(cwd);
|
|
24
|
-
if (existsSync(lockPath)) {
|
|
25
|
-
try {
|
|
26
|
-
const pid = Number.parseInt(readFileSync(lockPath, "utf-8").trim(), 10);
|
|
27
|
-
if (isProcessAlive(pid)) {
|
|
28
|
-
return false; // already running
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// stale/corrupt lock, take over
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
writeFileSync(lockPath, `${process.pid}\n`);
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
function releaseLock(cwd) {
|
|
39
|
-
try {
|
|
40
|
-
unlinkSync(getLockPath(cwd));
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// ignore
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function log(msg) {
|
|
47
|
-
console.log(`[${new Date().toISOString()}] ${msg}`);
|
|
48
|
-
}
|
|
49
|
-
export async function serveCommand(cwd) {
|
|
50
|
-
// Require an existing index
|
|
51
|
-
const ancestor = findIndexedAncestor(cwd);
|
|
52
|
-
if (!ancestor) {
|
|
53
|
-
const dbPath = getDbPath(cwd);
|
|
54
|
-
try {
|
|
55
|
-
fstatSync(dbPath);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
console.error("No index found. Run `lmgrep index` first.");
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (!acquireLock(cwd)) {
|
|
63
|
-
log("Already running for this project.");
|
|
64
|
-
process.exit(0);
|
|
65
|
-
}
|
|
66
|
-
// Clean up lock on exit
|
|
67
|
-
const cleanup = () => releaseLock(cwd);
|
|
68
|
-
process.on("exit", cleanup);
|
|
69
|
-
process.on("SIGINT", () => {
|
|
70
|
-
cleanup();
|
|
71
|
-
process.exit(0);
|
|
72
|
-
});
|
|
73
|
-
process.on("SIGTERM", () => {
|
|
74
|
-
cleanup();
|
|
75
|
-
process.exit(0);
|
|
76
|
-
});
|
|
77
|
-
// Initial index
|
|
78
|
-
log("Running initial index...");
|
|
79
|
-
await indexCommand(cwd, {});
|
|
80
|
-
// Build ignore filter
|
|
81
|
-
const ig = ignore();
|
|
82
|
-
ig.add(DEFAULT_IGNORE);
|
|
83
|
-
const gitignorePath = join(cwd, ".gitignore");
|
|
84
|
-
if (existsSync(gitignorePath)) {
|
|
85
|
-
ig.add(readFileSync(gitignorePath, "utf-8"));
|
|
86
|
-
}
|
|
87
|
-
const lmgrepIgnorePath = join(cwd, ".lmgrepignore");
|
|
88
|
-
if (existsSync(lmgrepIgnorePath)) {
|
|
89
|
-
ig.add(readFileSync(lmgrepIgnorePath, "utf-8"));
|
|
90
|
-
}
|
|
91
|
-
// Watch for changes
|
|
92
|
-
let debounceTimer;
|
|
93
|
-
let indexing = false;
|
|
94
|
-
let pendingReindex = false;
|
|
95
|
-
function scheduleIndex() {
|
|
96
|
-
if (debounceTimer)
|
|
97
|
-
clearTimeout(debounceTimer);
|
|
98
|
-
debounceTimer = setTimeout(async () => {
|
|
99
|
-
if (indexing) {
|
|
100
|
-
pendingReindex = true;
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
indexing = true;
|
|
104
|
-
try {
|
|
105
|
-
log("Changes detected, re-indexing...");
|
|
106
|
-
await indexCommand(cwd, {});
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
log(`Index error: ${err instanceof Error ? err.message : err}`);
|
|
110
|
-
}
|
|
111
|
-
finally {
|
|
112
|
-
indexing = false;
|
|
113
|
-
if (pendingReindex) {
|
|
114
|
-
pendingReindex = false;
|
|
115
|
-
scheduleIndex();
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}, DEBOUNCE_MS);
|
|
119
|
-
}
|
|
120
|
-
log("Watching for changes...");
|
|
121
|
-
watch(cwd, { recursive: true }, (_event, filename) => {
|
|
122
|
-
if (!filename)
|
|
123
|
-
return;
|
|
124
|
-
// Filter: code extensions only
|
|
125
|
-
const ext = extname(filename);
|
|
126
|
-
if (!CODE_EXTENSIONS.has(ext))
|
|
127
|
-
return;
|
|
128
|
-
// Filter: not ignored
|
|
129
|
-
try {
|
|
130
|
-
if (ig.ignores(filename))
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
scheduleIndex();
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=serve-cmd.js.map
|
package/dist/serve-cmd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-cmd.js","sourceRoot":"","sources":["../src/serve-cmd.ts"],"names":[],"mappings":"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"}
|