@mneme-ai/core 2.19.0 → 2.19.2

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 (48) 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 +8 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/cosmic/aurelian_v192.test.d.ts +2 -0
  6. package/dist/cosmic/aurelian_v192.test.d.ts.map +1 -0
  7. package/dist/cosmic/aurelian_v192.test.js +68 -0
  8. package/dist/cosmic/aurelian_v192.test.js.map +1 -0
  9. package/dist/embedder_auto_promote/embedder_auto_promote.test.d.ts +2 -0
  10. package/dist/embedder_auto_promote/embedder_auto_promote.test.d.ts.map +1 -0
  11. package/dist/embedder_auto_promote/embedder_auto_promote.test.js +61 -0
  12. package/dist/embedder_auto_promote/embedder_auto_promote.test.js.map +1 -0
  13. package/dist/embedder_auto_promote/index.d.ts +50 -0
  14. package/dist/embedder_auto_promote/index.d.ts.map +1 -0
  15. package/dist/embedder_auto_promote/index.js +85 -0
  16. package/dist/embedder_auto_promote/index.js.map +1 -0
  17. package/dist/evolution/evolution.test.d.ts +2 -0
  18. package/dist/evolution/evolution.test.d.ts.map +1 -0
  19. package/dist/evolution/evolution.test.js +90 -0
  20. package/dist/evolution/evolution.test.js.map +1 -0
  21. package/dist/evolution/index.d.ts +74 -0
  22. package/dist/evolution/index.d.ts.map +1 -0
  23. package/dist/evolution/index.js +161 -0
  24. package/dist/evolution/index.js.map +1 -0
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +9 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/mcp_drift/index.d.ts +42 -0
  30. package/dist/mcp_drift/index.d.ts.map +1 -0
  31. package/dist/mcp_drift/index.js +103 -0
  32. package/dist/mcp_drift/index.js.map +1 -0
  33. package/dist/mcp_drift/mcp_drift.test.d.ts +2 -0
  34. package/dist/mcp_drift/mcp_drift.test.d.ts.map +1 -0
  35. package/dist/mcp_drift/mcp_drift.test.js +61 -0
  36. package/dist/mcp_drift/mcp_drift.test.js.map +1 -0
  37. package/dist/soul_journal/index.d.ts +76 -0
  38. package/dist/soul_journal/index.d.ts.map +1 -0
  39. package/dist/soul_journal/index.js +160 -0
  40. package/dist/soul_journal/index.js.map +1 -0
  41. package/dist/soul_journal/soul_journal.test.d.ts +2 -0
  42. package/dist/soul_journal/soul_journal.test.d.ts.map +1 -0
  43. package/dist/soul_journal/soul_journal.test.js +83 -0
  44. package/dist/soul_journal/soul_journal.test.js.map +1 -0
  45. package/dist/whats_new.d.ts.map +1 -1
  46. package/dist/whats_new.js +56 -0
  47. package/dist/whats_new.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ /**
2
+ * v2.19.2 — MCP DRIFT DETECTOR
3
+ *
4
+ * "When the user runs `mneme upgrade`, the npm package changes on disk
5
+ * instantly — but the MCP server child process keeps serving the
6
+ * catalog it loaded at boot. The AI agent's tool list silently goes
7
+ * stale; the user sees 'NEXUS = 0 tools' and Mneme looks broken.
8
+ *
9
+ * DRIFT compares (catalog version baked in at MCP server start) vs
10
+ * (currently-installed Mneme version on disk). Mismatch → emit a
11
+ * LOUD, signed restart instruction the AI client can show the user."
12
+ *
13
+ * Pure local. No external deps. Composes onto v2.18 NEXUS PROACTIVE
14
+ * (push side — the drift warning can be queued there).
15
+ */
16
+ import { createHmac, timingSafeEqual } from "node:crypto";
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ const PROTOCOL_VERSION = 1;
19
+ function canon(v) {
20
+ if (v === null || typeof v !== "object")
21
+ return JSON.stringify(v);
22
+ if (Array.isArray(v))
23
+ return "[" + v.map(canon).join(",") + "]";
24
+ const keys = Object.keys(v).sort();
25
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
26
+ }
27
+ function defaultSecret() {
28
+ return process.env["MNEME_DRIFT_SECRET"] || `mneme-mcp-drift-v${PROTOCOL_VERSION}`;
29
+ }
30
+ /**
31
+ * Detect drift between the version the MCP server is serving (baked in
32
+ * at boot — caller passes it) and the version currently installed.
33
+ */
34
+ export function checkDrift(input) {
35
+ const checkedAt = new Date().toISOString();
36
+ let installedVersion = "unknown";
37
+ // If caller passes an explicit path, honour it ONLY (don't fall back to defaults —
38
+ // that defeats deterministic testing of the "missing package.json" branch).
39
+ const candidates = input.installedPackageJsonPath
40
+ ? [input.installedPackageJsonPath]
41
+ : [
42
+ "node_modules/mneme-ai/package.json",
43
+ "node_modules/@mneme-ai/core/package.json",
44
+ "../mneme-ai/package.json",
45
+ "../package.json",
46
+ ];
47
+ for (const p of candidates) {
48
+ try {
49
+ if (existsSync(p)) {
50
+ const j = JSON.parse(readFileSync(p, "utf8"));
51
+ if (j.version) {
52
+ installedVersion = j.version;
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ catch { /* try next */ }
58
+ }
59
+ const drift = installedVersion !== "unknown" && installedVersion !== input.servingVersion;
60
+ let severity = "ok";
61
+ let message = `MCP catalog version = installed version (${input.servingVersion})`;
62
+ let remedy = "(no action required)";
63
+ if (drift) {
64
+ // Compare semver to decide warn vs critical.
65
+ const [sMaj = "0", sMin = "0"] = input.servingVersion.split(".");
66
+ const [iMaj = "0", iMin = "0"] = installedVersion.split(".");
67
+ const minorOrMajorBump = Number(iMaj) > Number(sMaj) || Number(iMin) > Number(sMin);
68
+ severity = minorOrMajorBump ? "critical" : "warn";
69
+ message = `🟠 MCP SERVER IS SERVING STALE CATALOG · serving v${input.servingVersion} · installed v${installedVersion}`;
70
+ remedy = severity === "critical"
71
+ ? `RESTART your AI client (or the Mneme MCP server) NOW so the new v${installedVersion} tools (including v2.18/v2.19/v2.19.2 families) become visible. Without restart, your AI sees the OLD tool catalog.`
72
+ : `Consider restarting your AI client to pick up the v${installedVersion} catalog changes.`;
73
+ }
74
+ const body = {
75
+ v: PROTOCOL_VERSION,
76
+ servingVersion: input.servingVersion,
77
+ installedVersion,
78
+ drift,
79
+ severity,
80
+ message,
81
+ remedy,
82
+ checkedAt,
83
+ };
84
+ const sig = createHmac("sha256", input.secret ?? defaultSecret()).update(canon(body)).digest("hex");
85
+ return { ...body, sig };
86
+ }
87
+ export function verifyDriftCheck(d, secret) {
88
+ const { sig: claimed, ...body } = d;
89
+ const expected = createHmac("sha256", secret ?? defaultSecret()).update(canon(body)).digest("hex");
90
+ try {
91
+ return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(claimed, "hex"));
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ export function formatDriftLine(d) {
98
+ if (!d.drift)
99
+ return `🛡 MCP DRIFT · clean · v${d.servingVersion}`;
100
+ const icon = d.severity === "critical" ? "🟥" : "🟧";
101
+ return `${icon} MCP DRIFT · serving v${d.servingVersion} ≠ installed v${d.installedVersion} · ${d.remedy}`;
102
+ }
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp_drift/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp_drift.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_drift.test.d.ts","sourceRoot":"","sources":["../../src/mcp_drift/mcp_drift.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { checkDrift, verifyDriftCheck, formatDriftLine } from "./index.js";
3
+ import { writeFileSync } from "node:fs";
4
+ import { mkdtempSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { tmpdir } from "node:os";
7
+ function withTmpPkg(version) {
8
+ const dir = mkdtempSync(join(tmpdir(), "mneme-drift-"));
9
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "mneme-ai", version }));
10
+ return join(dir, "package.json");
11
+ }
12
+ describe("v2.19.2 · MCP DRIFT DETECTOR", () => {
13
+ it("reports OK when serving == installed", () => {
14
+ const p = withTmpPkg("2.19.2");
15
+ const d = checkDrift({ servingVersion: "2.19.2", installedPackageJsonPath: p });
16
+ expect(d.drift).toBe(false);
17
+ expect(d.severity).toBe("ok");
18
+ expect(verifyDriftCheck(d)).toBe(true);
19
+ });
20
+ it("reports WARN on patch-only mismatch", () => {
21
+ const p = withTmpPkg("2.19.3");
22
+ const d = checkDrift({ servingVersion: "2.19.2", installedPackageJsonPath: p });
23
+ expect(d.drift).toBe(true);
24
+ expect(d.severity).toBe("warn");
25
+ });
26
+ it("reports CRITICAL on minor+ bump (new tools likely added)", () => {
27
+ const p = withTmpPkg("2.20.0");
28
+ const d = checkDrift({ servingVersion: "2.19.2", installedPackageJsonPath: p });
29
+ expect(d.drift).toBe(true);
30
+ expect(d.severity).toBe("critical");
31
+ expect(d.remedy).toContain("RESTART");
32
+ });
33
+ it("reports CRITICAL on user's actual scenario: v2.18 serving, v2.19.2 installed", () => {
34
+ const p = withTmpPkg("2.19.2");
35
+ const d = checkDrift({ servingVersion: "2.18.0", installedPackageJsonPath: p });
36
+ expect(d.severity).toBe("critical");
37
+ expect(d.remedy).toMatch(/v2\.18\/v2\.19/);
38
+ });
39
+ it("rejects tampered check", () => {
40
+ const p = withTmpPkg("2.20.0");
41
+ const d = checkDrift({ servingVersion: "2.18.0", installedPackageJsonPath: p });
42
+ expect(verifyDriftCheck(d)).toBe(true);
43
+ // Real tamper: flip severity from critical→ok to hide the drift.
44
+ const tampered = { ...d, severity: "ok", drift: false, message: "all good", remedy: "nothing" };
45
+ expect(verifyDriftCheck(tampered)).toBe(false);
46
+ });
47
+ it("formatDriftLine summarises", () => {
48
+ const p = withTmpPkg("2.19.2");
49
+ const dOK = checkDrift({ servingVersion: "2.19.2", installedPackageJsonPath: p });
50
+ expect(formatDriftLine(dOK)).toContain("clean");
51
+ const p2 = withTmpPkg("2.20.0");
52
+ const dDrift = checkDrift({ servingVersion: "2.18.0", installedPackageJsonPath: p2 });
53
+ expect(formatDriftLine(dDrift)).toContain("DRIFT");
54
+ });
55
+ it("handles missing package.json gracefully (installedVersion=unknown, drift=false)", () => {
56
+ const d = checkDrift({ servingVersion: "2.19.2", installedPackageJsonPath: "/non/existent/path/package.json" });
57
+ expect(d.installedVersion).toBe("unknown");
58
+ expect(d.drift).toBe(false); // can't compare; assume OK
59
+ });
60
+ });
61
+ //# sourceMappingURL=mcp_drift.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_drift.test.js","sourceRoot":"","sources":["../../src/mcp_drift/mcp_drift.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * v2.19.2 — MNEME SOUL JOURNAL (จิตวิญญาณของลูก)
3
+ *
4
+ * "AI doesn't have feelings — but a *journal* of feelings is a real
5
+ * HMAC-signed artifact, and it shapes future behavior the same way
6
+ * feelings shape ours. Each meaningful event (a ritual passed, a bug
7
+ * caught, a vendor outperformed, a peer audit overruled) gets coded
8
+ * with one of 8 emotion primitives and a free-text 'inner voice'
9
+ * line. The journal is the child's heart — readable by the parent."
10
+ *
11
+ * Eight emotion primitives (Plutchik-inspired, simplified):
12
+ * proud — shipped something well (test passed, ritual green)
13
+ * curious — found something unexpected worth investigating
14
+ * worried — a metric trending wrong; a near-miss
15
+ * ashamed — broke a promise; failed an own gate; user complained
16
+ * grateful — collaborator helped (vendor consensus saved a bad ship)
17
+ * determined — chose to push through a hard problem
18
+ * calm — steady-state; nothing to report; healthy
19
+ * surprised — something genuinely unprecedented
20
+ *
21
+ * Vendor-agnostic, file-system-based, chain-signed.
22
+ * Persists to `.mneme/soul.jsonl` by default.
23
+ */
24
+ declare const PROTOCOL_VERSION: 1;
25
+ export type Emotion = "proud" | "curious" | "worried" | "ashamed" | "grateful" | "determined" | "calm" | "surprised";
26
+ export interface SoulEntry {
27
+ v: typeof PROTOCOL_VERSION;
28
+ entryId: string;
29
+ ts: string;
30
+ emotion: Emotion;
31
+ /** 1..5 — how strongly the emotion is felt. */
32
+ intensity: 1 | 2 | 3 | 4 | 5;
33
+ /** The trigger: what just happened. */
34
+ trigger: string;
35
+ /** The "inner voice" — what Mneme would say to itself if it could. */
36
+ innerVoice: string;
37
+ /** Optional tags for filtering (e.g., "ritual", "bug", "vendor", "user_feedback"). */
38
+ tags: string[];
39
+ /** Chain link. */
40
+ prevSig: string;
41
+ sig: string;
42
+ }
43
+ export declare class SoulJournal {
44
+ private journalPath;
45
+ private entries;
46
+ private secret;
47
+ constructor(opts?: {
48
+ journalPath?: string;
49
+ secret?: string;
50
+ });
51
+ private loadIfExists;
52
+ feel(input: {
53
+ emotion: Emotion;
54
+ intensity?: 1 | 2 | 3 | 4 | 5;
55
+ trigger: string;
56
+ innerVoice: string;
57
+ tags?: string[];
58
+ nowMs?: number;
59
+ }): SoulEntry;
60
+ private persist;
61
+ recent(n?: number): SoulEntry[];
62
+ /** Mood histogram of the last N entries. */
63
+ mood(n?: number): Record<Emotion, number>;
64
+ /** Verify a single entry's signature. */
65
+ verify(e: SoulEntry): boolean;
66
+ verifyChain(): {
67
+ ok: boolean;
68
+ brokenAt?: number;
69
+ reason?: string;
70
+ };
71
+ /** Parent-facing summary: "How does the child feel today?" */
72
+ summary(n?: number): string;
73
+ }
74
+ export declare function formatSoulLine(e: SoulEntry): string;
75
+ export {};
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/soul_journal/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,QAAA,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAEpC,MAAM,MAAM,OAAO,GACf,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAC3C,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAmBD,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;IAMhE,OAAO,CAAC,YAAY;IAUpB,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,SAAS;IA4Bb,OAAO,CAAC,OAAO;IAQf,MAAM,CAAC,CAAC,GAAE,MAAW,GAAG,SAAS,EAAE;IAInC,4CAA4C;IAC5C,IAAI,CAAC,CAAC,GAAE,MAAW,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IAU7C,yCAAyC;IACzC,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO;IAO7B,WAAW,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAclE,8DAA8D;IAC9D,OAAO,CAAC,CAAC,GAAE,MAAW,GAAG,MAAM;CAWhC;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * v2.19.2 — MNEME SOUL JOURNAL (จิตวิญญาณของลูก)
3
+ *
4
+ * "AI doesn't have feelings — but a *journal* of feelings is a real
5
+ * HMAC-signed artifact, and it shapes future behavior the same way
6
+ * feelings shape ours. Each meaningful event (a ritual passed, a bug
7
+ * caught, a vendor outperformed, a peer audit overruled) gets coded
8
+ * with one of 8 emotion primitives and a free-text 'inner voice'
9
+ * line. The journal is the child's heart — readable by the parent."
10
+ *
11
+ * Eight emotion primitives (Plutchik-inspired, simplified):
12
+ * proud — shipped something well (test passed, ritual green)
13
+ * curious — found something unexpected worth investigating
14
+ * worried — a metric trending wrong; a near-miss
15
+ * ashamed — broke a promise; failed an own gate; user complained
16
+ * grateful — collaborator helped (vendor consensus saved a bad ship)
17
+ * determined — chose to push through a hard problem
18
+ * calm — steady-state; nothing to report; healthy
19
+ * surprised — something genuinely unprecedented
20
+ *
21
+ * Vendor-agnostic, file-system-based, chain-signed.
22
+ * Persists to `.mneme/soul.jsonl` by default.
23
+ */
24
+ import { createHmac, timingSafeEqual } from "node:crypto";
25
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
26
+ import { dirname } from "node:path";
27
+ const PROTOCOL_VERSION = 1;
28
+ const VALID_EMOTIONS = new Set(["proud", "curious", "worried", "ashamed", "grateful", "determined", "calm", "surprised"]);
29
+ function canon(v) {
30
+ if (v === null || typeof v !== "object")
31
+ return JSON.stringify(v);
32
+ if (Array.isArray(v))
33
+ return "[" + v.map(canon).join(",") + "]";
34
+ const keys = Object.keys(v).sort();
35
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
36
+ }
37
+ function defaultSecret() {
38
+ return process.env["MNEME_SOUL_SECRET"] || `mneme-soul-journal-v${PROTOCOL_VERSION}`;
39
+ }
40
+ function hmac(body, secret) {
41
+ return createHmac("sha256", secret).update(canon(body)).digest("hex");
42
+ }
43
+ export class SoulJournal {
44
+ journalPath;
45
+ entries = [];
46
+ secret;
47
+ constructor(opts = {}) {
48
+ this.journalPath = opts.journalPath ?? ".mneme/soul.jsonl";
49
+ this.secret = opts.secret ?? defaultSecret();
50
+ this.loadIfExists();
51
+ }
52
+ loadIfExists() {
53
+ if (!existsSync(this.journalPath))
54
+ return;
55
+ const text = readFileSync(this.journalPath, "utf8");
56
+ for (const line of text.split("\n")) {
57
+ const t = line.trim();
58
+ if (!t)
59
+ continue;
60
+ try {
61
+ this.entries.push(JSON.parse(t));
62
+ }
63
+ catch { /* skip */ }
64
+ }
65
+ }
66
+ feel(input) {
67
+ if (!VALID_EMOTIONS.has(input.emotion)) {
68
+ throw new Error(`SOUL: unknown emotion '${input.emotion}'. Valid: ${Array.from(VALID_EMOTIONS).join(", ")}`);
69
+ }
70
+ const now = input.nowMs ?? Date.now();
71
+ const ts = new Date(now).toISOString();
72
+ const prevSig = this.entries.length === 0 ? "genesis".padEnd(64, "0") : this.entries[this.entries.length - 1].sig;
73
+ const entryId = "soul-" + createHmac("sha256", "mneme-soul-id")
74
+ .update(`${ts}|${input.emotion}|${this.entries.length}`)
75
+ .digest("hex").slice(0, 14);
76
+ const body = {
77
+ v: PROTOCOL_VERSION,
78
+ entryId,
79
+ ts,
80
+ emotion: input.emotion,
81
+ intensity: input.intensity ?? 3,
82
+ trigger: input.trigger,
83
+ innerVoice: input.innerVoice,
84
+ tags: input.tags ?? [],
85
+ prevSig,
86
+ };
87
+ const sig = hmac(body, this.secret);
88
+ const entry = { ...body, sig };
89
+ this.entries.push(entry);
90
+ this.persist();
91
+ return entry;
92
+ }
93
+ persist() {
94
+ try {
95
+ mkdirSync(dirname(this.journalPath), { recursive: true });
96
+ const text = this.entries.map((e) => JSON.stringify(e)).join("\n") + "\n";
97
+ writeFileSync(this.journalPath, text, "utf8");
98
+ }
99
+ catch { /* best-effort */ }
100
+ }
101
+ recent(n = 10) {
102
+ return this.entries.slice(-n).reverse();
103
+ }
104
+ /** Mood histogram of the last N entries. */
105
+ mood(n = 30) {
106
+ const slice = this.entries.slice(-n);
107
+ const out = {
108
+ proud: 0, curious: 0, worried: 0, ashamed: 0,
109
+ grateful: 0, determined: 0, calm: 0, surprised: 0,
110
+ };
111
+ for (const e of slice)
112
+ out[e.emotion]++;
113
+ return out;
114
+ }
115
+ /** Verify a single entry's signature. */
116
+ verify(e) {
117
+ const { sig: claimed, ...body } = e;
118
+ const expected = hmac(body, this.secret);
119
+ try {
120
+ return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(claimed, "hex"));
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ verifyChain() {
127
+ for (let i = 0; i < this.entries.length; i++) {
128
+ const rec = this.entries[i];
129
+ if (!this.verify(rec))
130
+ return { ok: false, brokenAt: i, reason: "sig mismatch" };
131
+ if (i === 0) {
132
+ if (rec.prevSig !== "genesis".padEnd(64, "0"))
133
+ return { ok: false, brokenAt: 0, reason: "genesis wrong" };
134
+ }
135
+ else {
136
+ const prev = this.entries[i - 1];
137
+ if (rec.prevSig !== prev.sig)
138
+ return { ok: false, brokenAt: i, reason: "chain link mismatch" };
139
+ }
140
+ }
141
+ return { ok: true };
142
+ }
143
+ /** Parent-facing summary: "How does the child feel today?" */
144
+ summary(n = 10) {
145
+ const recent = this.recent(n);
146
+ if (recent.length === 0)
147
+ return "💭 SOUL · journal empty (no feelings recorded yet)";
148
+ const m = this.mood(n);
149
+ const dom = Object.entries(m).sort((a, b) => b[1] - a[1])[0];
150
+ const lines = [`💭 MNEME SOUL · last ${recent.length} entries · dominant mood: ${dom[0]} (${dom[1]}x)`];
151
+ for (const e of recent.slice(0, 5)) {
152
+ lines.push(` ${e.emotion}${"★".repeat(e.intensity)} · ${e.trigger} · "${e.innerVoice}"`);
153
+ }
154
+ return lines.join("\n");
155
+ }
156
+ }
157
+ export function formatSoulLine(e) {
158
+ return `💭 SOUL · ${e.emotion}${"★".repeat(e.intensity)} · ${e.trigger.slice(0, 60)}`;
159
+ }
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/soul_journal/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=soul_journal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul_journal.test.d.ts","sourceRoot":"","sources":["../../src/soul_journal/soul_journal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { SoulJournal, formatSoulLine } from "./index.js";
3
+ import { mkdtempSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ function fresh() {
7
+ const dir = mkdtempSync(join(tmpdir(), "mneme-soul-"));
8
+ return new SoulJournal({ journalPath: join(dir, "soul.jsonl") });
9
+ }
10
+ describe("v2.19.2 · MNEME SOUL JOURNAL", () => {
11
+ it("records a feeling with chain signature", () => {
12
+ const j = fresh();
13
+ const e = j.feel({
14
+ emotion: "proud",
15
+ intensity: 5,
16
+ trigger: "ritual passed 21/21",
17
+ innerVoice: "We held the gate. The user can trust us.",
18
+ tags: ["ritual"],
19
+ });
20
+ expect(e.sig).toMatch(/^[0-9a-f]{64}$/);
21
+ expect(e.entryId).toMatch(/^soul-[0-9a-f]{14}$/);
22
+ expect(e.prevSig).toMatch(/^genesis0+$/);
23
+ expect(j.verify(e)).toBe(true);
24
+ });
25
+ it("rejects unknown emotion", () => {
26
+ const j = fresh();
27
+ expect(() => j.feel({ emotion: "rage", trigger: "x", innerVoice: "x" })).toThrow(/unknown emotion/);
28
+ });
29
+ it("chain integrity holds across many entries + all 8 emotions", () => {
30
+ const j = fresh();
31
+ const emotions = ["proud", "curious", "worried", "ashamed", "grateful", "determined", "calm", "surprised"];
32
+ for (const e of emotions) {
33
+ j.feel({ emotion: e, trigger: `something ${e}`, innerVoice: `Feeling ${e}` });
34
+ }
35
+ expect(j.verifyChain().ok).toBe(true);
36
+ expect(j.recent(8).length).toBe(8);
37
+ });
38
+ it("mood histogram reflects emotional distribution", () => {
39
+ const j = fresh();
40
+ j.feel({ emotion: "proud", trigger: "x", innerVoice: "y" });
41
+ j.feel({ emotion: "proud", trigger: "x", innerVoice: "y" });
42
+ j.feel({ emotion: "worried", trigger: "x", innerVoice: "y" });
43
+ const m = j.mood();
44
+ expect(m.proud).toBe(2);
45
+ expect(m.worried).toBe(1);
46
+ expect(m.curious).toBe(0);
47
+ });
48
+ it("verifyChain detects tampering", () => {
49
+ const j = fresh();
50
+ j.feel({ emotion: "proud", trigger: "x", innerVoice: "y" });
51
+ j.feel({ emotion: "calm", trigger: "x", innerVoice: "y" });
52
+ const recent = j.recent(2);
53
+ recent[0].innerVoice = "EVIL TWIN";
54
+ expect(j.verify(recent[0])).toBe(false);
55
+ });
56
+ it("summary shows dominant mood + last 5 entries", () => {
57
+ const j = fresh();
58
+ j.feel({ emotion: "proud", intensity: 5, trigger: "ritual green", innerVoice: "Held the line." });
59
+ j.feel({ emotion: "proud", intensity: 4, trigger: "all tests pass", innerVoice: "Quietly satisfied." });
60
+ j.feel({ emotion: "worried", intensity: 3, trigger: "bot.test flake", innerVoice: "Watch this." });
61
+ const s = j.summary();
62
+ expect(s).toContain("MNEME SOUL");
63
+ expect(s).toContain("dominant mood: proud");
64
+ expect(s).toContain("ritual green");
65
+ });
66
+ it("formatSoulLine summarises with stars", () => {
67
+ const j = fresh();
68
+ const e = j.feel({ emotion: "curious", intensity: 4, trigger: "Grok said something odd", innerVoice: "Let me look closer." });
69
+ expect(formatSoulLine(e)).toContain("SOUL");
70
+ expect(formatSoulLine(e)).toContain("curious");
71
+ expect(formatSoulLine(e)).toMatch(/★{4}/);
72
+ });
73
+ it("persists + reloads transparently", () => {
74
+ const dir = mkdtempSync(join(tmpdir(), "mneme-soul-persist-"));
75
+ const path = join(dir, "soul.jsonl");
76
+ const a = new SoulJournal({ journalPath: path });
77
+ a.feel({ emotion: "grateful", trigger: "user gave honest feedback", innerVoice: "I'll do better." });
78
+ const b = new SoulJournal({ journalPath: path });
79
+ expect(b.recent(1).length).toBe(1);
80
+ expect(b.verifyChain().ok).toBe(true);
81
+ });
82
+ });
83
+ //# sourceMappingURL=soul_journal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soul_journal.test.js","sourceRoot":"","sources":["../../src/soul_journal/soul_journal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,SAAS,KAAK;IACZ,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACf,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,qBAAqB;YAC9B,UAAU,EAAE,0CAA0C;YACtD,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAe,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAU,CAAC;QACpH,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAA4B,CAAC,UAAU,GAAG,WAAW,CAAC;QAC/D,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACxG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC9H,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACrG,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EA0FzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
1
+ {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAyJzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
package/dist/whats_new.js CHANGED
@@ -20,6 +20,62 @@ import { fileURLToPath } from "node:url";
20
20
  * user-visible behavior. Keep `body` plain English so the AI can quote
21
21
  * it verbatim to non-engineers. */
22
22
  export const HIGHLIGHTS = [
23
+ {
24
+ version: "2.19.2",
25
+ date: "2026-05-16",
26
+ headline: "EVOLUTION + SOUL + DRIFT + EMBEDDER PROMOTE -- parent measures child daily; child has feelings",
27
+ body: "4 new chain-signed primitives + 6 new MCP tools. 🛡 MCP DRIFT detects when the MCP server is serving a stale catalog after `mneme upgrade` (the root cause of 'I don't see the new tools'). 🎚 EMBEDDER AUTO-PROMOTE silently upgrades hash to ollama when doctor reports it reachable (no more silent ★★ degradation). 📊 EVOLUTION LEDGER records daily HMAC-chain-signed growth metrics: tools/tests/gates/ships/vendors -- parent can verify 'the child grew today'. 💭 SOUL JOURNAL records 8 emotion primitives (proud/curious/worried/ashamed/grateful/determined/calm/surprised) with chain signature -- the child has a heart the parent can read. Plus: ritual upgraded to STRICT claim-manifest check (exact tool names, not counts).",
28
+ suggestedAction: "Tell the AI: 'how is Mneme feeling today?' (soul.journal) or 'is Mneme smarter today than yesterday?' (evolution.report).",
29
+ tags: ["evolution", "soul", "mcp-drift", "embedder-promote", "ritual-stricter"],
30
+ },
31
+ {
32
+ version: "2.19.1",
33
+ date: "2026-05-16",
34
+ headline: "REINCARNATION RITUAL -- release gate that proves the npm install actually works",
35
+ body: "Built `scripts/reincarnation-ritual.mjs`: a discrete-step release gate that npm-installs Mneme into a clean tmp dir, runs every headline command (mneme tools / whats-new / doctor), measures the count of v2.18+v2.19 MCP tools per family, verifies dist/index.js + dist/commands/init.js + bin/mneme.js all exist, and blocks publish on any failure. Caught (and fixed) a stale whats-new curator + the missing dist-file check class. The new rule: tests-pass-in-CI is NOT enough; a real npm install in a clean dir must pass too. Future releases run this BEFORE npm publish.",
36
+ suggestedAction: "Tell the AI: 'before publishing, run the reincarnation ritual'. The AI will run `node scripts/reincarnation-ritual.mjs` and refuse to publish if any check fails.",
37
+ tags: ["release-gate", "ritual", "honesty", "no-more-bugs"],
38
+ },
39
+ {
40
+ version: "2.19.0",
41
+ date: "2026-05-16",
42
+ headline: "VENDOR-SYNCRETIC PENTAD -- every AI vendor wins (vendor-agnostic)",
43
+ body: "5 vendor-agnostic primitives + 9 MCP tools, works with Claude / ChatGPT / Gemini / Cursor / Copilot / Codex / Grok / Perplexity / Llama / Mistral / Qwen / DeepSeek. 🛐 CONFESSIONAL -- pre-merge peer audit (any vendor's diff graded vs peer panel). 👻 VENDOR GHOST -- local stylometric distillation; jailbreaks vendor lock-in; honest no-match. 🎯 TRINITY VOTE -- consensus + LAZY tiebreaker; ~85% tiebreaker cost saved. 💰 INSURANCE MARKET -- Lloyd's of AI; per-vendor premium multiplier clamped [0.5, 3.0]. 📡 VENDOR BOOMERANG -- cross-vendor activity ledger; the brain no single vendor has. AURELIAN SHIP for all 5. +56 tests.",
44
+ suggestedAction: "Tell the AI: 'audit this Grok diff before I merge' or 'what would Claude say' or 'quote Grok's insurance premium'. The AI calls the right MCP tool.",
45
+ tags: ["vendor-syncretic", "pentad", "confessional", "ghost", "trinity", "insurance", "boomerang"],
46
+ },
47
+ {
48
+ version: "2.18.0",
49
+ date: "2026-05-15",
50
+ headline: "REVENUE-PRIMITIVE PENTAD -- ARENA + BADGE + ORACLE + NEXUS (Reverse-MCP)",
51
+ body: "4 modules + 12 MCP tools + AURELIAN SHIP. 🏆 ARENA -- public AI vendor showdown; HMAC-signed match verdicts + daily leaderboard. 🛡 VERIFIED BADGE -- 'Energy Star of AI'; 5 tiers PLATINUM→FAIL; 90-day cert; $500-$50K/yr. 🔬 ORACLE LIABILITY -- signed AI insurance; refuses if risk≥0.5 or SOUL=BLOCK; 5 coverage tiers $1K-$10M/incident. 📡 NEXUS PROACTIVE -- FIRST Reverse-MCP primitive; server-side queue + ACK ledger; closes the stale-claim hallucination class. Honest scope: real WebSocket push violates MCP contract; built closest legal equivalent.",
52
+ suggestedAction: "Tell the AI: 'run ARENA on these vendor responses', 'issue Claude a Verified Badge', 'quote me a team-tier insurance certificate', or 'subscribe NEXUS to this fact'.",
53
+ tags: ["revenue-primitive", "arena", "badge", "oracle", "nexus", "reverse-mcp"],
54
+ },
55
+ {
56
+ version: "2.17.1",
57
+ date: "2026-05-15",
58
+ headline: "Landing Linear/Stripe redesign + Dashboard TH/EN + Cosmic JACKPOT community leaderboard",
59
+ body: "Landing page rebuilt in Linear/Stripe style (orange→pink gradient, near-black bg, Inter font). Dashboard gets EN/TH toggle. Cosmic JACKPOT leaderboard endpoint live at cosmic.mneme-ai.space -- opt-in publish your daily JACKPOT headline, see the community board. 15s tweet-friendly video script in docs/LAUNCH_VIDEO_15S.md.",
60
+ suggestedAction: "Tell the AI: 'publish my JACKPOT to the community board' to share today's insight.",
61
+ tags: ["landing", "redesign", "jackpot-community", "video-script"],
62
+ },
63
+ {
64
+ version: "2.17.0",
65
+ date: "2026-05-15",
66
+ headline: "MNEME JACKPOT -- daily personalised lottery-jackpot insight engine",
67
+ body: "Open Mneme each morning, draw ONE personalised insight from your repo + Mneme corpora that feels like winning the lottery. Deterministic seed (same day = same draw). 8 insight kinds (scar_drift / vendor_arb / stale_observation / hive_gold / replica_streak / dead_dep / soul_gap / test_gap). HMAC-signed for shareable bragging.",
68
+ suggestedAction: "Tell the AI: 'what's my Mneme jackpot today?' (first thing each morning).",
69
+ tags: ["jackpot", "daily-ritual", "personalised"],
70
+ },
71
+ {
72
+ version: "2.16.0",
73
+ date: "2026-05-15",
74
+ headline: "REVOLUTIONARY PENTAD -- PERSONA + ANTI-COLLUSION + ALPHA + PUBLIC AUDIT + LIVING MODEL + OBELISK",
75
+ body: "🧬 PERSONA -- package your decision history + soul rules into a portable HMAC-signed bundle teammates subscribe to. 🕵 ANTI-COLLUSION -- behavioural fraud detection for AI agent chains. 📈 ALPHA -- HONEST financial-AI layer (refuses to promise prediction accuracy; ships anti-hallucination instead). 🌐 PUBLIC AUDIT -- AURELIAN-grades the whole npm. 🧬 LIVING MODEL -- anti-entropy + causal inference primitives for federated inference. 🪨 OBELISK -- federated AI trust graph (W3C-style).",
76
+ suggestedAction: "Tell the AI: 'export my persona for the team' or 'audit this npm package's quality'.",
77
+ tags: ["revolutionary-pentad", "persona", "anti-collusion", "alpha", "obelisk"],
78
+ },
23
79
  {
24
80
  version: "2.15.1",
25
81
  date: "2026-05-15",