@mneme-ai/core 2.94.0 → 2.96.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 (55) hide show
  1. package/dist/agent_manifest.d.ts +0 -2
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +46 -0
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/hydra/analytic.d.ts +103 -0
  6. package/dist/hydra/analytic.d.ts.map +1 -0
  7. package/dist/hydra/analytic.js +161 -0
  8. package/dist/hydra/analytic.js.map +1 -0
  9. package/dist/hydra/attest.d.ts +60 -0
  10. package/dist/hydra/attest.d.ts.map +1 -0
  11. package/dist/hydra/attest.js +84 -0
  12. package/dist/hydra/attest.js.map +1 -0
  13. package/dist/hydra/engine.d.ts +84 -0
  14. package/dist/hydra/engine.d.ts.map +1 -0
  15. package/dist/hydra/engine.js +108 -0
  16. package/dist/hydra/engine.js.map +1 -0
  17. package/dist/hydra/hydra.test.d.ts +2 -0
  18. package/dist/hydra/hydra.test.d.ts.map +1 -0
  19. package/dist/hydra/hydra.test.js +90 -0
  20. package/dist/hydra/hydra.test.js.map +1 -0
  21. package/dist/hydra/index.d.ts +76 -0
  22. package/dist/hydra/index.d.ts.map +1 -0
  23. package/dist/hydra/index.js +61 -0
  24. package/dist/hydra/index.js.map +1 -0
  25. package/dist/hydra/mine.d.ts +42 -0
  26. package/dist/hydra/mine.d.ts.map +1 -0
  27. package/dist/hydra/mine.js +72 -0
  28. package/dist/hydra/mine.js.map +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/lexicon/aup_audit.d.ts +74 -0
  34. package/dist/lexicon/aup_audit.d.ts.map +1 -0
  35. package/dist/lexicon/aup_audit.js +118 -0
  36. package/dist/lexicon/aup_audit.js.map +1 -0
  37. package/dist/lexicon/dual_surface.d.ts.map +1 -1
  38. package/dist/lexicon/dual_surface.js +27 -0
  39. package/dist/lexicon/dual_surface.js.map +1 -1
  40. package/dist/lexicon/index.d.ts +1 -0
  41. package/dist/lexicon/index.d.ts.map +1 -1
  42. package/dist/lexicon/index.js +1 -0
  43. package/dist/lexicon/index.js.map +1 -1
  44. package/dist/lexicon/lexicon.test.js +45 -0
  45. package/dist/lexicon/lexicon.test.js.map +1 -1
  46. package/dist/lexicon/mappings.d.ts +4 -2
  47. package/dist/lexicon/mappings.d.ts.map +1 -1
  48. package/dist/lexicon/mappings.js +31 -0
  49. package/dist/lexicon/mappings.js.map +1 -1
  50. package/dist/notifier/agent_files.js +2 -2
  51. package/dist/notifier/agent_files.js.map +1 -1
  52. package/dist/truth_gate/probes.d.ts.map +1 -1
  53. package/dist/truth_gate/probes.js +54 -0
  54. package/dist/truth_gate/probes.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · the SUPER-BOT ANALYTIC ENGINE.
3
+ *
4
+ * A live, self-checking forge loop. It mines (L1), MDL-selects (L2), and
5
+ * GROWS the codebook one batch at a time — but every growth step is gated
6
+ * by the gauntlet (L4 lossless ∧ L7 zero-collision). It keeps improving
7
+ * (L9) until it can no longer add a byte of value, then STOPS. It never
8
+ * ships a codebook that loses a byte or holds two meanings for one symbol.
9
+ *
10
+ * "Continue improvement until it doesn't lie, 100%": the loop's exit
11
+ * condition is CONVERGENCE (no positive-MDL candidate survives the
12
+ * gauntlet) — not a guess. Each round strictly increases bytes-saved or
13
+ * the loop ends. Bounded by construction: the candidate pool is finite and
14
+ * each accepted phrase is removed from contention.
15
+ *
16
+ * Pure + deterministic. No crypto, no I/O, no Date — attestation (L5 sign,
17
+ * L8 energy cert) lives in attest.ts so this stays trivially testable.
18
+ */
19
+ import { type Codebook } from "./engine.js";
20
+ /** Order entries longest-phrase-first + (re)assign deterministic symbols. */
21
+ export declare function buildCodebook(open: string, close: string, phrases: Array<{
22
+ phrase: string;
23
+ hits: number;
24
+ gain: number;
25
+ }>, corpus: string): Codebook;
26
+ export interface CollisionReport {
27
+ collisions: number;
28
+ reasons: string[];
29
+ }
30
+ /**
31
+ * L7 — collision detection (the "can't hold two meanings" invariant, the
32
+ * same discipline as the axiom lattice). A codebook is collision-free iff:
33
+ * - every symbol is unique,
34
+ * - every phrase is unique,
35
+ * - no phrase contains a marker (would make expansion ambiguous).
36
+ */
37
+ export declare function collisions(cb: Codebook): CollisionReport;
38
+ export interface Gauntlet {
39
+ /** L4 — byte-identical round-trip. */
40
+ lossless: boolean;
41
+ /** L7 — number of symbol/phrase collisions (must be 0). */
42
+ collisions: number;
43
+ /** L6 — expansion is deterministic (two runs hash-identical). */
44
+ portable: boolean;
45
+ bytesOriginal: number;
46
+ bytesCompressed: number;
47
+ /** Honest: bytes the codebook itself costs to store/ship. */
48
+ codebookBytes: number;
49
+ /** original / compressed-text only (the per-use win when the codebook is
50
+ * pre-shared / amortized across many expansions). */
51
+ ratio: number;
52
+ /** HONEST net: original / (compressed-text + codebook) — the single-shot
53
+ * bundle ratio. <1 means a lone artifact is NOT smaller as a bundle; the
54
+ * win is amortization, never single-shot. We report it so we never lie. */
55
+ netRatio: number;
56
+ entries: number;
57
+ /** 0–100. 100 ⟺ lossless ∧ collisions=0 ∧ portable. Ratio does NOT move
58
+ * the score — HYDRA's gem is the CUT (signed/lossless/portable), not the
59
+ * carbon (compression). The score cannot lie about losing a byte. */
60
+ score: number;
61
+ }
62
+ /** Run the full gauntlet (L4 ∧ L6 ∧ L7 + honest ratios) over a codebook. */
63
+ export declare function gauntlet(corpus: string, cb: Codebook): Gauntlet;
64
+ export interface ForgeRound {
65
+ round: number;
66
+ added: number;
67
+ entries: number;
68
+ bytesSaved: number;
69
+ gauntletScore: number;
70
+ lossless: boolean;
71
+ collisions: number;
72
+ }
73
+ export interface ForgeResult {
74
+ codebook: Codebook;
75
+ gauntlet: Gauntlet;
76
+ rounds: ForgeRound[];
77
+ /** True iff the engine converged with a perfect gauntlet. */
78
+ converged: boolean;
79
+ }
80
+ export interface ForgeOpts {
81
+ maxRounds?: number;
82
+ /** Candidates promoted per round before re-proving (batch for speed). */
83
+ batchPerRound?: number;
84
+ maxEntries?: number;
85
+ minHits?: number;
86
+ windowSizes?: number[];
87
+ /** Run the full (expensive) gauntlet every N rounds as a live audit.
88
+ * The final round is ALWAYS audited. Default 16. */
89
+ auditEvery?: number;
90
+ /** Drop a candidate that is a substring of an already-chosen (higher-gain)
91
+ * phrase — kills the n-gram-overlap explosion → a lean, high-value
92
+ * codebook. Default true. */
93
+ dedupSubstrings?: boolean;
94
+ }
95
+ /**
96
+ * L9 — forge the codebook by infinite-until-convergence self-improvement.
97
+ * Each round: mine candidates not already covered, promote the top batch,
98
+ * RE-PROVE the gauntlet; if a batch ever broke losslessness or introduced
99
+ * a collision (it shouldn't, by construction), it is rolled back and
100
+ * retried one-at-a-time. Stop when no positive-gain candidate survives.
101
+ */
102
+ export declare function forgeCodebook(corpus: string, opts?: ForgeOpts): ForgeResult;
103
+ //# sourceMappingURL=analytic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytic.d.ts","sourceRoot":"","sources":["../../src/hydra/analytic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAA4F,MAAM,aAAa,CAAC;AAGtI,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAInJ;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,eAAe,CAYxD;AAED,MAAM,WAAW,QAAQ;IACvB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB;0DACsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd;;gFAE4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;0EAEsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAoB/D;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;yDACqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;kCAE8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,WAAW,CAuE/E"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · the SUPER-BOT ANALYTIC ENGINE.
3
+ *
4
+ * A live, self-checking forge loop. It mines (L1), MDL-selects (L2), and
5
+ * GROWS the codebook one batch at a time — but every growth step is gated
6
+ * by the gauntlet (L4 lossless ∧ L7 zero-collision). It keeps improving
7
+ * (L9) until it can no longer add a byte of value, then STOPS. It never
8
+ * ships a codebook that loses a byte or holds two meanings for one symbol.
9
+ *
10
+ * "Continue improvement until it doesn't lie, 100%": the loop's exit
11
+ * condition is CONVERGENCE (no positive-MDL candidate survives the
12
+ * gauntlet) — not a guess. Each round strictly increases bytes-saved or
13
+ * the loop ends. Bounded by construction: the candidate pool is finite and
14
+ * each accepted phrase is removed from contention.
15
+ *
16
+ * Pure + deterministic. No crypto, no I/O, no Date — attestation (L5 sign,
17
+ * L8 energy cert) lives in attest.ts so this stays trivially testable.
18
+ */
19
+ import { chooseMarkers, symbolFor, proveLossless, sha256Hex, compress, expand } from "./engine.js";
20
+ import { mineCandidates } from "./mine.js";
21
+ /** Order entries longest-phrase-first + (re)assign deterministic symbols. */
22
+ export function buildCodebook(open, close, phrases, corpus) {
23
+ const sorted = [...phrases].sort((a, b) => b.phrase.length - a.phrase.length || (a.phrase < b.phrase ? -1 : 1));
24
+ const entries = sorted.map((p, i) => ({ sym: symbolFor(open, close, i), phrase: p.phrase, hits: p.hits, gain: p.gain }));
25
+ return { v: 1, open, close, entries, corpusHash: sha256Hex(corpus) };
26
+ }
27
+ /**
28
+ * L7 — collision detection (the "can't hold two meanings" invariant, the
29
+ * same discipline as the axiom lattice). A codebook is collision-free iff:
30
+ * - every symbol is unique,
31
+ * - every phrase is unique,
32
+ * - no phrase contains a marker (would make expansion ambiguous).
33
+ */
34
+ export function collisions(cb) {
35
+ const reasons = [];
36
+ const syms = new Set();
37
+ const phrases = new Set();
38
+ for (const e of cb.entries) {
39
+ if (syms.has(e.sym))
40
+ reasons.push(`duplicate symbol ${JSON.stringify(e.sym)}`);
41
+ if (phrases.has(e.phrase))
42
+ reasons.push(`duplicate phrase ${JSON.stringify(e.phrase.slice(0, 24))}`);
43
+ if (e.phrase.includes(cb.open) || e.phrase.includes(cb.close))
44
+ reasons.push(`phrase carries a marker`);
45
+ syms.add(e.sym);
46
+ phrases.add(e.phrase);
47
+ }
48
+ return { collisions: reasons.length, reasons: reasons.slice(0, 8) };
49
+ }
50
+ function codebookByteSize(cb) {
51
+ let n = 0;
52
+ for (const e of cb.entries)
53
+ n += Buffer.byteLength(e.phrase, "utf8") + Buffer.byteLength(e.sym, "utf8") + 4;
54
+ return n;
55
+ }
56
+ /** Run the full gauntlet (L4 ∧ L6 ∧ L7 + honest ratios) over a codebook. */
57
+ export function gauntlet(corpus, cb) {
58
+ const proof = proveLossless(corpus, cb);
59
+ const coll = collisions(cb);
60
+ // L6 portability: determinism — recompute the round-trip hash; it must
61
+ // equal the original (single recompute; proveLossless already did one).
62
+ const portable = sha256Hex(expand(compress(corpus, cb), cb)) === proof.originalHash;
63
+ const perfect = proof.lossless && coll.collisions === 0 && portable;
64
+ const codebookBytes = codebookByteSize(cb);
65
+ return {
66
+ lossless: proof.lossless,
67
+ collisions: coll.collisions,
68
+ portable,
69
+ bytesOriginal: proof.originalBytes,
70
+ bytesCompressed: proof.compressedBytes,
71
+ codebookBytes,
72
+ ratio: proof.ratio,
73
+ netRatio: (proof.compressedBytes + codebookBytes) === 0 ? 1 : proof.originalBytes / (proof.compressedBytes + codebookBytes),
74
+ entries: cb.entries.length,
75
+ score: perfect ? 100 : 0,
76
+ };
77
+ }
78
+ /**
79
+ * L9 — forge the codebook by infinite-until-convergence self-improvement.
80
+ * Each round: mine candidates not already covered, promote the top batch,
81
+ * RE-PROVE the gauntlet; if a batch ever broke losslessness or introduced
82
+ * a collision (it shouldn't, by construction), it is rolled back and
83
+ * retried one-at-a-time. Stop when no positive-gain candidate survives.
84
+ */
85
+ export function forgeCodebook(corpus, opts = {}) {
86
+ const maxRounds = opts.maxRounds ?? 500;
87
+ const batchPerRound = opts.batchPerRound ?? 16;
88
+ const maxEntries = opts.maxEntries ?? 512;
89
+ const auditEvery = opts.auditEvery ?? 16;
90
+ const dedupSubstrings = opts.dedupSubstrings ?? true;
91
+ const [open, close] = chooseMarkers(corpus, []);
92
+ // Mine the full candidate pool ONCE — the corpus is fixed, so the pool
93
+ // doesn't change. Pre-sorted by MDL gain (L2). Per-candidate admission is
94
+ // O(1)+dedup; the full lossless proof is the load-bearing L4 gate, run as
95
+ // a LIVE periodic audit and authoritatively at the end.
96
+ const pool = mineCandidates(corpus, { minHits: opts.minHits, windowSizes: opts.windowSizes });
97
+ const chosen = [];
98
+ const chosenPhrases = new Set();
99
+ const rounds = [];
100
+ // collision-free ⟹ lossless (distinct phrases + PUA markers absent from
101
+ // corpus ⇒ symbols are isolated, expansion is exact). Per-candidate we
102
+ // check the O(1) collision precondition + substring-dedup; the full proof
103
+ // audits it. Substring-dedup keeps the codebook LEAN (one high-gain phrase
104
+ // beats a dozen overlapping sub-phrases).
105
+ const admissible = (phrase) => {
106
+ if (chosenPhrases.has(phrase) || phrase.includes(open) || phrase.includes(close))
107
+ return false;
108
+ if (dedupSubstrings) {
109
+ for (const c of chosen)
110
+ if (c.phrase.includes(phrase))
111
+ return false; // redundant with a higher-gain pick
112
+ }
113
+ return true;
114
+ };
115
+ let cb = buildCodebook(open, close, chosen, corpus);
116
+ let cursor = 0;
117
+ for (let round = 0; round < maxRounds && cursor < pool.length; round++) {
118
+ const before = chosen.length;
119
+ let taken = 0;
120
+ while (cursor < pool.length && taken < batchPerRound && chosen.length < maxEntries) {
121
+ const c = pool[cursor++];
122
+ if (!c)
123
+ break;
124
+ if (!admissible(c.phrase))
125
+ continue;
126
+ chosen.push(c);
127
+ chosenPhrases.add(c.phrase);
128
+ taken++;
129
+ }
130
+ if (chosen.length === before) {
131
+ if (cursor >= pool.length || chosen.length >= maxEntries)
132
+ break; // converged
133
+ continue; // batch all redundant, keep scanning
134
+ }
135
+ const lastRound = cursor >= pool.length || chosen.length >= maxEntries;
136
+ const doAudit = lastRound || round % auditEvery === 0;
137
+ if (doAudit) {
138
+ cb = buildCodebook(open, close, chosen, corpus);
139
+ const g = gauntlet(corpus, cb); // LIVE full audit (L4∧L6∧L7)
140
+ if (g.score !== 100) { // must not happen by construction
141
+ const rolledBack = chosen.splice(before);
142
+ for (const p of rolledBack)
143
+ chosenPhrases.delete(p.phrase);
144
+ cb = buildCodebook(open, close, chosen, corpus);
145
+ const rg = gauntlet(corpus, cb);
146
+ rounds.push({ round, added: 0, entries: chosen.length, bytesSaved: rg.bytesOriginal - rg.bytesCompressed, gauntletScore: rg.score, lossless: rg.lossless, collisions: g.collisions });
147
+ break;
148
+ }
149
+ rounds.push({ round, added: chosen.length - before, entries: chosen.length, bytesSaved: g.bytesOriginal - g.bytesCompressed, gauntletScore: g.score, lossless: g.lossless, collisions: g.collisions });
150
+ }
151
+ else {
152
+ rounds.push({ round, added: chosen.length - before, entries: chosen.length, bytesSaved: -1, gauntletScore: -1, lossless: true, collisions: 0 });
153
+ }
154
+ if (lastRound)
155
+ break;
156
+ }
157
+ cb = buildCodebook(open, close, chosen, corpus);
158
+ const finalG = gauntlet(corpus, cb);
159
+ return { codebook: cb, gauntlet: finalG, rounds, converged: finalG.score === 100 };
160
+ }
161
+ //# sourceMappingURL=analytic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytic.js","sourceRoot":"","sources":["../../src/hydra/analytic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAqC,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtI,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,OAA8D,EAAE,MAAc;IACvI,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,MAAM,OAAO,GAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1I,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AACvE,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EAAY;IACrC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACvG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC;AA2BD,SAAS,gBAAgB,CAAC,EAAY;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO;QAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5G,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,EAAY;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,uEAAuE;IACvE,wEAAwE;IACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC;IACpF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC;IACpE,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ;QACR,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,aAAa;QACb,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC;QAC3H,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM;QAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAoCD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAkB,EAAE;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;IACrD,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhD,uEAAuE;IACvE,0EAA0E;IAC1E,0EAA0E;IAC1E,wDAAwD;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAE9F,MAAM,MAAM,GAA0D,EAAE,CAAC;IACzE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,0CAA0C;IAC1C,MAAM,UAAU,GAAG,CAAC,MAAc,EAAW,EAAE;QAC7C,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/F,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,KAAK,CAAC,CAAC,oCAAoC;QAC3G,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,aAAa,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACnF,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC;gBAAE,MAAM;YACd,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,SAAS;YACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5B,KAAK,EAAE,CAAC;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU;gBAAE,MAAM,CAAG,YAAY;YAC/E,SAAS,CAA0D,qCAAqC;QAC1G,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC;QACvE,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,GAAG,UAAU,KAAK,CAAC,CAAC;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAiB,6BAA6B;YAC7E,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC,CAA0B,kCAAkC;gBAChF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACzC,KAAK,MAAM,CAAC,IAAI,UAAU;oBAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3D,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;gBACtL,MAAM;YACR,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACzM,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAClJ,CAAC;QACD,IAAI,SAAS;YAAE,MAAM;IACvB,CAAC;IAED,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;AACrF,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · L5 signed codebook + L8 energy certificate.
3
+ *
4
+ * This is the gem's CUT — the facets prior-art research found UNFILLED:
5
+ * no prompt-compression system signs its codebook or attests the round
6
+ * trip. HYDRA reuses Mneme's existing NOTARY (Ed25519) spine so a third
7
+ * party can verify OFFLINE, with the public key alone, that:
8
+ * - this exact codebook was forged by this issuer (L5), and
9
+ * - it expands a corpus of this exact hash with a perfect gauntlet, and
10
+ * - the one-time mining energy buys perpetual ~0-energy recollection (L8,
11
+ * the ANAMNESIS thesis: compute once, recollect forever).
12
+ *
13
+ * No new crypto — diamonds compound on the NOTARY spine.
14
+ */
15
+ import { type NotaryReceipt } from "../notary/receipt.js";
16
+ import type { Codebook } from "./engine.js";
17
+ import type { Gauntlet } from "./analytic.js";
18
+ /** Canonical, deterministic serialization of a codebook (for hashing/sig). */
19
+ export declare function canonicalizeCodebook(cb: Codebook): string;
20
+ export interface HydraCodebookProof {
21
+ codebookHash: string;
22
+ corpusHash: string;
23
+ entries: number;
24
+ gauntletScore: number;
25
+ ratio: number;
26
+ bytesOriginal: number;
27
+ bytesCompressed: number;
28
+ }
29
+ /**
30
+ * L5 — sign the codebook + its gauntlet verdict into a portable NOTARY
31
+ * receipt. `at` is the issue timestamp (passed in for determinism/testing;
32
+ * the CLI supplies Date.now()).
33
+ */
34
+ export declare function signCodebook(repoRoot: string, cb: Codebook, g: Gauntlet, at: number): NotaryReceipt;
35
+ export interface CodebookVerify {
36
+ valid: boolean;
37
+ reason: string;
38
+ /** True only when the signature is valid AND the receipt's codebookHash
39
+ * matches the codebook actually presented (no swap-after-sign). */
40
+ bound: boolean;
41
+ }
42
+ /**
43
+ * Verify a signed codebook OFFLINE: the Ed25519 signature must check out
44
+ * AND the receipt's embedded codebookHash must equal the hash of the
45
+ * codebook presented. Catches both forged receipts and codebook tampering.
46
+ */
47
+ export declare function verifyCodebook(receipt: unknown, cb: Codebook): CodebookVerify;
48
+ export interface EnergyCert {
49
+ receipt: NotaryReceipt;
50
+ bytesSaved: number;
51
+ ratio: number;
52
+ /** Bytes saved per future expansion, paid for by a single mine. */
53
+ perpetualSavingPerUse: number;
54
+ }
55
+ /**
56
+ * L8 — energy certificate: the one-time mine cost buys perpetual savings.
57
+ * Signed via NOTARY so the savings claim is itself verifiable, not boast.
58
+ */
59
+ export declare function mintEnergyCert(repoRoot: string, cb: Codebook, g: Gauntlet, at: number): EnergyCert;
60
+ //# sourceMappingURL=attest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.d.ts","sourceRoot":"","sources":["../../src/hydra/attest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAKzD;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CAiBnG;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;wEACoE;IACpE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,GAAG,cAAc,CAe7E;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,CAUlG"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · L5 signed codebook + L8 energy certificate.
3
+ *
4
+ * This is the gem's CUT — the facets prior-art research found UNFILLED:
5
+ * no prompt-compression system signs its codebook or attests the round
6
+ * trip. HYDRA reuses Mneme's existing NOTARY (Ed25519) spine so a third
7
+ * party can verify OFFLINE, with the public key alone, that:
8
+ * - this exact codebook was forged by this issuer (L5), and
9
+ * - it expands a corpus of this exact hash with a perfect gauntlet, and
10
+ * - the one-time mining energy buys perpetual ~0-energy recollection (L8,
11
+ * the ANAMNESIS thesis: compute once, recollect forever).
12
+ *
13
+ * No new crypto — diamonds compound on the NOTARY spine.
14
+ */
15
+ import { issueReceipt, verifyReceipt } from "../notary/receipt.js";
16
+ import { sha256Hex } from "./engine.js";
17
+ /** Canonical, deterministic serialization of a codebook (for hashing/sig). */
18
+ export function canonicalizeCodebook(cb) {
19
+ // Entry order is already deterministic (longest-first); we serialize only
20
+ // the load-bearing fields so the hash is stable across runs.
21
+ const entries = cb.entries.map((e) => [e.sym, e.phrase]);
22
+ return JSON.stringify({ v: cb.v, open: cb.open, close: cb.close, corpusHash: cb.corpusHash, entries });
23
+ }
24
+ /**
25
+ * L5 — sign the codebook + its gauntlet verdict into a portable NOTARY
26
+ * receipt. `at` is the issue timestamp (passed in for determinism/testing;
27
+ * the CLI supplies Date.now()).
28
+ */
29
+ export function signCodebook(repoRoot, cb, g, at) {
30
+ const proof = {
31
+ codebookHash: sha256Hex(canonicalizeCodebook(cb)),
32
+ corpusHash: cb.corpusHash,
33
+ entries: g.entries,
34
+ gauntletScore: g.score,
35
+ ratio: Number(g.ratio.toFixed(4)),
36
+ bytesOriginal: g.bytesOriginal,
37
+ bytesCompressed: g.bytesCompressed,
38
+ };
39
+ return issueReceipt(repoRoot, {
40
+ kind: "memory-capsule",
41
+ subject: `hydra-codebook:${cb.corpusHash.slice(0, 16)}`,
42
+ payload: proof,
43
+ includePayload: true,
44
+ issuedAt: at,
45
+ });
46
+ }
47
+ /**
48
+ * Verify a signed codebook OFFLINE: the Ed25519 signature must check out
49
+ * AND the receipt's embedded codebookHash must equal the hash of the
50
+ * codebook presented. Catches both forged receipts and codebook tampering.
51
+ */
52
+ export function verifyCodebook(receipt, cb) {
53
+ const v = verifyReceipt(receipt);
54
+ if (!v.valid)
55
+ return { valid: false, reason: v.reason ?? "invalid signature", bound: false };
56
+ const payload = receipt.payload;
57
+ if (!payload || typeof payload.codebookHash !== "string") {
58
+ return { valid: true, reason: "signature valid but no codebookHash payload to bind", bound: false };
59
+ }
60
+ const actual = sha256Hex(canonicalizeCodebook(cb));
61
+ if (payload.codebookHash !== actual) {
62
+ return { valid: true, reason: "signature valid but codebook does NOT match receipt (tampered/swapped)", bound: false };
63
+ }
64
+ if (payload.corpusHash !== cb.corpusHash) {
65
+ return { valid: true, reason: "signature valid but corpusHash mismatch", bound: false };
66
+ }
67
+ return { valid: true, reason: "signature valid and codebook bound to receipt", bound: true };
68
+ }
69
+ /**
70
+ * L8 — energy certificate: the one-time mine cost buys perpetual savings.
71
+ * Signed via NOTARY so the savings claim is itself verifiable, not boast.
72
+ */
73
+ export function mintEnergyCert(repoRoot, cb, g, at) {
74
+ const bytesSaved = g.bytesOriginal - g.bytesCompressed;
75
+ const receipt = issueReceipt(repoRoot, {
76
+ kind: "memory-capsule",
77
+ subject: `hydra-energy:${cb.corpusHash.slice(0, 16)}`,
78
+ payload: { corpusHash: cb.corpusHash, bytesSaved, ratio: Number(g.ratio.toFixed(4)), computedOnce: true },
79
+ includePayload: true,
80
+ issuedAt: at,
81
+ });
82
+ return { receipt, bytesSaved, ratio: g.ratio, perpetualSavingPerUse: bytesSaved };
83
+ }
84
+ //# sourceMappingURL=attest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attest.js","sourceRoot":"","sources":["../../src/hydra/attest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · L3 deterministic expansion engine + L4 lossless proof.
3
+ *
4
+ * HYDRA is NOT a "compressor" (the world has those — LLMLingua/LoPace/AWS
5
+ * Meta-Tokens). HYDRA is a SIGNED, DETERMINISTIC, PROVABLY-LOSSLESS,
6
+ * VENDOR-NEUTRAL context codebook that Mneme mines from its OWN corpus.
7
+ * The defensible gem is the CUT, not the carbon: L5 signed codebook (NOTARY)
8
+ * × L6 vendor-neutral-by-construction × L7 axiom-lattice binding — a
9
+ * combination prior-art research found UNFILLED.
10
+ *
11
+ * This file is the bedrock every other layer stands on: a substitution
12
+ * codec whose round-trip is BYTE-IDENTICAL by construction, and a proof
13
+ * (SHA-256 round-trip) that is a boolean — never "downstream accuracy
14
+ * stayed similar", always lossless=1.000 or fail. No lies.
15
+ *
16
+ * KEY DESIGN (different thinking):
17
+ * - Symbols live in the Unicode Private-Use Area (U+E000…), which never
18
+ * occurs in real manifests/code/docs. The marker pair is VERIFIED
19
+ * absent from the corpus AND every phrase, with deterministic fallback
20
+ * to the next candidate pair → collision is impossible, not unlikely.
21
+ * - Expansion is a single deterministic pass: phrases (raw corpus
22
+ * substrings) cannot contain markers, so no cascade, no ambiguity.
23
+ * - Pure functions. Same input → same bytes on every OS/arch (that IS
24
+ * the L6 vendor-neutral proof: the LLM never sees the codebook).
25
+ */
26
+ export interface CodebookEntry {
27
+ /** The private-use-area symbol that stands in for `phrase`. */
28
+ sym: string;
29
+ /** The raw corpus substring this symbol expands to. */
30
+ phrase: string;
31
+ /** Occurrences in the corpus at mining time (telemetry only). */
32
+ hits: number;
33
+ /** MDL gain in bytes this entry contributed (telemetry only). */
34
+ gain: number;
35
+ }
36
+ export interface Codebook {
37
+ v: 1;
38
+ /** Open marker (PUA char), verified absent from corpus + all phrases. */
39
+ open: string;
40
+ /** Close marker (PUA char), verified absent from corpus + all phrases. */
41
+ close: string;
42
+ /** Entries ordered LONGEST-phrase-first so greedy encode never splits a
43
+ * longer phrase by replacing a shorter sub-phrase first. */
44
+ entries: CodebookEntry[];
45
+ /** SHA-256 of the exact corpus this codebook was mined from. */
46
+ corpusHash: string;
47
+ }
48
+ export declare function sha256Hex(s: string): string;
49
+ /**
50
+ * Pick a marker pair guaranteed absent from `corpus` and every `phrase`.
51
+ * Deterministic: always returns the first clean candidate. Throws only if
52
+ * the (astronomically unlikely) corpus contains every PUA candidate.
53
+ */
54
+ export declare function chooseMarkers(corpus: string, phrases: string[]): readonly [string, string];
55
+ /** The deterministic symbol for entry index `i`. */
56
+ export declare function symbolFor(open: string, close: string, i: number): string;
57
+ /**
58
+ * L3 — COMPRESS. Replace each codebook phrase with its symbol, longest
59
+ * phrase first (the entries are pre-sorted). Pure + deterministic.
60
+ */
61
+ export declare function compress(text: string, cb: Codebook): string;
62
+ /**
63
+ * L3 — EXPAND (the Hydra head). Single deterministic pass: replace every
64
+ * symbol with its phrase. Because phrases are raw corpus substrings they
65
+ * cannot contain markers, so there is no cascade and the result is exact.
66
+ */
67
+ export declare function expand(encoded: string, cb: Codebook): string;
68
+ export interface LosslessProof {
69
+ /** True iff expand(compress(text)) is byte-identical to text. */
70
+ lossless: boolean;
71
+ originalHash: string;
72
+ roundTripHash: string;
73
+ originalBytes: number;
74
+ compressedBytes: number;
75
+ /** original / compressed (1.0 = no gain). */
76
+ ratio: number;
77
+ }
78
+ /**
79
+ * L4 — LOSSLESS PROOF. The boolean that cannot lie: a SHA-256 round-trip,
80
+ * not a similarity score. If `lossless` is ever false the codebook is
81
+ * REJECTED upstream — HYDRA never ships a codebook that loses a byte.
82
+ */
83
+ export declare function proveLossless(text: string, cb: Codebook): LosslessProof;
84
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/hydra/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,CAAC,CAAC;IACL,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd;iEAC6D;IAC7D,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAO1F;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAO3D;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAO5D;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,aAAa,CAevE"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * v2.96.0 — HYDRA · L3 deterministic expansion engine + L4 lossless proof.
3
+ *
4
+ * HYDRA is NOT a "compressor" (the world has those — LLMLingua/LoPace/AWS
5
+ * Meta-Tokens). HYDRA is a SIGNED, DETERMINISTIC, PROVABLY-LOSSLESS,
6
+ * VENDOR-NEUTRAL context codebook that Mneme mines from its OWN corpus.
7
+ * The defensible gem is the CUT, not the carbon: L5 signed codebook (NOTARY)
8
+ * × L6 vendor-neutral-by-construction × L7 axiom-lattice binding — a
9
+ * combination prior-art research found UNFILLED.
10
+ *
11
+ * This file is the bedrock every other layer stands on: a substitution
12
+ * codec whose round-trip is BYTE-IDENTICAL by construction, and a proof
13
+ * (SHA-256 round-trip) that is a boolean — never "downstream accuracy
14
+ * stayed similar", always lossless=1.000 or fail. No lies.
15
+ *
16
+ * KEY DESIGN (different thinking):
17
+ * - Symbols live in the Unicode Private-Use Area (U+E000…), which never
18
+ * occurs in real manifests/code/docs. The marker pair is VERIFIED
19
+ * absent from the corpus AND every phrase, with deterministic fallback
20
+ * to the next candidate pair → collision is impossible, not unlikely.
21
+ * - Expansion is a single deterministic pass: phrases (raw corpus
22
+ * substrings) cannot contain markers, so no cascade, no ambiguity.
23
+ * - Pure functions. Same input → same bytes on every OS/arch (that IS
24
+ * the L6 vendor-neutral proof: the LLM never sees the codebook).
25
+ */
26
+ import { createHash } from "node:crypto";
27
+ /** Candidate marker pairs, built from Private-Use-Area code points
28
+ * (U+E000…U+E00B) — these never occur in real manifests/code/docs.
29
+ * Built programmatically so the bytes are unambiguous in source. */
30
+ const MARKER_PAIRS = [
31
+ [String.fromCharCode(0xe000), String.fromCharCode(0xe001)],
32
+ [String.fromCharCode(0xe002), String.fromCharCode(0xe003)],
33
+ [String.fromCharCode(0xe004), String.fromCharCode(0xe005)],
34
+ [String.fromCharCode(0xe006), String.fromCharCode(0xe007)],
35
+ [String.fromCharCode(0xe008), String.fromCharCode(0xe009)],
36
+ [String.fromCharCode(0xe00a), String.fromCharCode(0xe00b)],
37
+ ];
38
+ export function sha256Hex(s) {
39
+ return createHash("sha256").update(s, "utf8").digest("hex");
40
+ }
41
+ /**
42
+ * Pick a marker pair guaranteed absent from `corpus` and every `phrase`.
43
+ * Deterministic: always returns the first clean candidate. Throws only if
44
+ * the (astronomically unlikely) corpus contains every PUA candidate.
45
+ */
46
+ export function chooseMarkers(corpus, phrases) {
47
+ for (const [o, c] of MARKER_PAIRS) {
48
+ if (corpus.includes(o) || corpus.includes(c))
49
+ continue;
50
+ if (phrases.some((p) => p.includes(o) || p.includes(c)))
51
+ continue;
52
+ return [o, c];
53
+ }
54
+ throw new Error("HYDRA: corpus exhausts all PUA marker candidates (impossible for real text)");
55
+ }
56
+ /** The deterministic symbol for entry index `i`. */
57
+ export function symbolFor(open, close, i) {
58
+ return open + i.toString(36) + close;
59
+ }
60
+ /**
61
+ * L3 — COMPRESS. Replace each codebook phrase with its symbol, longest
62
+ * phrase first (the entries are pre-sorted). Pure + deterministic.
63
+ */
64
+ export function compress(text, cb) {
65
+ let out = text;
66
+ for (const e of cb.entries) {
67
+ if (e.phrase.length === 0)
68
+ continue;
69
+ out = out.split(e.phrase).join(e.sym);
70
+ }
71
+ return out;
72
+ }
73
+ /**
74
+ * L3 — EXPAND (the Hydra head). Single deterministic pass: replace every
75
+ * symbol with its phrase. Because phrases are raw corpus substrings they
76
+ * cannot contain markers, so there is no cascade and the result is exact.
77
+ */
78
+ export function expand(encoded, cb) {
79
+ let out = encoded;
80
+ for (const e of cb.entries) {
81
+ if (e.phrase.length === 0)
82
+ continue;
83
+ out = out.split(e.sym).join(e.phrase);
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * L4 — LOSSLESS PROOF. The boolean that cannot lie: a SHA-256 round-trip,
89
+ * not a similarity score. If `lossless` is ever false the codebook is
90
+ * REJECTED upstream — HYDRA never ships a codebook that loses a byte.
91
+ */
92
+ export function proveLossless(text, cb) {
93
+ const encoded = compress(text, cb);
94
+ const restored = expand(encoded, cb);
95
+ const originalHash = sha256Hex(text);
96
+ const roundTripHash = sha256Hex(restored);
97
+ const originalBytes = Buffer.byteLength(text, "utf8");
98
+ const compressedBytes = Buffer.byteLength(encoded, "utf8");
99
+ return {
100
+ lossless: originalHash === roundTripHash,
101
+ originalHash,
102
+ roundTripHash,
103
+ originalBytes,
104
+ compressedBytes,
105
+ ratio: compressedBytes === 0 ? 1 : originalBytes / compressedBytes,
106
+ };
107
+ }
108
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/hydra/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hydra.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydra.test.d.ts","sourceRoot":"","sources":["../../src/hydra/hydra.test.ts"],"names":[],"mappings":""}