@mneme-ai/core 2.19.20 → 2.19.22

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/catalog_parity/catalog_parity.test.d.ts +2 -0
  2. package/dist/catalog_parity/catalog_parity.test.d.ts.map +1 -0
  3. package/dist/catalog_parity/catalog_parity.test.js +104 -0
  4. package/dist/catalog_parity/catalog_parity.test.js.map +1 -0
  5. package/dist/catalog_parity/index.d.ts +69 -0
  6. package/dist/catalog_parity/index.d.ts.map +1 -0
  7. package/dist/catalog_parity/index.js +118 -0
  8. package/dist/catalog_parity/index.js.map +1 -0
  9. package/dist/cosmic/aurelian_v1921.test.d.ts +2 -0
  10. package/dist/cosmic/aurelian_v1921.test.d.ts.map +1 -0
  11. package/dist/cosmic/aurelian_v1921.test.js +48 -0
  12. package/dist/cosmic/aurelian_v1921.test.js.map +1 -0
  13. package/dist/cosmic/aurelian_v1922.test.d.ts +2 -0
  14. package/dist/cosmic/aurelian_v1922.test.d.ts.map +1 -0
  15. package/dist/cosmic/aurelian_v1922.test.js +48 -0
  16. package/dist/cosmic/aurelian_v1922.test.js.map +1 -0
  17. package/dist/dynamic/pack-schema.d.ts +14 -14
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/periodic/periodic.test.js +1 -1
  23. package/dist/periodic/periodic.test.js.map +1 -1
  24. package/dist/reflex/index.d.ts +210 -0
  25. package/dist/reflex/index.d.ts.map +1 -0
  26. package/dist/reflex/index.js +298 -0
  27. package/dist/reflex/index.js.map +1 -0
  28. package/dist/reflex/reflex.test.d.ts +2 -0
  29. package/dist/reflex/reflex.test.d.ts.map +1 -0
  30. package/dist/reflex/reflex.test.js +379 -0
  31. package/dist/reflex/reflex.test.js.map +1 -0
  32. package/dist/snn_auto_promote/index.d.ts +82 -0
  33. package/dist/snn_auto_promote/index.d.ts.map +1 -0
  34. package/dist/snn_auto_promote/index.js +154 -0
  35. package/dist/snn_auto_promote/index.js.map +1 -0
  36. package/dist/snn_auto_promote/snn_auto_promote.test.d.ts +2 -0
  37. package/dist/snn_auto_promote/snn_auto_promote.test.d.ts.map +1 -0
  38. package/dist/snn_auto_promote/snn_auto_promote.test.js +164 -0
  39. package/dist/snn_auto_promote/snn_auto_promote.test.js.map +1 -0
  40. package/dist/whats_new.d.ts.map +1 -1
  41. package/dist/whats_new.js +16 -0
  42. package/dist/whats_new.js.map +1 -1
  43. package/dist/wrapper_genesis/index.d.ts.map +1 -1
  44. package/dist/wrapper_genesis/index.js +23 -0
  45. package/dist/wrapper_genesis/index.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,379 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { eventCacheKey, emptyStore, recordObservation, verifyStore, predictFollowup, emptyCache, writeCacheEntry, readCache, gcCache, prefetch, emptyTelemetry, recordFetch, computeStats, formatStatsLine, } from "./index.js";
3
+ const SECRET = "reflex-test-secret-997744";
4
+ function mkEvent(kind, context, ts = 1_000_000) {
5
+ return { v: 1, kind, context, ts };
6
+ }
7
+ describe("v2.19.22 REFLEX · eventCacheKey (signature stability)", () => {
8
+ it("MEASURED 100% determinism: same event -> same key (100 trials)", () => {
9
+ const e = mkEvent("file_save", { path: "src/foo.ts" });
10
+ const k1 = eventCacheKey(e);
11
+ let allEqual = true;
12
+ for (let i = 0; i < 100; i++) {
13
+ if (eventCacheKey(e) !== k1) {
14
+ allEqual = false;
15
+ break;
16
+ }
17
+ }
18
+ expect(allEqual).toBe(true);
19
+ expect(k1.length).toBe(16);
20
+ });
21
+ it("ignores ts (same kind+context but different ts -> same key)", () => {
22
+ const a = mkEvent("git_commit", { sha: "abc" }, 1);
23
+ const b = mkEvent("git_commit", { sha: "abc" }, 999_999);
24
+ expect(eventCacheKey(a)).toBe(eventCacheKey(b));
25
+ });
26
+ it("distinct kind OR context -> distinct key (50 random pairs, no collisions)", () => {
27
+ const seen = new Set();
28
+ let collisions = 0;
29
+ for (let i = 0; i < 50; i++) {
30
+ const e = mkEvent(i % 2 === 0 ? "file_save" : "git_commit", { i });
31
+ const k = eventCacheKey(e);
32
+ if (seen.has(k))
33
+ collisions++;
34
+ seen.add(k);
35
+ }
36
+ expect(collisions).toBe(0);
37
+ });
38
+ it("context key order does not matter (canonicalisation)", () => {
39
+ const a = mkEvent("user_chat", { a: 1, b: 2 });
40
+ const b = mkEvent("user_chat", { b: 2, a: 1 });
41
+ expect(eventCacheKey(a)).toBe(eventCacheKey(b));
42
+ });
43
+ });
44
+ describe("v2.19.22 REFLEX · pheromone store (HMAC chain)", () => {
45
+ it("recordObservation appends + HMAC-chains to predecessor", () => {
46
+ let s = emptyStore();
47
+ const e = mkEvent("file_save", { path: "x.ts" });
48
+ s = recordObservation({ store: s, event: e, followup: { toolName: "mneme.ask", args: { q: "foo" }, ts: 1 }, secret: SECRET });
49
+ s = recordObservation({ store: s, event: e, followup: { toolName: "mneme.why", args: { f: "x.ts" }, ts: 2 }, secret: SECRET });
50
+ expect(s.records).toHaveLength(2);
51
+ expect(s.records[0].prevSig).toBeNull();
52
+ expect(s.records[1].prevSig).toBe(s.records[0].sig);
53
+ });
54
+ it("verifyStore passes on untampered chain (10 records)", () => {
55
+ let s = emptyStore();
56
+ for (let i = 0; i < 10; i++) {
57
+ s = recordObservation({
58
+ store: s,
59
+ event: mkEvent("git_commit", { i }),
60
+ followup: { toolName: "mneme.ask", args: { i }, ts: i },
61
+ secret: SECRET,
62
+ });
63
+ }
64
+ expect(verifyStore(s, SECRET).ok).toBe(true);
65
+ });
66
+ it("verifyStore detects tamper at exact step", () => {
67
+ let s = emptyStore();
68
+ for (let i = 0; i < 5; i++) {
69
+ s = recordObservation({
70
+ store: s,
71
+ event: mkEvent("file_save", { i }),
72
+ followup: { toolName: "mneme.ask", args: { i }, ts: i },
73
+ secret: SECRET,
74
+ });
75
+ }
76
+ const tampered = {
77
+ ...s,
78
+ records: s.records.map((r, i) => (i === 2 ? { ...r, followup: { ...r.followup, toolName: "EVIL" } } : r)),
79
+ };
80
+ const v = verifyStore(tampered, SECRET);
81
+ expect(v.ok).toBe(false);
82
+ expect(v.brokenAt).toBe(2);
83
+ });
84
+ });
85
+ describe("v2.19.22 REFLEX · predictor (frequency-based, deterministic)", () => {
86
+ it("empty store -> empty predictions", () => {
87
+ const e = mkEvent("file_save", { path: "x.ts" });
88
+ expect(predictFollowup({ store: emptyStore(), event: e })).toEqual([]);
89
+ });
90
+ it("top-N ranked by frequency; confidence = matches/total within event sig", () => {
91
+ let s = emptyStore();
92
+ const e = mkEvent("file_save", { path: "x.ts" });
93
+ // ask called 4 times, why 2 times, status 1 time for this event sig.
94
+ for (let i = 0; i < 4; i++)
95
+ s = recordObservation({ store: s, event: e, followup: { toolName: "mneme.ask", args: {}, ts: i }, secret: SECRET });
96
+ for (let i = 0; i < 2; i++)
97
+ s = recordObservation({ store: s, event: e, followup: { toolName: "mneme.why", args: {}, ts: i }, secret: SECRET });
98
+ s = recordObservation({ store: s, event: e, followup: { toolName: "mneme.status", args: {}, ts: 99 }, secret: SECRET });
99
+ const p = predictFollowup({ store: s, event: e, topN: 3 });
100
+ expect(p).toHaveLength(3);
101
+ expect(p[0].toolName).toBe("mneme.ask");
102
+ expect(p[0].confidence).toBeCloseTo(4 / 7, 5);
103
+ expect(p[0].sampleCount).toBe(4);
104
+ expect(p[1].toolName).toBe("mneme.why");
105
+ expect(p[2].toolName).toBe("mneme.status");
106
+ });
107
+ it("predictions scoped to matching event sig only (no cross-event leakage)", () => {
108
+ let s = emptyStore();
109
+ const eA = mkEvent("file_save", { path: "A.ts" });
110
+ const eB = mkEvent("file_save", { path: "B.ts" });
111
+ for (let i = 0; i < 5; i++)
112
+ s = recordObservation({ store: s, event: eA, followup: { toolName: "mneme.A_only", args: {}, ts: i }, secret: SECRET });
113
+ for (let i = 0; i < 5; i++)
114
+ s = recordObservation({ store: s, event: eB, followup: { toolName: "mneme.B_only", args: {}, ts: i }, secret: SECRET });
115
+ const pA = predictFollowup({ store: s, event: eA });
116
+ const pB = predictFollowup({ store: s, event: eB });
117
+ expect(pA.map((x) => x.toolName)).toEqual(["mneme.A_only"]);
118
+ expect(pB.map((x) => x.toolName)).toEqual(["mneme.B_only"]);
119
+ });
120
+ it("MEASURED deterministic: same input -> same output (20 trials)", () => {
121
+ let s = emptyStore();
122
+ const e = mkEvent("git_commit", { sha: "deadbeef" });
123
+ for (let i = 0; i < 6; i++)
124
+ s = recordObservation({ store: s, event: e, followup: { toolName: `tool.${i % 2}`, args: { i }, ts: i }, secret: SECRET });
125
+ const first = JSON.stringify(predictFollowup({ store: s, event: e }));
126
+ let allEqual = true;
127
+ for (let i = 0; i < 20; i++) {
128
+ if (JSON.stringify(predictFollowup({ store: s, event: e })) !== first) {
129
+ allEqual = false;
130
+ break;
131
+ }
132
+ }
133
+ expect(allEqual).toBe(true);
134
+ });
135
+ });
136
+ describe("v2.19.22 REFLEX · cache (TTL + HMAC integrity)", () => {
137
+ it("write + read happy path", () => {
138
+ let c = emptyCache();
139
+ const e = mkEvent("file_save", { path: "x.ts" });
140
+ c = writeCacheEntry({ cache: c, event: e, toolName: "mneme.ask", args: { q: "foo" }, result: { answer: 42 }, nowMs: 1_000_000, secret: SECRET });
141
+ const r = readCache({ cache: c, event: e, toolName: "mneme.ask", nowMs: 1_000_000, secret: SECRET });
142
+ expect(r.hit).toBe(true);
143
+ expect(r.entry?.result).toEqual({ answer: 42 });
144
+ });
145
+ it("expired entry reads as MISS", () => {
146
+ let c = emptyCache();
147
+ const e = mkEvent("file_save", { path: "x.ts" });
148
+ c = writeCacheEntry({ cache: c, event: e, toolName: "mneme.ask", args: {}, result: 1, ttlMs: 1000, nowMs: 0, secret: SECRET });
149
+ expect(readCache({ cache: c, event: e, toolName: "mneme.ask", nowMs: 500, secret: SECRET }).hit).toBe(true);
150
+ expect(readCache({ cache: c, event: e, toolName: "mneme.ask", nowMs: 2000, secret: SECRET }).hit).toBe(false);
151
+ });
152
+ it("tampered entry refuses to hit (HMAC mismatch)", () => {
153
+ let c = emptyCache();
154
+ const e = mkEvent("file_save", { path: "x.ts" });
155
+ c = writeCacheEntry({ cache: c, event: e, toolName: "mneme.ask", args: {}, result: "ok", nowMs: 0, secret: SECRET });
156
+ const eventKey = Object.keys(c.entries)[0];
157
+ const tampered = {
158
+ v: c.v,
159
+ entries: { [eventKey]: [{ ...c.entries[eventKey][0], result: "EVIL" }] },
160
+ };
161
+ const r = readCache({ cache: tampered, event: e, toolName: "mneme.ask", nowMs: 100, secret: SECRET });
162
+ expect(r.hit).toBe(false);
163
+ expect(r.reason).toContain("HMAC");
164
+ });
165
+ it("argsMatch predicate filters", () => {
166
+ let c = emptyCache();
167
+ const e = mkEvent("user_chat", { topic: "auth" });
168
+ c = writeCacheEntry({ cache: c, event: e, toolName: "mneme.ask", args: { q: "what" }, result: 1, nowMs: 0, secret: SECRET });
169
+ c = writeCacheEntry({ cache: c, event: e, toolName: "mneme.ask", args: { q: "why" }, result: 2, nowMs: 0, secret: SECRET });
170
+ const r = readCache({
171
+ cache: c, event: e, toolName: "mneme.ask",
172
+ argsMatch: (a) => a["q"] === "why", nowMs: 100, secret: SECRET,
173
+ });
174
+ expect(r.hit).toBe(true);
175
+ expect(r.entry?.result).toBe(2);
176
+ });
177
+ it("gcCache drops expired entries; keeps fresh", () => {
178
+ let c = emptyCache();
179
+ const e = mkEvent("file_save", { path: "x.ts" });
180
+ c = writeCacheEntry({ cache: c, event: e, toolName: "old", args: {}, result: 0, ttlMs: 100, nowMs: 0, secret: SECRET });
181
+ c = writeCacheEntry({ cache: c, event: e, toolName: "fresh", args: {}, result: 1, ttlMs: 100000, nowMs: 0, secret: SECRET });
182
+ const { cache: gc, removed } = gcCache({ cache: c, nowMs: 5000 });
183
+ expect(removed).toBe(1);
184
+ const keys = Object.keys(gc.entries);
185
+ expect(keys).toHaveLength(1);
186
+ expect(gc.entries[keys[0]]).toHaveLength(1);
187
+ expect(gc.entries[keys[0]][0].toolName).toBe("fresh");
188
+ });
189
+ });
190
+ describe("v2.19.22 REFLEX · prefetch executor (budget-bound, concurrent)", () => {
191
+ it("executes all candidates in parallel; writes cache for each", async () => {
192
+ const e = mkEvent("git_commit", { sha: "deadbeef" });
193
+ const invoke = async (toolName, args) => ({ toolName, args, ts: Date.now() });
194
+ const r = await prefetch({
195
+ cache: emptyCache(),
196
+ event: e,
197
+ candidates: [
198
+ { toolName: "mneme.ask", args: { q: "1" } },
199
+ { toolName: "mneme.why", args: { f: "x" } },
200
+ { toolName: "mneme.status", args: {} },
201
+ ],
202
+ invoke,
203
+ budgetMs: 200,
204
+ secret: SECRET,
205
+ });
206
+ expect(r.executed).toHaveLength(3);
207
+ expect(r.executed.every((x) => x.ok)).toBe(true);
208
+ expect(r.withinBudget).toBe(true);
209
+ const keys = Object.keys(r.cache.entries);
210
+ expect(keys).toHaveLength(1);
211
+ expect(r.cache.entries[keys[0]]).toHaveLength(3);
212
+ });
213
+ it("slow tool times out at budget; other tools complete normally", async () => {
214
+ const e = mkEvent("file_save", { path: "x.ts" });
215
+ const invoke = async (toolName) => {
216
+ if (toolName === "slow") {
217
+ await new Promise((r) => setTimeout(r, 500));
218
+ return "slow_done";
219
+ }
220
+ return `${toolName}_done`;
221
+ };
222
+ const r = await prefetch({
223
+ cache: emptyCache(),
224
+ event: e,
225
+ candidates: [
226
+ { toolName: "fast", args: {} },
227
+ { toolName: "slow", args: {} },
228
+ { toolName: "fast2", args: {} },
229
+ ],
230
+ invoke,
231
+ budgetMs: 100,
232
+ secret: SECRET,
233
+ });
234
+ const slow = r.executed.find((x) => x.toolName === "slow");
235
+ expect(slow.ok).toBe(false);
236
+ expect(slow.error).toBe("prefetch_timeout");
237
+ const fastCount = r.executed.filter((x) => x.ok).length;
238
+ expect(fastCount).toBe(2);
239
+ });
240
+ it("failed candidates are NOT written to cache", async () => {
241
+ const e = mkEvent("user_chat", { topic: "x" });
242
+ const invoke = async (toolName) => {
243
+ if (toolName === "bad")
244
+ throw new Error("nope");
245
+ return toolName;
246
+ };
247
+ const r = await prefetch({
248
+ cache: emptyCache(),
249
+ event: e,
250
+ candidates: [
251
+ { toolName: "good", args: {} },
252
+ { toolName: "bad", args: {} },
253
+ ],
254
+ invoke,
255
+ budgetMs: 200,
256
+ secret: SECRET,
257
+ });
258
+ const eventKey = Object.keys(r.cache.entries)[0];
259
+ const cached = r.cache.entries[eventKey] ?? [];
260
+ expect(cached).toHaveLength(1);
261
+ expect(cached[0].toolName).toBe("good");
262
+ });
263
+ });
264
+ describe("v2.19.22 REFLEX · MEASURED end-to-end (hit rate + speedup)", () => {
265
+ it("MEASURED hit rate >= 80% on synthetic warm trail (10 warm-up + 20 follow-up events)", async () => {
266
+ let store = emptyStore();
267
+ let cache = emptyCache();
268
+ let telemetry = emptyTelemetry();
269
+ const e = mkEvent("git_commit", { sha: "abc" });
270
+ // Phase 1 — warm-up: observe (git_commit -> mneme.ask) 10 times.
271
+ for (let i = 0; i < 10; i++) {
272
+ store = recordObservation({
273
+ store,
274
+ event: e,
275
+ followup: { toolName: "mneme.ask", args: { q: "what changed" }, ts: i },
276
+ secret: SECRET,
277
+ });
278
+ }
279
+ // Phase 2 — predictive prefetch on next event.
280
+ const predictions = predictFollowup({ store, event: e, topN: 3 });
281
+ expect(predictions).toHaveLength(1);
282
+ const { cache: c1 } = await prefetch({
283
+ cache,
284
+ event: e,
285
+ candidates: predictions.map((p) => ({ toolName: p.toolName, args: p.argsTemplate })),
286
+ invoke: async () => "answer",
287
+ budgetMs: 200,
288
+ secret: SECRET,
289
+ });
290
+ cache = c1;
291
+ // Phase 3 — 20 follow-up reads; should all HIT.
292
+ for (let i = 0; i < 20; i++) {
293
+ const r = readCache({ cache, event: e, toolName: "mneme.ask", secret: SECRET });
294
+ telemetry = recordFetch({ telemetry, hit: r.hit });
295
+ }
296
+ const stats = computeStats({ store, cache, telemetry });
297
+ expect(stats.hitRate).toBeGreaterThanOrEqual(0.8);
298
+ expect(stats.hitRate).toBe(1.0); // perfect within window
299
+ });
300
+ it("MEASURED speedup: cached read p50 < cold invoke p50 (50 trials each)", async () => {
301
+ const e = mkEvent("file_save", { path: "src/x.ts" });
302
+ let cache = emptyCache();
303
+ // Cold invoke simulator: 20ms work.
304
+ const coldInvoke = async () => {
305
+ await new Promise((r) => setTimeout(r, 20));
306
+ return "x";
307
+ };
308
+ // Warm cache once.
309
+ const { cache: c1 } = await prefetch({
310
+ cache, event: e, candidates: [{ toolName: "mneme.ask", args: {} }],
311
+ invoke: coldInvoke, budgetMs: 200, secret: SECRET,
312
+ });
313
+ cache = c1;
314
+ // Measure 50 cold + 50 cached.
315
+ const cold = [];
316
+ const cached = [];
317
+ for (let i = 0; i < 50; i++) {
318
+ const t0 = Date.now();
319
+ await coldInvoke();
320
+ cold.push(Date.now() - t0);
321
+ const t1 = Date.now();
322
+ const r = readCache({ cache, event: e, toolName: "mneme.ask", secret: SECRET });
323
+ cached.push(Date.now() - t1);
324
+ expect(r.hit).toBe(true);
325
+ }
326
+ const median = (arr) => {
327
+ const sorted = [...arr].sort((a, b) => a - b);
328
+ return sorted[Math.floor(sorted.length / 2)];
329
+ };
330
+ const coldP50 = median(cold);
331
+ const cachedP50 = median(cached);
332
+ expect(coldP50).toBeGreaterThanOrEqual(15);
333
+ expect(cachedP50).toBeLessThan(coldP50);
334
+ expect(cachedP50).toBeLessThanOrEqual(5);
335
+ });
336
+ it("MEASURED 100% cache integrity across 50 round-trips (no false hits, no missed verifies)", () => {
337
+ let c = emptyCache();
338
+ const e = mkEvent("user_chat", { topic: "auth" });
339
+ let passes = 0;
340
+ for (let i = 0; i < 50; i++) {
341
+ c = writeCacheEntry({ cache: c, event: e, toolName: `t${i}`, args: { i }, result: `r${i}`, nowMs: 0, secret: SECRET });
342
+ const r = readCache({ cache: c, event: e, toolName: `t${i}`, nowMs: 100, secret: SECRET });
343
+ if (r.hit && r.entry?.result === `r${i}`)
344
+ passes++;
345
+ }
346
+ expect(passes).toBe(50);
347
+ });
348
+ });
349
+ describe("v2.19.22 REFLEX · stats + formatter", () => {
350
+ it("computeStats reports hit rate from telemetry; expired cache entries counted separately", () => {
351
+ const e = mkEvent("file_save", { path: "x.ts" });
352
+ let store = emptyStore();
353
+ store = recordObservation({ store, event: e, followup: { toolName: "t1", args: {}, ts: 1 }, secret: SECRET });
354
+ store = recordObservation({ store, event: e, followup: { toolName: "t2", args: {}, ts: 2 }, secret: SECRET });
355
+ let cache = emptyCache();
356
+ cache = writeCacheEntry({ cache, event: e, toolName: "t1", args: {}, result: 1, ttlMs: 100, nowMs: 0, secret: SECRET });
357
+ cache = writeCacheEntry({ cache, event: e, toolName: "t2", args: {}, result: 2, ttlMs: 100000, nowMs: 0, secret: SECRET });
358
+ let tel = emptyTelemetry();
359
+ tel = recordFetch({ telemetry: tel, hit: true });
360
+ tel = recordFetch({ telemetry: tel, hit: true });
361
+ tel = recordFetch({ telemetry: tel, hit: false });
362
+ const s = computeStats({ store, cache, telemetry: tel, nowMs: 5000 });
363
+ expect(s.totalRecords).toBe(2);
364
+ expect(s.uniqueEventSigs).toBe(1);
365
+ expect(s.totalCacheEntries).toBe(2);
366
+ expect(s.expiredCacheEntries).toBe(1);
367
+ expect(s.freshCacheEntries).toBe(1);
368
+ expect(s.totalHits).toBe(2);
369
+ expect(s.totalMisses).toBe(1);
370
+ expect(s.hitRate).toBeCloseTo(2 / 3, 5);
371
+ });
372
+ it("formatStatsLine renders single-line digest", () => {
373
+ const stats = computeStats({ store: emptyStore(), cache: emptyCache(), telemetry: { hits: 7, misses: 3 } });
374
+ const line = formatStatsLine(stats);
375
+ expect(line).toContain("REFLEX");
376
+ expect(line).toContain("70.0%");
377
+ });
378
+ });
379
+ //# sourceMappingURL=reflex.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflex.test.js","sourceRoot":"","sources":["../../src/reflex/reflex.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * v2.19.21 — MNEME SNN AUTO-PROMOTE (W5 audit fix at SOURCE)
3
+ *
4
+ * User audit (W5): mneme status reports hash:fnv-256 [FALLBACK] even
5
+ * though SNN MCP tools ship + resolveEmbedder ladder includes SNN. The
6
+ * v2.19.16 BundledOrSnnEmbedder promoted at runtime (in-memory) but
7
+ * never wrote the resolution back to disk — so every `mneme status`
8
+ * call re-resolved + every fresh process started cold.
9
+ *
10
+ * v2.19.21 closes the gap: `decidePromotion()` compares the saved
11
+ * config's provider against the runtime-resolved tier and recommends a
12
+ * one-way promotion when (a) saved is hash (the worst tier), (b) runtime
13
+ * resolved to a higher tier. Pure function — caller decides whether to
14
+ * persist the promotion (writes to .mneme/config.json).
15
+ *
16
+ * HMAC-chained PROMOTION HISTORY ledger so the daemon can audit + roll
17
+ * back if quality degrades.
18
+ *
19
+ * Honest scope:
20
+ * - Refuses to downgrade. If saved provider is `snn` or higher and
21
+ * ladder resolved to a lower tier (e.g., bundled fail → snn), no
22
+ * auto-write. The user's explicit pin always wins.
23
+ * - Refuses to "promote" between equal-tier providers (snn vs bundled
24
+ * — both ★★★) unless the runtime tier is strictly higher quality.
25
+ * - Caller persists. Mneme returns the decision; .mneme/config.json
26
+ * write is the CLI's call.
27
+ */
28
+ declare const PROTOCOL_VERSION: 1;
29
+ export type EmbedderTier = "openai" | "ollama" | "snn" | "bundled" | "hash" | "auto" | "unknown";
30
+ export interface PromotionDecision {
31
+ v: typeof PROTOCOL_VERSION;
32
+ savedProvider: EmbedderTier;
33
+ runtimeResolvedName: string;
34
+ runtimeResolvedTier: EmbedderTier;
35
+ shouldPromote: boolean;
36
+ recommendedProvider: EmbedderTier | null;
37
+ reason: string;
38
+ isDowngradeRefused: boolean;
39
+ }
40
+ /** Parse the active embedder's `name` field into a tier. */
41
+ export declare function tierFromName(name: string): EmbedderTier;
42
+ /**
43
+ * Decide whether to promote the saved config to the runtime-resolved tier.
44
+ * Promote when:
45
+ * savedProvider is "auto" OR "hash" (worst tier)
46
+ * AND runtime resolved to a higher tier than "hash"
47
+ * Refuse to downgrade:
48
+ * if savedProvider's rank >= runtime's rank, no write
49
+ */
50
+ export declare function decidePromotion(input: {
51
+ savedProvider: EmbedderTier;
52
+ runtimeResolvedName: string;
53
+ }): PromotionDecision;
54
+ export interface PromotionRecord {
55
+ v: typeof PROTOCOL_VERSION;
56
+ from: EmbedderTier;
57
+ to: EmbedderTier;
58
+ runtimeResolvedName: string;
59
+ reason: string;
60
+ ts: number;
61
+ prevSig: string | null;
62
+ sig: string;
63
+ }
64
+ export interface PromotionHistory {
65
+ v: typeof PROTOCOL_VERSION;
66
+ records: PromotionRecord[];
67
+ }
68
+ export declare function emptyPromotionHistory(): PromotionHistory;
69
+ export declare function appendPromotion(opts: {
70
+ history: PromotionHistory;
71
+ decision: PromotionDecision;
72
+ nowMs?: number;
73
+ secret?: string;
74
+ }): PromotionHistory;
75
+ export declare function verifyPromotionHistory(history: PromotionHistory, secret?: string): {
76
+ ok: boolean;
77
+ brokenAt?: number;
78
+ reason?: string;
79
+ };
80
+ export declare function formatDecisionLine(d: PromotionDecision): string;
81
+ export {};
82
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/snn_auto_promote/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAajG,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,aAAa,EAAE,YAAY,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,YAAY,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,YAAY,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAOvD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,aAAa,EAAE,YAAY,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,iBAAiB,CA6BpB;AAID,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,YAAY,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAsBD,wBAAgB,qBAAqB,IAAI,gBAAgB,CAExD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,gBAAgB,CAgBnB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAWtI;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAG/D"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * v2.19.21 — MNEME SNN AUTO-PROMOTE (W5 audit fix at SOURCE)
3
+ *
4
+ * User audit (W5): mneme status reports hash:fnv-256 [FALLBACK] even
5
+ * though SNN MCP tools ship + resolveEmbedder ladder includes SNN. The
6
+ * v2.19.16 BundledOrSnnEmbedder promoted at runtime (in-memory) but
7
+ * never wrote the resolution back to disk — so every `mneme status`
8
+ * call re-resolved + every fresh process started cold.
9
+ *
10
+ * v2.19.21 closes the gap: `decidePromotion()` compares the saved
11
+ * config's provider against the runtime-resolved tier and recommends a
12
+ * one-way promotion when (a) saved is hash (the worst tier), (b) runtime
13
+ * resolved to a higher tier. Pure function — caller decides whether to
14
+ * persist the promotion (writes to .mneme/config.json).
15
+ *
16
+ * HMAC-chained PROMOTION HISTORY ledger so the daemon can audit + roll
17
+ * back if quality degrades.
18
+ *
19
+ * Honest scope:
20
+ * - Refuses to downgrade. If saved provider is `snn` or higher and
21
+ * ladder resolved to a lower tier (e.g., bundled fail → snn), no
22
+ * auto-write. The user's explicit pin always wins.
23
+ * - Refuses to "promote" between equal-tier providers (snn vs bundled
24
+ * — both ★★★) unless the runtime tier is strictly higher quality.
25
+ * - Caller persists. Mneme returns the decision; .mneme/config.json
26
+ * write is the CLI's call.
27
+ */
28
+ import { createHmac, timingSafeEqual } from "node:crypto";
29
+ const PROTOCOL_VERSION = 1;
30
+ /** Strict quality ordering. Higher index = higher quality. */
31
+ const TIER_RANK = {
32
+ hash: 1,
33
+ unknown: 1,
34
+ bundled: 2,
35
+ snn: 2, // peer of bundled — pure-TS vs WASM
36
+ auto: 3, // "auto" means "let the ladder pick"; treat as middle
37
+ ollama: 4,
38
+ openai: 5,
39
+ };
40
+ /** Parse the active embedder's `name` field into a tier. */
41
+ export function tierFromName(name) {
42
+ if (name.startsWith("openai:"))
43
+ return "openai";
44
+ if (name.startsWith("ollama:"))
45
+ return "ollama";
46
+ if (name.startsWith("bundled:"))
47
+ return "bundled";
48
+ if (name.startsWith("snn:"))
49
+ return "snn";
50
+ if (name.startsWith("hash:"))
51
+ return "hash";
52
+ return "unknown";
53
+ }
54
+ /**
55
+ * Decide whether to promote the saved config to the runtime-resolved tier.
56
+ * Promote when:
57
+ * savedProvider is "auto" OR "hash" (worst tier)
58
+ * AND runtime resolved to a higher tier than "hash"
59
+ * Refuse to downgrade:
60
+ * if savedProvider's rank >= runtime's rank, no write
61
+ */
62
+ export function decidePromotion(input) {
63
+ const runtimeTier = tierFromName(input.runtimeResolvedName);
64
+ const savedRank = TIER_RANK[input.savedProvider] ?? 0;
65
+ const runtimeRank = TIER_RANK[runtimeTier] ?? 0;
66
+ const isDowngradeRefused = savedRank >= runtimeRank && input.savedProvider !== "auto";
67
+ // Auto-promote happens when:
68
+ // (a) saved is "hash" or "auto" (worst-tier / undecided)
69
+ // (b) runtime resolved to a STRICTLY higher tier
70
+ const shouldPromote = (input.savedProvider === "hash" || input.savedProvider === "auto")
71
+ && runtimeRank > savedRank;
72
+ const recommendedProvider = shouldPromote ? runtimeTier : null;
73
+ let reason;
74
+ if (shouldPromote) {
75
+ reason = `saved=${input.savedProvider} (rank ${savedRank}) → runtime=${runtimeTier} (rank ${runtimeRank}); promoting to surface real tier in status + skip future probe`;
76
+ }
77
+ else if (isDowngradeRefused) {
78
+ reason = `saved=${input.savedProvider} (rank ${savedRank}) >= runtime=${runtimeTier} (rank ${runtimeRank}); refusing to downgrade (user's explicit pin wins)`;
79
+ }
80
+ else {
81
+ reason = `saved=${input.savedProvider} (rank ${savedRank}) ~ runtime=${runtimeTier} (rank ${runtimeRank}); no promotion needed`;
82
+ }
83
+ return {
84
+ v: PROTOCOL_VERSION,
85
+ savedProvider: input.savedProvider,
86
+ runtimeResolvedName: input.runtimeResolvedName,
87
+ runtimeResolvedTier: runtimeTier,
88
+ shouldPromote,
89
+ recommendedProvider,
90
+ reason,
91
+ isDowngradeRefused,
92
+ };
93
+ }
94
+ function canon(v) {
95
+ if (v === null || typeof v !== "object")
96
+ return JSON.stringify(v);
97
+ if (Array.isArray(v))
98
+ return "[" + v.map(canon).join(",") + "]";
99
+ const keys = Object.keys(v).sort();
100
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
101
+ }
102
+ function defaultSecret() {
103
+ return process.env["MNEME_SNN_PROMOTE_SECRET"] || `mneme-snn-auto-promote-v${PROTOCOL_VERSION}`;
104
+ }
105
+ function signRecord(body, secret) {
106
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
107
+ }
108
+ function safeEqHex(a, b) {
109
+ try {
110
+ return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ export function emptyPromotionHistory() {
117
+ return { v: PROTOCOL_VERSION, records: [] };
118
+ }
119
+ export function appendPromotion(opts) {
120
+ if (!opts.decision.shouldPromote || opts.decision.recommendedProvider === null) {
121
+ return opts.history;
122
+ }
123
+ const prev = opts.history.records[opts.history.records.length - 1];
124
+ const body = {
125
+ v: PROTOCOL_VERSION,
126
+ from: opts.decision.savedProvider,
127
+ to: opts.decision.recommendedProvider,
128
+ runtimeResolvedName: opts.decision.runtimeResolvedName,
129
+ reason: opts.decision.reason,
130
+ ts: opts.nowMs ?? Date.now(),
131
+ prevSig: prev ? prev.sig : null,
132
+ };
133
+ const sig = signRecord(body, opts.secret ?? defaultSecret());
134
+ return { v: PROTOCOL_VERSION, records: [...opts.history.records, { ...body, sig }] };
135
+ }
136
+ export function verifyPromotionHistory(history, secret) {
137
+ const sec = secret ?? defaultSecret();
138
+ let prevSig = null;
139
+ for (let i = 0; i < history.records.length; i++) {
140
+ const r = history.records[i];
141
+ const { sig, ...body } = r;
142
+ if (body.prevSig !== prevSig)
143
+ return { ok: false, brokenAt: i, reason: `prevSig mismatch at step ${i}` };
144
+ if (!safeEqHex(signRecord(body, sec), sig))
145
+ return { ok: false, brokenAt: i, reason: `HMAC mismatch at step ${i}` };
146
+ prevSig = sig;
147
+ }
148
+ return { ok: true };
149
+ }
150
+ export function formatDecisionLine(d) {
151
+ const tag = d.shouldPromote ? "⬆" : d.isDowngradeRefused ? "🛡" : "·";
152
+ return `${tag} SNN-PROMOTE · saved=${d.savedProvider} · runtime=${d.runtimeResolvedTier} · ${d.shouldPromote ? "PROMOTE" : "no-op"}`;
153
+ }
154
+ //# sourceMappingURL=index.js.map