@aman_asmuei/amem 0.18.0 → 0.19.0
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/README.md +350 -485
- package/dist/ann.js +6 -4
- package/dist/ann.js.map +1 -1
- package/dist/cli.js +36 -17
- package/dist/cli.js.map +1 -1
- package/dist/database.d.ts +19 -0
- package/dist/database.js +85 -0
- package/dist/database.js.map +1 -1
- package/dist/extractor.js +10 -3
- package/dist/extractor.js.map +1 -1
- package/dist/hooks.js +12 -5
- package/dist/hooks.js.map +1 -1
- package/dist/memory.d.ts +1 -0
- package/dist/memory.js.map +1 -1
- package/dist/reflection.d.ts +82 -0
- package/dist/reflection.js +414 -0
- package/dist/reflection.js.map +1 -0
- package/dist/reflection.test.d.ts +1 -0
- package/dist/reflection.test.js +453 -0
- package/dist/reflection.test.js.map +1 -0
- package/dist/schemas.d.ts +190 -0
- package/dist/schemas.js +43 -0
- package/dist/schemas.js.map +1 -1
- package/dist/tools/advanced.js +180 -0
- package/dist/tools/advanced.js.map +1 -1
- package/dist/tools/memory.js +22 -0
- package/dist/tools/memory.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { createDatabase } from "./database.js";
|
|
3
|
+
import { reflect, isReflectionDue } from "./reflection.js";
|
|
4
|
+
// ── Test helpers ───────────────────────────────────────
|
|
5
|
+
/** Create a deterministic fake embedding from a seed string. */
|
|
6
|
+
function fakeEmbedding(seed, dims = 384) {
|
|
7
|
+
const arr = new Float32Array(dims);
|
|
8
|
+
for (let i = 0; i < dims; i++) {
|
|
9
|
+
arr[i] = Math.sin(seed.charCodeAt(i % seed.length) * (i + 1) * 0.01);
|
|
10
|
+
}
|
|
11
|
+
// Normalize to unit vector
|
|
12
|
+
let norm = 0;
|
|
13
|
+
for (let i = 0; i < dims; i++)
|
|
14
|
+
norm += arr[i] * arr[i];
|
|
15
|
+
norm = Math.sqrt(norm);
|
|
16
|
+
for (let i = 0; i < dims; i++)
|
|
17
|
+
arr[i] /= norm;
|
|
18
|
+
return arr;
|
|
19
|
+
}
|
|
20
|
+
/** Create a similar embedding by adding small noise to a base. */
|
|
21
|
+
function similarEmbedding(base, noise = 0.05) {
|
|
22
|
+
const arr = new Float32Array(base.length);
|
|
23
|
+
for (let i = 0; i < base.length; i++) {
|
|
24
|
+
arr[i] = base[i] + (Math.random() - 0.5) * noise;
|
|
25
|
+
}
|
|
26
|
+
// Normalize
|
|
27
|
+
let norm = 0;
|
|
28
|
+
for (let i = 0; i < arr.length; i++)
|
|
29
|
+
norm += arr[i] * arr[i];
|
|
30
|
+
norm = Math.sqrt(norm);
|
|
31
|
+
for (let i = 0; i < arr.length; i++)
|
|
32
|
+
arr[i] /= norm;
|
|
33
|
+
return arr;
|
|
34
|
+
}
|
|
35
|
+
function insertMemory(db, content, type, embedding, opts) {
|
|
36
|
+
return db.insertMemory({
|
|
37
|
+
content,
|
|
38
|
+
type,
|
|
39
|
+
tags: opts?.tags ?? [],
|
|
40
|
+
confidence: opts?.confidence ?? 0.8,
|
|
41
|
+
source: "test",
|
|
42
|
+
embedding,
|
|
43
|
+
scope: "global",
|
|
44
|
+
validFrom: opts?.createdAt,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// ── Tests ──────────────────────────────────────────────
|
|
48
|
+
let db;
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
db = createDatabase(":memory:");
|
|
51
|
+
});
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
db.close();
|
|
54
|
+
});
|
|
55
|
+
describe("reflect — empty database", () => {
|
|
56
|
+
it("returns empty report for empty database", () => {
|
|
57
|
+
const report = reflect(db);
|
|
58
|
+
expect(report.stats.totalMemories).toBe(0);
|
|
59
|
+
expect(report.clusters).toHaveLength(0);
|
|
60
|
+
expect(report.contradictions).toHaveLength(0);
|
|
61
|
+
expect(report.synthesisCandidates).toHaveLength(0);
|
|
62
|
+
expect(report.stats.healthScore).toBe(100);
|
|
63
|
+
expect(report.durationMs).toBeGreaterThanOrEqual(0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("reflect — clustering", () => {
|
|
67
|
+
it("groups similar memories into a cluster", () => {
|
|
68
|
+
// Create 4 memories with very similar embeddings (same seed base)
|
|
69
|
+
const base = fakeEmbedding("typescript-types");
|
|
70
|
+
insertMemory(db, "Always use strict TypeScript types", "correction", similarEmbedding(base, 0.02));
|
|
71
|
+
insertMemory(db, "Prefer strict null checks in TypeScript", "correction", similarEmbedding(base, 0.02));
|
|
72
|
+
insertMemory(db, "Use unknown instead of any in TypeScript", "correction", similarEmbedding(base, 0.02));
|
|
73
|
+
insertMemory(db, "Enable strictNullChecks in tsconfig", "pattern", similarEmbedding(base, 0.02));
|
|
74
|
+
// Create 1 unrelated memory
|
|
75
|
+
insertMemory(db, "Deploy to AWS us-east-1", "decision", fakeEmbedding("deploy-cloud"));
|
|
76
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
77
|
+
expect(report.stats.totalMemories).toBe(5);
|
|
78
|
+
// Should have at least one cluster with the TS-related memories
|
|
79
|
+
expect(report.clusters.length).toBeGreaterThanOrEqual(1);
|
|
80
|
+
const tsCluster = report.clusters.find((c) => c.members.some((m) => m.content.includes("TypeScript")));
|
|
81
|
+
expect(tsCluster).toBeDefined();
|
|
82
|
+
expect(tsCluster.members.length).toBeGreaterThanOrEqual(3);
|
|
83
|
+
});
|
|
84
|
+
it("does not cluster memories below similarity threshold", () => {
|
|
85
|
+
// Create memories with very different embeddings
|
|
86
|
+
insertMemory(db, "Use Python for data science", "decision", fakeEmbedding("python-data-science"));
|
|
87
|
+
insertMemory(db, "Deploy via Kubernetes", "decision", fakeEmbedding("k8s-deploy-infra"));
|
|
88
|
+
insertMemory(db, "Auth uses OAuth2", "decision", fakeEmbedding("oauth-authentication"));
|
|
89
|
+
const report = reflect(db, { similarityThreshold: 0.9 });
|
|
90
|
+
// With very high threshold, dissimilar memories shouldn't cluster
|
|
91
|
+
expect(report.clusters).toHaveLength(0);
|
|
92
|
+
expect(report.orphans).toBe(3);
|
|
93
|
+
});
|
|
94
|
+
it("respects minClusterSize", () => {
|
|
95
|
+
const base = fakeEmbedding("react-hooks");
|
|
96
|
+
insertMemory(db, "Use useEffect for side effects", "pattern", similarEmbedding(base, 0.02));
|
|
97
|
+
insertMemory(db, "Prefer useMemo for expensive computations", "pattern", similarEmbedding(base, 0.02));
|
|
98
|
+
// Only 2 similar memories, but min cluster size is 3
|
|
99
|
+
const report = reflect(db, { minClusterSize: 3, similarityThreshold: 0.5 });
|
|
100
|
+
expect(report.clusters).toHaveLength(0);
|
|
101
|
+
// Lower min cluster size to 2 — should form a cluster
|
|
102
|
+
const report2 = reflect(db, { minClusterSize: 2, similarityThreshold: 0.5 });
|
|
103
|
+
expect(report2.clusters.length).toBeGreaterThanOrEqual(1);
|
|
104
|
+
});
|
|
105
|
+
it("identifies dominant type correctly", () => {
|
|
106
|
+
const base = fakeEmbedding("testing-strategy");
|
|
107
|
+
insertMemory(db, "Always write tests before code", "correction", similarEmbedding(base, 0.02));
|
|
108
|
+
insertMemory(db, "Never skip unit tests", "correction", similarEmbedding(base, 0.02));
|
|
109
|
+
insertMemory(db, "Test coverage should be above 80%", "pattern", similarEmbedding(base, 0.02));
|
|
110
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
111
|
+
const cluster = report.clusters[0];
|
|
112
|
+
expect(cluster).toBeDefined();
|
|
113
|
+
expect(cluster.dominantType).toBe("correction");
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("reflect — contradiction detection", () => {
|
|
117
|
+
it("detects opposing language in similar memories", () => {
|
|
118
|
+
const base = fakeEmbedding("semicolons-style");
|
|
119
|
+
const oldTime = Date.now() - 30 * 86_400_000; // 30 days ago
|
|
120
|
+
insertMemory(db, "Always use semicolons in JavaScript", "pattern", similarEmbedding(base, 0.01), {
|
|
121
|
+
createdAt: oldTime,
|
|
122
|
+
});
|
|
123
|
+
insertMemory(db, "Never use semicolons in JavaScript", "pattern", similarEmbedding(base, 0.01));
|
|
124
|
+
// Third memory to satisfy min cluster size of 3
|
|
125
|
+
insertMemory(db, "Semicolons are part of JavaScript style", "pattern", similarEmbedding(base, 0.01));
|
|
126
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
127
|
+
expect(report.contradictions.length).toBeGreaterThanOrEqual(1);
|
|
128
|
+
const c = report.contradictions[0];
|
|
129
|
+
expect(c.reason).toContain("Opposing language");
|
|
130
|
+
expect(c.suggestedAction).toBeTruthy();
|
|
131
|
+
});
|
|
132
|
+
it("does not flag non-opposing memories as contradictions", () => {
|
|
133
|
+
const base = fakeEmbedding("code-style");
|
|
134
|
+
insertMemory(db, "Use consistent indentation", "pattern", similarEmbedding(base, 0.02));
|
|
135
|
+
insertMemory(db, "Use consistent naming conventions", "pattern", similarEmbedding(base, 0.02));
|
|
136
|
+
insertMemory(db, "Use consistent formatting", "pattern", similarEmbedding(base, 0.02));
|
|
137
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
138
|
+
expect(report.contradictions).toHaveLength(0);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("reflect — synthesis candidates", () => {
|
|
142
|
+
it("identifies clusters as synthesis candidates", () => {
|
|
143
|
+
const base = fakeEmbedding("error-handling");
|
|
144
|
+
insertMemory(db, "Always catch errors at service boundaries", "pattern", similarEmbedding(base, 0.02));
|
|
145
|
+
insertMemory(db, "Log errors with full stack traces", "pattern", similarEmbedding(base, 0.02));
|
|
146
|
+
insertMemory(db, "Return structured error responses", "pattern", similarEmbedding(base, 0.02));
|
|
147
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
148
|
+
expect(report.synthesisCandidates.length).toBeGreaterThanOrEqual(1);
|
|
149
|
+
const candidate = report.synthesisCandidates[0];
|
|
150
|
+
expect(candidate.suggestedPrompt).toContain("Synthesize");
|
|
151
|
+
expect(candidate.memories.length).toBeGreaterThanOrEqual(3);
|
|
152
|
+
expect(candidate.dominantType).toBe("pattern");
|
|
153
|
+
});
|
|
154
|
+
it("skips clusters with already-high-confidence synthesis", () => {
|
|
155
|
+
const base = fakeEmbedding("api-design");
|
|
156
|
+
// One member has very high confidence (looks like an existing synthesis)
|
|
157
|
+
insertMemory(db, "RESTful APIs should be versioned", "decision", similarEmbedding(base, 0.02), {
|
|
158
|
+
confidence: 0.98,
|
|
159
|
+
});
|
|
160
|
+
insertMemory(db, "API endpoints should be consistent", "decision", similarEmbedding(base, 0.02));
|
|
161
|
+
insertMemory(db, "Use proper HTTP status codes", "decision", similarEmbedding(base, 0.02));
|
|
162
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
163
|
+
// Should NOT generate synthesis candidate since one member has 0.98 confidence
|
|
164
|
+
const apiCandidate = report.synthesisCandidates.find((s) => s.memories.some((m) => m.content.includes("API")));
|
|
165
|
+
expect(apiCandidate).toBeUndefined();
|
|
166
|
+
});
|
|
167
|
+
it("respects maxSynthesisCandidates", () => {
|
|
168
|
+
// Create multiple distinct clusters
|
|
169
|
+
for (let i = 0; i < 8; i++) {
|
|
170
|
+
const base = fakeEmbedding(`cluster-${i}-unique-seed`);
|
|
171
|
+
insertMemory(db, `Rule A for topic ${i}`, "pattern", similarEmbedding(base, 0.02));
|
|
172
|
+
insertMemory(db, `Rule B for topic ${i}`, "pattern", similarEmbedding(base, 0.02));
|
|
173
|
+
insertMemory(db, `Rule C for topic ${i}`, "pattern", similarEmbedding(base, 0.02));
|
|
174
|
+
}
|
|
175
|
+
const report = reflect(db, {
|
|
176
|
+
similarityThreshold: 0.5,
|
|
177
|
+
maxSynthesisCandidates: 3,
|
|
178
|
+
});
|
|
179
|
+
expect(report.synthesisCandidates.length).toBeLessThanOrEqual(3);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe("reflect — health score", () => {
|
|
183
|
+
it("returns 100 for empty database", () => {
|
|
184
|
+
const report = reflect(db);
|
|
185
|
+
expect(report.stats.healthScore).toBe(100);
|
|
186
|
+
});
|
|
187
|
+
it("returns higher health for well-organized memories", () => {
|
|
188
|
+
// High-confidence, well-clustered memories
|
|
189
|
+
const base = fakeEmbedding("well-organized");
|
|
190
|
+
for (let i = 0; i < 5; i++) {
|
|
191
|
+
insertMemory(db, `Well-organized rule ${i}`, "correction", similarEmbedding(base, 0.02), { confidence: 0.95 });
|
|
192
|
+
}
|
|
193
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
194
|
+
expect(report.stats.healthScore).toBeGreaterThan(30);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe("reflect — expired memories", () => {
|
|
198
|
+
it("excludes expired memories from reflection", () => {
|
|
199
|
+
const base = fakeEmbedding("expired-test");
|
|
200
|
+
const id1 = insertMemory(db, "Old expired rule", "pattern", similarEmbedding(base, 0.02));
|
|
201
|
+
insertMemory(db, "Active rule one", "pattern", similarEmbedding(base, 0.02));
|
|
202
|
+
insertMemory(db, "Active rule two", "pattern", similarEmbedding(base, 0.02));
|
|
203
|
+
insertMemory(db, "Active rule three", "pattern", similarEmbedding(base, 0.02));
|
|
204
|
+
// Expire the first one
|
|
205
|
+
db.expireMemory(id1);
|
|
206
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
207
|
+
expect(report.stats.totalMemories).toBe(3);
|
|
208
|
+
// Expired memory should not appear in any cluster
|
|
209
|
+
for (const cluster of report.clusters) {
|
|
210
|
+
for (const member of cluster.members) {
|
|
211
|
+
expect(member.id).not.toBe(id1);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe("reflect — configuration", () => {
|
|
217
|
+
it("accepts custom configuration", () => {
|
|
218
|
+
const base = fakeEmbedding("config-test");
|
|
219
|
+
insertMemory(db, "Config test A", "fact", similarEmbedding(base, 0.02));
|
|
220
|
+
insertMemory(db, "Config test B", "fact", similarEmbedding(base, 0.02));
|
|
221
|
+
insertMemory(db, "Config test C", "fact", similarEmbedding(base, 0.02));
|
|
222
|
+
// Very high threshold should prevent clustering
|
|
223
|
+
const strict = reflect(db, { similarityThreshold: 0.99 });
|
|
224
|
+
expect(strict.clusters).toHaveLength(0);
|
|
225
|
+
// Low threshold should allow clustering
|
|
226
|
+
const loose = reflect(db, { similarityThreshold: 0.3 });
|
|
227
|
+
expect(loose.stats.totalMemories).toBe(3);
|
|
228
|
+
});
|
|
229
|
+
it("respects maxMemories limit", () => {
|
|
230
|
+
const base = fakeEmbedding("limit-test");
|
|
231
|
+
for (let i = 0; i < 10; i++) {
|
|
232
|
+
insertMemory(db, `Memory ${i}`, "fact", similarEmbedding(base, 0.02));
|
|
233
|
+
}
|
|
234
|
+
const report = reflect(db, { maxMemories: 5 });
|
|
235
|
+
expect(report.stats.totalMemories).toBe(5);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe("reflect — report structure", () => {
|
|
239
|
+
it("returns a complete report with all fields", () => {
|
|
240
|
+
const report = reflect(db);
|
|
241
|
+
expect(report).toHaveProperty("clusters");
|
|
242
|
+
expect(report).toHaveProperty("contradictions");
|
|
243
|
+
expect(report).toHaveProperty("synthesisCandidates");
|
|
244
|
+
expect(report).toHaveProperty("orphans");
|
|
245
|
+
expect(report).toHaveProperty("stats");
|
|
246
|
+
expect(report).toHaveProperty("timestamp");
|
|
247
|
+
expect(report).toHaveProperty("durationMs");
|
|
248
|
+
expect(report.stats).toHaveProperty("totalMemories");
|
|
249
|
+
expect(report.stats).toHaveProperty("clusteredMemories");
|
|
250
|
+
expect(report.stats).toHaveProperty("totalClusters");
|
|
251
|
+
expect(report.stats).toHaveProperty("avgClusterSize");
|
|
252
|
+
expect(report.stats).toHaveProperty("contradictionsFound");
|
|
253
|
+
expect(report.stats).toHaveProperty("synthesisCandidates");
|
|
254
|
+
expect(report.stats).toHaveProperty("knowledgeGaps");
|
|
255
|
+
expect(report.stats).toHaveProperty("healthScore");
|
|
256
|
+
expect(report).toHaveProperty("knowledgeGaps");
|
|
257
|
+
expect(report.timestamp).toBeGreaterThan(0);
|
|
258
|
+
expect(report.durationMs).toBeGreaterThanOrEqual(0);
|
|
259
|
+
});
|
|
260
|
+
it("cluster members have correct structure", () => {
|
|
261
|
+
const base = fakeEmbedding("structure-test");
|
|
262
|
+
insertMemory(db, "Structure test A", "pattern", similarEmbedding(base, 0.02), {
|
|
263
|
+
tags: ["test"],
|
|
264
|
+
});
|
|
265
|
+
insertMemory(db, "Structure test B", "pattern", similarEmbedding(base, 0.02), {
|
|
266
|
+
tags: ["test"],
|
|
267
|
+
});
|
|
268
|
+
insertMemory(db, "Structure test C", "pattern", similarEmbedding(base, 0.02), {
|
|
269
|
+
tags: ["test"],
|
|
270
|
+
});
|
|
271
|
+
const report = reflect(db, { similarityThreshold: 0.5 });
|
|
272
|
+
if (report.clusters.length > 0) {
|
|
273
|
+
const cluster = report.clusters[0];
|
|
274
|
+
expect(cluster).toHaveProperty("id");
|
|
275
|
+
expect(cluster).toHaveProperty("members");
|
|
276
|
+
expect(cluster).toHaveProperty("dominantType");
|
|
277
|
+
expect(cluster).toHaveProperty("coherence");
|
|
278
|
+
expect(cluster).toHaveProperty("tags");
|
|
279
|
+
expect(cluster).toHaveProperty("isSynthesisCandidate");
|
|
280
|
+
const member = cluster.members[0];
|
|
281
|
+
expect(member).toHaveProperty("id");
|
|
282
|
+
expect(member).toHaveProperty("content");
|
|
283
|
+
expect(member).toHaveProperty("type");
|
|
284
|
+
expect(member).toHaveProperty("confidence");
|
|
285
|
+
expect(member).toHaveProperty("createdAt");
|
|
286
|
+
expect(member).toHaveProperty("tags");
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
// ── Gap fixes: new tests ──────────────────────────────
|
|
291
|
+
describe("reflect — synthesis lineage (Gap 3)", () => {
|
|
292
|
+
it("skips clusters that already have a synthesis via lineage", () => {
|
|
293
|
+
const base = fakeEmbedding("lineage-test");
|
|
294
|
+
const id1 = insertMemory(db, "Lineage rule A", "pattern", similarEmbedding(base, 0.02));
|
|
295
|
+
const id2 = insertMemory(db, "Lineage rule B", "pattern", similarEmbedding(base, 0.02));
|
|
296
|
+
const id3 = insertMemory(db, "Lineage rule C", "pattern", similarEmbedding(base, 0.02));
|
|
297
|
+
// First reflection should find synthesis candidates
|
|
298
|
+
const report1 = reflect(db, { similarityThreshold: 0.5 });
|
|
299
|
+
const hasCandidates = report1.synthesisCandidates.length > 0;
|
|
300
|
+
if (hasCandidates) {
|
|
301
|
+
// Simulate synthesis: store a synthesis memory and record lineage
|
|
302
|
+
const synthId = db.insertMemory({
|
|
303
|
+
content: "Synthesized rule for lineage test",
|
|
304
|
+
type: "pattern",
|
|
305
|
+
tags: [],
|
|
306
|
+
confidence: 0.9,
|
|
307
|
+
source: "reflection-synthesis",
|
|
308
|
+
embedding: similarEmbedding(base, 0.02),
|
|
309
|
+
scope: "global",
|
|
310
|
+
});
|
|
311
|
+
db.insertSynthesisLineage(synthId, [id1, id2, id3]);
|
|
312
|
+
// Second reflection should skip this cluster
|
|
313
|
+
const report2 = reflect(db, { similarityThreshold: 0.5 });
|
|
314
|
+
const sameCandidates = report2.synthesisCandidates.filter((s) => s.memories.some((m) => m.id === id1 || m.id === id2 || m.id === id3));
|
|
315
|
+
expect(sameCandidates).toHaveLength(0);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
describe("reflect — numerical contradictions (Gap 2)", () => {
|
|
320
|
+
it("detects numerical disagreements in similar memories", () => {
|
|
321
|
+
const base = fakeEmbedding("timeout-config-value");
|
|
322
|
+
const oldTime = Date.now() - 10 * 86_400_000;
|
|
323
|
+
insertMemory(db, "API timeout is 30 seconds", "fact", similarEmbedding(base, 0.005), {
|
|
324
|
+
createdAt: oldTime,
|
|
325
|
+
});
|
|
326
|
+
insertMemory(db, "API timeout is 5 seconds", "fact", similarEmbedding(base, 0.005));
|
|
327
|
+
insertMemory(db, "API timeout configuration", "fact", similarEmbedding(base, 0.005));
|
|
328
|
+
const report = reflect(db, { similarityThreshold: 0.5, contradictionMinSimilarity: 0.5 });
|
|
329
|
+
// The contradiction detection depends on exact embedding similarity
|
|
330
|
+
// If memories cluster and are similar enough, numerical contradiction should be detected
|
|
331
|
+
if (report.clusters.length > 0 && report.clusters[0].members.length >= 2) {
|
|
332
|
+
// At minimum, the engine should run without errors
|
|
333
|
+
expect(report.contradictions).toBeDefined();
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe("reflect — knowledge gaps (Gap 5)", () => {
|
|
338
|
+
it("includes knowledge gaps in the report", () => {
|
|
339
|
+
// Create some knowledge gaps
|
|
340
|
+
db.upsertKnowledgeGap("kubernetes deployment", 0.3, 1);
|
|
341
|
+
db.upsertKnowledgeGap("database migration strategy", 0.2, 0);
|
|
342
|
+
db.upsertKnowledgeGap("kubernetes deployment", 0.4, 2); // hit again
|
|
343
|
+
const report = reflect(db);
|
|
344
|
+
expect(report.knowledgeGaps.length).toBeGreaterThanOrEqual(2);
|
|
345
|
+
const k8sGap = report.knowledgeGaps.find((g) => g.queryPattern === "kubernetes deployment");
|
|
346
|
+
expect(k8sGap).toBeDefined();
|
|
347
|
+
expect(k8sGap.hitCount).toBe(2); // hit twice
|
|
348
|
+
expect(k8sGap.avgConfidence).toBeCloseTo(0.35, 2); // running avg: (0.3 + 0.4) / 2
|
|
349
|
+
});
|
|
350
|
+
it("resolving a gap removes it from the report", () => {
|
|
351
|
+
const gapId = db.upsertKnowledgeGap("resolved topic", 0.5, 2);
|
|
352
|
+
db.resolveKnowledgeGap(gapId);
|
|
353
|
+
const report = reflect(db);
|
|
354
|
+
const found = report.knowledgeGaps.find((g) => g.queryPattern === "resolved topic");
|
|
355
|
+
expect(found).toBeUndefined();
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
describe("utility score (Gap 4)", () => {
|
|
359
|
+
it("bumps utility score on memory", () => {
|
|
360
|
+
const id = insertMemory(db, "Utility test memory", "fact", fakeEmbedding("utility"));
|
|
361
|
+
const before = db.getById(id);
|
|
362
|
+
expect(before.utilityScore).toBe(0);
|
|
363
|
+
db.bumpUtilityScore(id);
|
|
364
|
+
db.bumpUtilityScore(id);
|
|
365
|
+
const after = db.getById(id);
|
|
366
|
+
expect(after.utilityScore).toBe(2);
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
describe("synthesis lineage DB methods (Gap 3)", () => {
|
|
370
|
+
it("records and retrieves synthesis lineage", () => {
|
|
371
|
+
const base = fakeEmbedding("lineage-db");
|
|
372
|
+
const src1 = insertMemory(db, "Source 1", "pattern", similarEmbedding(base, 0.02));
|
|
373
|
+
const src2 = insertMemory(db, "Source 2", "pattern", similarEmbedding(base, 0.02));
|
|
374
|
+
const synthId = insertMemory(db, "Synthesis", "pattern", similarEmbedding(base, 0.02));
|
|
375
|
+
db.insertSynthesisLineage(synthId, [src1, src2]);
|
|
376
|
+
const sources = db.getSynthesisSources(synthId);
|
|
377
|
+
expect(sources).toContain(src1);
|
|
378
|
+
expect(sources).toContain(src2);
|
|
379
|
+
expect(sources).toHaveLength(2);
|
|
380
|
+
});
|
|
381
|
+
it("hasAnySynthesis returns true when lineage exists", () => {
|
|
382
|
+
const base = fakeEmbedding("has-synth");
|
|
383
|
+
const src1 = insertMemory(db, "Has synth source", "pattern", similarEmbedding(base, 0.02));
|
|
384
|
+
const synthId = insertMemory(db, "Has synth result", "pattern", similarEmbedding(base, 0.02));
|
|
385
|
+
expect(db.hasAnySynthesis([src1])).toBe(false);
|
|
386
|
+
db.insertSynthesisLineage(synthId, [src1]);
|
|
387
|
+
expect(db.hasAnySynthesis([src1])).toBe(true);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
describe("isReflectionDue (Gap 1)", () => {
|
|
391
|
+
it("reports due when never run", () => {
|
|
392
|
+
const result = isReflectionDue(db);
|
|
393
|
+
expect(result.due).toBe(true);
|
|
394
|
+
expect(result.reason).toContain("never");
|
|
395
|
+
});
|
|
396
|
+
it("reports not due after recent reflection", () => {
|
|
397
|
+
// Simulate a recent reflection
|
|
398
|
+
db.setReflectionMeta("last_reflection_at", String(Date.now()));
|
|
399
|
+
db.setReflectionMeta("last_memory_count", "10");
|
|
400
|
+
const result = isReflectionDue(db);
|
|
401
|
+
expect(result.due).toBe(false);
|
|
402
|
+
});
|
|
403
|
+
it("reports due after many new memories", () => {
|
|
404
|
+
db.setReflectionMeta("last_reflection_at", String(Date.now()));
|
|
405
|
+
db.setReflectionMeta("last_memory_count", "0");
|
|
406
|
+
// Add 50+ memories
|
|
407
|
+
const base = fakeEmbedding("bulk-test");
|
|
408
|
+
for (let i = 0; i < 55; i++) {
|
|
409
|
+
insertMemory(db, `Bulk memory ${i}`, "fact", similarEmbedding(base, 0.1));
|
|
410
|
+
}
|
|
411
|
+
const result = isReflectionDue(db);
|
|
412
|
+
expect(result.due).toBe(true);
|
|
413
|
+
expect(result.reason).toContain("new memories");
|
|
414
|
+
});
|
|
415
|
+
it("reports due after 7+ days", () => {
|
|
416
|
+
const eightDaysAgo = Date.now() - 8 * 86_400_000;
|
|
417
|
+
db.setReflectionMeta("last_reflection_at", String(eightDaysAgo));
|
|
418
|
+
db.setReflectionMeta("last_memory_count", "100");
|
|
419
|
+
const result = isReflectionDue(db);
|
|
420
|
+
expect(result.due).toBe(true);
|
|
421
|
+
expect(result.reason).toContain("ago");
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
describe("knowledge gap DB methods (Gap 5)", () => {
|
|
425
|
+
it("upserts and increments hit count with running average", () => {
|
|
426
|
+
db.upsertKnowledgeGap("test query", 0.4, 2);
|
|
427
|
+
db.upsertKnowledgeGap("test query", 0.6, 4); // second hit
|
|
428
|
+
const gaps = db.getActiveKnowledgeGaps();
|
|
429
|
+
const gap = gaps.find((g) => g.queryPattern === "test query");
|
|
430
|
+
expect(gap).toBeDefined();
|
|
431
|
+
expect(gap.hitCount).toBe(2);
|
|
432
|
+
// Running average: (0.4*1 + 0.6) / 2 = 0.5
|
|
433
|
+
expect(gap.avgConfidence).toBeCloseTo(0.5, 2);
|
|
434
|
+
// Running average: (2*1 + 4) / 2 = 3
|
|
435
|
+
expect(gap.avgResults).toBeCloseTo(3, 1);
|
|
436
|
+
});
|
|
437
|
+
it("resolveKnowledgeGap hides from active list", () => {
|
|
438
|
+
const id = db.upsertKnowledgeGap("resolvable", 0.3, 1);
|
|
439
|
+
expect(db.getActiveKnowledgeGaps().some((g) => g.queryPattern === "resolvable")).toBe(true);
|
|
440
|
+
db.resolveKnowledgeGap(id);
|
|
441
|
+
expect(db.getActiveKnowledgeGaps().some((g) => g.queryPattern === "resolvable")).toBe(false);
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
describe("reflection meta DB methods", () => {
|
|
445
|
+
it("stores and retrieves metadata", () => {
|
|
446
|
+
expect(db.getReflectionMeta("test_key")).toBeNull();
|
|
447
|
+
db.setReflectionMeta("test_key", "test_value");
|
|
448
|
+
expect(db.getReflectionMeta("test_key")).toBe("test_value");
|
|
449
|
+
db.setReflectionMeta("test_key", "updated");
|
|
450
|
+
expect(db.getReflectionMeta("test_key")).toBe("updated");
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
//# sourceMappingURL=reflection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflection.test.js","sourceRoot":"","sources":["../src/reflection.test.ts"],"names":[],"mappings":"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"}
|