@mneme-ai/core 0.8.3

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 (142) hide show
  1. package/README.md +31 -0
  2. package/dist/correlate/index.d.ts +44 -0
  3. package/dist/correlate/index.d.ts.map +1 -0
  4. package/dist/correlate/index.js +21 -0
  5. package/dist/correlate/index.js.map +1 -0
  6. package/dist/enrich/index.d.ts +35 -0
  7. package/dist/enrich/index.d.ts.map +1 -0
  8. package/dist/enrich/index.js +69 -0
  9. package/dist/enrich/index.js.map +1 -0
  10. package/dist/entities/cosine-clones.d.ts +6 -0
  11. package/dist/entities/cosine-clones.d.ts.map +1 -0
  12. package/dist/entities/cosine-clones.js +142 -0
  13. package/dist/entities/cosine-clones.js.map +1 -0
  14. package/dist/entities/cosine-clones.test.d.ts +2 -0
  15. package/dist/entities/cosine-clones.test.d.ts.map +1 -0
  16. package/dist/entities/cosine-clones.test.js +109 -0
  17. package/dist/entities/cosine-clones.test.js.map +1 -0
  18. package/dist/entities/index.d.ts +74 -0
  19. package/dist/entities/index.d.ts.map +1 -0
  20. package/dist/entities/index.js +24 -0
  21. package/dist/entities/index.js.map +1 -0
  22. package/dist/entities/python-parser.d.ts +16 -0
  23. package/dist/entities/python-parser.d.ts.map +1 -0
  24. package/dist/entities/python-parser.js +248 -0
  25. package/dist/entities/python-parser.js.map +1 -0
  26. package/dist/entities/typescript-parser.d.ts +18 -0
  27. package/dist/entities/typescript-parser.d.ts.map +1 -0
  28. package/dist/entities/typescript-parser.js +220 -0
  29. package/dist/entities/typescript-parser.js.map +1 -0
  30. package/dist/entities/typescript-parser.test.d.ts +2 -0
  31. package/dist/entities/typescript-parser.test.d.ts.map +1 -0
  32. package/dist/entities/typescript-parser.test.js +103 -0
  33. package/dist/entities/typescript-parser.test.js.map +1 -0
  34. package/dist/git/blame.d.ts +9 -0
  35. package/dist/git/blame.d.ts.map +1 -0
  36. package/dist/git/blame.js +56 -0
  37. package/dist/git/blame.js.map +1 -0
  38. package/dist/git/exec.d.ts +13 -0
  39. package/dist/git/exec.d.ts.map +1 -0
  40. package/dist/git/exec.js +40 -0
  41. package/dist/git/exec.js.map +1 -0
  42. package/dist/git/github.d.ts +62 -0
  43. package/dist/git/github.d.ts.map +1 -0
  44. package/dist/git/github.js +115 -0
  45. package/dist/git/github.js.map +1 -0
  46. package/dist/git/github.test.d.ts +2 -0
  47. package/dist/git/github.test.d.ts.map +1 -0
  48. package/dist/git/github.test.js +86 -0
  49. package/dist/git/github.test.js.map +1 -0
  50. package/dist/git/gitlab.d.ts +66 -0
  51. package/dist/git/gitlab.d.ts.map +1 -0
  52. package/dist/git/gitlab.js +121 -0
  53. package/dist/git/gitlab.js.map +1 -0
  54. package/dist/git/gitlab.test.d.ts +2 -0
  55. package/dist/git/gitlab.test.d.ts.map +1 -0
  56. package/dist/git/gitlab.test.js +122 -0
  57. package/dist/git/gitlab.test.js.map +1 -0
  58. package/dist/git/index.d.ts +7 -0
  59. package/dist/git/index.d.ts.map +1 -0
  60. package/dist/git/index.js +7 -0
  61. package/dist/git/index.js.map +1 -0
  62. package/dist/git/log.d.ts +11 -0
  63. package/dist/git/log.d.ts.map +1 -0
  64. package/dist/git/log.js +107 -0
  65. package/dist/git/log.js.map +1 -0
  66. package/dist/git/log.test.d.ts +2 -0
  67. package/dist/git/log.test.d.ts.map +1 -0
  68. package/dist/git/log.test.js +88 -0
  69. package/dist/git/log.test.js.map +1 -0
  70. package/dist/git/repo.d.ts +12 -0
  71. package/dist/git/repo.d.ts.map +1 -0
  72. package/dist/git/repo.js +50 -0
  73. package/dist/git/repo.js.map +1 -0
  74. package/dist/git/repo.test.d.ts +2 -0
  75. package/dist/git/repo.test.d.ts.map +1 -0
  76. package/dist/git/repo.test.js +35 -0
  77. package/dist/git/repo.test.js.map +1 -0
  78. package/dist/index.d.ts +10 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +10 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/indexer/index.d.ts +2 -0
  83. package/dist/indexer/index.d.ts.map +1 -0
  84. package/dist/indexer/index.js +2 -0
  85. package/dist/indexer/index.js.map +1 -0
  86. package/dist/indexer/indexer.d.ts +22 -0
  87. package/dist/indexer/indexer.d.ts.map +1 -0
  88. package/dist/indexer/indexer.js +107 -0
  89. package/dist/indexer/indexer.js.map +1 -0
  90. package/dist/indexer/indexer.test.d.ts +2 -0
  91. package/dist/indexer/indexer.test.d.ts.map +1 -0
  92. package/dist/indexer/indexer.test.js +80 -0
  93. package/dist/indexer/indexer.test.js.map +1 -0
  94. package/dist/retrieve/index.d.ts +3 -0
  95. package/dist/retrieve/index.d.ts.map +1 -0
  96. package/dist/retrieve/index.js +3 -0
  97. package/dist/retrieve/index.js.map +1 -0
  98. package/dist/retrieve/rerank.d.ts +44 -0
  99. package/dist/retrieve/rerank.d.ts.map +1 -0
  100. package/dist/retrieve/rerank.js +68 -0
  101. package/dist/retrieve/rerank.js.map +1 -0
  102. package/dist/retrieve/rerank.test.d.ts +2 -0
  103. package/dist/retrieve/rerank.test.d.ts.map +1 -0
  104. package/dist/retrieve/rerank.test.js +52 -0
  105. package/dist/retrieve/rerank.test.js.map +1 -0
  106. package/dist/retrieve/search.d.ts +31 -0
  107. package/dist/retrieve/search.d.ts.map +1 -0
  108. package/dist/retrieve/search.js +170 -0
  109. package/dist/retrieve/search.js.map +1 -0
  110. package/dist/retrieve/search.test.d.ts +2 -0
  111. package/dist/retrieve/search.test.d.ts.map +1 -0
  112. package/dist/retrieve/search.test.js +105 -0
  113. package/dist/retrieve/search.test.js.map +1 -0
  114. package/dist/store/index.d.ts +3 -0
  115. package/dist/store/index.d.ts.map +1 -0
  116. package/dist/store/index.js +3 -0
  117. package/dist/store/index.js.map +1 -0
  118. package/dist/store/schema.d.ts +11 -0
  119. package/dist/store/schema.d.ts.map +1 -0
  120. package/dist/store/schema.js +129 -0
  121. package/dist/store/schema.js.map +1 -0
  122. package/dist/store/sqlite.d.ts +51 -0
  123. package/dist/store/sqlite.d.ts.map +1 -0
  124. package/dist/store/sqlite.js +262 -0
  125. package/dist/store/sqlite.js.map +1 -0
  126. package/dist/store/sqlite.test.d.ts +2 -0
  127. package/dist/store/sqlite.test.d.ts.map +1 -0
  128. package/dist/store/sqlite.test.js +128 -0
  129. package/dist/store/sqlite.test.js.map +1 -0
  130. package/dist/types.d.ts +115 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +6 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/util/index.d.ts +15 -0
  135. package/dist/util/index.d.ts.map +1 -0
  136. package/dist/util/index.js +65 -0
  137. package/dist/util/index.js.map +1 -0
  138. package/dist/util/index.test.d.ts +2 -0
  139. package/dist/util/index.test.d.ts.map +1 -0
  140. package/dist/util/index.test.js +37 -0
  141. package/dist/util/index.test.js.map +1 -0
  142. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/retrieve/search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { cosine, reciprocalRankFusion } from "./search.js";
3
+ const chunk = (id, hash = "h") => ({
4
+ id,
5
+ commitHash: hash,
6
+ kind: "subject",
7
+ text: `text-${id}`,
8
+ });
9
+ describe("cosine", () => {
10
+ it("is 1 for identical vectors", () => {
11
+ const v = Float32Array.from([1, 2, 3]);
12
+ expect(cosine(v, v)).toBeCloseTo(1, 6);
13
+ });
14
+ it("is 0 for orthogonal vectors", () => {
15
+ expect(cosine(Float32Array.from([1, 0]), Float32Array.from([0, 1]))).toBeCloseTo(0, 6);
16
+ });
17
+ it("is -1 for opposite vectors", () => {
18
+ expect(cosine(Float32Array.from([1, 1]), Float32Array.from([-1, -1]))).toBeCloseTo(-1, 6);
19
+ });
20
+ it("is invariant to magnitude", () => {
21
+ const a = Float32Array.from([1, 2, 3]);
22
+ const b = Float32Array.from([2, 4, 6]);
23
+ expect(cosine(a, b)).toBeCloseTo(1, 6);
24
+ });
25
+ it("returns 0 for zero vector (no NaN)", () => {
26
+ const a = Float32Array.from([0, 0, 0]);
27
+ const b = Float32Array.from([1, 1, 1]);
28
+ expect(cosine(a, b)).toBe(0);
29
+ });
30
+ it("returns 0 for mismatched length", () => {
31
+ const a = Float32Array.from([1, 2, 3]);
32
+ const b = Float32Array.from([1, 2]);
33
+ expect(cosine(a, b)).toBe(0);
34
+ });
35
+ it("matches hand-calculated value", () => {
36
+ // a·b = 1*4 + 2*5 = 14; |a| = √5; |b| = √41
37
+ const a = Float32Array.from([1, 2]);
38
+ const b = Float32Array.from([4, 5]);
39
+ const expected = 14 / (Math.sqrt(5) * Math.sqrt(41));
40
+ expect(cosine(a, b)).toBeCloseTo(expected, 6);
41
+ });
42
+ });
43
+ describe("reciprocalRankFusion", () => {
44
+ const cfg = { lexicalWeight: 0.5, semanticWeight: 0.5, k: 60 };
45
+ it("fuses and ranks by combined score", () => {
46
+ const lex = [
47
+ { chunk: chunk("A"), rank: 1, raw: 0 },
48
+ { chunk: chunk("B"), rank: 2, raw: 0 },
49
+ ];
50
+ const sem = [
51
+ { chunk: chunk("B"), rank: 1, raw: 0 },
52
+ { chunk: chunk("A"), rank: 2, raw: 0 },
53
+ ];
54
+ const out = reciprocalRankFusion(lex, sem, cfg);
55
+ expect(out).toHaveLength(2);
56
+ // both A and B appear in both lists; both should have equal symmetric scores
57
+ expect(out[0].score).toBeCloseTo(out[1].score, 6);
58
+ });
59
+ it("rewards results that appear in both rankings", () => {
60
+ const lex = [
61
+ { chunk: chunk("A"), rank: 1, raw: 0 },
62
+ { chunk: chunk("X"), rank: 2, raw: 0 },
63
+ ];
64
+ const sem = [
65
+ { chunk: chunk("A"), rank: 1, raw: 0 },
66
+ { chunk: chunk("Y"), rank: 2, raw: 0 },
67
+ ];
68
+ const out = reciprocalRankFusion(lex, sem, cfg);
69
+ expect(out[0].chunk.id).toBe("A");
70
+ // A is in both lists; X and Y are each only in one
71
+ const a = out.find((r) => r.chunk.id === "A");
72
+ const x = out.find((r) => r.chunk.id === "X");
73
+ expect(a.score).toBeGreaterThan(x.score);
74
+ });
75
+ it("respects asymmetric weights", () => {
76
+ const lex = [{ chunk: chunk("LEX_ONLY"), rank: 1, raw: 0 }];
77
+ const sem = [{ chunk: chunk("SEM_ONLY"), rank: 1, raw: 0 }];
78
+ const out = reciprocalRankFusion(lex, sem, {
79
+ lexicalWeight: 0.9,
80
+ semanticWeight: 0.1,
81
+ k: 60,
82
+ });
83
+ expect(out[0].chunk.id).toBe("LEX_ONLY");
84
+ });
85
+ it("returns higher score for rank 1 than rank 100 (monotonicity)", () => {
86
+ const lex = [
87
+ { chunk: chunk("FIRST"), rank: 1, raw: 0 },
88
+ { chunk: chunk("LAST"), rank: 100, raw: 0 },
89
+ ];
90
+ const out = reciprocalRankFusion(lex, [], cfg);
91
+ const first = out.find((r) => r.chunk.id === "FIRST");
92
+ const last = out.find((r) => r.chunk.id === "LAST");
93
+ expect(first.score).toBeGreaterThan(last.score);
94
+ });
95
+ it("handles empty inputs", () => {
96
+ expect(reciprocalRankFusion([], [], cfg)).toEqual([]);
97
+ });
98
+ it("k=60 (TREC default) is the standard RRF constant", () => {
99
+ const lex = [{ chunk: chunk("A"), rank: 1, raw: 0 }];
100
+ const out = reciprocalRankFusion(lex, [], { lexicalWeight: 1, semanticWeight: 0, k: 60 });
101
+ // 1 / (60 + 1) = 1/61
102
+ expect(out[0].score).toBeCloseTo(1 / 61, 6);
103
+ });
104
+ });
105
+ //# sourceMappingURL=search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/retrieve/search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./schema.js";
2
+ export * from "./sqlite.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./schema.js";
2
+ export * from "./sqlite.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Mneme storage schema.
3
+ *
4
+ * Phase 1 — commits, file_changes, chunks (with vector blob)
5
+ * Phase 2 — entities, entity_clusters
6
+ * Phase 3 — incidents, correlations
7
+ * Phase 4 — graph_snapshots (for temporal viz)
8
+ */
9
+ export declare const SCHEMA_VERSION = 1;
10
+ export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS commits (\n hash TEXT PRIMARY KEY,\n short_hash TEXT NOT NULL,\n author_name TEXT NOT NULL,\n author_email TEXT NOT NULL,\n author_date TEXT NOT NULL,\n committer_date TEXT NOT NULL,\n subject TEXT NOT NULL,\n body TEXT NOT NULL,\n parents TEXT NOT NULL,\n pr_number INTEGER,\n pr_title TEXT,\n pr_body TEXT,\n issue_refs TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_commits_author_date ON commits(author_date);\nCREATE INDEX IF NOT EXISTS idx_commits_pr ON commits(pr_number);\n\nCREATE TABLE IF NOT EXISTS file_changes (\n commit_hash TEXT NOT NULL,\n path TEXT NOT NULL,\n change_kind TEXT NOT NULL,\n insertions INTEGER NOT NULL DEFAULT 0,\n deletions INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY (commit_hash, path),\n FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS idx_file_changes_path ON file_changes(path);\n\nCREATE TABLE IF NOT EXISTS chunks (\n id TEXT PRIMARY KEY,\n commit_hash TEXT NOT NULL,\n kind TEXT NOT NULL,\n text TEXT NOT NULL,\n embedding BLOB,\n embedding_model TEXT,\n FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE\n);\nCREATE INDEX IF NOT EXISTS idx_chunks_commit ON chunks(commit_hash);\nCREATE INDEX IF NOT EXISTS idx_chunks_kind ON chunks(kind);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(\n id UNINDEXED,\n commit_hash UNINDEXED,\n text,\n tokenize = 'porter unicode61'\n);\n\n-- Phase 2: entity graph\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n name TEXT NOT NULL,\n file_path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n signature TEXT,\n language TEXT NOT NULL,\n embedding BLOB\n);\nCREATE INDEX IF NOT EXISTS idx_entities_file ON entities(file_path);\nCREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);\n\n-- Phase 3: incidents and correlations (the moat)\nCREATE TABLE IF NOT EXISTS incidents (\n id TEXT PRIMARY KEY,\n source TEXT NOT NULL,\n external_id TEXT,\n title TEXT NOT NULL,\n occurred_at TEXT NOT NULL,\n resolved_at TEXT,\n severity TEXT NOT NULL,\n affected_files TEXT,\n stack_frames TEXT,\n url TEXT,\n metadata TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_incidents_occurred ON incidents(occurred_at);\nCREATE INDEX IF NOT EXISTS idx_incidents_source ON incidents(source);\n\nCREATE TABLE IF NOT EXISTS correlations (\n id TEXT PRIMARY KEY,\n from_kind TEXT NOT NULL,\n from_id TEXT NOT NULL,\n to_kind TEXT NOT NULL,\n to_id TEXT NOT NULL,\n weight REAL NOT NULL,\n reason TEXT NOT NULL,\n evidence TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_corr_from ON correlations(from_kind, from_id);\nCREATE INDEX IF NOT EXISTS idx_corr_to ON correlations(to_kind, to_id);\n\n-- Phase 4: temporal graph snapshots\nCREATE TABLE IF NOT EXISTS graph_snapshots (\n id TEXT PRIMARY KEY,\n taken_at TEXT NOT NULL,\n payload BLOB NOT NULL\n);\n\n-- WILD #1: AI-synthesized notes for commits with poor messages.\n-- The original commit is never modified. The synthesized note is searched\n-- alongside the original chunks but always marked as kind='synthesized'\n-- so users can verify against the underlying diff.\nCREATE TABLE IF NOT EXISTS synthesized_notes (\n commit_hash TEXT PRIMARY KEY,\n note TEXT NOT NULL,\n model TEXT NOT NULL,\n diff_chars INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE\n);\n";
11
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,UAAU,i/GAsHtB,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Mneme storage schema.
3
+ *
4
+ * Phase 1 — commits, file_changes, chunks (with vector blob)
5
+ * Phase 2 — entities, entity_clusters
6
+ * Phase 3 — incidents, correlations
7
+ * Phase 4 — graph_snapshots (for temporal viz)
8
+ */
9
+ export const SCHEMA_VERSION = 1;
10
+ export const SCHEMA_SQL = `
11
+ CREATE TABLE IF NOT EXISTS meta (
12
+ key TEXT PRIMARY KEY,
13
+ value TEXT NOT NULL
14
+ );
15
+
16
+ CREATE TABLE IF NOT EXISTS commits (
17
+ hash TEXT PRIMARY KEY,
18
+ short_hash TEXT NOT NULL,
19
+ author_name TEXT NOT NULL,
20
+ author_email TEXT NOT NULL,
21
+ author_date TEXT NOT NULL,
22
+ committer_date TEXT NOT NULL,
23
+ subject TEXT NOT NULL,
24
+ body TEXT NOT NULL,
25
+ parents TEXT NOT NULL,
26
+ pr_number INTEGER,
27
+ pr_title TEXT,
28
+ pr_body TEXT,
29
+ issue_refs TEXT
30
+ );
31
+ CREATE INDEX IF NOT EXISTS idx_commits_author_date ON commits(author_date);
32
+ CREATE INDEX IF NOT EXISTS idx_commits_pr ON commits(pr_number);
33
+
34
+ CREATE TABLE IF NOT EXISTS file_changes (
35
+ commit_hash TEXT NOT NULL,
36
+ path TEXT NOT NULL,
37
+ change_kind TEXT NOT NULL,
38
+ insertions INTEGER NOT NULL DEFAULT 0,
39
+ deletions INTEGER NOT NULL DEFAULT 0,
40
+ PRIMARY KEY (commit_hash, path),
41
+ FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE
42
+ );
43
+ CREATE INDEX IF NOT EXISTS idx_file_changes_path ON file_changes(path);
44
+
45
+ CREATE TABLE IF NOT EXISTS chunks (
46
+ id TEXT PRIMARY KEY,
47
+ commit_hash TEXT NOT NULL,
48
+ kind TEXT NOT NULL,
49
+ text TEXT NOT NULL,
50
+ embedding BLOB,
51
+ embedding_model TEXT,
52
+ FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE
53
+ );
54
+ CREATE INDEX IF NOT EXISTS idx_chunks_commit ON chunks(commit_hash);
55
+ CREATE INDEX IF NOT EXISTS idx_chunks_kind ON chunks(kind);
56
+
57
+ CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
58
+ id UNINDEXED,
59
+ commit_hash UNINDEXED,
60
+ text,
61
+ tokenize = 'porter unicode61'
62
+ );
63
+
64
+ -- Phase 2: entity graph
65
+ CREATE TABLE IF NOT EXISTS entities (
66
+ id TEXT PRIMARY KEY,
67
+ kind TEXT NOT NULL,
68
+ name TEXT NOT NULL,
69
+ file_path TEXT NOT NULL,
70
+ start_line INTEGER NOT NULL,
71
+ end_line INTEGER NOT NULL,
72
+ signature TEXT,
73
+ language TEXT NOT NULL,
74
+ embedding BLOB
75
+ );
76
+ CREATE INDEX IF NOT EXISTS idx_entities_file ON entities(file_path);
77
+ CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
78
+
79
+ -- Phase 3: incidents and correlations (the moat)
80
+ CREATE TABLE IF NOT EXISTS incidents (
81
+ id TEXT PRIMARY KEY,
82
+ source TEXT NOT NULL,
83
+ external_id TEXT,
84
+ title TEXT NOT NULL,
85
+ occurred_at TEXT NOT NULL,
86
+ resolved_at TEXT,
87
+ severity TEXT NOT NULL,
88
+ affected_files TEXT,
89
+ stack_frames TEXT,
90
+ url TEXT,
91
+ metadata TEXT
92
+ );
93
+ CREATE INDEX IF NOT EXISTS idx_incidents_occurred ON incidents(occurred_at);
94
+ CREATE INDEX IF NOT EXISTS idx_incidents_source ON incidents(source);
95
+
96
+ CREATE TABLE IF NOT EXISTS correlations (
97
+ id TEXT PRIMARY KEY,
98
+ from_kind TEXT NOT NULL,
99
+ from_id TEXT NOT NULL,
100
+ to_kind TEXT NOT NULL,
101
+ to_id TEXT NOT NULL,
102
+ weight REAL NOT NULL,
103
+ reason TEXT NOT NULL,
104
+ evidence TEXT
105
+ );
106
+ CREATE INDEX IF NOT EXISTS idx_corr_from ON correlations(from_kind, from_id);
107
+ CREATE INDEX IF NOT EXISTS idx_corr_to ON correlations(to_kind, to_id);
108
+
109
+ -- Phase 4: temporal graph snapshots
110
+ CREATE TABLE IF NOT EXISTS graph_snapshots (
111
+ id TEXT PRIMARY KEY,
112
+ taken_at TEXT NOT NULL,
113
+ payload BLOB NOT NULL
114
+ );
115
+
116
+ -- WILD #1: AI-synthesized notes for commits with poor messages.
117
+ -- The original commit is never modified. The synthesized note is searched
118
+ -- alongside the original chunks but always marked as kind='synthesized'
119
+ -- so users can verify against the underlying diff.
120
+ CREATE TABLE IF NOT EXISTS synthesized_notes (
121
+ commit_hash TEXT PRIMARY KEY,
122
+ note TEXT NOT NULL,
123
+ model TEXT NOT NULL,
124
+ diff_chars INTEGER NOT NULL,
125
+ created_at TEXT NOT NULL,
126
+ FOREIGN KEY (commit_hash) REFERENCES commits(hash) ON DELETE CASCADE
127
+ );
128
+ `;
129
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHzB,CAAC"}
@@ -0,0 +1,51 @@
1
+ import Database from "better-sqlite3";
2
+ import type { Commit, CommitChunk, Entity, FileChange, Incident, Correlation } from "../types.js";
3
+ export declare class MnemeStore {
4
+ readonly dbPath: string;
5
+ readonly db: Database.Database;
6
+ constructor(dbPath: string);
7
+ close(): void;
8
+ setMeta(key: string, value: string): void;
9
+ getMeta(key: string): string | undefined;
10
+ upsertCommits(commits: Commit[]): void;
11
+ upsertFileChanges(changes: FileChange[]): void;
12
+ upsertChunks(chunks: CommitChunk[], embeddingModel?: string): void;
13
+ getCommit(hash: string): Commit | undefined;
14
+ filesForCommit(hash: string): string[];
15
+ countCommits(): number;
16
+ countChunks(): number;
17
+ countChunksWithEmbedding(): number;
18
+ /** Iterate every chunk that has an embedding. Used for in-memory cosine search. */
19
+ iterEmbeddedChunks(): Generator<{
20
+ id: string;
21
+ commitHash: string;
22
+ text: string;
23
+ kind: string;
24
+ vec: Float32Array;
25
+ }>;
26
+ ftsSearch(query: string, limit: number): Array<{
27
+ id: string;
28
+ commitHash: string;
29
+ text: string;
30
+ kind: string;
31
+ bm25: number;
32
+ }>;
33
+ upsertEntities(entities: Entity[], embeddingModel?: string): void;
34
+ countEntities(): number;
35
+ countEntitiesWithEmbedding(): number;
36
+ countEntitiesByLanguage(): Array<{
37
+ language: string;
38
+ n: number;
39
+ }>;
40
+ iterEmbeddedEntities(): Generator<Entity>;
41
+ upsertIncidents(incidents: Incident[]): void;
42
+ upsertSynthesizedNote(commitHash: string, note: string, model: string, diffChars: number): void;
43
+ getSynthesizedNote(commitHash: string): {
44
+ note: string;
45
+ model: string;
46
+ createdAt: string;
47
+ } | undefined;
48
+ countSynthesizedNotes(): number;
49
+ upsertCorrelations(correlations: Correlation[]): void;
50
+ }
51
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,WAAW,EACZ,MAAM,aAAa,CAAC;AAGrB,qBAAa,UAAU;aAGO,MAAM,EAAE,MAAM;IAF1C,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBAEH,MAAM,EAAE,MAAM;IAU1C,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOxC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IA6BtC,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAc9C,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBlE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAOtC,YAAY,IAAI,MAAM;IAKtB,WAAW,IAAI,MAAM;IAKrB,wBAAwB,IAAI,MAAM;IAOlC,mFAAmF;IAClF,kBAAkB,IAAI,SAAS,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC;IAuBnH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAuB5H,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IA0BjE,aAAa,IAAI,MAAM;IAKvB,0BAA0B,IAAI,MAAM;IAOpC,uBAAuB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAMhE,oBAAoB,IAAI,SAAS,CAAC,MAAM,CAAC;IAgC1C,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IA2B5C,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAU/F,kBAAkB,CAChB,UAAU,EAAE,MAAM,GACjB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAQjE,qBAAqB,IAAI,MAAM;IAO/B,kBAAkB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI;CAsBtD"}
@@ -0,0 +1,262 @@
1
+ import Database from "better-sqlite3";
2
+ import { existsSync, mkdirSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { SCHEMA_SQL, SCHEMA_VERSION } from "./schema.js";
5
+ export class MnemeStore {
6
+ dbPath;
7
+ db;
8
+ constructor(dbPath) {
9
+ this.dbPath = dbPath;
10
+ if (!existsSync(dirname(dbPath)))
11
+ mkdirSync(dirname(dbPath), { recursive: true });
12
+ this.db = new Database(dbPath);
13
+ this.db.pragma("journal_mode = WAL");
14
+ this.db.pragma("synchronous = NORMAL");
15
+ this.db.pragma("foreign_keys = ON");
16
+ this.db.exec(SCHEMA_SQL);
17
+ this.setMeta("schema_version", String(SCHEMA_VERSION));
18
+ }
19
+ close() {
20
+ this.db.close();
21
+ }
22
+ setMeta(key, value) {
23
+ this.db
24
+ .prepare("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)")
25
+ .run(key, value);
26
+ }
27
+ getMeta(key) {
28
+ const row = this.db.prepare("SELECT value FROM meta WHERE key = ?").get(key);
29
+ return row?.value;
30
+ }
31
+ upsertCommits(commits) {
32
+ const stmt = this.db.prepare(`
33
+ INSERT OR REPLACE INTO commits
34
+ (hash, short_hash, author_name, author_email, author_date, committer_date,
35
+ subject, body, parents, pr_number, pr_title, pr_body, issue_refs)
36
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
37
+ `);
38
+ const tx = this.db.transaction((batch) => {
39
+ for (const c of batch) {
40
+ stmt.run(c.hash, c.shortHash, c.authorName, c.authorEmail, c.authorDate, c.committerDate, c.subject, c.body, c.parents.join(" "), c.prNumber ?? null, c.prTitle ?? null, c.prBody ?? null, c.issueRefs?.length ? JSON.stringify(c.issueRefs) : null);
41
+ }
42
+ });
43
+ tx(commits);
44
+ }
45
+ upsertFileChanges(changes) {
46
+ const stmt = this.db.prepare(`
47
+ INSERT OR REPLACE INTO file_changes
48
+ (commit_hash, path, change_kind, insertions, deletions)
49
+ VALUES (?, ?, ?, ?, ?)
50
+ `);
51
+ const tx = this.db.transaction((batch) => {
52
+ for (const c of batch) {
53
+ stmt.run(c.commitHash, c.path, c.changeKind, c.insertions, c.deletions);
54
+ }
55
+ });
56
+ tx(changes);
57
+ }
58
+ upsertChunks(chunks, embeddingModel) {
59
+ const stmt = this.db.prepare(`
60
+ INSERT OR REPLACE INTO chunks
61
+ (id, commit_hash, kind, text, embedding, embedding_model)
62
+ VALUES (?, ?, ?, ?, ?, ?)
63
+ `);
64
+ const ftsDel = this.db.prepare("DELETE FROM chunks_fts WHERE id = ?");
65
+ const ftsIns = this.db.prepare("INSERT INTO chunks_fts (id, commit_hash, text) VALUES (?, ?, ?)");
66
+ const tx = this.db.transaction((batch) => {
67
+ for (const c of batch) {
68
+ const buf = c.embedding ? Buffer.from(c.embedding.buffer.slice(0)) : null;
69
+ stmt.run(c.id, c.commitHash, c.kind, c.text, buf, embeddingModel ?? null);
70
+ ftsDel.run(c.id);
71
+ ftsIns.run(c.id, c.commitHash, c.text);
72
+ }
73
+ });
74
+ tx(chunks);
75
+ }
76
+ getCommit(hash) {
77
+ const row = this.db.prepare("SELECT * FROM commits WHERE hash = ?").get(hash);
78
+ if (!row)
79
+ return undefined;
80
+ return rawToCommit(row, this.filesForCommit(hash));
81
+ }
82
+ filesForCommit(hash) {
83
+ const rows = this.db
84
+ .prepare("SELECT path FROM file_changes WHERE commit_hash = ?")
85
+ .all(hash);
86
+ return rows.map((r) => r.path);
87
+ }
88
+ countCommits() {
89
+ const row = this.db.prepare("SELECT COUNT(*) AS n FROM commits").get();
90
+ return row.n;
91
+ }
92
+ countChunks() {
93
+ const row = this.db.prepare("SELECT COUNT(*) AS n FROM chunks").get();
94
+ return row.n;
95
+ }
96
+ countChunksWithEmbedding() {
97
+ const row = this.db
98
+ .prepare("SELECT COUNT(*) AS n FROM chunks WHERE embedding IS NOT NULL")
99
+ .get();
100
+ return row.n;
101
+ }
102
+ /** Iterate every chunk that has an embedding. Used for in-memory cosine search. */
103
+ *iterEmbeddedChunks() {
104
+ const rows = this.db
105
+ .prepare("SELECT id, commit_hash, kind, text, embedding FROM chunks WHERE embedding IS NOT NULL")
106
+ .iterate();
107
+ for (const r of rows) {
108
+ yield {
109
+ id: r.id,
110
+ commitHash: r.commit_hash,
111
+ kind: r.kind,
112
+ text: r.text,
113
+ vec: bufToFloat32(r.embedding),
114
+ };
115
+ }
116
+ }
117
+ ftsSearch(query, limit) {
118
+ const sanitized = sanitizeFts(query);
119
+ if (!sanitized)
120
+ return [];
121
+ const rows = this.db
122
+ .prepare(`SELECT c.id AS id, c.commit_hash AS commitHash, c.text AS text, c.kind AS kind,
123
+ bm25(chunks_fts) AS bm25
124
+ FROM chunks_fts
125
+ JOIN chunks c ON c.id = chunks_fts.id
126
+ WHERE chunks_fts MATCH ?
127
+ ORDER BY bm25 ASC
128
+ LIMIT ?`)
129
+ .all(sanitized, limit);
130
+ return rows;
131
+ }
132
+ upsertEntities(entities, embeddingModel) {
133
+ const stmt = this.db.prepare(`
134
+ INSERT OR REPLACE INTO entities
135
+ (id, kind, name, file_path, start_line, end_line, signature, language, embedding)
136
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
137
+ `);
138
+ const tx = this.db.transaction((batch) => {
139
+ for (const e of batch) {
140
+ const buf = e.embedding ? Buffer.from(e.embedding.buffer.slice(0)) : null;
141
+ stmt.run(e.id, e.kind, e.name, e.filePath, e.startLine, e.endLine, e.signature ?? null, e.language, buf);
142
+ }
143
+ });
144
+ tx(entities);
145
+ if (embeddingModel)
146
+ this.setMeta("entity_embedder", embeddingModel);
147
+ }
148
+ countEntities() {
149
+ const row = this.db.prepare("SELECT COUNT(*) AS n FROM entities").get();
150
+ return row.n;
151
+ }
152
+ countEntitiesWithEmbedding() {
153
+ const row = this.db
154
+ .prepare("SELECT COUNT(*) AS n FROM entities WHERE embedding IS NOT NULL")
155
+ .get();
156
+ return row.n;
157
+ }
158
+ countEntitiesByLanguage() {
159
+ return this.db
160
+ .prepare("SELECT language, COUNT(*) AS n FROM entities GROUP BY language ORDER BY n DESC")
161
+ .all();
162
+ }
163
+ *iterEmbeddedEntities() {
164
+ const rows = this.db
165
+ .prepare(`SELECT id, kind, name, file_path, start_line, end_line, signature, language, embedding
166
+ FROM entities WHERE embedding IS NOT NULL`)
167
+ .iterate();
168
+ for (const r of rows) {
169
+ yield {
170
+ id: r.id,
171
+ kind: r.kind,
172
+ name: r.name,
173
+ filePath: r.file_path,
174
+ startLine: r.start_line,
175
+ endLine: r.end_line,
176
+ signature: r.signature ?? undefined,
177
+ language: r.language,
178
+ embedding: bufToFloat32(r.embedding),
179
+ };
180
+ }
181
+ }
182
+ upsertIncidents(incidents) {
183
+ const stmt = this.db.prepare(`
184
+ INSERT OR REPLACE INTO incidents
185
+ (id, source, external_id, title, occurred_at, resolved_at, severity,
186
+ affected_files, stack_frames, url, metadata)
187
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
188
+ `);
189
+ const tx = this.db.transaction((batch) => {
190
+ for (const i of batch) {
191
+ stmt.run(i.id, i.source, i.externalId ?? null, i.title, i.occurredAt, i.resolvedAt ?? null, i.severity, i.affectedFiles?.length ? JSON.stringify(i.affectedFiles) : null, i.stackFrames?.length ? JSON.stringify(i.stackFrames) : null, i.url ?? null, i.metadata ? JSON.stringify(i.metadata) : null);
192
+ }
193
+ });
194
+ tx(incidents);
195
+ }
196
+ upsertSynthesizedNote(commitHash, note, model, diffChars) {
197
+ this.db
198
+ .prepare(`INSERT OR REPLACE INTO synthesized_notes
199
+ (commit_hash, note, model, diff_chars, created_at)
200
+ VALUES (?, ?, ?, ?, ?)`)
201
+ .run(commitHash, note, model, diffChars, new Date().toISOString());
202
+ }
203
+ getSynthesizedNote(commitHash) {
204
+ const row = this.db
205
+ .prepare("SELECT note, model, created_at FROM synthesized_notes WHERE commit_hash = ?")
206
+ .get(commitHash);
207
+ if (!row)
208
+ return undefined;
209
+ return { note: row.note, model: row.model, createdAt: row.created_at };
210
+ }
211
+ countSynthesizedNotes() {
212
+ const row = this.db
213
+ .prepare("SELECT COUNT(*) AS n FROM synthesized_notes")
214
+ .get();
215
+ return row.n;
216
+ }
217
+ upsertCorrelations(correlations) {
218
+ const stmt = this.db.prepare(`
219
+ INSERT OR REPLACE INTO correlations
220
+ (id, from_kind, from_id, to_kind, to_id, weight, reason, evidence)
221
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
222
+ `);
223
+ const tx = this.db.transaction((batch) => {
224
+ for (const c of batch) {
225
+ stmt.run(c.id, c.fromKind, c.fromId, c.toKind, c.toId, c.weight, c.reason, c.evidence?.length ? JSON.stringify(c.evidence) : null);
226
+ }
227
+ });
228
+ tx(correlations);
229
+ }
230
+ }
231
+ function rawToCommit(r, files) {
232
+ return {
233
+ hash: r.hash,
234
+ shortHash: r.short_hash,
235
+ authorName: r.author_name,
236
+ authorEmail: r.author_email,
237
+ authorDate: r.author_date,
238
+ committerDate: r.committer_date,
239
+ subject: r.subject,
240
+ body: r.body,
241
+ parents: r.parents.split(/\s+/).filter(Boolean),
242
+ prNumber: r.pr_number ?? undefined,
243
+ prTitle: r.pr_title ?? undefined,
244
+ prBody: r.pr_body ?? undefined,
245
+ issueRefs: r.issue_refs ? JSON.parse(r.issue_refs) : undefined,
246
+ files,
247
+ };
248
+ }
249
+ function bufToFloat32(buf) {
250
+ return new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
251
+ }
252
+ function sanitizeFts(query) {
253
+ const tokens = query
254
+ .replace(/["'`]/g, " ")
255
+ .split(/\s+/)
256
+ .map((t) => t.trim())
257
+ .filter((t) => t.length >= 2);
258
+ if (!tokens.length)
259
+ return "";
260
+ return tokens.map((t) => `"${t}"`).join(" OR ");
261
+ }
262
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/store/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sqlite.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.test.d.ts","sourceRoot":"","sources":["../../src/store/sqlite.test.ts"],"names":[],"mappings":""}