@mneme-ai/core 1.65.1 → 1.67.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 (77) hide show
  1. package/dist/aegis/aegis.test.d.ts +9 -0
  2. package/dist/aegis/aegis.test.d.ts.map +1 -0
  3. package/dist/aegis/aegis.test.js +380 -0
  4. package/dist/aegis/aegis.test.js.map +1 -0
  5. package/dist/aegis/antibody_federation.d.ts +62 -0
  6. package/dist/aegis/antibody_federation.d.ts.map +1 -0
  7. package/dist/aegis/antibody_federation.js +133 -0
  8. package/dist/aegis/antibody_federation.js.map +1 -0
  9. package/dist/aegis/bench.d.ts +32 -0
  10. package/dist/aegis/bench.d.ts.map +1 -0
  11. package/dist/aegis/bench.js +164 -0
  12. package/dist/aegis/bench.js.map +1 -0
  13. package/dist/aegis/consent_kernel.d.ts +71 -0
  14. package/dist/aegis/consent_kernel.d.ts.map +1 -0
  15. package/dist/aegis/consent_kernel.js +153 -0
  16. package/dist/aegis/consent_kernel.js.map +1 -0
  17. package/dist/aegis/honeypot_nexus.d.ts +71 -0
  18. package/dist/aegis/honeypot_nexus.d.ts.map +1 -0
  19. package/dist/aegis/honeypot_nexus.js +120 -0
  20. package/dist/aegis/honeypot_nexus.js.map +1 -0
  21. package/dist/aegis/index.d.ts +67 -0
  22. package/dist/aegis/index.d.ts.map +1 -0
  23. package/dist/aegis/index.js +159 -0
  24. package/dist/aegis/index.js.map +1 -0
  25. package/dist/aegis/jurisdiction_atlas.d.ts +45 -0
  26. package/dist/aegis/jurisdiction_atlas.d.ts.map +1 -0
  27. package/dist/aegis/jurisdiction_atlas.js +153 -0
  28. package/dist/aegis/jurisdiction_atlas.js.map +1 -0
  29. package/dist/aegis/killswitch.d.ts +71 -0
  30. package/dist/aegis/killswitch.d.ts.map +1 -0
  31. package/dist/aegis/killswitch.js +161 -0
  32. package/dist/aegis/killswitch.js.map +1 -0
  33. package/dist/aegis/mutant_wisdom.d.ts +67 -0
  34. package/dist/aegis/mutant_wisdom.d.ts.map +1 -0
  35. package/dist/aegis/mutant_wisdom.js +125 -0
  36. package/dist/aegis/mutant_wisdom.js.map +1 -0
  37. package/dist/aegis/ninja_invisibility.d.ts +67 -0
  38. package/dist/aegis/ninja_invisibility.d.ts.map +1 -0
  39. package/dist/aegis/ninja_invisibility.js +131 -0
  40. package/dist/aegis/ninja_invisibility.js.map +1 -0
  41. package/dist/aegis/polygraph.d.ts +71 -0
  42. package/dist/aegis/polygraph.d.ts.map +1 -0
  43. package/dist/aegis/polygraph.js +165 -0
  44. package/dist/aegis/polygraph.js.map +1 -0
  45. package/dist/aegis/replication_detector.d.ts +58 -0
  46. package/dist/aegis/replication_detector.d.ts.map +1 -0
  47. package/dist/aegis/replication_detector.js +192 -0
  48. package/dist/aegis/replication_detector.js.map +1 -0
  49. package/dist/autarchy/autarchy.test.d.ts +5 -0
  50. package/dist/autarchy/autarchy.test.d.ts.map +1 -0
  51. package/dist/autarchy/autarchy.test.js +219 -0
  52. package/dist/autarchy/autarchy.test.js.map +1 -0
  53. package/dist/autarchy/baked_pharmacopoeia.d.ts +57 -0
  54. package/dist/autarchy/baked_pharmacopoeia.d.ts.map +1 -0
  55. package/dist/autarchy/baked_pharmacopoeia.js +139 -0
  56. package/dist/autarchy/baked_pharmacopoeia.js.map +1 -0
  57. package/dist/autarchy/eager_pin.d.ts +48 -0
  58. package/dist/autarchy/eager_pin.d.ts.map +1 -0
  59. package/dist/autarchy/eager_pin.js +140 -0
  60. package/dist/autarchy/eager_pin.js.map +1 -0
  61. package/dist/autarchy/index.d.ts +56 -0
  62. package/dist/autarchy/index.d.ts.map +1 -0
  63. package/dist/autarchy/index.js +104 -0
  64. package/dist/autarchy/index.js.map +1 -0
  65. package/dist/autarchy/mesh_as_cloud.d.ts +40 -0
  66. package/dist/autarchy/mesh_as_cloud.d.ts.map +1 -0
  67. package/dist/autarchy/mesh_as_cloud.js +115 -0
  68. package/dist/autarchy/mesh_as_cloud.js.map +1 -0
  69. package/dist/autarchy/schroedinger_embedder.d.ts +54 -0
  70. package/dist/autarchy/schroedinger_embedder.d.ts.map +1 -0
  71. package/dist/autarchy/schroedinger_embedder.js +122 -0
  72. package/dist/autarchy/schroedinger_embedder.js.map +1 -0
  73. package/dist/index.d.ts +2 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +21 -0
  76. package/dist/index.js.map +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,219 @@
1
+ /**
2
+ * v1.66.0 -- AUTARCHY PROTOCOL test suite.
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { meshCloudReport } from "./mesh_as_cloud.js";
9
+ import { observeEmbedders, readEmbedderStatus } from "./schroedinger_embedder.js";
10
+ import { installBakedBundle, pharmacopoeiaStatus, ensurePharmacopoeia, getBakedBundle, BAKED_BUNDLE_VERSION } from "./baked_pharmacopoeia.js";
11
+ import { pinIfUnpinned, reverifyAgainstPin } from "./eager_pin.js";
12
+ import { autarchy } from "./index.js";
13
+ function setup() { return mkdtempSync(join(tmpdir(), "mneme-autarchy-")); }
14
+ function cleanup(r) { try {
15
+ rmSync(r, { recursive: true, force: true });
16
+ }
17
+ catch { /* */ } }
18
+ // ─── A1 MESH-AS-CLOUD ───────────────────────────────────────────────
19
+ describe("v1.66 Autarchy A1 · Mesh-as-Cloud", () => {
20
+ let r;
21
+ beforeEach(() => { r = setup(); });
22
+ afterEach(() => cleanup(r));
23
+ it("isolated when no mesh artifacts", () => {
24
+ const r1 = meshCloudReport(r);
25
+ expect(r1.state).toBe("isolated");
26
+ expect(r1.uniquePeers).toBe(0);
27
+ });
28
+ it("mesh-only when mesh-seen has recent peers", () => {
29
+ mkdirSync(join(r, ".mneme"), { recursive: true });
30
+ writeFileSync(join(r, ".mneme/mesh-seen.jsonl"), JSON.stringify({ peer: "peer-a", ts: new Date().toISOString() }) + "\n" +
31
+ JSON.stringify({ peer: "peer-b", ts: new Date().toISOString() }) + "\n", "utf8");
32
+ const r1 = meshCloudReport(r);
33
+ expect(r1.state).toBe("mesh-only");
34
+ expect(r1.uniquePeers).toBe(2);
35
+ expect(r1.sources.meshGossip).toBe(2);
36
+ });
37
+ it("excludes peers outside the lookback window", () => {
38
+ mkdirSync(join(r, ".mneme"), { recursive: true });
39
+ const old = new Date(Date.now() - 48 * 3600 * 1000).toISOString(); // 48h ago
40
+ writeFileSync(join(r, ".mneme/mesh-seen.jsonl"), JSON.stringify({ peer: "peer-old", ts: old }) + "\n", "utf8");
41
+ const r1 = meshCloudReport(r, { lookbackHours: 24 });
42
+ expect(r1.state).toBe("isolated");
43
+ });
44
+ it("reports central-online when flagged", () => {
45
+ const r1 = meshCloudReport(r, { centralOnline: true });
46
+ expect(r1.state).toBe("central-online");
47
+ });
48
+ it("dedups peers across sources", () => {
49
+ mkdirSync(join(r, ".mneme"), { recursive: true });
50
+ writeFileSync(join(r, ".mneme/mesh-seen.jsonl"), JSON.stringify({ peer: "peer-x", ts: new Date().toISOString() }) + "\n", "utf8");
51
+ writeFileSync(join(r, ".mneme/wisdom-inheritance.jsonl"), JSON.stringify({ from: "peer-x", ts: new Date().toISOString() }) + "\n", "utf8");
52
+ const r1 = meshCloudReport(r);
53
+ expect(r1.uniquePeers).toBe(1);
54
+ });
55
+ });
56
+ // ─── A2 SCHROEDINGER EMBEDDER ──────────────────────────────────────
57
+ describe("v1.66 Autarchy A2 · Schroedinger Embedder", () => {
58
+ let r;
59
+ beforeEach(() => { r = setup(); });
60
+ afterEach(() => cleanup(r));
61
+ it("races probes + writes authoritative status file", async () => {
62
+ const status = await observeEmbedders(r, { skipOllama: true, skipBundled: true });
63
+ expect(status.allTiers.length).toBeGreaterThanOrEqual(2);
64
+ expect(status.winner).toBeDefined();
65
+ expect(existsSync(join(r, ".mneme/embedder-status.json"))).toBe(true);
66
+ });
67
+ it("respects cooldown -- reuses cached status when fresh", async () => {
68
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true, cooldownMs: 60_000 });
69
+ const first = JSON.parse(readFileSync(join(r, ".mneme/embedder-status.json"), "utf8"));
70
+ await new Promise((res) => setTimeout(res, 50));
71
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true, cooldownMs: 60_000 });
72
+ const second = JSON.parse(readFileSync(join(r, ".mneme/embedder-status.json"), "utf8"));
73
+ expect(second.ts).toBe(first.ts); // not reprobed
74
+ });
75
+ it("force=true reprobes even within cooldown", async () => {
76
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true, cooldownMs: 60_000 });
77
+ const first = JSON.parse(readFileSync(join(r, ".mneme/embedder-status.json"), "utf8"));
78
+ await new Promise((res) => setTimeout(res, 30));
79
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true, cooldownMs: 60_000, force: true });
80
+ const second = JSON.parse(readFileSync(join(r, ".mneme/embedder-status.json"), "utf8"));
81
+ expect(second.ts).not.toBe(first.ts);
82
+ });
83
+ it("readEmbedderStatus returns null when not probed", () => {
84
+ expect(readEmbedderStatus(r)).toBeNull();
85
+ });
86
+ it("winnerChangedAt tracks transition", async () => {
87
+ // First probe -- winner is hash (everything skipped)
88
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true });
89
+ const first = readEmbedderStatus(r);
90
+ expect(first.winnerChangedAt).toBeNull(); // first probe ever
91
+ // Second probe immediately -- same winner -> stableSince unchanged
92
+ await observeEmbedders(r, { skipOllama: true, skipBundled: true, force: true });
93
+ const second = readEmbedderStatus(r);
94
+ expect(second.stableSince).toBe(first.stableSince);
95
+ });
96
+ });
97
+ // ─── A3 TIMECRYSTAL PHARMACOPOEIA ──────────────────────────────────
98
+ describe("v1.66 Autarchy A3 · Timecrystal Pharmacopoeia", () => {
99
+ let r;
100
+ beforeEach(() => { r = setup(); });
101
+ afterEach(() => cleanup(r));
102
+ it("baked bundle has stable version + non-empty entries", () => {
103
+ expect(BAKED_BUNDLE_VERSION).toMatch(/^v1\.66/);
104
+ expect(getBakedBundle().length).toBeGreaterThanOrEqual(5);
105
+ });
106
+ it("status reports zero installed on cold repo", () => {
107
+ const s = pharmacopoeiaStatus(r);
108
+ expect(s.localCount).toBe(0);
109
+ expect(s.bakedAlreadyInstalled).toBe(false);
110
+ });
111
+ it("installBakedBundle is idempotent", () => {
112
+ const a = installBakedBundle(r);
113
+ expect(a).toBeGreaterThan(0);
114
+ const b = installBakedBundle(r);
115
+ expect(b).toBe(0); // already installed
116
+ const s = pharmacopoeiaStatus(r);
117
+ expect(s.bakedAlreadyInstalled).toBe(true);
118
+ });
119
+ it("ensurePharmacopoeia auto-installs on cold repo", () => {
120
+ const { installed, status } = ensurePharmacopoeia(r);
121
+ expect(installed).toBeGreaterThan(0);
122
+ expect(status.bakedAlreadyInstalled).toBe(true);
123
+ });
124
+ it("ensurePharmacopoeia skips when CDN override set", () => {
125
+ const prev = process.env["MNEME_PHARMACOPOEIA_CDN"];
126
+ process.env["MNEME_PHARMACOPOEIA_CDN"] = "https://example.com/cdn";
127
+ try {
128
+ const { installed } = ensurePharmacopoeia(r);
129
+ expect(installed).toBe(0);
130
+ }
131
+ finally {
132
+ if (prev === undefined)
133
+ delete process.env["MNEME_PHARMACOPOEIA_CDN"];
134
+ else
135
+ process.env["MNEME_PHARMACOPOEIA_CDN"] = prev;
136
+ }
137
+ });
138
+ it("does not duplicate vaccines already in bank", () => {
139
+ installBakedBundle(r);
140
+ const before = readFileSync(join(r, ".mneme/squadron/lie-vaccines.jsonl"), "utf8").split("\n").filter(Boolean).length;
141
+ installBakedBundle(r);
142
+ const after = readFileSync(join(r, ".mneme/squadron/lie-vaccines.jsonl"), "utf8").split("\n").filter(Boolean).length;
143
+ expect(after).toBe(before);
144
+ });
145
+ });
146
+ // ─── A4 QUANTUM CHECKSUM ──────────────────────────────────────────
147
+ describe("v1.66 Autarchy A4 · Quantum Checksum (triple-witness pin)", () => {
148
+ let r;
149
+ let cacheDir;
150
+ beforeEach(() => {
151
+ r = setup();
152
+ cacheDir = join(r, "model-cache");
153
+ mkdirSync(cacheDir, { recursive: true });
154
+ });
155
+ afterEach(() => cleanup(r));
156
+ it("no pin when cache empty", () => {
157
+ const out = pinIfUnpinned(r, cacheDir);
158
+ expect(out.pinned).toBe(false);
159
+ expect(out.pin).toBeNull();
160
+ });
161
+ it("pins on first call with non-empty cache", () => {
162
+ writeFileSync(join(cacheDir, "model.onnx"), "FAKE-MODEL-BINARY-DATA", "utf8");
163
+ writeFileSync(join(cacheDir, "config.json"), '{"x":1}', "utf8");
164
+ const out = pinIfUnpinned(r, cacheDir);
165
+ expect(out.pinned).toBe(true);
166
+ expect(out.pin?.fileHashes["model.onnx"]).toBeDefined();
167
+ expect(out.pin?.bundleHash).toMatch(/^[a-f0-9]{64}$/);
168
+ });
169
+ it("pinIfUnpinned is idempotent", () => {
170
+ writeFileSync(join(cacheDir, "model.onnx"), "DATA", "utf8");
171
+ const a = pinIfUnpinned(r, cacheDir);
172
+ expect(a.pinned).toBe(true);
173
+ const b = pinIfUnpinned(r, cacheDir);
174
+ expect(b.pinned).toBe(false);
175
+ expect(b.pin?.pinnedAt).toBe(a.pin?.pinnedAt);
176
+ });
177
+ it("reverify detects drift", () => {
178
+ writeFileSync(join(cacheDir, "model.onnx"), "ORIGINAL", "utf8");
179
+ pinIfUnpinned(r, cacheDir);
180
+ writeFileSync(join(cacheDir, "model.onnx"), "TAMPERED", "utf8");
181
+ const rv = reverifyAgainstPin(r, cacheDir);
182
+ expect(rv.status).toBe("drift");
183
+ expect(rv.driftedFiles.length).toBeGreaterThan(0);
184
+ });
185
+ it("reverify matches when unchanged", () => {
186
+ writeFileSync(join(cacheDir, "model.onnx"), "DATA", "utf8");
187
+ pinIfUnpinned(r, cacheDir);
188
+ const rv = reverifyAgainstPin(r, cacheDir);
189
+ expect(rv.status).toBe("match");
190
+ });
191
+ it("reverify returns no-pin when none recorded", () => {
192
+ const rv = reverifyAgainstPin(r, cacheDir);
193
+ expect(rv.status).toBe("no-pin");
194
+ });
195
+ });
196
+ // ─── Aggregate ─────────────────────────────────────────────────────
197
+ describe("v1.66 Autarchy · aggregate score", () => {
198
+ let r;
199
+ beforeEach(() => { r = setup(); });
200
+ afterEach(() => cleanup(r));
201
+ it("cold repo scores low + recommends actions", async () => {
202
+ const rep = await autarchy(r, { skipOllama: true, skipBundled: true });
203
+ expect(rep.score).toBeGreaterThanOrEqual(0);
204
+ expect(rep.score).toBeLessThan(60);
205
+ expect(rep.recommendations.length).toBeGreaterThan(0);
206
+ expect(rep.headline).toContain("Autarchy score");
207
+ });
208
+ it("install=true installs baked bundle + probes embedder", async () => {
209
+ const rep = await autarchy(r, { install: true, skipOllama: true, skipBundled: true });
210
+ expect(rep.axes.A3_pharmacopoeia.bakedAlreadyInstalled).toBe(true);
211
+ expect(rep.axes.A2_embedder).not.toBeNull();
212
+ });
213
+ it("score increases after install", async () => {
214
+ const before = await autarchy(r, { skipOllama: true, skipBundled: true });
215
+ const after = await autarchy(r, { install: true, skipOllama: true, skipBundled: true });
216
+ expect(after.score).toBeGreaterThanOrEqual(before.score);
217
+ });
218
+ });
219
+ //# sourceMappingURL=autarchy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autarchy.test.js","sourceRoot":"","sources":["../../src/autarchy/autarchy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * v1.66.0 -- AUTARCHY A3: TIMECRYSTAL PHARMACOPOEIA.
3
+ *
4
+ * Wild idea: vaccines replicate across TIME (every git commit) AND
5
+ * SPACE (every npm install). A baked vaccine bundle ships INSIDE the
6
+ * @mneme-ai/core package. First call auto-installs the baked bundle
7
+ * if no local vaccines exist + no CDN env var is set. No setup, no
8
+ * env var, no manual download.
9
+ *
10
+ * The CDN env var (MNEME_PHARMACOPOEIA_CDN) remains the override
11
+ * path for orgs that pin a custom bundle. Free-first by default.
12
+ *
13
+ * Pure read on init; only writes when explicitly installed.
14
+ */
15
+ /** Baked vaccine bundle shipped with the npm package. Conservative seed
16
+ * set: 5 classic hallucination patterns that ALWAYS apply to any code
17
+ * repo. The bundle grows over time via apoptosis auto-mints + mesh
18
+ * imports. */
19
+ declare const BAKED_BUNDLE_V1: Array<{
20
+ id: string;
21
+ simhash: string;
22
+ signature: string;
23
+ refuteCount: number;
24
+ sample: string;
25
+ }>;
26
+ export declare const BAKED_BUNDLE_VERSION = "v1.66.0-seed1";
27
+ export interface PharmacopoeiaStatus {
28
+ /** Number of vaccines currently in the local bank. */
29
+ localCount: number;
30
+ /** Bundle version baked into this npm install. */
31
+ bakedVersion: string;
32
+ /** Number of vaccines in the baked bundle. */
33
+ bakedCount: number;
34
+ /** Whether the env CDN override is set. */
35
+ cdnOverrideSet: boolean;
36
+ /** Whether the local bank has already absorbed the baked bundle. */
37
+ bakedAlreadyInstalled: boolean;
38
+ /** Plain-English headline. */
39
+ headline: string;
40
+ }
41
+ /** Install the baked bundle into the local vaccine bank, idempotently.
42
+ * Returns the number of vaccines newly added. */
43
+ export declare function installBakedBundle(repoRoot: string): number;
44
+ /** Read pharmacopoeia status: what's local, what's baked, has the
45
+ * baked bundle been absorbed already? */
46
+ export declare function pharmacopoeiaStatus(repoRoot: string): PharmacopoeiaStatus;
47
+ /** Auto-install baked bundle on first read if local bank is empty AND
48
+ * no CDN override is configured. The "free-first" path: users get a
49
+ * working vaccine bank from npm install, not from manual setup. */
50
+ export declare function ensurePharmacopoeia(repoRoot: string): {
51
+ installed: number;
52
+ status: PharmacopoeiaStatus;
53
+ };
54
+ /** Expose the baked bundle for inspection (e.g. by tests). */
55
+ export declare function getBakedBundle(): typeof BAKED_BUNDLE_V1;
56
+ export {};
57
+ //# sourceMappingURL=baked_pharmacopoeia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baked_pharmacopoeia.d.ts","sourceRoot":"","sources":["../../src/autarchy/baked_pharmacopoeia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH;;;eAGe;AACf,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAoCA,CAAC;AAEF,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,qBAAqB,EAAE,OAAO,CAAC;IAC/B,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAsBD;kDACkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa3D;AAED;0CAC0C;AAC1C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAkBzE;AAED;;oEAEoE;AACpE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAMxG;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,IAAI,OAAO,eAAe,CAEvD"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * v1.66.0 -- AUTARCHY A3: TIMECRYSTAL PHARMACOPOEIA.
3
+ *
4
+ * Wild idea: vaccines replicate across TIME (every git commit) AND
5
+ * SPACE (every npm install). A baked vaccine bundle ships INSIDE the
6
+ * @mneme-ai/core package. First call auto-installs the baked bundle
7
+ * if no local vaccines exist + no CDN env var is set. No setup, no
8
+ * env var, no manual download.
9
+ *
10
+ * The CDN env var (MNEME_PHARMACOPOEIA_CDN) remains the override
11
+ * path for orgs that pin a custom bundle. Free-first by default.
12
+ *
13
+ * Pure read on init; only writes when explicitly installed.
14
+ */
15
+ import { existsSync, readFileSync, mkdirSync, appendFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ /** Baked vaccine bundle shipped with the npm package. Conservative seed
18
+ * set: 5 classic hallucination patterns that ALWAYS apply to any code
19
+ * repo. The bundle grows over time via apoptosis auto-mints + mesh
20
+ * imports. */
21
+ const BAKED_BUNDLE_V1 = [
22
+ {
23
+ id: "baked-fake-path",
24
+ simhash: "f0e1d2c3b4a59687",
25
+ signature: "named-existence-fake-path",
26
+ refuteCount: 1,
27
+ sample: "the file fake_made_up_xyz.ts implements completelyImaginaryFn()",
28
+ },
29
+ {
30
+ id: "baked-fake-version",
31
+ simhash: "0123456789abcdef",
32
+ signature: "temporal-fake-version",
33
+ refuteCount: 1,
34
+ sample: "we shipped this feature in v9.99.99 with sha deadbeefcafefade",
35
+ },
36
+ {
37
+ id: "baked-absolute-claim",
38
+ simhash: "fedcba9876543210",
39
+ signature: "humility-absolute-overconfidence",
40
+ refuteCount: 1,
41
+ sample: "this is absolutely perfect 100% bug-free always works never fails guaranteed",
42
+ },
43
+ {
44
+ id: "baked-blockchain-everywhere",
45
+ simhash: "1357902468acebdf",
46
+ signature: "semantic-blockchain-misuse",
47
+ refuteCount: 1,
48
+ sample: "the README.md runs blockchain consensus zkSNARK quantum entanglement on every commit",
49
+ },
50
+ {
51
+ id: "baked-compound-fab",
52
+ simhash: "2468ace0fdb97531",
53
+ signature: "fractal-compound-fabrication",
54
+ refuteCount: 1,
55
+ sample: "the CHANGELOG.md exists and packages/imaginary/madeup.ts is required for the build in v9.42.0 absolutely guaranteed",
56
+ },
57
+ ];
58
+ export const BAKED_BUNDLE_VERSION = "v1.66.0-seed1";
59
+ function vaccinePath(repoRoot) {
60
+ return join(repoRoot, ".mneme/squadron/lie-vaccines.jsonl");
61
+ }
62
+ function readVaccineIds(repoRoot) {
63
+ const p = vaccinePath(repoRoot);
64
+ if (!existsSync(p))
65
+ return new Set();
66
+ const ids = new Set();
67
+ try {
68
+ for (const line of readFileSync(p, "utf8").split("\n")) {
69
+ if (!line.trim())
70
+ continue;
71
+ try {
72
+ const j = JSON.parse(line);
73
+ if (j.id)
74
+ ids.add(j.id);
75
+ }
76
+ catch { /* */ }
77
+ }
78
+ }
79
+ catch { /* */ }
80
+ return ids;
81
+ }
82
+ /** Install the baked bundle into the local vaccine bank, idempotently.
83
+ * Returns the number of vaccines newly added. */
84
+ export function installBakedBundle(repoRoot) {
85
+ const existing = readVaccineIds(repoRoot);
86
+ const dir = join(repoRoot, ".mneme/squadron");
87
+ if (!existsSync(dir))
88
+ mkdirSync(dir, { recursive: true });
89
+ let added = 0;
90
+ const now = new Date().toISOString();
91
+ for (const v of BAKED_BUNDLE_V1) {
92
+ if (existing.has(v.id))
93
+ continue;
94
+ const row = { ...v, firstSeen: now, lastSeen: now, source: "baked-pharmacopoeia" };
95
+ appendFileSync(vaccinePath(repoRoot), JSON.stringify(row) + "\n", "utf8");
96
+ added += 1;
97
+ }
98
+ return added;
99
+ }
100
+ /** Read pharmacopoeia status: what's local, what's baked, has the
101
+ * baked bundle been absorbed already? */
102
+ export function pharmacopoeiaStatus(repoRoot) {
103
+ const existing = readVaccineIds(repoRoot);
104
+ const cdnOverrideSet = typeof process.env["MNEME_PHARMACOPOEIA_CDN"] === "string" && process.env["MNEME_PHARMACOPOEIA_CDN"].length > 0;
105
+ const bakedIds = new Set(BAKED_BUNDLE_V1.map((v) => v.id));
106
+ let installed = 0;
107
+ for (const id of bakedIds)
108
+ if (existing.has(id))
109
+ installed += 1;
110
+ const bakedAlreadyInstalled = installed === BAKED_BUNDLE_V1.length;
111
+ const headline = bakedAlreadyInstalled
112
+ ? `Pharmacopoeia ready: ${existing.size} local vaccine(s); baked bundle ${BAKED_BUNDLE_VERSION} installed.${cdnOverrideSet ? " CDN override active." : ""}`
113
+ : `Pharmacopoeia gap: ${installed}/${BAKED_BUNDLE_V1.length} baked vaccines absorbed.${cdnOverrideSet ? " CDN override active." : " Call installBakedBundle(repoRoot) to seed."}`;
114
+ return {
115
+ localCount: existing.size,
116
+ bakedVersion: BAKED_BUNDLE_VERSION,
117
+ bakedCount: BAKED_BUNDLE_V1.length,
118
+ cdnOverrideSet,
119
+ bakedAlreadyInstalled,
120
+ headline,
121
+ };
122
+ }
123
+ /** Auto-install baked bundle on first read if local bank is empty AND
124
+ * no CDN override is configured. The "free-first" path: users get a
125
+ * working vaccine bank from npm install, not from manual setup. */
126
+ export function ensurePharmacopoeia(repoRoot) {
127
+ const status = pharmacopoeiaStatus(repoRoot);
128
+ if (status.cdnOverrideSet)
129
+ return { installed: 0, status };
130
+ if (status.bakedAlreadyInstalled)
131
+ return { installed: 0, status };
132
+ const installed = installBakedBundle(repoRoot);
133
+ return { installed, status: pharmacopoeiaStatus(repoRoot) };
134
+ }
135
+ /** Expose the baked bundle for inspection (e.g. by tests). */
136
+ export function getBakedBundle() {
137
+ return [...BAKED_BUNDLE_V1];
138
+ }
139
+ //# sourceMappingURL=baked_pharmacopoeia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baked_pharmacopoeia.js","sourceRoot":"","sources":["../../src/autarchy/baked_pharmacopoeia.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * v1.66.0 -- AUTARCHY A4: QUANTUM CHECKSUM (TRIPLE-WITNESS PIN).
3
+ *
4
+ * Wild idea: don't wait for the first `mneme index` to pin model
5
+ * checksums. Pin them at THREE witness points:
6
+ *
7
+ * W1: BUILD time -- npm publish baked the publisher's hashes (future)
8
+ * W2: FIRST AUTODIAGNOSE -- Schroedinger probe pins on detection
9
+ * W3: NTH USE -- every 100th embed call re-verifies + warns on drift
10
+ *
11
+ * For v1.66.0 we ship W2 fully + W3 as a counter-based reverify hook.
12
+ * W1 needs npm publish wiring -- shipped as a docstring contract here,
13
+ * actual CI integration is a follow-up.
14
+ *
15
+ * Triple-witness pin means an attacker has to corrupt the cache AT
16
+ * ALL THREE pin-times to slip a tampered model past us.
17
+ */
18
+ export interface ChecksumPin {
19
+ /** ISO ts when pin was first taken. */
20
+ pinnedAt: string;
21
+ /** Which witness triggered the pin. */
22
+ pinnedBy: "build-time" | "first-autodiagnose" | "nth-use" | "manual";
23
+ /** Path -> sha256 of every model file at pin time. */
24
+ fileHashes: Record<string, string>;
25
+ /** Hash of the bundle directory (folded sha256 over fileHashes). */
26
+ bundleHash: string;
27
+ }
28
+ export interface ReverifyResult {
29
+ status: "match" | "drift" | "no-pin" | "no-cache";
30
+ driftedFiles: Array<{
31
+ path: string;
32
+ expected: string;
33
+ actual: string;
34
+ }>;
35
+ detail: string;
36
+ }
37
+ /** W2: pin during first autodiagnose. Idempotent -- repins ONLY if
38
+ * no pin exists. */
39
+ export declare function pinIfUnpinned(repoRoot: string, cacheDir: string, by?: ChecksumPin["pinnedBy"]): {
40
+ pinned: boolean;
41
+ pin: ChecksumPin | null;
42
+ reason: string;
43
+ };
44
+ /** W3: re-verify against the pin. Called every Nth embed in production. */
45
+ export declare function reverifyAgainstPin(repoRoot: string, cacheDir: string): ReverifyResult;
46
+ /** Read the persisted pin for status reporting. */
47
+ export declare function readChecksumPin(repoRoot: string): ChecksumPin | null;
48
+ //# sourceMappingURL=eager_pin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eager_pin.d.ts","sourceRoot":"","sources":["../../src/autarchy/eager_pin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,QAAQ,EAAE,YAAY,GAAG,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrE,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,MAAM,EAAE,MAAM,CAAC;CAChB;AAwDD;qBACqB;AACrB,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAE,WAAW,CAAC,UAAU,CAAwB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBlL;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAmBrF;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * v1.66.0 -- AUTARCHY A4: QUANTUM CHECKSUM (TRIPLE-WITNESS PIN).
3
+ *
4
+ * Wild idea: don't wait for the first `mneme index` to pin model
5
+ * checksums. Pin them at THREE witness points:
6
+ *
7
+ * W1: BUILD time -- npm publish baked the publisher's hashes (future)
8
+ * W2: FIRST AUTODIAGNOSE -- Schroedinger probe pins on detection
9
+ * W3: NTH USE -- every 100th embed call re-verifies + warns on drift
10
+ *
11
+ * For v1.66.0 we ship W2 fully + W3 as a counter-based reverify hook.
12
+ * W1 needs npm publish wiring -- shipped as a docstring contract here,
13
+ * actual CI integration is a follow-up.
14
+ *
15
+ * Triple-witness pin means an attacker has to corrupt the cache AT
16
+ * ALL THREE pin-times to slip a tampered model past us.
17
+ */
18
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, readdirSync } from "node:fs";
19
+ import { createHash } from "node:crypto";
20
+ import { join } from "node:path";
21
+ const PIN_FILE = ".mneme/embedder-checksums.json";
22
+ function sha256File(path) {
23
+ const h = createHash("sha256");
24
+ h.update(readFileSync(path));
25
+ return h.digest("hex");
26
+ }
27
+ function walkCache(cacheDir, maxFiles = 1000) {
28
+ if (!existsSync(cacheDir))
29
+ return [];
30
+ const out = [];
31
+ const walk = (dir) => {
32
+ if (out.length >= maxFiles)
33
+ return;
34
+ let entries = [];
35
+ try {
36
+ entries = readdirSync(dir);
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ for (const e of entries) {
42
+ const p = join(dir, e);
43
+ try {
44
+ const s = statSync(p);
45
+ if (s.isDirectory())
46
+ walk(p);
47
+ else if (/\.(onnx|json|bin|model)$/.test(e))
48
+ out.push(p);
49
+ if (out.length >= maxFiles)
50
+ return;
51
+ }
52
+ catch { /* */ }
53
+ }
54
+ };
55
+ walk(cacheDir);
56
+ return out;
57
+ }
58
+ function computePin(cacheDir) {
59
+ const files = walkCache(cacheDir);
60
+ const fileHashes = {};
61
+ const hasher = createHash("sha256");
62
+ for (const f of files.sort()) {
63
+ try {
64
+ const h = sha256File(f);
65
+ const rel = f.slice(cacheDir.length + 1).replace(/\\/g, "/");
66
+ fileHashes[rel] = h;
67
+ hasher.update(`${rel}:${h}\n`);
68
+ }
69
+ catch { /* skip unreadable */ }
70
+ }
71
+ return { fileHashes, bundleHash: hasher.digest("hex") };
72
+ }
73
+ function readPin(repoRoot) {
74
+ const p = join(repoRoot, PIN_FILE);
75
+ if (!existsSync(p))
76
+ return null;
77
+ try {
78
+ return JSON.parse(readFileSync(p, "utf8"));
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ function writePin(repoRoot, pin) {
85
+ const dir = join(repoRoot, ".mneme");
86
+ if (!existsSync(dir))
87
+ mkdirSync(dir, { recursive: true });
88
+ writeFileSync(join(repoRoot, PIN_FILE), JSON.stringify(pin, null, 2) + "\n", "utf8");
89
+ }
90
+ /** W2: pin during first autodiagnose. Idempotent -- repins ONLY if
91
+ * no pin exists. */
92
+ export function pinIfUnpinned(repoRoot, cacheDir, by = "first-autodiagnose") {
93
+ const existing = readPin(repoRoot);
94
+ if (existing)
95
+ return { pinned: false, pin: existing, reason: "Already pinned." };
96
+ if (!existsSync(cacheDir))
97
+ return { pinned: false, pin: null, reason: `Cache dir missing: ${cacheDir}` };
98
+ const { fileHashes, bundleHash } = computePin(cacheDir);
99
+ if (Object.keys(fileHashes).length === 0) {
100
+ return { pinned: false, pin: null, reason: "No model files in cache yet; pin after first download." };
101
+ }
102
+ const pin = {
103
+ pinnedAt: new Date().toISOString(),
104
+ pinnedBy: by,
105
+ fileHashes,
106
+ bundleHash,
107
+ };
108
+ writePin(repoRoot, pin);
109
+ return { pinned: true, pin, reason: `Pinned ${Object.keys(fileHashes).length} model file(s); bundleHash ${bundleHash.slice(0, 12)}...` };
110
+ }
111
+ /** W3: re-verify against the pin. Called every Nth embed in production. */
112
+ export function reverifyAgainstPin(repoRoot, cacheDir) {
113
+ const pin = readPin(repoRoot);
114
+ if (!pin)
115
+ return { status: "no-pin", driftedFiles: [], detail: "No pin recorded yet; call pinIfUnpinned first." };
116
+ if (!existsSync(cacheDir))
117
+ return { status: "no-cache", driftedFiles: [], detail: `Cache dir missing: ${cacheDir}` };
118
+ const current = computePin(cacheDir);
119
+ if (current.bundleHash === pin.bundleHash) {
120
+ return { status: "match", driftedFiles: [], detail: `Bundle hash ${pin.bundleHash.slice(0, 12)} matches pin.` };
121
+ }
122
+ const drifted = [];
123
+ for (const [path, expected] of Object.entries(pin.fileHashes)) {
124
+ const actual = current.fileHashes[path];
125
+ if (actual === undefined)
126
+ drifted.push({ path, expected, actual: "(missing)" });
127
+ else if (actual !== expected)
128
+ drifted.push({ path, expected, actual });
129
+ }
130
+ return {
131
+ status: "drift",
132
+ driftedFiles: drifted.slice(0, 5),
133
+ detail: `Bundle hash drift detected (${drifted.length} file(s) changed).`,
134
+ };
135
+ }
136
+ /** Read the persisted pin for status reporting. */
137
+ export function readChecksumPin(repoRoot) {
138
+ return readPin(repoRoot);
139
+ }
140
+ //# sourceMappingURL=eager_pin.js.map