sverklo 0.2.13 → 0.2.14
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/src/indexer/indexer-provider-integration.test.d.ts +1 -0
- package/dist/src/indexer/indexer-provider-integration.test.js +142 -0
- package/dist/src/indexer/indexer-provider-integration.test.js.map +1 -0
- package/dist/src/indexer/indexer.d.ts +34 -0
- package/dist/src/indexer/indexer.js +107 -6
- package/dist/src/indexer/indexer.js.map +1 -1
- package/dist/src/indexer/migration.test.d.ts +1 -0
- package/dist/src/indexer/migration.test.js +144 -0
- package/dist/src/indexer/migration.test.js.map +1 -0
- package/dist/src/indexer/symbol-extractor.js +17 -5
- package/dist/src/indexer/symbol-extractor.js.map +1 -1
- package/dist/src/indexer/symbol-extractor.test.d.ts +1 -0
- package/dist/src/indexer/symbol-extractor.test.js +88 -0
- package/dist/src/indexer/symbol-extractor.test.js.map +1 -0
- package/dist/src/search/hybrid-search.js +2 -2
- package/dist/src/search/hybrid-search.js.map +1 -1
- package/dist/src/search/hybrid-search.test.js +3 -0
- package/dist/src/search/hybrid-search.test.js.map +1 -1
- package/dist/src/search/token-budget.js +33 -5
- package/dist/src/search/token-budget.js.map +1 -1
- package/dist/src/server/tools/find-references.d.ts +4 -0
- package/dist/src/server/tools/find-references.js +46 -6
- package/dist/src/server/tools/find-references.js.map +1 -1
- package/dist/src/server/tools/find-references.test.d.ts +1 -0
- package/dist/src/server/tools/find-references.test.js +98 -0
- package/dist/src/server/tools/find-references.test.js.map +1 -0
- package/dist/src/server/tools/index-status.js +13 -13
- package/dist/src/server/tools/index-status.js.map +1 -1
- package/dist/src/server/tools/lookup.js +9 -0
- package/dist/src/server/tools/lookup.js.map +1 -1
- package/dist/src/server/tools/lookup.test.d.ts +1 -0
- package/dist/src/server/tools/lookup.test.js +110 -0
- package/dist/src/server/tools/lookup.test.js.map +1 -0
- package/dist/src/server/tools/recall.js +2 -2
- package/dist/src/server/tools/recall.js.map +1 -1
- package/dist/src/server/tools/remember.js +2 -2
- package/dist/src/server/tools/remember.js.map +1 -1
- package/dist/src/storage/database.d.ts +13 -0
- package/dist/src/storage/database.js +47 -0
- package/dist/src/storage/database.js.map +1 -1
- package/package.json +1 -1
|
@@ -35,7 +35,16 @@ export const lookupTool = {
|
|
|
35
35
|
},
|
|
36
36
|
};
|
|
37
37
|
export function handleLookup(indexer, args) {
|
|
38
|
+
// Bug A (issue #15 investigation): missing / wrong-named required
|
|
39
|
+
// params previously fell through to a SQL LIKE '%undefined%' and
|
|
40
|
+
// returned "No results found" — indistinguishable from "the symbol
|
|
41
|
+
// doesn't exist" and actively misleading. Fail loud instead so the
|
|
42
|
+
// caller knows it was their mistake, not the index's.
|
|
38
43
|
const symbol = args.symbol;
|
|
44
|
+
if (typeof symbol !== "string" || symbol.trim() === "") {
|
|
45
|
+
return ('Error: `symbol` is required. Usage: sverklo_lookup symbol:"MyClass".\n' +
|
|
46
|
+
"The tool schema names this parameter `symbol`, not `name` — common typo.");
|
|
47
|
+
}
|
|
39
48
|
const type = args.type || "any";
|
|
40
49
|
const tokenBudget = args.token_budget || 1200;
|
|
41
50
|
// Single JOIN'd query — chunks come back pre-sorted by pagerank DESC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/server/tools/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,yEAAyE;AACzE,mEAAmE;AACnE,qEAAqE;AACrE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,4HAA4H;IAC9H,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,UAAU;oBACV,OAAO;oBACP,MAAM;oBACN,WAAW;oBACX,QAAQ;oBACR,UAAU;oBACV,KAAK;iBACN;gBACD,WAAW,EAAE,uBAAuB;aACrC;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,IAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../src/server/tools/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,yEAAyE;AACzE,mEAAmE;AACnE,qEAAqE;AACrE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,4HAA4H;IAC9H,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,UAAU;oBACV,OAAO;oBACP,MAAM;oBACN,WAAW;oBACX,QAAQ;oBACR,UAAU;oBACV,KAAK;iBACN;gBACD,WAAW,EAAE,uBAAuB;aACrC;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,IAA6B;IAE7B,kEAAkE;IAClE,iEAAiE;IACjE,mEAAmE;IACnE,mEAAmE;IACnE,sDAAsD;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,OAAO,CACL,wEAAwE;YACxE,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAI,IAAI,CAAC,IAA0B,IAAI,KAAK,CAAC;IACvD,MAAM,WAAW,GAAI,IAAI,CAAC,YAAuB,IAAI,IAAI,CAAC;IAE1D,qEAAqE;IACrE,mEAAmE;IACnE,IAAI,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE9D,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,oEAAoE;IACpE,mEAAmE;IACnE,+CAA+C;IAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;IACnD,OAAO,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { Indexer } from "../../indexer/indexer.js";
|
|
6
|
+
import { getProjectConfig } from "../../utils/config.js";
|
|
7
|
+
import { handleLookup } from "./lookup.js";
|
|
8
|
+
// Regression tests for github.com/sverklo/sverklo/issues/15.
|
|
9
|
+
//
|
|
10
|
+
// Two bugs combined to silently lie about whether a symbol existed:
|
|
11
|
+
//
|
|
12
|
+
// A. Missing-required-parameter fallthrough. Calling the tool with
|
|
13
|
+
// the wrong param name (or no param) went straight to a SQL
|
|
14
|
+
// LIKE '%undefined%' which matches nothing, returning "No results
|
|
15
|
+
// found" — indistinguishable from "the symbol does not exist."
|
|
16
|
+
//
|
|
17
|
+
// B. Oversize-chunk silent drop. When a query matched both a small
|
|
18
|
+
// chunk (fits the budget) and a big one (doesn't), the big one
|
|
19
|
+
// was silently dropped. The user saw the small match and
|
|
20
|
+
// concluded the big one didn't exist. On a realistic codebase
|
|
21
|
+
// looking up a major class, this made the tool useless — the
|
|
22
|
+
// real class body is always the biggest match.
|
|
23
|
+
describe("handleLookup — issue #15 regression", () => {
|
|
24
|
+
let tmpRoot;
|
|
25
|
+
let indexer;
|
|
26
|
+
beforeEach(async () => {
|
|
27
|
+
tmpRoot = mkdtempSync(join(tmpdir(), "sverklo-lookup-"));
|
|
28
|
+
mkdirSync(join(tmpRoot, "src"), { recursive: true });
|
|
29
|
+
mkdirSync(join(tmpRoot, "test"), { recursive: true });
|
|
30
|
+
// A "big" class that exceeds the default token budget (1200).
|
|
31
|
+
// We pad the body with enough meaningful-looking code to push the
|
|
32
|
+
// chunk's estimated token count well above 1200.
|
|
33
|
+
const padLines = Array.from({ length: 200 }, (_, i) => ` method${i}(): void { return; }`).join("\n");
|
|
34
|
+
writeFileSync(join(tmpRoot, "src", "indexer.ts"), ["export class Indexer {", padLines, "}"].join("\n"), "utf-8");
|
|
35
|
+
// A "small" function that matches the same substring but fits
|
|
36
|
+
// the budget. Without the fix, this would hide the Indexer class.
|
|
37
|
+
writeFileSync(join(tmpRoot, "test", "fakes.ts"), "export function fakeIndexerWithCore() { return {}; }\n", "utf-8");
|
|
38
|
+
const cfg = getProjectConfig(tmpRoot);
|
|
39
|
+
indexer = new Indexer(cfg);
|
|
40
|
+
await indexer.index();
|
|
41
|
+
});
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
try {
|
|
44
|
+
indexer.close();
|
|
45
|
+
}
|
|
46
|
+
catch { }
|
|
47
|
+
try {
|
|
48
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
});
|
|
52
|
+
// ── Bug A ─────────────────────────────────────────────────────
|
|
53
|
+
it("returns a helpful error when `symbol` is missing (bug A)", () => {
|
|
54
|
+
const out = handleLookup(indexer, {});
|
|
55
|
+
expect(out).toContain("Error");
|
|
56
|
+
expect(out).toContain("symbol");
|
|
57
|
+
// The error should specifically mention the common typo so
|
|
58
|
+
// users don't have to read the schema.
|
|
59
|
+
expect(out).toMatch(/name.*typo|symbol.*not.*name/i);
|
|
60
|
+
});
|
|
61
|
+
it("returns a helpful error when `symbol` is an empty string (bug A)", () => {
|
|
62
|
+
const out = handleLookup(indexer, { symbol: "" });
|
|
63
|
+
expect(out).toContain("Error");
|
|
64
|
+
});
|
|
65
|
+
it("returns a helpful error when the wrong parameter name is used (bug A)", () => {
|
|
66
|
+
// Users commonly call this with `name: "Foo"` instead of
|
|
67
|
+
// `symbol: "Foo"`. Before the fix, that silently returned
|
|
68
|
+
// "No results found" — indistinguishable from a real miss.
|
|
69
|
+
const out = handleLookup(indexer, { name: "Indexer" });
|
|
70
|
+
expect(out).toContain("Error");
|
|
71
|
+
expect(out).toMatch(/name.*typo|symbol.*not.*name/i);
|
|
72
|
+
});
|
|
73
|
+
// ── Bug B ─────────────────────────────────────────────────────
|
|
74
|
+
it("surfaces oversize matches as locations, even when smaller matches fit (bug B)", () => {
|
|
75
|
+
// `Indexer` matches both: the big class (oversized) and the small
|
|
76
|
+
// fakeIndexerWithCore (fits). Before the fix, only the small one
|
|
77
|
+
// was shown and the big one was silently dropped.
|
|
78
|
+
const out = handleLookup(indexer, { symbol: "Indexer", token_budget: 1200 });
|
|
79
|
+
// The small match should be visible
|
|
80
|
+
expect(out).toContain("fakeIndexerWithCore");
|
|
81
|
+
// And the big match should ALSO be visible, at minimum as a
|
|
82
|
+
// locations-only entry pointing at indexer.ts.
|
|
83
|
+
expect(out).toContain("indexer.ts");
|
|
84
|
+
expect(out).toMatch(/class: Indexer|Indexer/);
|
|
85
|
+
// The "too large" explanation should be present so the caller
|
|
86
|
+
// knows the body was skipped on purpose, not missing.
|
|
87
|
+
expect(out).toMatch(/too large|exceed|token_budget/i);
|
|
88
|
+
});
|
|
89
|
+
it("surfaces all matches as locations when none fit", () => {
|
|
90
|
+
// With a tiny budget, nothing fits — but we still need the
|
|
91
|
+
// locations list, not "No results found."
|
|
92
|
+
const out = handleLookup(indexer, { symbol: "Indexer", token_budget: 80 });
|
|
93
|
+
expect(out).not.toBe("No results found.");
|
|
94
|
+
expect(out).toMatch(/exceed|token_budget|locations only/i);
|
|
95
|
+
expect(out).toContain("indexer.ts");
|
|
96
|
+
});
|
|
97
|
+
it("with a large budget, returns full bodies for both matches", () => {
|
|
98
|
+
const out = handleLookup(indexer, { symbol: "Indexer", token_budget: 20000 });
|
|
99
|
+
expect(out).toContain("fakeIndexerWithCore");
|
|
100
|
+
expect(out).toContain("class Indexer");
|
|
101
|
+
// With full bodies rendered, the "too large" warning should not
|
|
102
|
+
// appear.
|
|
103
|
+
expect(out).not.toMatch(/too large/i);
|
|
104
|
+
});
|
|
105
|
+
it("still returns 'No results found' when the symbol genuinely does not exist", () => {
|
|
106
|
+
const out = handleLookup(indexer, { symbol: "NonexistentSymbolXYZ" });
|
|
107
|
+
expect(out).toBe("No results found.");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=lookup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.test.js","sourceRoot":"","sources":["../../../../src/server/tools/lookup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cosineSimilarity } from "../../indexer/embedder.js";
|
|
2
2
|
import { checkStaleness } from "../../memory/staleness.js";
|
|
3
3
|
import { track } from "../../telemetry/index.js";
|
|
4
4
|
const RRF_K = 60;
|
|
@@ -97,7 +97,7 @@ export async function handleRecall(indexer, args) {
|
|
|
97
97
|
// Signal A: FTS text search
|
|
98
98
|
const ftsResults = indexer.memoryStore.searchFts(query, 30);
|
|
99
99
|
// Signal B: Vector similarity
|
|
100
|
-
const [queryVector] = await embed([query]);
|
|
100
|
+
const [queryVector] = await indexer.embed([query]);
|
|
101
101
|
const allEmbeddings = indexer.memoryEmbeddingStore.getAll();
|
|
102
102
|
const vectorScores = [];
|
|
103
103
|
for (const [memoryId, vec] of allEmbeddings) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../../src/server/tools/recall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../../src/server/tools/recall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGjD,MAAM,KAAK,GAAG,EAAE,CAAC;AAEjB,kEAAkE;AAClE,uEAAuE;AACvE,sEAAsE;AACtE,EAAE;AACF,iEAAiE;AACjE,oEAAoE;AACpE,mDAAmD;AACnD,EAAE;AACF,sEAAsE;AACtE,iEAAiE;AACjE,0DAA0D;AAC1D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,qGAAqG;QACrG,mGAAmG;QACnG,mGAAmG;QACnG,oGAAoG;QACpG,8EAA8E;IAChF,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACxE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;gBACjC,WAAW,EACT,gFAAgF;oBAChF,+CAA+C;aAClD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC;gBACnF,WAAW,EAAE,qCAAqC;aACnD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,yCAAyC;aACvD;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,IAA6B;IAE7B,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAI,IAAI,CAAC,IAAoC,IAAI,KAAK,CAAC;IACjE,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAmC,IAAI,KAAK,CAAC;IACpE,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAI,IAAI,CAAC,aAAyB,IAAI,KAAK,CAAC;IAE9D,gEAAgE;IAChE,mEAAmE;IACnE,gEAAgE;IAChE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,QAAQ,GACZ,QAAQ,KAAK,KAAK;YAChB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAE1D,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;QAE1B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CACL,uEAAuE;gBACvE,+DAA+D;gBAC/D,6DAA6D;gBAC7D,mCAAmC,CACpC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAa,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,MAAM,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,iEAAiE;QACjE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC3D,IAAI,SAAS,GAAG,oBAAoB,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CACR,MAAM,SAAS,8CAA8C,oBAAoB,IAAI;gBACnF,oFAAoF;gBACpF,sEAAsE,CACzE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,gEAAgE;IAChE,kEAAkE;IAClE,kCAAkC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CACL,8EAA8E;YAC9E,+CAA+C,CAChD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAiB,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,4BAA4B;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE5D,8BAA8B;IAC9B,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;IAC5D,MAAM,YAAY,GAA0C,EAAE,CAAC;IAE/D,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5C,aAAa;IACb,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QACpC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAwC,EAAE,CAAC;IAC3D,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,IAAI,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACjE,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,SAAS;QAEjD,yBAAyB;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7E,IAAI,KAAK;YAAE,SAAS,EAAE,CAAC;QACvB,IAAI,KAAK,IAAI,CAAC,YAAY;YAAE,SAAS;QAErC,kCAAkC;QAClC,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QACvE,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC;QAE/D,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE3D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3C,oCAAoC;IACpC,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,SAAS;IACT,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO;YACxB,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC7D,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEzC,OAAO;YACL,eAAe,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE;YAC3D,MAAM,CAAC,OAAO;YACd,IAAI,GAAG,sBAAsB,MAAM,CAAC,UAAU,gBAAgB,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YACpJ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cosineSimilarity } from "../../indexer/embedder.js";
|
|
2
2
|
import { getGitState } from "../../memory/git-state.js";
|
|
3
3
|
import { track } from "../../telemetry/index.js";
|
|
4
4
|
const CONFLICT_THRESHOLD = 0.85;
|
|
@@ -46,7 +46,7 @@ export async function handleRemember(indexer, args) {
|
|
|
46
46
|
// ─── Conflict detection ───
|
|
47
47
|
// Check for existing active memories with high semantic similarity.
|
|
48
48
|
// If same related_files or very high similarity, invalidate the old one.
|
|
49
|
-
const [queryVector] = await embed([content]);
|
|
49
|
+
const [queryVector] = await indexer.embed([content]);
|
|
50
50
|
const existingEmbeddings = indexer.memoryEmbeddingStore.getAll();
|
|
51
51
|
const conflicts = [];
|
|
52
52
|
for (const [memId, vec] of existingEmbeddings) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remember.js","sourceRoot":"","sources":["../../../../src/server/tools/remember.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"remember.js","sourceRoot":"","sources":["../../../../src/server/tools/remember.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGjD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC9D,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC;gBAC5E,WAAW,EAAE,2DAA2D;aACzE;YACD,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;YAChF,aAAa,EAAE;gBACb,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,4DAA4D;aAC1E;YACD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;YACnE,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;gBACzB,WAAW,EAAE,+DAA+D;aAC7E;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,IAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,QAAQ,GAAI,IAAI,CAAC,QAA2B,IAAI,SAAS,CAAC;IAChE,MAAM,IAAI,GAAI,IAAI,CAAC,IAAiB,IAAI,IAAI,CAAC;IAC7C,MAAM,YAAY,GAAI,IAAI,CAAC,aAA0B,IAAI,IAAI,CAAC;IAC9D,oEAAoE;IACpE,MAAM,iBAAiB,GAAG,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,MAAM,UAAU,GAAI,IAAI,CAAC,UAAqB,IAAI,iBAAiB,CAAC;IACpE,+DAA+D;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,IAA8B,CAAC;IACzD,MAAM,IAAI,GACR,YAAY;QACZ,CAAC,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtD,6BAA6B;IAC7B,oEAAoE;IACpE,yEAAyE;IACzE,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;IACjE,MAAM,SAAS,GAAyC,EAAE,CAAC;IAE3D,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,kBAAkB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW;gBAAE,SAAS;YAC3B,oCAAoC;YACpC,IAAI,WAAW,CAAC,eAAe;gBAAE,SAAS;YAE1C,gEAAgE;YAChE,MAAM,aAAa,GAAa,WAAW,CAAC,aAAa;gBACvD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC;gBACvC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,SAAS,GACb,YAAY;gBACZ,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtD,IAAI,GAAG,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CACnC,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,UAAU,EACV,GAAG,EACH,MAAM,EACN,YAAY,EACZ,IAAI,CACL,CAAC;IAEF,yEAAyE;IACzE,yCAAyC;IACzC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC7B,EAAE;QACF,OAAO;QACP,QAAQ;QACR,IAAI;QACJ,UAAU;QACV,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE,MAAM;QAClB,aAAa,EAAE,YAAY;QAC3B,IAAI;KACL,CAAC,CAAC;IAEH,+DAA+D;IAC/D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,CAAC,mBAAmB,EAAE,eAAe,QAAQ,WAAW,IAAI,GAAG,CAAC,CAAC;IAC/E,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,IAAI,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,cAAc,SAAS,CAAC,MAAM,SAAS,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/J,CAAC;IACJ,CAAC;IAED,KAAK,KAAK,CAAC,cAAc,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
import Database from "better-sqlite3";
|
|
2
|
+
export declare const CURRENT_DATA_VERSION = 2;
|
|
2
3
|
export declare function createDatabase(dbPath: string): Database.Database;
|
|
4
|
+
/**
|
|
5
|
+
* Read the stored data version. Returns 0 for fresh databases that
|
|
6
|
+
* have never been tagged, so callers can treat any version < current
|
|
7
|
+
* as "migrate me".
|
|
8
|
+
*/
|
|
9
|
+
export declare function getDataVersion(db: Database.Database): number;
|
|
10
|
+
/**
|
|
11
|
+
* Stamp the database with the current data version. Call after a
|
|
12
|
+
* migration completes (or on a fresh database after the first full
|
|
13
|
+
* index, so subsequent runs don't waste time re-migrating).
|
|
14
|
+
*/
|
|
15
|
+
export declare function setDataVersion(db: Database.Database, version: number): void;
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import Database from "better-sqlite3";
|
|
2
|
+
// Current data-layer version. Bump this when existing stored data
|
|
3
|
+
// (not just schema shape) has become incompatible with the new code.
|
|
4
|
+
// The Indexer runs data migrations on startup when the stored version
|
|
5
|
+
// is lower than this.
|
|
6
|
+
//
|
|
7
|
+
// 1 — initial. Tables as defined in SCHEMA below.
|
|
8
|
+
// 2 — fix for github.com/sverklo/sverklo/issues/13: symbol_refs
|
|
9
|
+
// generated by v0.2.13 and earlier used chunk-wide dedupe in
|
|
10
|
+
// extractReferences(), which collapsed every repeat call of a
|
|
11
|
+
// symbol in the same chunk to one row. Upgrading triggers
|
|
12
|
+
// re-extraction of references from existing chunks (no file
|
|
13
|
+
// I/O — just regex over chunk.content).
|
|
14
|
+
export const CURRENT_DATA_VERSION = 2;
|
|
2
15
|
const SCHEMA = `
|
|
3
16
|
-- Indexed files
|
|
4
17
|
CREATE TABLE IF NOT EXISTS files (
|
|
@@ -148,6 +161,15 @@ CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at);
|
|
|
148
161
|
CREATE INDEX IF NOT EXISTS idx_memories_stale ON memories(is_stale);
|
|
149
162
|
CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier);
|
|
150
163
|
CREATE INDEX IF NOT EXISTS idx_memories_valid_until ON memories(valid_until_sha);
|
|
164
|
+
|
|
165
|
+
-- Key-value metadata. Used to track the data-layer version so we can
|
|
166
|
+
-- run inline migrations when the code's expectations about stored
|
|
167
|
+
-- data drift from what's on disk. Single-row-per-key; no schema here
|
|
168
|
+
-- because values are small strings.
|
|
169
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
170
|
+
key TEXT PRIMARY KEY,
|
|
171
|
+
value TEXT NOT NULL
|
|
172
|
+
);
|
|
151
173
|
`;
|
|
152
174
|
// Additive migrations — run after SCHEMA to upgrade existing databases
|
|
153
175
|
const MIGRATIONS = [
|
|
@@ -176,4 +198,29 @@ export function createDatabase(dbPath) {
|
|
|
176
198
|
}
|
|
177
199
|
return db;
|
|
178
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Read the stored data version. Returns 0 for fresh databases that
|
|
203
|
+
* have never been tagged, so callers can treat any version < current
|
|
204
|
+
* as "migrate me".
|
|
205
|
+
*/
|
|
206
|
+
export function getDataVersion(db) {
|
|
207
|
+
try {
|
|
208
|
+
const row = db
|
|
209
|
+
.prepare("SELECT value FROM meta WHERE key = 'data_version'")
|
|
210
|
+
.get();
|
|
211
|
+
return row ? parseInt(row.value, 10) || 0 : 0;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return 0;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Stamp the database with the current data version. Call after a
|
|
219
|
+
* migration completes (or on a fresh database after the first full
|
|
220
|
+
* index, so subsequent runs don't waste time re-migrating).
|
|
221
|
+
*/
|
|
222
|
+
export function setDataVersion(db, version) {
|
|
223
|
+
db.prepare("INSERT INTO meta (key, value) VALUES ('data_version', ?) " +
|
|
224
|
+
"ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(String(version));
|
|
225
|
+
}
|
|
179
226
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,kEAAkE;AAClE,qEAAqE;AACrE,sEAAsE;AACtE,sBAAsB;AACtB,EAAE;AACF,oDAAoD;AACpD,kEAAkE;AAClE,mEAAmE;AACnE,oEAAoE;AACpE,gEAAgE;AAChE,kEAAkE;AAClE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Jd,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,GAAG;IACjB,6DAA6D;IAC7D,qDAAqD;IACrD,sDAAsD;IACtD,wDAAwD;IACxD,uDAAuD;CACxD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa;IAE/C,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,yEAAyE;IACzE,sEAAsE;IACtE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAqB;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,mDAAmD,CAAC;aAC5D,GAAG,EAAmC,CAAC;QAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAqB,EAAE,OAAe;IACnE,EAAE,CAAC,OAAO,CACR,2DAA2D;QACzD,uDAAuD,CAC1D,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sverklo",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "Sverklo — local-first code intelligence MCP server. Diff-aware MR review, risk scoring, hybrid semantic search, PageRank ranking, persistent memory. Zero config.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|