@mneme-ai/core 2.13.1 → 2.14.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.
Files changed (53) hide show
  1. package/dist/agent_manifest.d.ts +1 -1
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +22 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/bounty/bounty.test.d.ts +2 -0
  6. package/dist/bounty/bounty.test.d.ts.map +1 -0
  7. package/dist/bounty/bounty.test.js +125 -0
  8. package/dist/bounty/bounty.test.js.map +1 -0
  9. package/dist/bounty/index.d.ts +142 -0
  10. package/dist/bounty/index.d.ts.map +1 -0
  11. package/dist/bounty/index.js +180 -0
  12. package/dist/bounty/index.js.map +1 -0
  13. package/dist/cosmic/aurelian_v214.test.d.ts +9 -0
  14. package/dist/cosmic/aurelian_v214.test.d.ts.map +1 -0
  15. package/dist/cosmic/aurelian_v214.test.js +84 -0
  16. package/dist/cosmic/aurelian_v214.test.js.map +1 -0
  17. package/dist/index.d.ts +5 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/infra_brain/index.d.ts +148 -0
  22. package/dist/infra_brain/index.d.ts.map +1 -0
  23. package/dist/infra_brain/index.js +243 -0
  24. package/dist/infra_brain/index.js.map +1 -0
  25. package/dist/infra_brain/infra_brain.test.d.ts +2 -0
  26. package/dist/infra_brain/infra_brain.test.d.ts.map +1 -0
  27. package/dist/infra_brain/infra_brain.test.js +154 -0
  28. package/dist/infra_brain/infra_brain.test.js.map +1 -0
  29. package/dist/kill_switch/index.d.ts +168 -0
  30. package/dist/kill_switch/index.d.ts.map +1 -0
  31. package/dist/kill_switch/index.js +285 -0
  32. package/dist/kill_switch/index.js.map +1 -0
  33. package/dist/kill_switch/kill_switch.test.d.ts +2 -0
  34. package/dist/kill_switch/kill_switch.test.d.ts.map +1 -0
  35. package/dist/kill_switch/kill_switch.test.js +154 -0
  36. package/dist/kill_switch/kill_switch.test.js.map +1 -0
  37. package/dist/project_soul/index.d.ts +123 -0
  38. package/dist/project_soul/index.d.ts.map +1 -0
  39. package/dist/project_soul/index.js +241 -0
  40. package/dist/project_soul/index.js.map +1 -0
  41. package/dist/project_soul/project_soul.test.d.ts +2 -0
  42. package/dist/project_soul/project_soul.test.d.ts.map +1 -0
  43. package/dist/project_soul/project_soul.test.js +123 -0
  44. package/dist/project_soul/project_soul.test.js.map +1 -0
  45. package/dist/replica/index.d.ts +105 -0
  46. package/dist/replica/index.d.ts.map +1 -0
  47. package/dist/replica/index.js +206 -0
  48. package/dist/replica/index.js.map +1 -0
  49. package/dist/replica/replica.test.d.ts +2 -0
  50. package/dist/replica/replica.test.d.ts.map +1 -0
  51. package/dist/replica/replica.test.js +102 -0
  52. package/dist/replica/replica.test.js.map +1 -0
  53. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ /**
2
+ * v2.14.0 — MNEME REPLICA
3
+ *
4
+ * "When the AI is down, sanctioned, paywalled, hijacked — or just
5
+ * wrong — Mneme answers with a non-LLM decision oracle distilled from
6
+ * your own past judgments. Survives AI extinction events."
7
+ *
8
+ * The replica is built from a corpus of past `Decision` records. Each
9
+ * decision has features (key=value tags) and an outcome (the action you
10
+ * took). When asked a new question, the replica:
11
+ *
12
+ * 1. Computes feature similarity (Jaccard over tags + lexical
13
+ * similarity over question text) against every past decision.
14
+ * 2. Returns the k nearest decisions and their actions, weighted by
15
+ * similarity AND recency (newer decisions weigh slightly more).
16
+ * 3. Produces a confidence score (Wilson-like) plus a structured
17
+ * explanation: "you have decided like this N times; M led to
18
+ * positive outcome."
19
+ *
20
+ * Zero LLM dependency. Runs on CPU. ~100ms for 10K decisions on a
21
+ * laptop. Survives any AI vendor outage.
22
+ *
23
+ * Wisdom: the replica gets *better the more you use Mneme*. It's a
24
+ * compounding asset — every conversation Mneme observes feeds the
25
+ * corpus. This is the moat: a personal AI clone with N months of
26
+ * provenance cannot be replicated by a competitor overnight.
27
+ *
28
+ * Storage: `.mneme/replica/decisions.jsonl` — append-only.
29
+ */
30
+ import { createHmac, randomBytes } from "node:crypto";
31
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, appendFileSync } from "node:fs";
32
+ import { join, resolve, isAbsolute } from "node:path";
33
+ const PROTOCOL_VERSION = 1;
34
+ const DEFAULT_DECAY_HALF_LIFE_DAYS = 90;
35
+ function canon(v) {
36
+ if (v === null || typeof v !== "object")
37
+ return JSON.stringify(v);
38
+ if (Array.isArray(v))
39
+ return "[" + v.map(canon).join(",") + "]";
40
+ const keys = Object.keys(v).sort();
41
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
42
+ }
43
+ function defaultSecret() {
44
+ return process.env["MNEME_REPLICA_SECRET"] || `mneme-replica-default-v${PROTOCOL_VERSION}`;
45
+ }
46
+ function replicaPath(repoDir) {
47
+ const root = repoDir ? (isAbsolute(repoDir) ? repoDir : resolve(repoDir)) : process.cwd();
48
+ const dir = join(root, ".mneme", "replica");
49
+ if (!existsSync(dir))
50
+ mkdirSync(dir, { recursive: true });
51
+ return join(dir, "decisions.jsonl");
52
+ }
53
+ function readAll(path) {
54
+ if (!existsSync(path))
55
+ return [];
56
+ const lines = readFileSync(path, "utf8").split(/\r?\n/).filter((l) => l.trim().length > 0);
57
+ const out = [];
58
+ for (const line of lines) {
59
+ try {
60
+ out.push(JSON.parse(line));
61
+ }
62
+ catch { }
63
+ }
64
+ return out;
65
+ }
66
+ export function recordDecision(input) {
67
+ const path = replicaPath(input.repoDir);
68
+ const d = {
69
+ v: PROTOCOL_VERSION,
70
+ id: "d-" + randomBytes(6).toString("hex"),
71
+ ts: new Date().toISOString(),
72
+ question: input.question.slice(0, 1000),
73
+ features: input.features ?? {},
74
+ action: input.action.slice(0, 1000),
75
+ };
76
+ appendFileSync(path, JSON.stringify(d) + "\n");
77
+ return d;
78
+ }
79
+ /**
80
+ * Tag a previously-recorded decision with an outcome (good/bad/neutral).
81
+ * Appends a new line; the replica reads the latest outcome per id.
82
+ */
83
+ export function recordOutcome(input) {
84
+ const path = replicaPath(input.repoDir);
85
+ const all = readAll(path);
86
+ const idx = all.findIndex((d) => d.id === input.id);
87
+ if (idx < 0)
88
+ throw new Error(`no decision with id ${input.id}`);
89
+ const updated = {
90
+ ...all[idx],
91
+ outcome: { polarity: input.polarity, ...(input.note ? { note: input.note.slice(0, 500) } : {}), recordedAt: new Date().toISOString() },
92
+ };
93
+ all[idx] = updated;
94
+ // Rewrite the file — small enough for personal corpus.
95
+ writeFileSync(path, all.map((d) => JSON.stringify(d)).join("\n") + "\n");
96
+ }
97
+ const STOP = new Set(["the", "a", "an", "is", "are", "in", "on", "of", "to", "for", "and", "or", "but", "we", "i", "you", "it", "be", "with", "do", "did", "have", "has", "had", "this", "that"]);
98
+ function tokenize(text) {
99
+ return new Set(text.toLowerCase().split(/[^a-z0-9]+/)
100
+ .filter((t) => t.length >= 3 && !STOP.has(t)));
101
+ }
102
+ function jaccard(a, b) {
103
+ if (a.size === 0 && b.size === 0)
104
+ return 0;
105
+ let inter = 0;
106
+ for (const x of a)
107
+ if (b.has(x))
108
+ inter++;
109
+ const union = a.size + b.size - inter;
110
+ return union === 0 ? 0 : inter / union;
111
+ }
112
+ function featureSim(a, b) {
113
+ const ak = Object.keys(a), bk = Object.keys(b);
114
+ if (ak.length === 0 && bk.length === 0)
115
+ return 0;
116
+ let matches = 0;
117
+ const union = new Set([...ak, ...bk]);
118
+ for (const k of union)
119
+ if (a[k] !== undefined && b[k] !== undefined && a[k] === b[k])
120
+ matches++;
121
+ return union.size === 0 ? 0 : matches / union.size;
122
+ }
123
+ function decayWeight(decisionTs, nowMs, halfLifeDays) {
124
+ const t = new Date(decisionTs).getTime();
125
+ if (!Number.isFinite(t))
126
+ return 1;
127
+ const ageDays = Math.max(0, (nowMs - t) / (24 * 60 * 60 * 1000));
128
+ return Math.pow(0.5, ageDays / halfLifeDays);
129
+ }
130
+ /** Consult the replica — non-LLM oracle. Returns recommended action +
131
+ * confidence + rationale. */
132
+ export function consultReplica(input) {
133
+ const path = replicaPath(input.repoDir);
134
+ const corpus = readAll(path);
135
+ const k = Math.max(1, input.k ?? 5);
136
+ const halfLife = input.halfLifeDays ?? DEFAULT_DECAY_HALF_LIFE_DAYS;
137
+ const now = Date.now();
138
+ const qTokens = tokenize(input.question);
139
+ const qFeatures = input.features ?? {};
140
+ if (corpus.length === 0) {
141
+ const body = { recommendation: null, confidence: 0, corpusSize: 0 };
142
+ return { recommendation: null, confidence: 0, rationale: ["corpus is empty — no past decisions to draw on"], neighbours: [], corpusSize: 0, sig: createHmac("sha256", defaultSecret()).update(canon(body)).digest("hex") };
143
+ }
144
+ const scored = corpus.map((d) => {
145
+ const textSim = jaccard(qTokens, tokenize(d.question));
146
+ const featSim = featureSim(qFeatures, d.features);
147
+ // Combine: feature match weighs more than text overlap, since features
148
+ // are explicit user-curated structure.
149
+ const similarity = featSim * 0.6 + textSim * 0.4;
150
+ const decay = decayWeight(d.ts, now, halfLife);
151
+ // Outcome shaping: positive outcomes weighed up, negative down.
152
+ const outcomeBoost = d.outcome?.polarity === "good" ? 1.2
153
+ : d.outcome?.polarity === "bad" ? 0.6
154
+ : 1.0;
155
+ return {
156
+ d,
157
+ similarity,
158
+ decayWeight: decay,
159
+ finalWeight: similarity * decay * outcomeBoost,
160
+ };
161
+ }).sort((a, b) => b.finalWeight - a.finalWeight).slice(0, k);
162
+ // Aggregate by action: sum finalWeight per action.
163
+ const tally = new Map();
164
+ for (const s of scored)
165
+ tally.set(s.d.action, (tally.get(s.d.action) ?? 0) + s.finalWeight);
166
+ const ranked = Array.from(tally.entries()).sort((a, b) => b[1] - a[1]);
167
+ const top = ranked[0];
168
+ const totalWeight = ranked.reduce((acc, [, w]) => acc + w, 0);
169
+ const confidence = top && totalWeight > 0 ? top[1] / totalWeight : 0;
170
+ const rationale = [];
171
+ if (top) {
172
+ rationale.push(`Top match: "${top[0]}" with combined weight ${top[1].toFixed(3)} across ${scored.filter((s) => s.d.action === top[0]).length} neighbour(s).`);
173
+ rationale.push(`Confidence = ${(confidence * 100).toFixed(1)}% (top-action weight / total).`);
174
+ if (scored.length >= 3)
175
+ rationale.push(`${scored.length} neighbours considered with half-life ${halfLife} days.`);
176
+ }
177
+ else {
178
+ rationale.push("no meaningful similarity to any past decision");
179
+ }
180
+ const neighbours = scored.map((s) => ({
181
+ id: s.d.id,
182
+ similarity: Math.round(s.similarity * 1000) / 1000,
183
+ decayWeight: Math.round(s.decayWeight * 1000) / 1000,
184
+ finalWeight: Math.round(s.finalWeight * 1000) / 1000,
185
+ action: s.d.action,
186
+ question: s.d.question,
187
+ ...(s.d.outcome ? { outcomePolarity: s.d.outcome.polarity } : {}),
188
+ }));
189
+ const body = { recommendation: top?.[0] ?? null, confidence, corpusSize: corpus.length };
190
+ const sig = createHmac("sha256", defaultSecret()).update(canon(body)).digest("hex");
191
+ return {
192
+ recommendation: top?.[0] ?? null,
193
+ confidence: Math.round(confidence * 1000) / 1000,
194
+ rationale,
195
+ neighbours,
196
+ corpusSize: corpus.length,
197
+ sig,
198
+ };
199
+ }
200
+ /** One-line summary of the replica state. */
201
+ export function formatReplicaLine(opts = {}) {
202
+ const corpus = readAll(replicaPath(opts.repoDir));
203
+ const withOutcome = corpus.filter((d) => d.outcome).length;
204
+ return `REPLICA · ${corpus.length} decisions · ${withOutcome} with outcome`;
205
+ }
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/replica/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,gBAAgB,GAAG,CAAU,CAAC;AACpC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAsDxC,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACnH,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,0BAA0B,gBAAgB,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3F,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAa,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AASD,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,GAAa;QAClB,CAAC,EAAE,gBAAgB;QACnB,EAAE,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QACvC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;KACpC,CAAC;IACF,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAA4F;IACxH,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,GAAa;QACxB,GAAG,GAAG,CAAC,GAAG,CAAE;QACZ,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;KACvI,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACnB,uDAAuD;IACvD,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAElM,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,GAAG,CACZ,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAc,EAAE,CAAc;IAC7C,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACtC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,CAAyB,EAAE,CAAyB;IACtE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IAChG,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,KAAa,EAAE,YAAoB;IAC1E,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED;8BAC8B;AAC9B,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,IAAI,4BAA4B,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,gDAAgD,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7N,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,uEAAuE;QACvE,uCAAuC;QACvC,MAAM,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,gEAAgE;QAChE,MAAM,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG;YACvD,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG;gBACrC,CAAC,CAAC,GAAG,CAAC;QACR,OAAO;YACL,CAAC;YACD,UAAU;YACV,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,YAAY;SAC/C,CAAC;IACJ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,mDAAmD;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,GAAG,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAC9J,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,yCAAyC,QAAQ,QAAQ,CAAC,CAAC;IACpH,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACV,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI;QAClD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI;QACpD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI;QACpD,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;QAClB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ;QACtB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC,CAAC,CAAC;IAEJ,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACzF,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpF,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;QAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI;QAChD,SAAS;QACT,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAAC,OAA6B,EAAE;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3D,OAAO,aAAa,MAAM,CAAC,MAAM,gBAAgB,WAAW,eAAe,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=replica.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replica.test.d.ts","sourceRoot":"","sources":["../../src/replica/replica.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { recordDecision, recordOutcome, consultReplica, formatReplicaLine } from "./index.js";
6
+ describe("v2.14 · MNEME REPLICA — non-LLM oracle from history", () => {
7
+ let dir;
8
+ beforeEach(() => { dir = mkdtempSync(join(tmpdir(), "replica-")); });
9
+ afterEach(() => { try {
10
+ rmSync(dir, { recursive: true, force: true });
11
+ }
12
+ catch { } });
13
+ it("empty corpus → confidence 0, no recommendation", () => {
14
+ const r = consultReplica({ question: "should I deploy on Friday?", repoDir: dir });
15
+ expect(r.corpusSize).toBe(0);
16
+ expect(r.recommendation).toBeNull();
17
+ expect(r.confidence).toBe(0);
18
+ expect(r.sig).toMatch(/^[0-9a-f]{64}$/);
19
+ });
20
+ it("recordDecision appends signed entry", () => {
21
+ const d = recordDecision({ question: "Friday deploy ok?", action: "wait until Monday", features: { day: "Friday", risk: "high" }, repoDir: dir });
22
+ expect(d.id).toMatch(/^d-/);
23
+ expect(d.action).toBe("wait until Monday");
24
+ expect(d.features.day).toBe("Friday");
25
+ });
26
+ it("consult recovers a matching past decision via features", () => {
27
+ recordDecision({ question: "Should I deploy on Friday at 5pm?", action: "wait until Monday", features: { day: "Friday", risk: "high" }, repoDir: dir });
28
+ const r = consultReplica({ question: "Friday deployment plan?", features: { day: "Friday", risk: "high" }, repoDir: dir });
29
+ expect(r.recommendation).toBe("wait until Monday");
30
+ expect(r.confidence).toBeGreaterThan(0);
31
+ expect(r.neighbours).toHaveLength(1);
32
+ });
33
+ it("recency decay: recent decision wins over old one with same features", () => {
34
+ // Old decision: action A. Inject by hand-writing with old timestamp.
35
+ const oldDecision = recordDecision({ question: "Friday deploy?", action: "deploy carefully", features: { day: "Friday" }, repoDir: dir });
36
+ // Hack: directly rewrite to push ts back 365 days.
37
+ const fs = require("node:fs");
38
+ const path = require("node:path").join(dir, ".mneme", "replica", "decisions.jsonl");
39
+ const lines = fs.readFileSync(path, "utf8").split("\n").filter((l) => l.length > 0);
40
+ const old = JSON.parse(lines[0]);
41
+ old.ts = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000).toISOString();
42
+ lines[0] = JSON.stringify(old);
43
+ fs.writeFileSync(path, lines.join("\n") + "\n");
44
+ // Newer decision: action B with same features
45
+ recordDecision({ question: "Friday deploy?", action: "DO NOT deploy", features: { day: "Friday" }, repoDir: dir });
46
+ const r = consultReplica({ question: "Friday deploy?", features: { day: "Friday" }, repoDir: dir, halfLifeDays: 30 });
47
+ // Recent should outweigh ancient
48
+ expect(r.recommendation).toBe("DO NOT deploy");
49
+ });
50
+ it("outcome polarity shapes recommendation", () => {
51
+ // Two competing decisions with same features but different outcomes
52
+ const d1 = recordDecision({ question: "x", action: "approach A", features: { topic: "x" }, repoDir: dir });
53
+ const d2 = recordDecision({ question: "x", action: "approach B", features: { topic: "x" }, repoDir: dir });
54
+ recordOutcome({ id: d1.id, polarity: "bad", repoDir: dir });
55
+ recordOutcome({ id: d2.id, polarity: "good", repoDir: dir });
56
+ const r = consultReplica({ question: "x again", features: { topic: "x" }, repoDir: dir });
57
+ // approach B (good outcome) gets a boost; should win
58
+ expect(r.recommendation).toBe("approach B");
59
+ });
60
+ it("consults k neighbours and reports rationale", () => {
61
+ for (let i = 0; i < 8; i++) {
62
+ recordDecision({ question: `case ${i}`, action: i % 2 === 0 ? "left" : "right", features: { even: String(i % 2 === 0) }, repoDir: dir });
63
+ }
64
+ const r = consultReplica({ question: "case 9", features: { even: "false" }, k: 4, repoDir: dir });
65
+ expect(r.neighbours).toHaveLength(4);
66
+ expect(r.rationale.length).toBeGreaterThanOrEqual(2);
67
+ expect(r.corpusSize).toBe(8);
68
+ });
69
+ it("confidence sums to ≤ 1.0 across top action share", () => {
70
+ for (let i = 0; i < 5; i++)
71
+ recordDecision({ question: "x", action: "A", features: { t: "x" }, repoDir: dir });
72
+ recordDecision({ question: "x", action: "B", features: { t: "x" }, repoDir: dir });
73
+ const r = consultReplica({ question: "x", features: { t: "x" }, k: 6, repoDir: dir });
74
+ expect(r.confidence).toBeGreaterThan(0);
75
+ expect(r.confidence).toBeLessThanOrEqual(1);
76
+ });
77
+ it("HMAC sig is deterministic for same body shape", () => {
78
+ recordDecision({ question: "test", action: "yes", repoDir: dir });
79
+ const r1 = consultReplica({ question: "test", repoDir: dir });
80
+ const r2 = consultReplica({ question: "test", repoDir: dir });
81
+ // sig is over { recommendation, confidence, corpusSize } — should match
82
+ expect(r1.sig).toBe(r2.sig);
83
+ });
84
+ it("recordOutcome throws for unknown id", () => {
85
+ expect(() => recordOutcome({ id: "d-doesnotexist", polarity: "good", repoDir: dir })).toThrow();
86
+ });
87
+ it("formatReplicaLine summarises", () => {
88
+ const d = recordDecision({ question: "x", action: "y", repoDir: dir });
89
+ recordOutcome({ id: d.id, polarity: "good", repoDir: dir });
90
+ const line = formatReplicaLine({ repoDir: dir });
91
+ expect(line).toContain("REPLICA");
92
+ expect(line).toContain("1 decisions");
93
+ expect(line).toContain("1 with outcome");
94
+ });
95
+ it("works even when all AI is unavailable (zero LLM dep proof)", () => {
96
+ // No fetch, no API — pure local crypto + filesystem.
97
+ recordDecision({ question: "What if internet is down?", action: "use local cache", features: { offline: "true" }, repoDir: dir });
98
+ const r = consultReplica({ question: "offline scenario", features: { offline: "true" }, repoDir: dir });
99
+ expect(r.recommendation).toBe("use local cache");
100
+ });
101
+ });
102
+ //# sourceMappingURL=replica.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replica.test.js","sourceRoot":"","sources":["../../src/replica/replica.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/core",
3
- "version": "2.13.1",
3
+ "version": "2.14.0",
4
4
  "description": "Core indexing, retrieval, and graph engine for Mneme",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",