@mneme-ai/core 1.75.0 → 1.77.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 (61) hide show
  1. package/dist/abyss/abyss.test.d.ts +2 -0
  2. package/dist/abyss/abyss.test.d.ts.map +1 -0
  3. package/dist/abyss/abyss.test.js +191 -0
  4. package/dist/abyss/abyss.test.js.map +1 -0
  5. package/dist/abyss/homunculus.d.ts +45 -0
  6. package/dist/abyss/homunculus.d.ts.map +1 -0
  7. package/dist/abyss/homunculus.js +108 -0
  8. package/dist/abyss/homunculus.js.map +1 -0
  9. package/dist/abyss/index.d.ts +14 -0
  10. package/dist/abyss/index.d.ts.map +1 -0
  11. package/dist/abyss/index.js +14 -0
  12. package/dist/abyss/index.js.map +1 -0
  13. package/dist/abyss/revenant.d.ts +48 -0
  14. package/dist/abyss/revenant.d.ts.map +1 -0
  15. package/dist/abyss/revenant.js +102 -0
  16. package/dist/abyss/revenant.js.map +1 -0
  17. package/dist/abyss/scythe.d.ts +53 -0
  18. package/dist/abyss/scythe.d.ts.map +1 -0
  19. package/dist/abyss/scythe.js +132 -0
  20. package/dist/abyss/scythe.js.map +1 -0
  21. package/dist/agent_manifest.d.ts +1 -1
  22. package/dist/agent_manifest.d.ts.map +1 -1
  23. package/dist/agent_manifest.js +11 -1
  24. package/dist/agent_manifest.js.map +1 -1
  25. package/dist/genesplice/soul_prompt.d.ts.map +1 -1
  26. package/dist/genesplice/soul_prompt.js +4 -1
  27. package/dist/genesplice/soul_prompt.js.map +1 -1
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/parasite/bridge.d.ts.map +1 -1
  33. package/dist/parasite/bridge.js +3 -0
  34. package/dist/parasite/bridge.js.map +1 -1
  35. package/dist/permeate/bookmarklet_generator.d.ts +10 -1
  36. package/dist/permeate/bookmarklet_generator.d.ts.map +1 -1
  37. package/dist/permeate/bookmarklet_generator.js +15 -1
  38. package/dist/permeate/bookmarklet_generator.js.map +1 -1
  39. package/dist/permeate/editor_integration_map.d.ts +10 -1
  40. package/dist/permeate/editor_integration_map.d.ts.map +1 -1
  41. package/dist/permeate/editor_integration_map.js +40 -1
  42. package/dist/permeate/editor_integration_map.js.map +1 -1
  43. package/dist/permeate/permeate.test.js +64 -5
  44. package/dist/permeate/permeate.test.js.map +1 -1
  45. package/dist/permeate/transport_menu.d.ts +15 -2
  46. package/dist/permeate/transport_menu.d.ts.map +1 -1
  47. package/dist/permeate/transport_menu.js +88 -24
  48. package/dist/permeate/transport_menu.js.map +1 -1
  49. package/dist/seamless/index.d.ts +2 -0
  50. package/dist/seamless/index.d.ts.map +1 -0
  51. package/dist/seamless/index.js +2 -0
  52. package/dist/seamless/index.js.map +1 -0
  53. package/dist/seamless/seamless.test.d.ts +2 -0
  54. package/dist/seamless/seamless.test.d.ts.map +1 -0
  55. package/dist/seamless/seamless.test.js +100 -0
  56. package/dist/seamless/seamless.test.js.map +1 -0
  57. package/dist/seamless/voice_directive.d.ts +62 -0
  58. package/dist/seamless/voice_directive.d.ts.map +1 -0
  59. package/dist/seamless/voice_directive.js +161 -0
  60. package/dist/seamless/voice_directive.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=abyss.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abyss.test.d.ts","sourceRoot":"","sources":["../../src/abyss/abyss.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync, existsSync, utimesSync, readFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { pruneCapsules, scheduledPrune } from "./scythe.js";
6
+ import { archiveSoul, listSouls, replaySoul, markUsed } from "./revenant.js";
7
+ import { renderHomunculusRequest, parseHomunculusReturn, summarizeHomunculusReturn } from "./homunculus.js";
8
+ function tmpRepo() {
9
+ return mkdtempSync(join(tmpdir(), "mneme-abyss-"));
10
+ }
11
+ function writeCapsule(repoRoot, name, ageMs, payload = {}) {
12
+ const dir = join(repoRoot, ".mneme/capsules");
13
+ mkdirSync(dir, { recursive: true });
14
+ const p = join(dir, name);
15
+ writeFileSync(p, JSON.stringify(payload, null, 2), "utf8");
16
+ const past = (Date.now() - ageMs) / 1000;
17
+ utimesSync(p, past, past);
18
+ return p;
19
+ }
20
+ // ─── SCYTHE ──────────────────────────────────────────────────────────
21
+ describe("v1.76 ABYSS · Scythe (capsule TTL + auto-prune)", () => {
22
+ let repo;
23
+ beforeEach(() => {
24
+ repo = tmpRepo();
25
+ });
26
+ it("returns empty report when capsule dir doesn't exist", () => {
27
+ const r = pruneCapsules(repo);
28
+ expect(r.scannedCount).toBe(0);
29
+ expect(r.prunedCount).toBe(0);
30
+ });
31
+ it("prunes capsules older than TTL", () => {
32
+ writeCapsule(repo, "old.capsule", 40 * 24 * 60 * 60 * 1000); // 40 days
33
+ writeCapsule(repo, "young.capsule", 1 * 24 * 60 * 60 * 1000); // 1 day
34
+ const r = pruneCapsules(repo);
35
+ expect(r.scannedCount).toBe(2);
36
+ expect(r.prunedCount).toBe(1);
37
+ expect(r.pruned[0].file).toBe("old.capsule");
38
+ expect(r.pruned[0].reason).toBe("ttl-exceeded");
39
+ });
40
+ it("respects maxCount cap (newest first wins)", () => {
41
+ for (let i = 0; i < 10; i++)
42
+ writeCapsule(repo, `c${i}.capsule`, i * 60_000); // each 1 min older
43
+ const r = pruneCapsules(repo, { maxCount: 5, ttlMs: 365 * 24 * 60 * 60 * 1000 });
44
+ expect(r.scannedCount).toBe(10);
45
+ expect(r.prunedCount).toBe(5);
46
+ for (const p of r.pruned) {
47
+ expect(p.reason === "count-cap-exceeded" || p.reason === "both").toBe(true);
48
+ }
49
+ });
50
+ it("immune entries (`keep: true`) survive pruning", () => {
51
+ writeCapsule(repo, "old-but-kept.capsule", 40 * 24 * 60 * 60 * 1000, { keep: true });
52
+ writeCapsule(repo, "old.capsule", 40 * 24 * 60 * 60 * 1000);
53
+ const r = pruneCapsules(repo);
54
+ expect(r.prunedCount).toBe(1);
55
+ expect(r.pruned[0].file).toBe("old.capsule");
56
+ expect(r.keptCount).toBe(1);
57
+ // Kept file still on disk.
58
+ expect(existsSync(join(repo, ".mneme/capsules/old-but-kept.capsule"))).toBe(true);
59
+ });
60
+ it("dryRun reports without deleting", () => {
61
+ const p = writeCapsule(repo, "ancient.capsule", 100 * 24 * 60 * 60 * 1000);
62
+ const r = pruneCapsules(repo, { dryRun: true });
63
+ expect(r.dryRun).toBe(true);
64
+ expect(r.prunedCount).toBe(1);
65
+ expect(existsSync(p)).toBe(true);
66
+ });
67
+ it("writes audit log to .mneme/abyss/scythe.jsonl", () => {
68
+ writeCapsule(repo, "old.capsule", 40 * 24 * 60 * 60 * 1000);
69
+ pruneCapsules(repo);
70
+ const auditPath = join(repo, ".mneme/abyss/scythe.jsonl");
71
+ expect(existsSync(auditPath)).toBe(true);
72
+ const log = readFileSync(auditPath, "utf8");
73
+ expect(log).toContain("old.capsule");
74
+ expect(log).toContain("pruned");
75
+ });
76
+ it("scheduledPrune is a shortcut for default opts", () => {
77
+ writeCapsule(repo, "old.capsule", 40 * 24 * 60 * 60 * 1000);
78
+ const r = scheduledPrune(repo);
79
+ expect(r.prunedCount).toBe(1);
80
+ });
81
+ it("bytes reclaimed is non-zero when files are deleted", () => {
82
+ writeCapsule(repo, "old.capsule", 40 * 24 * 60 * 60 * 1000, { padding: "x".repeat(500) });
83
+ const r = pruneCapsules(repo);
84
+ expect(r.bytesReclaimed).toBeGreaterThan(100);
85
+ });
86
+ });
87
+ // ─── REVENANT ────────────────────────────────────────────────────────
88
+ describe("v1.76 ABYSS · Revenant (soul archive)", () => {
89
+ let repo;
90
+ beforeEach(() => {
91
+ repo = tmpRepo();
92
+ });
93
+ it("archives a soul and assigns a stable id", () => {
94
+ const entry = archiveSoul(repo, { text: "# 🧬 MNEME SOUL PROMPT\nbody", vendor: "claude", fingerprint: "abc" });
95
+ expect(entry.id).toMatch(/^[a-f0-9]{16}$/);
96
+ expect(entry.used).toBe(false);
97
+ const replayed = replaySoul(repo, entry.id);
98
+ expect(replayed).not.toBeNull();
99
+ expect(replayed.text).toContain("MNEME SOUL PROMPT");
100
+ });
101
+ it("listSouls returns newest first", async () => {
102
+ archiveSoul(repo, { text: "soul1", vendor: "claude", fingerprint: "x" });
103
+ await new Promise((r) => setTimeout(r, 5));
104
+ archiveSoul(repo, { text: "soul2", vendor: "claude", fingerprint: "x" });
105
+ const list = listSouls(repo);
106
+ expect(list.length).toBe(2);
107
+ expect(list[0].createdAt >= list[1].createdAt).toBe(true);
108
+ });
109
+ it("filter by vendor works", () => {
110
+ archiveSoul(repo, { text: "a", vendor: "claude", fingerprint: "x" });
111
+ archiveSoul(repo, { text: "b", vendor: "gemini", fingerprint: "x" });
112
+ expect(listSouls(repo, { vendor: "claude" }).length).toBe(1);
113
+ expect(listSouls(repo, { vendor: "gemini" }).length).toBe(1);
114
+ });
115
+ it("markUsed flips the flag + records timestamp", () => {
116
+ const e = archiveSoul(repo, { text: "soul", vendor: "claude", fingerprint: "x" });
117
+ const ok = markUsed(repo, e.id, "chatgpt");
118
+ expect(ok).toBe(true);
119
+ const replayed = replaySoul(repo, e.id);
120
+ expect(replayed.used).toBe(true);
121
+ expect(replayed.destinationVendor).toBe("chatgpt");
122
+ expect(replayed.usedAt).toBeDefined();
123
+ });
124
+ it("markUsed on missing id returns false", () => {
125
+ expect(markUsed(repo, "nope-0000000000")).toBe(false);
126
+ });
127
+ it("usedOnly / unusedOnly filters", () => {
128
+ const a = archiveSoul(repo, { text: "a", vendor: "claude", fingerprint: "x" });
129
+ archiveSoul(repo, { text: "b", vendor: "claude", fingerprint: "x" });
130
+ markUsed(repo, a.id);
131
+ expect(listSouls(repo, { usedOnly: true }).length).toBe(1);
132
+ expect(listSouls(repo, { unusedOnly: true }).length).toBe(1);
133
+ });
134
+ });
135
+ // ─── HOMUNCULUS ──────────────────────────────────────────────────────
136
+ describe("v1.76 ABYSS · Homunculus (receiver write-back)", () => {
137
+ it("renderHomunculusRequest produces a contract block", () => {
138
+ const md = renderHomunculusRequest({ originatorVendor: "claude-opus-4-7" });
139
+ expect(md).toContain("Homunculus request");
140
+ expect(md).toContain("HOMUNCULUS RETURN");
141
+ expect(md).toContain("originator: claude-opus-4-7");
142
+ });
143
+ it("parseHomunculusReturn round-trips a structured return", () => {
144
+ const text = [
145
+ "Some preamble",
146
+ "",
147
+ "# HOMUNCULUS RETURN",
148
+ "originator: claude-opus-4-7",
149
+ "returning_from: gpt-5",
150
+ "decisions: |",
151
+ " - prefer Gist over clipboard",
152
+ " - revisit telepathy v2 next session",
153
+ "reasoning: |",
154
+ " - npm latest is the single source of truth",
155
+ "next_actions: |",
156
+ " - ship abyss",
157
+ "",
158
+ ].join("\n");
159
+ const parsed = parseHomunculusReturn(text);
160
+ expect(parsed).not.toBeNull();
161
+ expect(parsed.originator).toBe("claude-opus-4-7");
162
+ expect(parsed.returningFrom).toBe("gpt-5");
163
+ expect(parsed.decisions.length).toBe(2);
164
+ expect(parsed.reasoning.length).toBe(1);
165
+ expect(parsed.nextActions.length).toBe(1);
166
+ expect(parsed.vaccines.length).toBe(0);
167
+ });
168
+ it("parseHomunculusReturn returns null when block is missing", () => {
169
+ expect(parseHomunculusReturn("just some chat output")).toBeNull();
170
+ });
171
+ it("parseHomunculusReturn returns null when required fields are missing", () => {
172
+ const text = "# HOMUNCULUS RETURN\norigin: missing";
173
+ expect(parseHomunculusReturn(text)).toBeNull();
174
+ });
175
+ it("summarizeHomunculusReturn is a one-line digest", () => {
176
+ const r = {
177
+ originator: "claude-opus-4-7",
178
+ returningFrom: "gpt-5",
179
+ decisions: ["a", "b"],
180
+ reasoning: ["r"],
181
+ vaccines: [],
182
+ nextActions: ["n"],
183
+ };
184
+ const s = summarizeHomunculusReturn(r);
185
+ expect(s).toContain("Homunculus return");
186
+ expect(s).toContain("Decisions: 2");
187
+ expect(s).toContain("Reasoning highlights: 1");
188
+ expect(s).not.toContain("vaccines");
189
+ });
190
+ });
191
+ //# sourceMappingURL=abyss.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abyss.test.js","sourceRoot":"","sources":["../../src/abyss/abyss.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS MINION 3: HOMUNCULUS (receiver write-back).
3
+ *
4
+ * Bidirectional brain sync without a backchannel.
5
+ *
6
+ * When a soul prompt is sent to a foreign AI (ChatGPT, Gemini),
7
+ * append a "callback prompt" that asks the receiver to RETURN its
8
+ * OWN soul prompt at the end of the session. The user pastes that
9
+ * return prompt back into Mneme, which ingests it via
10
+ * `parseHomunculusReturn` and merges it into the local genome.
11
+ *
12
+ * Loop closure:
13
+ * 1. Mneme generates soul prompt + appends `## Homunculus request`.
14
+ * 2. User pastes into ChatGPT.
15
+ * 3. ChatGPT continues the work + (at session end) emits a return
16
+ * soul prompt in the agreed format.
17
+ * 4. User pastes the return into Mneme.
18
+ * 5. Mneme parses, merges decisions + reasoning trace + new vaccines
19
+ * into the local genome via GENESPLICE recombine.
20
+ *
21
+ * No API key. No webhook. No server. Just user-as-courier with a
22
+ * structured contract.
23
+ */
24
+ export interface HomunculusRequestOptions {
25
+ /** What the originator wants to learn back. Default: decisions + reasoning. */
26
+ ask?: ("decisions" | "reasoning" | "vaccines" | "next-actions")[];
27
+ /** Originating vendor (so the return prompt knows who to address). */
28
+ originatorVendor?: string;
29
+ }
30
+ /** Render the callback instruction block that gets appended to a soul prompt. */
31
+ export declare function renderHomunculusRequest(opts?: HomunculusRequestOptions): string;
32
+ export interface HomunculusReturn {
33
+ originator: string;
34
+ returningFrom: string;
35
+ decisions: string[];
36
+ reasoning: string[];
37
+ vaccines: string[];
38
+ nextActions: string[];
39
+ }
40
+ /** Parse a HOMUNCULUS RETURN block from pasted text. Returns null if the
41
+ * required fields are missing. */
42
+ export declare function parseHomunculusReturn(text: string): HomunculusReturn | null;
43
+ /** Summarize a parsed return for the originator AI to relay to the user. */
44
+ export declare function summarizeHomunculusReturn(r: HomunculusReturn): string;
45
+ //# sourceMappingURL=homunculus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homunculus.d.ts","sourceRoot":"","sources":["../../src/abyss/homunculus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,+EAA+E;IAC/E,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,CAAC,EAAE,CAAC;IAClE,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,wBAA6B,GAAG,MAAM,CAoBnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;mCACmC;AACnC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmC3E;AAED,4EAA4E;AAC5E,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAQrE"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS MINION 3: HOMUNCULUS (receiver write-back).
3
+ *
4
+ * Bidirectional brain sync without a backchannel.
5
+ *
6
+ * When a soul prompt is sent to a foreign AI (ChatGPT, Gemini),
7
+ * append a "callback prompt" that asks the receiver to RETURN its
8
+ * OWN soul prompt at the end of the session. The user pastes that
9
+ * return prompt back into Mneme, which ingests it via
10
+ * `parseHomunculusReturn` and merges it into the local genome.
11
+ *
12
+ * Loop closure:
13
+ * 1. Mneme generates soul prompt + appends `## Homunculus request`.
14
+ * 2. User pastes into ChatGPT.
15
+ * 3. ChatGPT continues the work + (at session end) emits a return
16
+ * soul prompt in the agreed format.
17
+ * 4. User pastes the return into Mneme.
18
+ * 5. Mneme parses, merges decisions + reasoning trace + new vaccines
19
+ * into the local genome via GENESPLICE recombine.
20
+ *
21
+ * No API key. No webhook. No server. Just user-as-courier with a
22
+ * structured contract.
23
+ */
24
+ /** Render the callback instruction block that gets appended to a soul prompt. */
25
+ export function renderHomunculusRequest(opts = {}) {
26
+ const ask = opts.ask ?? ["decisions", "reasoning", "next-actions"];
27
+ const originator = opts.originatorVendor ?? "claude-opus-4-7";
28
+ const lines = [];
29
+ lines.push(`## Homunculus request (write-back contract)`);
30
+ lines.push(``);
31
+ lines.push(`At the end of this session OR when the user types "homunculus return", emit a block in this EXACT format so the originating ${originator} session can ingest it back into the local Mneme:`);
32
+ lines.push(``);
33
+ lines.push("```");
34
+ lines.push(`# HOMUNCULUS RETURN`);
35
+ lines.push(`originator: ${originator}`);
36
+ lines.push(`returning_from: <your-model-id>`);
37
+ if (ask.includes("decisions"))
38
+ lines.push(`decisions: |\n - <decision 1>\n - <decision 2>`);
39
+ if (ask.includes("reasoning"))
40
+ lines.push(`reasoning: |\n - <key reasoning highlight>`);
41
+ if (ask.includes("vaccines"))
42
+ lines.push(`vaccines: |\n - <hallucination strain caught + how>`);
43
+ if (ask.includes("next-actions"))
44
+ lines.push(`next_actions: |\n - <what should happen next>`);
45
+ lines.push("```");
46
+ lines.push(``);
47
+ lines.push(`The user will paste this back into their local Mneme. Be terse -- one bullet per line, no prose paragraphs.`);
48
+ return lines.join("\n");
49
+ }
50
+ /** Parse a HOMUNCULUS RETURN block from pasted text. Returns null if the
51
+ * required fields are missing. */
52
+ export function parseHomunculusReturn(text) {
53
+ if (!text.includes("HOMUNCULUS RETURN"))
54
+ return null;
55
+ const get = (key) => {
56
+ const m = text.match(new RegExp(`^${key}:\\s*(.+)$`, "m"));
57
+ return m ? m[1].trim() : null;
58
+ };
59
+ // Line-based block parser: find `^key: |` then collect indented lines.
60
+ const lines = text.split(/\r?\n/);
61
+ const block = (key) => {
62
+ const headerRe = new RegExp(`^${key}:\\s*\\|\\s*$`);
63
+ const out = [];
64
+ for (let i = 0; i < lines.length; i++) {
65
+ if (!headerRe.test(lines[i]))
66
+ continue;
67
+ for (let j = i + 1; j < lines.length; j++) {
68
+ const ln = lines[j];
69
+ if (ln === "")
70
+ continue; // blank lines allowed inside the block
71
+ if (!/^\s/.test(ln))
72
+ break; // unindented line ends the block
73
+ const item = ln.replace(/^\s*-\s*/, "").trim();
74
+ if (item)
75
+ out.push(item);
76
+ }
77
+ break;
78
+ }
79
+ return out;
80
+ };
81
+ const originator = get("originator");
82
+ const returningFrom = get("returning_from");
83
+ if (!originator || !returningFrom)
84
+ return null;
85
+ return {
86
+ originator,
87
+ returningFrom,
88
+ decisions: block("decisions"),
89
+ reasoning: block("reasoning"),
90
+ vaccines: block("vaccines"),
91
+ nextActions: block("next_actions"),
92
+ };
93
+ }
94
+ /** Summarize a parsed return for the originator AI to relay to the user. */
95
+ export function summarizeHomunculusReturn(r) {
96
+ const lines = [];
97
+ lines.push(`Homunculus return from \`${r.returningFrom}\` → \`${r.originator}\``);
98
+ if (r.decisions.length > 0)
99
+ lines.push(`Decisions: ${r.decisions.length}`);
100
+ if (r.reasoning.length > 0)
101
+ lines.push(`Reasoning highlights: ${r.reasoning.length}`);
102
+ if (r.vaccines.length > 0)
103
+ lines.push(`New vaccines: ${r.vaccines.length}`);
104
+ if (r.nextActions.length > 0)
105
+ lines.push(`Next actions: ${r.nextActions.length}`);
106
+ return lines.join(" · ");
107
+ }
108
+ //# sourceMappingURL=homunculus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homunculus.js","sourceRoot":"","sources":["../../src/abyss/homunculus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS PROTOCOL: final-boss minions.
3
+ *
4
+ * - SCYTHE: capsule TTL + auto-prune. Stops `.mneme/capsules/` from
5
+ * growing forever; nightly daemon job clears them.
6
+ * - REVENANT: soul prompt archive. Every soul prompt is replayable
7
+ * by id; mark-as-used closes the cross-vendor loop.
8
+ * - HOMUNCULUS: receiver-write-back contract. Foreign AI returns its
9
+ * own soul prompt at session end → ingested into local genome.
10
+ */
11
+ export * from "./scythe.js";
12
+ export * from "./revenant.js";
13
+ export * from "./homunculus.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/abyss/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS PROTOCOL: final-boss minions.
3
+ *
4
+ * - SCYTHE: capsule TTL + auto-prune. Stops `.mneme/capsules/` from
5
+ * growing forever; nightly daemon job clears them.
6
+ * - REVENANT: soul prompt archive. Every soul prompt is replayable
7
+ * by id; mark-as-used closes the cross-vendor loop.
8
+ * - HOMUNCULUS: receiver-write-back contract. Foreign AI returns its
9
+ * own soul prompt at session end → ingested into local genome.
10
+ */
11
+ export * from "./scythe.js";
12
+ export * from "./revenant.js";
13
+ export * from "./homunculus.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abyss/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS MINION 2: REVENANT (soul prompt archive + replay).
3
+ *
4
+ * Every soul prompt that leaves Mneme should be REPLAYABLE later.
5
+ * REVENANT is git-reflog for cross-vendor handovers:
6
+ * - Save the soul prompt + metadata when generated.
7
+ * - List archived souls with vendor / fingerprint / created / used.
8
+ * - Replay any past soul by id.
9
+ * - Mark a soul as "used successfully" when the receiving AI ACKs.
10
+ *
11
+ * Storage: `.mneme/abyss/souls/<id>.json` (newline-delimited safe).
12
+ * Index: in-memory rebuild from directory listing -- no separate
13
+ * index file to corrupt.
14
+ */
15
+ export interface ArchivedSoul {
16
+ id: string;
17
+ createdAt: string;
18
+ vendor: string;
19
+ fingerprint: string;
20
+ destinationVendor?: string;
21
+ /** Was the soul transferred successfully? Set by markUsed. */
22
+ used: boolean;
23
+ /** ISO timestamp when marked used. */
24
+ usedAt?: string;
25
+ /** The raw soul prompt text. */
26
+ text: string;
27
+ /** Char length convenience. */
28
+ length: number;
29
+ }
30
+ export interface ArchiveInput {
31
+ text: string;
32
+ vendor: string;
33
+ fingerprint: string;
34
+ destinationVendor?: string;
35
+ }
36
+ /** Save a soul prompt to the local archive. Returns the assigned id. */
37
+ export declare function archiveSoul(repoRoot: string, input: ArchiveInput): ArchivedSoul;
38
+ /** List all archived souls (newest first). Optionally filter by vendor. */
39
+ export declare function listSouls(repoRoot: string, opts?: {
40
+ vendor?: string;
41
+ usedOnly?: boolean;
42
+ unusedOnly?: boolean;
43
+ }): ArchivedSoul[];
44
+ /** Retrieve a single archived soul by id. */
45
+ export declare function replaySoul(repoRoot: string, id: string): ArchivedSoul | null;
46
+ /** Mark a soul as successfully transferred (receiving AI ACKed). */
47
+ export declare function markUsed(repoRoot: string, id: string, destinationVendor?: string): boolean;
48
+ //# sourceMappingURL=revenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenant.d.ts","sourceRoot":"","sources":["../../src/abyss/revenant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAYD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAe/E;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACvE,YAAY,EAAE,CAkBhB;AAED,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAS5E;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAc1F"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS MINION 2: REVENANT (soul prompt archive + replay).
3
+ *
4
+ * Every soul prompt that leaves Mneme should be REPLAYABLE later.
5
+ * REVENANT is git-reflog for cross-vendor handovers:
6
+ * - Save the soul prompt + metadata when generated.
7
+ * - List archived souls with vendor / fingerprint / created / used.
8
+ * - Replay any past soul by id.
9
+ * - Mark a soul as "used successfully" when the receiving AI ACKs.
10
+ *
11
+ * Storage: `.mneme/abyss/souls/<id>.json` (newline-delimited safe).
12
+ * Index: in-memory rebuild from directory listing -- no separate
13
+ * index file to corrupt.
14
+ */
15
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { createHash } from "node:crypto";
18
+ const SOULS_DIR = ".mneme/abyss/souls";
19
+ function ensureSoulsDir(repoRoot) {
20
+ const dir = join(repoRoot, SOULS_DIR);
21
+ if (!existsSync(dir))
22
+ mkdirSync(dir, { recursive: true });
23
+ return dir;
24
+ }
25
+ function shortId(text) {
26
+ return createHash("sha256").update(text).digest("hex").slice(0, 16);
27
+ }
28
+ /** Save a soul prompt to the local archive. Returns the assigned id. */
29
+ export function archiveSoul(repoRoot, input) {
30
+ const dir = ensureSoulsDir(repoRoot);
31
+ const id = shortId(input.text + new Date().toISOString());
32
+ const entry = {
33
+ id,
34
+ createdAt: new Date().toISOString(),
35
+ vendor: input.vendor,
36
+ fingerprint: input.fingerprint,
37
+ destinationVendor: input.destinationVendor,
38
+ used: false,
39
+ text: input.text,
40
+ length: input.text.length,
41
+ };
42
+ writeFileSync(join(dir, `${id}.json`), JSON.stringify(entry, null, 2), "utf8");
43
+ return entry;
44
+ }
45
+ /** List all archived souls (newest first). Optionally filter by vendor. */
46
+ export function listSouls(repoRoot, opts = {}) {
47
+ const dir = join(repoRoot, SOULS_DIR);
48
+ if (!existsSync(dir))
49
+ return [];
50
+ const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
51
+ const out = [];
52
+ for (const f of files) {
53
+ try {
54
+ const j = JSON.parse(readFileSync(join(dir, f), "utf8"));
55
+ if (opts.vendor && j.vendor !== opts.vendor)
56
+ continue;
57
+ if (opts.usedOnly && !j.used)
58
+ continue;
59
+ if (opts.unusedOnly && j.used)
60
+ continue;
61
+ out.push(j);
62
+ }
63
+ catch {
64
+ // skip corrupt entries
65
+ }
66
+ }
67
+ out.sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));
68
+ return out;
69
+ }
70
+ /** Retrieve a single archived soul by id. */
71
+ export function replaySoul(repoRoot, id) {
72
+ const dir = join(repoRoot, SOULS_DIR);
73
+ const p = join(dir, `${id}.json`);
74
+ if (!existsSync(p))
75
+ return null;
76
+ try {
77
+ return JSON.parse(readFileSync(p, "utf8"));
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ /** Mark a soul as successfully transferred (receiving AI ACKed). */
84
+ export function markUsed(repoRoot, id, destinationVendor) {
85
+ const dir = join(repoRoot, SOULS_DIR);
86
+ const p = join(dir, `${id}.json`);
87
+ if (!existsSync(p))
88
+ return false;
89
+ try {
90
+ const j = JSON.parse(readFileSync(p, "utf8"));
91
+ j.used = true;
92
+ j.usedAt = new Date().toISOString();
93
+ if (destinationVendor)
94
+ j.destinationVendor = destinationVendor;
95
+ writeFileSync(p, JSON.stringify(j, null, 2), "utf8");
96
+ return true;
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ //# sourceMappingURL=revenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenant.js","sourceRoot":"","sources":["../../src/abyss/revenant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * v1.76.0 -- ABYSS MINION 1: SCYTHE (capsule TTL + auto-prune).
3
+ *
4
+ * The bug user spotted: `.mneme/capsules/` accumulates a capsule
5
+ * EVERY session, forever. Disk fills, search slows, snapshots bloat.
6
+ *
7
+ * SCYTHE keeps the capsule directory bounded by two simultaneous
8
+ * policies:
9
+ * 1. Time-to-live (TTL): default 30 days. Older capsules deleted.
10
+ * 2. Hard count cap: default 200. Beyond that, the oldest are
11
+ * culled regardless of age.
12
+ *
13
+ * Both policies apply -- a capsule survives only if BOTH its age is
14
+ * under the TTL AND its rank (newest=0) is under the cap. Capsules
15
+ * marked `keep: true` (set by the user / by REVENANT when archived)
16
+ * are immune.
17
+ *
18
+ * Audit log: every prune writes a structured entry to
19
+ * `.mneme/abyss/scythe.jsonl` so we can later prove what disappeared
20
+ * and why. The daemon can call this nightly via `scheduledPrune()`.
21
+ */
22
+ export interface ScytheOptions {
23
+ /** Time-to-live in milliseconds. Default 30 days. */
24
+ ttlMs?: number;
25
+ /** Maximum capsules to keep (newest first). Default 200. */
26
+ maxCount?: number;
27
+ /** Directory holding `.capsule` files. Default `<repoRoot>/.mneme/capsules`. */
28
+ capsuleDir?: string;
29
+ /** When true, list what WOULD be pruned without deleting. */
30
+ dryRun?: boolean;
31
+ }
32
+ export interface ScythePrunedEntry {
33
+ file: string;
34
+ ageDays: number;
35
+ reason: "ttl-exceeded" | "count-cap-exceeded" | "both";
36
+ sizeBytes: number;
37
+ }
38
+ export interface ScytheReport {
39
+ scannedCount: number;
40
+ prunedCount: number;
41
+ keptCount: number;
42
+ bytesReclaimed: number;
43
+ pruned: ScythePrunedEntry[];
44
+ ttlMs: number;
45
+ maxCount: number;
46
+ dryRun: boolean;
47
+ ranAt: string;
48
+ }
49
+ /** Prune capsules in `<repoRoot>/.mneme/capsules` according to TTL + cap. */
50
+ export declare function pruneCapsules(repoRoot: string, opts?: ScytheOptions): ScytheReport;
51
+ /** Daemon-friendly nightly entry point. Same as pruneCapsules with defaults. */
52
+ export declare function scheduledPrune(repoRoot: string): ScytheReport;
53
+ //# sourceMappingURL=scythe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scythe.d.ts","sourceRoot":"","sources":["../../src/abyss/scythe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,GAAG,oBAAoB,GAAG,MAAM,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CAuFtF;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAE7D"}