@shrkcrft/embeddings 0.1.0-alpha.17 → 0.1.0-alpha.19
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/focused-context.d.ts.map +1 -1
- package/dist/focused-context.js +4 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/prune-deleted-hits.d.ts +13 -0
- package/dist/prune-deleted-hits.d.ts.map +1 -0
- package/dist/prune-deleted-hits.js +24 -0
- package/dist/semantic-index.d.ts.map +1 -1
- package/dist/semantic-index.js +19 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focused-context.d.ts","sourceRoot":"","sources":["../src/focused-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"focused-context.d.ts","sourceRoot":"","sources":["../src/focused-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAGvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,eAAe,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,EAAE,aAAa,CAAC;IACrB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF;;;;;OAKG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuHhG;AAsBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAuC1E"}
|
package/dist/focused-context.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { extractDeclarations, } from "./declaration-extractor.js";
|
|
2
|
+
import { pruneDeletedHits } from "./prune-deleted-hits.js";
|
|
2
3
|
/**
|
|
3
4
|
* Build a small, dense, task-specific context bundle using *multiple*
|
|
4
5
|
* BGE embedding cycles. The free tiny model does more work so the
|
|
@@ -26,7 +27,9 @@ export async function buildFocusedContext(opts) {
|
|
|
26
27
|
// When --since is in play we ask for a wider initial pool so the
|
|
27
28
|
// allowlist post-filter has more material to work with.
|
|
28
29
|
const initialPool = opts.pathAllowlist ? fileCandidates * 8 : fileCandidates;
|
|
29
|
-
|
|
30
|
+
// Drop deleted-file hits BEFORE extracting declarations — a stale index must
|
|
31
|
+
// not surface a file that no longer exists.
|
|
32
|
+
let fileHits = pruneDeletedHits(await opts.index.searchFiles(opts.task, initialPool), opts.cwd).hits;
|
|
30
33
|
if (opts.pathAllowlist) {
|
|
31
34
|
const allow = new Set(opts.pathAllowlist);
|
|
32
35
|
fileHits = fileHits.filter((h) => allow.has(h.path)).slice(0, fileCandidates);
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ISemanticHit } from './semantic-index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Drop semantic hits whose file is gone from disk — a stale embedding index must
|
|
4
|
+
* never suggest a deleted file (the freshness-in-the-moment guarantee for
|
|
5
|
+
* semantic retrieval, mirroring the code graph's deleted-result prune). Score
|
|
6
|
+
* order is preserved; when `k` is given the live result is capped at `k` (so an
|
|
7
|
+
* over-fetch can backfill the holes left by deleted files).
|
|
8
|
+
*/
|
|
9
|
+
export declare function pruneDeletedHits(hits: readonly ISemanticHit[], cwd: string, k?: number): {
|
|
10
|
+
hits: ISemanticHit[];
|
|
11
|
+
prunedDeleted: number;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=prune-deleted-hits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-deleted-hits.d.ts","sourceRoot":"","sources":["../src/prune-deleted-hits.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,YAAY,EAAE,EAC7B,GAAG,EAAE,MAAM,EACX,CAAC,CAAC,EAAE,MAAM,GACT;IAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAYjD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import * as nodePath from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Drop semantic hits whose file is gone from disk — a stale embedding index must
|
|
5
|
+
* never suggest a deleted file (the freshness-in-the-moment guarantee for
|
|
6
|
+
* semantic retrieval, mirroring the code graph's deleted-result prune). Score
|
|
7
|
+
* order is preserved; when `k` is given the live result is capped at `k` (so an
|
|
8
|
+
* over-fetch can backfill the holes left by deleted files).
|
|
9
|
+
*/
|
|
10
|
+
export function pruneDeletedHits(hits, cwd, k) {
|
|
11
|
+
const live = [];
|
|
12
|
+
let prunedDeleted = 0;
|
|
13
|
+
for (const h of hits) {
|
|
14
|
+
const abs = nodePath.isAbsolute(h.path) ? h.path : nodePath.join(cwd, h.path);
|
|
15
|
+
if (existsSync(abs)) {
|
|
16
|
+
if (k === undefined || live.length < k)
|
|
17
|
+
live.push(h);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
prunedDeleted += 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return { hits: live, prunedDeleted };
|
|
24
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-index.d.ts","sourceRoot":"","sources":["../src/semantic-index.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAWD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IAStB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG;IAVtB,4EAA4E;IAC5E,MAAM,CAAC,iBAAiB,EACpB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,GACxD,IAAI,CAAQ;IAEhB,OAAO,CAAC,eAAe,CAAoD;IAE3E,OAAO;WAMM,OAAO,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAgCnB,KAAK,CAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC3C,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO,GACnF,OAAO,CAAC,aAAa,CAAC;IAyCzB;;;;;;;;OAQG;IACG,OAAO,CACX,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC3C,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;KACzE,GACL,OAAO,CAAC,sBAAsB,CAAC;IAgFlC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,wBAAwB;IAoErB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"semantic-index.d.ts","sourceRoot":"","sources":["../src/semantic-index.ts"],"names":[],"mappings":"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"}
|
package/dist/semantic-index.js
CHANGED
|
@@ -318,7 +318,25 @@ export class SemanticIndex {
|
|
|
318
318
|
hits.push({ path: this.meta.paths[i], score: dot });
|
|
319
319
|
}
|
|
320
320
|
hits.sort((a, b) => b.score - a.score);
|
|
321
|
-
|
|
321
|
+
// Query-time prune: a stale index can still hold vectors for files that
|
|
322
|
+
// were deleted on disk; returning them would feed dead paths into
|
|
323
|
+
// callers (e.g. the smart-context LLM seed). Skip any hit whose file no
|
|
324
|
+
// longer exists, walking only as far down the ranked list as needed to
|
|
325
|
+
// fill `k` survivors — so this stays O(k) stats in the common case, not
|
|
326
|
+
// O(n). A genuinely-changed (but present) file still scores on its old
|
|
327
|
+
// vector and is still served; `freshnessReport` remains the staleness
|
|
328
|
+
// signal that nags for a rebuild.
|
|
329
|
+
const out = [];
|
|
330
|
+
for (const hit of hits) {
|
|
331
|
+
if (out.length >= k)
|
|
332
|
+
break;
|
|
333
|
+
const abs = nodePath.isAbsolute(hit.path)
|
|
334
|
+
? hit.path
|
|
335
|
+
: nodePath.join(this.cwd, hit.path);
|
|
336
|
+
if (existsSync(abs))
|
|
337
|
+
out.push(hit);
|
|
338
|
+
}
|
|
339
|
+
return out;
|
|
322
340
|
}
|
|
323
341
|
async embed(text) {
|
|
324
342
|
if (SemanticIndex._embedderForTests) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shrkcrft/embeddings",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.19",
|
|
4
4
|
"description": "SharkCraft local-first semantic retrieval, plan cache, declaration extractor, and task classifier.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "SharkCraft contributors",
|