sverklo 0.2.13 → 0.2.15

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 (46) hide show
  1. package/dist/src/indexer/indexer-provider-integration.test.d.ts +1 -0
  2. package/dist/src/indexer/indexer-provider-integration.test.js +142 -0
  3. package/dist/src/indexer/indexer-provider-integration.test.js.map +1 -0
  4. package/dist/src/indexer/indexer.d.ts +34 -0
  5. package/dist/src/indexer/indexer.js +107 -6
  6. package/dist/src/indexer/indexer.js.map +1 -1
  7. package/dist/src/indexer/migration.test.d.ts +1 -0
  8. package/dist/src/indexer/migration.test.js +144 -0
  9. package/dist/src/indexer/migration.test.js.map +1 -0
  10. package/dist/src/indexer/parser.js +13 -1
  11. package/dist/src/indexer/parser.js.map +1 -1
  12. package/dist/src/indexer/parser.test.d.ts +1 -0
  13. package/dist/src/indexer/parser.test.js +128 -0
  14. package/dist/src/indexer/parser.test.js.map +1 -0
  15. package/dist/src/indexer/symbol-extractor.js +17 -5
  16. package/dist/src/indexer/symbol-extractor.js.map +1 -1
  17. package/dist/src/indexer/symbol-extractor.test.d.ts +1 -0
  18. package/dist/src/indexer/symbol-extractor.test.js +88 -0
  19. package/dist/src/indexer/symbol-extractor.test.js.map +1 -0
  20. package/dist/src/search/hybrid-search.js +2 -2
  21. package/dist/src/search/hybrid-search.js.map +1 -1
  22. package/dist/src/search/hybrid-search.test.js +3 -0
  23. package/dist/src/search/hybrid-search.test.js.map +1 -1
  24. package/dist/src/search/token-budget.js +33 -5
  25. package/dist/src/search/token-budget.js.map +1 -1
  26. package/dist/src/server/tools/find-references.d.ts +4 -0
  27. package/dist/src/server/tools/find-references.js +46 -6
  28. package/dist/src/server/tools/find-references.js.map +1 -1
  29. package/dist/src/server/tools/find-references.test.d.ts +1 -0
  30. package/dist/src/server/tools/find-references.test.js +98 -0
  31. package/dist/src/server/tools/find-references.test.js.map +1 -0
  32. package/dist/src/server/tools/index-status.js +13 -13
  33. package/dist/src/server/tools/index-status.js.map +1 -1
  34. package/dist/src/server/tools/lookup.js +9 -0
  35. package/dist/src/server/tools/lookup.js.map +1 -1
  36. package/dist/src/server/tools/lookup.test.d.ts +1 -0
  37. package/dist/src/server/tools/lookup.test.js +110 -0
  38. package/dist/src/server/tools/lookup.test.js.map +1 -0
  39. package/dist/src/server/tools/recall.js +2 -2
  40. package/dist/src/server/tools/recall.js.map +1 -1
  41. package/dist/src/server/tools/remember.js +2 -2
  42. package/dist/src/server/tools/remember.js.map +1 -1
  43. package/dist/src/storage/database.d.ts +13 -0
  44. package/dist/src/storage/database.js +47 -0
  45. package/dist/src/storage/database.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } 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.js";
6
+ import { getProjectConfig } from "../utils/config.js";
7
+ // Integration test that would have caught the issue #9 wiring gap:
8
+ // the provider factory existed and its unit tests passed, but the
9
+ // Indexer never actually called the factory — it imported legacyEmbed
10
+ // directly from ./embedder.js and used it everywhere. Users setting
11
+ // SVERKLO_EMBEDDING_PROVIDER=openai silently got the bundled ONNX
12
+ // model and no visible error.
13
+ //
14
+ // The fix was to lazily initialize the provider on the first index()
15
+ // call and expose it via `indexer.embed()` / `indexer.embeddingProviderName`.
16
+ // These tests lock that wiring in so a refactor can't silently break
17
+ // it again.
18
+ //
19
+ // We don't hit real OpenAI / Ollama endpoints here. The point isn't
20
+ // to prove the providers work (their own unit tests do that). The
21
+ // point is to prove the indexer *uses* whichever provider the env
22
+ // vars selected, instead of always defaulting.
23
+ describe("Indexer + embedding provider integration", () => {
24
+ let tmpRoot;
25
+ const originalEnv = { ...process.env };
26
+ beforeEach(() => {
27
+ tmpRoot = mkdtempSync(join(tmpdir(), "sverklo-provider-int-"));
28
+ mkdirSync(join(tmpRoot, "src"), { recursive: true });
29
+ writeFileSync(join(tmpRoot, "src", "a.ts"), "export function hello() { return 'world'; }\n", "utf-8");
30
+ });
31
+ afterEach(() => {
32
+ try {
33
+ rmSync(tmpRoot, { recursive: true, force: true });
34
+ }
35
+ catch { }
36
+ // Restore env so tests don't leak into each other.
37
+ for (const key of Object.keys(process.env)) {
38
+ if (key.startsWith("SVERKLO_") && !(key in originalEnv)) {
39
+ delete process.env[key];
40
+ }
41
+ }
42
+ for (const [k, v] of Object.entries(originalEnv)) {
43
+ if (k.startsWith("SVERKLO_"))
44
+ process.env[k] = v;
45
+ }
46
+ });
47
+ it("defaults to the bundled provider when no env var is set", async () => {
48
+ delete process.env.SVERKLO_EMBEDDING_PROVIDER;
49
+ const indexer = new Indexer(getProjectConfig(tmpRoot));
50
+ try {
51
+ await indexer.index();
52
+ expect(indexer.embeddingProviderName).toBe("default");
53
+ expect(indexer.embeddingDimensions).toBe(384);
54
+ }
55
+ finally {
56
+ indexer.close();
57
+ }
58
+ });
59
+ it("selects the OpenAI provider when SVERKLO_EMBEDDING_PROVIDER=openai and key is set", async () => {
60
+ // We can't actually call OpenAI in a test — patch fetch to a
61
+ // deterministic stub so the provider init succeeds. The indexer
62
+ // then commits to the openai provider for the rest of its life.
63
+ process.env.SVERKLO_EMBEDDING_PROVIDER = "openai";
64
+ process.env.SVERKLO_OPENAI_API_KEY = "sk-test";
65
+ // Mock fetch so the embedder calls look successful and return
66
+ // the right number of dimensions per request.
67
+ const originalFetch = global.fetch;
68
+ global.fetch = vi.fn(async (_url, init) => {
69
+ const body = JSON.parse(init.body);
70
+ const input = Array.isArray(body.input) ? body.input : [body.input];
71
+ return new Response(JSON.stringify({
72
+ data: input.map((_, i) => ({
73
+ index: i,
74
+ embedding: new Array(1536).fill(0),
75
+ })),
76
+ }), { status: 200 });
77
+ });
78
+ try {
79
+ const indexer = new Indexer(getProjectConfig(tmpRoot));
80
+ try {
81
+ await indexer.index();
82
+ expect(indexer.embeddingProviderName).toContain("openai");
83
+ expect(indexer.embeddingDimensions).toBe(1536);
84
+ }
85
+ finally {
86
+ indexer.close();
87
+ }
88
+ }
89
+ finally {
90
+ global.fetch = originalFetch;
91
+ }
92
+ });
93
+ it("falls back to default when OpenAI is requested but the API key is missing", async () => {
94
+ process.env.SVERKLO_EMBEDDING_PROVIDER = "openai";
95
+ delete process.env.SVERKLO_OPENAI_API_KEY;
96
+ const indexer = new Indexer(getProjectConfig(tmpRoot));
97
+ try {
98
+ await indexer.index();
99
+ // Factory init() throws on missing key → factory falls back to
100
+ // default. The whole point of the wiring is that this fallback
101
+ // is visible, not silent.
102
+ expect(indexer.embeddingProviderName).toBe("default");
103
+ }
104
+ finally {
105
+ indexer.close();
106
+ }
107
+ });
108
+ it("initializes the provider lazily on first embed() if index() hasn't run yet", async () => {
109
+ delete process.env.SVERKLO_EMBEDDING_PROVIDER;
110
+ const indexer = new Indexer(getProjectConfig(tmpRoot));
111
+ try {
112
+ // Call embed() without first calling index(). The embed method
113
+ // should fall back to the legacy path and still return vectors
114
+ // — this covers agents that hit search/recall before the first
115
+ // index cycle completes.
116
+ const vecs = await indexer.embed(["hello world"]);
117
+ expect(Array.isArray(vecs)).toBe(true);
118
+ expect(vecs.length).toBe(1);
119
+ expect(vecs[0]).toBeInstanceOf(Float32Array);
120
+ }
121
+ finally {
122
+ indexer.close();
123
+ }
124
+ });
125
+ it("reuses the same provider across multiple index() calls", async () => {
126
+ delete process.env.SVERKLO_EMBEDDING_PROVIDER;
127
+ const indexer = new Indexer(getProjectConfig(tmpRoot));
128
+ try {
129
+ await indexer.index();
130
+ const firstName = indexer.embeddingProviderName;
131
+ // Write a new file and reindex
132
+ writeFileSync(join(tmpRoot, "src", "b.ts"), "export function goodbye() { return 'world'; }\n", "utf-8");
133
+ await indexer.index();
134
+ // Provider identity stays stable — reindex should not reselect.
135
+ expect(indexer.embeddingProviderName).toBe(firstName);
136
+ }
137
+ finally {
138
+ indexer.close();
139
+ }
140
+ });
141
+ });
142
+ //# sourceMappingURL=indexer-provider-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer-provider-integration.test.js","sourceRoot":"","sources":["../../../src/indexer/indexer-provider-integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,mEAAmE;AACnE,kEAAkE;AAClE,sEAAsE;AACtE,oEAAoE;AACpE,kEAAkE;AAClE,8BAA8B;AAC9B,EAAE;AACF,qEAAqE;AACrE,8EAA8E;AAC9E,qEAAqE;AACrE,YAAY;AACZ,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,kEAAkE;AAClE,+CAA+C;AAE/C,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,IAAI,OAAe,CAAC;IACpB,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAC5B,+CAA+C,EAC/C,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,mDAAmD;QACnD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC;gBACxD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,6DAA6D;QAC7D,gEAAgE;QAChE,gEAAgE;QAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,QAAQ,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAE/C,8DAA8D;QAC9D,8CAA8C;QAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAa,EAAE,IAAc,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAyB,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,KAAK,GAAa,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9E,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzB,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;iBACnC,CAAC,CAAC;aACJ,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC,CAA4B,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC1D,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,QAAQ,CAAC;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,+DAA+D;YAC/D,+DAA+D;YAC/D,0BAA0B;YAC1B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAC/D,yBAAyB;YACzB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAEhD,+BAA+B;YAC/B,aAAa,CACX,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAC5B,iDAAiD,EACjD,OAAO,CACR,CAAC;YACF,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,gEAAgE;YAChE,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -18,13 +18,47 @@ export declare class Indexer {
18
18
  memoryEmbeddingStore: MemoryEmbeddingStore;
19
19
  symbolRefStore: SymbolRefStore;
20
20
  memoryJournal: MemoryJournal;
21
+ private embeddingProvider;
21
22
  private indexing;
22
23
  private progress;
23
24
  private lastIndexedTime;
24
25
  private freshnessCache;
25
26
  private static readonly FRESHNESS_CACHE_MS;
26
27
  constructor(config: ProjectConfig);
28
+ /**
29
+ * Bring the on-disk data layer up to CURRENT_DATA_VERSION. Runs
30
+ * once on Indexer construction and is a no-op on already-current
31
+ * databases.
32
+ *
33
+ * Migrations are intentionally side-effecting on this instance's
34
+ * stores; each one should be small, deterministic, and fast.
35
+ */
36
+ private runDataMigrations;
27
37
  get rootPath(): string;
38
+ /**
39
+ * Embed a batch of texts using the selected provider. Callers should
40
+ * prefer this over importing the legacy embed() directly so that a
41
+ * single env-var change (SVERKLO_EMBEDDING_PROVIDER) actually takes
42
+ * effect across every query path.
43
+ *
44
+ * If the provider hasn't been lazily initialized yet (embed() called
45
+ * before the first index() run), we init the default provider
46
+ * synchronously via the bundled ONNX module so read-path tools like
47
+ * search / recall / remember still work during bootstrap.
48
+ */
49
+ embed(texts: string[]): Promise<Float32Array[]>;
50
+ /**
51
+ * Human-readable name of the active embedding provider. Used by
52
+ * sverklo_status and sverklo doctor to show the user which provider
53
+ * their env vars actually selected. Returns "default" if the
54
+ * provider hasn't been initialized yet.
55
+ */
56
+ get embeddingProviderName(): string;
57
+ /**
58
+ * Dimensions of the active embedding provider. Surfaced in status
59
+ * so users can spot a dimension mismatch that would require reindex.
60
+ */
61
+ get embeddingDimensions(): number;
28
62
  index(): Promise<void>;
29
63
  reindexFile(relativePath: string, absolutePath: string, language: string): Promise<void>;
30
64
  removeFile(relativePath: string): void;
@@ -1,6 +1,6 @@
1
1
  import { readFileSync, existsSync, unlinkSync } from "node:fs";
2
2
  import { createHash } from "node:crypto";
3
- import { createDatabase } from "../storage/database.js";
3
+ import { createDatabase, getDataVersion, setDataVersion, CURRENT_DATA_VERSION, } from "../storage/database.js";
4
4
  import { FileStore } from "../storage/file-store.js";
5
5
  import { ChunkStore } from "../storage/chunk-store.js";
6
6
  import { EmbeddingStore } from "../storage/embedding-store.js";
@@ -12,7 +12,8 @@ import { MemoryJournal } from "../memory/journal.js";
12
12
  import { discoverFiles } from "./file-discovery.js";
13
13
  import { parseFile } from "./parser.js";
14
14
  import { describeChunk } from "./describer.js";
15
- import { embed, initEmbedder } from "./embedder.js";
15
+ import { embed as legacyEmbed, initEmbedder } from "./embedder.js";
16
+ import { createEmbeddingProvider, } from "./embedding-providers.js";
16
17
  import { buildGraph } from "./graph-builder.js";
17
18
  import { extractReferences } from "./symbol-extractor.js";
18
19
  import { createIgnoreFilter } from "../utils/ignore.js";
@@ -30,6 +31,12 @@ export class Indexer {
30
31
  memoryEmbeddingStore;
31
32
  symbolRefStore;
32
33
  memoryJournal;
34
+ // Issue #9 wiring (caught during dogfood session, 2026-04-08):
35
+ // The pluggable provider factory existed but the indexer was still
36
+ // calling the bundled ONNX embed() directly, so SVERKLO_EMBEDDING_PROVIDER
37
+ // had no effect. We lazily select a provider on the first index() call,
38
+ // then use it everywhere via the public embed() method below.
39
+ embeddingProvider = null;
33
40
  indexing = false;
34
41
  progress = { done: 0, total: 0 };
35
42
  lastIndexedTime = null;
@@ -51,21 +58,115 @@ export class Indexer {
51
58
  this.memoryEmbeddingStore = new MemoryEmbeddingStore(this.db);
52
59
  this.symbolRefStore = new SymbolRefStore(this.db);
53
60
  this.memoryJournal = new MemoryJournal(config.rootPath);
61
+ // Run any outstanding data migrations before any query code touches
62
+ // the stores. Migrations are surgical — they operate on the existing
63
+ // data and never require a full reindex — so the user sees zero
64
+ // downtime on upgrade.
65
+ this.runDataMigrations();
66
+ }
67
+ /**
68
+ * Bring the on-disk data layer up to CURRENT_DATA_VERSION. Runs
69
+ * once on Indexer construction and is a no-op on already-current
70
+ * databases.
71
+ *
72
+ * Migrations are intentionally side-effecting on this instance's
73
+ * stores; each one should be small, deterministic, and fast.
74
+ */
75
+ runDataMigrations() {
76
+ const stored = getDataVersion(this.db);
77
+ if (stored >= CURRENT_DATA_VERSION)
78
+ return;
79
+ // A fresh database has version 0 and no data yet — we'll stamp it
80
+ // below without running any migrations. Only existing data needs
81
+ // upgrading.
82
+ const chunkCount = this.chunkStore.count();
83
+ if (stored < 2 && chunkCount > 0) {
84
+ // Migration 1 → 2: re-extract symbol references from every
85
+ // existing chunk. Fixes github.com/sverklo/sverklo/issues/13
86
+ // where v0.2.13 and earlier collapsed repeat calls of the
87
+ // same symbol in one chunk to a single symbol_refs row.
88
+ //
89
+ // We drop the old symbol_refs rows and re-run extractReferences
90
+ // in-process. No file I/O, no re-parsing — just regex over the
91
+ // chunk bodies we already have in the DB.
92
+ log(`[migration] data_version ${stored} → 2: re-extracting symbol refs for ${chunkCount} chunks (fixes #13)`);
93
+ const t0 = Date.now();
94
+ this.db.exec("DELETE FROM symbol_refs");
95
+ // Pull chunks one at a time to keep memory bounded on huge repos.
96
+ const rows = this.db
97
+ .prepare("SELECT id, name, start_line, content FROM chunks")
98
+ .all();
99
+ let totalRefs = 0;
100
+ const insertTxn = this.db.transaction(() => {
101
+ for (const row of rows) {
102
+ const refs = extractReferences(row.content, row.name);
103
+ for (const ref of refs) {
104
+ this.symbolRefStore.insert(row.id, ref.name, row.start_line + ref.line);
105
+ totalRefs++;
106
+ }
107
+ }
108
+ });
109
+ insertTxn();
110
+ log(`[migration] extracted ${totalRefs} symbol refs in ${Date.now() - t0}ms`);
111
+ }
112
+ setDataVersion(this.db, CURRENT_DATA_VERSION);
54
113
  }
55
114
  get rootPath() {
56
115
  return this.config.rootPath;
57
116
  }
117
+ /**
118
+ * Embed a batch of texts using the selected provider. Callers should
119
+ * prefer this over importing the legacy embed() directly so that a
120
+ * single env-var change (SVERKLO_EMBEDDING_PROVIDER) actually takes
121
+ * effect across every query path.
122
+ *
123
+ * If the provider hasn't been lazily initialized yet (embed() called
124
+ * before the first index() run), we init the default provider
125
+ * synchronously via the bundled ONNX module so read-path tools like
126
+ * search / recall / remember still work during bootstrap.
127
+ */
128
+ async embed(texts) {
129
+ if (this.embeddingProvider) {
130
+ return this.embeddingProvider.embed(texts);
131
+ }
132
+ // Fallback: lazy-init the default provider. Happens if search /
133
+ // recall is called before index() completes.
134
+ await initEmbedder();
135
+ return legacyEmbed(texts);
136
+ }
137
+ /**
138
+ * Human-readable name of the active embedding provider. Used by
139
+ * sverklo_status and sverklo doctor to show the user which provider
140
+ * their env vars actually selected. Returns "default" if the
141
+ * provider hasn't been initialized yet.
142
+ */
143
+ get embeddingProviderName() {
144
+ return this.embeddingProvider?.name ?? "default";
145
+ }
146
+ /**
147
+ * Dimensions of the active embedding provider. Surfaced in status
148
+ * so users can spot a dimension mismatch that would require reindex.
149
+ */
150
+ get embeddingDimensions() {
151
+ return this.embeddingProvider?.dimensions ?? 384;
152
+ }
58
153
  async index() {
59
154
  if (this.indexing)
60
155
  return;
61
156
  this.indexing = true;
62
157
  // Cold-start vs refresh detection: cold start = no file records yet.
63
- // Computed before initEmbedder so we don't count model download in duration.
158
+ // Computed before provider init so we don't count model download in duration.
64
159
  const __isColdStart = this.fileStore.count() === 0;
65
160
  try {
66
161
  log(`Indexing ${this.config.rootPath}...`);
67
162
  const startTime = Date.now();
68
- await initEmbedder();
163
+ // Select the embedding provider lazily on first index. This
164
+ // reads SVERKLO_EMBEDDING_PROVIDER + related env vars and falls
165
+ // back to the bundled ONNX model on any failure. Only runs once
166
+ // per Indexer instance — subsequent index() calls reuse it.
167
+ if (!this.embeddingProvider) {
168
+ this.embeddingProvider = await createEmbeddingProvider();
169
+ }
69
170
  // 1. Discover files
70
171
  const ignoreFilter = createIgnoreFilter(this.config.rootPath);
71
172
  const files = discoverFiles(this.config.rootPath, ignoreFilter);
@@ -142,7 +243,7 @@ export class Indexer {
142
243
  for (let i = 0; i < embeddingBatch.length; i += BATCH_SIZE) {
143
244
  const batch = embeddingBatch.slice(i, i + BATCH_SIZE);
144
245
  const texts = batch.map((b) => b.text);
145
- const vectors = await embed(texts);
246
+ const vectors = await this.embed(texts);
146
247
  for (let j = 0; j < batch.length; j++) {
147
248
  this.embeddingStore.insert(batch[j].chunkId, vectors[j]);
148
249
  }
@@ -200,7 +301,7 @@ export class Indexer {
200
301
  this.symbolRefStore.insert(chunkId, ref.name, chunk.startLine + ref.line);
201
302
  }
202
303
  const embText = description + "\n" + chunk.content.slice(0, 512);
203
- const [vector] = await embed([embText]);
304
+ const [vector] = await this.embed([embText]);
204
305
  this.embeddingStore.insert(chunkId, vector);
205
306
  }
206
307
  }
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/indexer/indexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/indexer/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
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.js";
6
+ import { getProjectConfig } from "../utils/config.js";
7
+ import { createDatabase, getDataVersion, setDataVersion, CURRENT_DATA_VERSION, } from "../storage/database.js";
8
+ // Tests for the data-version migration runner (issue #13 rollout).
9
+ //
10
+ // Scenario: a user upgrades from v0.2.13 (where symbol_refs rows
11
+ // were lossy due to chunk-wide dedupe) to v0.2.14 (where the bug
12
+ // is fixed). Their existing index is still lossy until we re-extract
13
+ // references from the chunks we already have.
14
+ //
15
+ // The migration:
16
+ // 1. runs on Indexer construction if stored data_version < 2
17
+ // 2. drops all symbol_refs rows
18
+ // 3. re-runs extractReferences over every chunk.content already in the db
19
+ // 4. stamps data_version = 2 so subsequent constructions are a no-op
20
+ describe("data-version migration", () => {
21
+ let tmpRoot;
22
+ beforeEach(() => {
23
+ tmpRoot = mkdtempSync(join(tmpdir(), "sverklo-migration-"));
24
+ mkdirSync(join(tmpRoot, "src"), { recursive: true });
25
+ // A file with a symbol called twice in the same function.
26
+ // Under v0.2.13, extractReferences would produce ONE symbol_ref
27
+ // row for 'helper' from this function, not two.
28
+ //
29
+ // Note: we use `declare function` for helper rather than a real
30
+ // definition because the current chunker only chunks the first
31
+ // top-level function when a file has multiple — that's a
32
+ // separate bug worth filing, but not blocking the migration
33
+ // tests here.
34
+ writeFileSync(join(tmpRoot, "src", "a.ts"), [
35
+ "declare function helper(): number;",
36
+ "export function run() {",
37
+ " const a = helper();",
38
+ " const b = helper();",
39
+ " return a + b;",
40
+ "}",
41
+ ].join("\n"), "utf-8");
42
+ });
43
+ afterEach(() => {
44
+ try {
45
+ rmSync(tmpRoot, { recursive: true, force: true });
46
+ }
47
+ catch { }
48
+ });
49
+ it("fresh database stamps data_version = CURRENT_DATA_VERSION on first index", async () => {
50
+ const cfg = getProjectConfig(tmpRoot);
51
+ const indexer = new Indexer(cfg);
52
+ try {
53
+ await indexer.index();
54
+ const v = getDataVersion(indexer.db);
55
+ expect(v).toBe(CURRENT_DATA_VERSION);
56
+ }
57
+ finally {
58
+ indexer.close();
59
+ }
60
+ });
61
+ it("upgrading from v1 re-extracts symbol refs", async () => {
62
+ // Step 1: build an index the "old" way. We create a database,
63
+ // set data_version = 1, and insert a single lossy symbol_ref
64
+ // row for 'helper' on the first call site only. This simulates
65
+ // what v0.2.13 would have produced.
66
+ const cfg = getProjectConfig(tmpRoot);
67
+ {
68
+ const indexer = new Indexer(cfg);
69
+ await indexer.index();
70
+ indexer.close();
71
+ }
72
+ // Simulate an old (v0.2.13) index by:
73
+ // - manually deleting all symbol_refs
74
+ // - inserting ONE lossy row for helper at the first call site
75
+ // - setting data_version = 1
76
+ {
77
+ const db = createDatabase(cfg.dbPath);
78
+ db.exec("DELETE FROM symbol_refs");
79
+ // Find the chunk id of the `run` function
80
+ const runChunk = db
81
+ .prepare("SELECT id FROM chunks WHERE name = 'run'")
82
+ .get();
83
+ if (runChunk) {
84
+ db.prepare("INSERT INTO symbol_refs (source_chunk_id, target_name, line) VALUES (?, ?, ?)").run(runChunk.id, "helper", 2);
85
+ }
86
+ setDataVersion(db, 1);
87
+ db.close();
88
+ }
89
+ // Step 2: open the index with a new Indexer. The migration
90
+ // should run and re-extract all references.
91
+ const indexer2 = new Indexer(cfg);
92
+ try {
93
+ const db = indexer2.db;
94
+ // data_version should now be CURRENT
95
+ expect(getDataVersion(db)).toBe(CURRENT_DATA_VERSION);
96
+ // symbol_refs should now include BOTH helper calls, not just one
97
+ const helperRefs = db
98
+ .prepare("SELECT COUNT(*) as c FROM symbol_refs WHERE target_name = 'helper'")
99
+ .get();
100
+ expect(helperRefs.c).toBeGreaterThanOrEqual(2);
101
+ }
102
+ finally {
103
+ indexer2.close();
104
+ }
105
+ });
106
+ it("a second Indexer construction on a current database is a no-op", async () => {
107
+ const cfg = getProjectConfig(tmpRoot);
108
+ {
109
+ const indexer = new Indexer(cfg);
110
+ await indexer.index();
111
+ indexer.close();
112
+ }
113
+ // Capture the symbol_refs count after the initial index
114
+ const db = createDatabase(cfg.dbPath);
115
+ const initial = db.prepare("SELECT COUNT(*) as c FROM symbol_refs").get().c;
116
+ db.close();
117
+ // Construct again — migration should skip
118
+ const indexer2 = new Indexer(cfg);
119
+ try {
120
+ const db2 = indexer2.db;
121
+ const after = db2.prepare("SELECT COUNT(*) as c FROM symbol_refs").get().c;
122
+ // Same count — no rebuild happened
123
+ expect(after).toBe(initial);
124
+ }
125
+ finally {
126
+ indexer2.close();
127
+ }
128
+ });
129
+ it("migration handles an empty database (no chunks) without erroring", () => {
130
+ // Case: someone installs sverklo, opens a project, but no files
131
+ // have been indexed yet. Database is empty. Migration should
132
+ // still stamp the version and return cleanly.
133
+ const cfg = getProjectConfig(tmpRoot);
134
+ const emptyIndexer = new Indexer(cfg);
135
+ try {
136
+ const db = emptyIndexer.db;
137
+ expect(getDataVersion(db)).toBe(CURRENT_DATA_VERSION);
138
+ }
139
+ finally {
140
+ emptyIndexer.close();
141
+ }
142
+ });
143
+ });
144
+ //# sourceMappingURL=migration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.test.js","sourceRoot":"","sources":["../../../src/indexer/migration.test.ts"],"names":[],"mappings":"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"}
@@ -163,7 +163,19 @@ function parseTSJS(content, lines) {
163
163
  }
164
164
  if (chunk && chunk.content.length > 10) {
165
165
  chunks.push(chunk);
166
- i = chunk.endLine; // skip past this chunk
166
+ // Issue #16: chunk.endLine is 1-indexed (set by extractChunk),
167
+ // but this loop's `i` is 0-indexed. Assigning the 1-indexed
168
+ // value meant the for-loop's `i++` skipped one line past the
169
+ // chunk. On a file with two adjacent top-level functions like
170
+ // function helper() { return 1; }
171
+ // export function run() { ... }
172
+ // that skipped line was the `function run` declaration, and
173
+ // every subsequent top-level function was missing from the
174
+ // index entirely. Every other language parser in this file
175
+ // correctly uses the 0-indexed `endLine` local. Subtract 1 so
176
+ // the next iteration's `i++` lands exactly on the line after
177
+ // the chunk.
178
+ i = chunk.endLine - 1;
167
179
  }
168
180
  }
169
181
  // If no chunks found, fall back to whole-file chunk