@mneme-ai/core 2.37.1 → 2.39.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 (44) hide show
  1. package/dist/agent_manifest.d.ts +1 -1
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +6 -0
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/bridge_phoenix/index.d.ts +60 -0
  6. package/dist/bridge_phoenix/index.d.ts.map +1 -0
  7. package/dist/bridge_phoenix/index.js +117 -0
  8. package/dist/bridge_phoenix/index.js.map +1 -0
  9. package/dist/honest_mirror/engine.d.ts.map +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +17 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/pulse.d.ts.map +1 -1
  15. package/dist/pulse.js +72 -2
  16. package/dist/pulse.js.map +1 -1
  17. package/dist/squadron/hyperbole_detector.d.ts.map +1 -1
  18. package/dist/squadron/hyperbole_detector.js +7 -3
  19. package/dist/squadron/hyperbole_detector.js.map +1 -1
  20. package/dist/zzzzz_probe/anti_entropy.d.ts +36 -0
  21. package/dist/zzzzz_probe/anti_entropy.d.ts.map +1 -0
  22. package/dist/zzzzz_probe/anti_entropy.js +147 -0
  23. package/dist/zzzzz_probe/anti_entropy.js.map +1 -0
  24. package/dist/zzzzz_probe/engine.d.ts +27 -0
  25. package/dist/zzzzz_probe/engine.d.ts.map +1 -0
  26. package/dist/zzzzz_probe/engine.js +203 -0
  27. package/dist/zzzzz_probe/engine.js.map +1 -0
  28. package/dist/zzzzz_probe/image_provenance.d.ts +34 -0
  29. package/dist/zzzzz_probe/image_provenance.d.ts.map +1 -0
  30. package/dist/zzzzz_probe/image_provenance.js +224 -0
  31. package/dist/zzzzz_probe/image_provenance.js.map +1 -0
  32. package/dist/zzzzz_probe/index.d.ts +22 -0
  33. package/dist/zzzzz_probe/index.d.ts.map +1 -0
  34. package/dist/zzzzz_probe/index.js +20 -0
  35. package/dist/zzzzz_probe/index.js.map +1 -0
  36. package/dist/zzzzz_probe/os_polygraph.d.ts +16 -0
  37. package/dist/zzzzz_probe/os_polygraph.d.ts.map +1 -0
  38. package/dist/zzzzz_probe/os_polygraph.js +43 -0
  39. package/dist/zzzzz_probe/os_polygraph.js.map +1 -0
  40. package/dist/zzzzz_probe/types.d.ts +101 -0
  41. package/dist/zzzzz_probe/types.d.ts.map +1 -0
  42. package/dist/zzzzz_probe/types.js +23 -0
  43. package/dist/zzzzz_probe/types.js.map +1 -0
  44. package/package.json +1 -1
@@ -0,0 +1,147 @@
1
+ /**
2
+ * v2.39.0 — Anti-Entropy text/code analyzer.
3
+ *
4
+ * 4 measurable signals AI-generated text leaks (well-cited in
5
+ * Mitchell et al. 2023 "DetectGPT" and academic AI-text-detection
6
+ * literature). No GPU, no ML model, pure deterministic math.
7
+ *
8
+ * 1. Shannon entropy bits/char — AI text often clusters near
9
+ * 4.0-4.5 bits/char (natural English ~3.9-4.7).
10
+ * 2. Repetition rate — dominant n-gram frequency. AI repeats.
11
+ * 3. Sentence-variance ratio — sigma/mean of sentence length.
12
+ * AI text often uniform (low ratio).
13
+ * 4. Zipf deviation — top-K word frequency vs Zipf's law (k/rank).
14
+ * AI text under-represents stop-word power-law tail.
15
+ *
16
+ * Each signal contributes to a composite `anomalyScore` in [0, 1].
17
+ */
18
+ // ── 1. Shannon entropy ────────────────────────────────────────────────
19
+ export function shannonBitsPerChar(text) {
20
+ if (text.length === 0)
21
+ return 0;
22
+ const counts = new Map();
23
+ for (const ch of text)
24
+ counts.set(ch, (counts.get(ch) ?? 0) + 1);
25
+ const total = text.length;
26
+ let h = 0;
27
+ for (const c of counts.values()) {
28
+ const p = c / total;
29
+ h -= p * Math.log2(p);
30
+ }
31
+ return h;
32
+ }
33
+ // ── 2. Repetition rate ────────────────────────────────────────────────
34
+ export function repetitionRate(text) {
35
+ const tokens = text.toLowerCase().split(/\s+/).filter(Boolean);
36
+ if (tokens.length === 0)
37
+ return 0;
38
+ const counts = new Map();
39
+ for (const t of tokens)
40
+ counts.set(t, (counts.get(t) ?? 0) + 1);
41
+ let maxCount = 0;
42
+ for (const c of counts.values())
43
+ if (c > maxCount)
44
+ maxCount = c;
45
+ return maxCount / tokens.length;
46
+ }
47
+ // ── 3. Sentence-length variance ratio ─────────────────────────────────
48
+ export function sentenceVarianceRatio(text) {
49
+ // Sentences = runs separated by . ! ? + whitespace.
50
+ const sentences = text.split(/(?<=[.!?])\s+/).filter((s) => s.trim().length > 0);
51
+ if (sentences.length < 2)
52
+ return 0;
53
+ const lengths = sentences.map((s) => s.length);
54
+ const mean = lengths.reduce((a, b) => a + b, 0) / lengths.length;
55
+ if (mean === 0)
56
+ return 0;
57
+ const variance = lengths.reduce((a, n) => a + (n - mean) ** 2, 0) / lengths.length;
58
+ const stddev = Math.sqrt(variance);
59
+ return stddev / mean;
60
+ }
61
+ // ── 4. Zipf deviation ─────────────────────────────────────────────────
62
+ export function zipfDeviation(text) {
63
+ const tokens = text.toLowerCase().match(/[a-z]+/g) ?? [];
64
+ if (tokens.length < 50)
65
+ return 0; // not enough sample
66
+ const counts = new Map();
67
+ for (const t of tokens)
68
+ counts.set(t, (counts.get(t) ?? 0) + 1);
69
+ const sorted = Array.from(counts.entries()).sort((a, b) => b[1] - a[1]).slice(0, 50);
70
+ if (sorted.length < 10)
71
+ return 0;
72
+ // Expected Zipf: freq(rank=r) ≈ freq(rank=1) / r
73
+ const top = sorted[0][1];
74
+ let deviationSum = 0;
75
+ let denom = 0;
76
+ for (let i = 1; i < sorted.length; i++) {
77
+ const expected = top / (i + 1);
78
+ const observed = sorted[i][1];
79
+ const ratio = observed / Math.max(1, expected);
80
+ // Penalty grows as ratio deviates from 1.0 (in EITHER direction).
81
+ deviationSum += Math.abs(Math.log(ratio));
82
+ denom++;
83
+ }
84
+ return denom === 0 ? 0 : deviationSum / denom;
85
+ }
86
+ // ── Composite ─────────────────────────────────────────────────────────
87
+ /**
88
+ * Compute all 4 metrics + composite anomalyScore.
89
+ *
90
+ * Each signal is normalized to [0, 1] via these heuristics:
91
+ * - Shannon: distance from natural-English range 3.9-4.7 bits/char
92
+ * - Repetition: rate * 4 clamped (0.25 = 1.0 anomaly)
93
+ * - Variance: distance from natural 0.3-0.6 range
94
+ * - Zipf: deviation > 1.5 = 1.0 anomaly
95
+ *
96
+ * Composite = mean of 4 individual scores. > 0.55 = REFUTED;
97
+ * > 0.40 = PROBE_DRIFT; ≤ 0.40 = CRYSTAL_CLEAR.
98
+ */
99
+ export function analyzeText(text) {
100
+ const shannon = shannonBitsPerChar(text);
101
+ const rep = repetitionRate(text);
102
+ const sentVar = sentenceVarianceRatio(text);
103
+ const zipf = zipfDeviation(text);
104
+ // Normalize each to [0, 1] anomaly contribution.
105
+ const shannonAnomaly = (() => {
106
+ if (text.length < 20)
107
+ return 0;
108
+ // Natural English is 3.9-4.7 bits/char. Distance outside this range = anomaly.
109
+ if (shannon >= 3.9 && shannon <= 4.7)
110
+ return 0;
111
+ if (shannon < 3.9)
112
+ return Math.min(1, (3.9 - shannon) / 2);
113
+ return Math.min(1, (shannon - 4.7) / 2);
114
+ })();
115
+ // Natural English has 15-20% dominant-token rate (the / a / of /
116
+ // and). Suspicious starts above 30%. Floor at 0.20 (no signal); ramp
117
+ // linearly to 1.0 at rep=1.0 (a single token = 100% of text).
118
+ const repAnomaly = Math.max(0, Math.min(1, (rep - 0.20) * 1.25));
119
+ const variAnomaly = (() => {
120
+ if (sentVar === 0)
121
+ return 0;
122
+ // Natural prose tends to 0.3-0.7 ratio. AI tends to be lower (uniform).
123
+ if (sentVar >= 0.3 && sentVar <= 0.7)
124
+ return 0;
125
+ if (sentVar < 0.3)
126
+ return Math.min(1, (0.3 - sentVar) / 0.3);
127
+ return Math.min(1, (sentVar - 0.7) / 0.7);
128
+ })();
129
+ const zipfAnomaly = Math.min(1, zipf / 1.5);
130
+ // Composite: average of the 4 signals, BUT if any single signal is
131
+ // maxed, boost the composite so a single-axis red flag still drives
132
+ // a refute. Otherwise high-repetition AI loops would land at composite
133
+ // 0.30 because the other 3 signals were quiet. Real AI hallucinations
134
+ // often light up just ONE axis hard — that signal alone should refute.
135
+ const plainComposite = (shannonAnomaly + repAnomaly + variAnomaly + zipfAnomaly) / 4;
136
+ const maxSingle = Math.max(shannonAnomaly, repAnomaly, variAnomaly, zipfAnomaly);
137
+ const composite = Math.max(plainComposite, maxSingle * 0.7);
138
+ return {
139
+ shannonBitsPerChar: round3(shannon),
140
+ repetitionRate: round3(rep),
141
+ sentenceVarianceRatio: round3(sentVar),
142
+ zipfDeviation: round3(zipf),
143
+ anomalyScore: round3(composite),
144
+ };
145
+ }
146
+ function round3(n) { return Number(n.toFixed(3)); }
147
+ //# sourceMappingURL=anti_entropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti_entropy.js","sourceRoot":"","sources":["../../src/zzzzz_probe/anti_entropy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * v2.39.0 — Zzzzz-PROBE orchestrator.
3
+ *
4
+ * Fuses anti-entropy + image-provenance + OS-polygraph signals into a
5
+ * single HMAC-signed ZzzzzReport. Composes with HGP: REFUTED /
6
+ * IMPOSSIBLE_REFUTE auto-emits an HGP-YYYY-NNNNN id (best-effort,
7
+ * lazy import to avoid cycles).
8
+ */
9
+ import type { ProbeInput, ZzzzzReport } from "./types.js";
10
+ export declare function __resetZzzzzChainForTest(): void;
11
+ export declare function probeArtifact(input: ProbeInput, repoRoot: string): Promise<ZzzzzReport>;
12
+ export declare function readLedger(repoRoot: string, limit?: number): ZzzzzReport[];
13
+ export declare function verifyReport(r: ZzzzzReport, prev?: string): {
14
+ ok: true;
15
+ } | {
16
+ ok: false;
17
+ reason: string;
18
+ };
19
+ export interface ArmState {
20
+ armed: boolean;
21
+ at: string;
22
+ reason?: string;
23
+ }
24
+ export declare function arm(repoRoot: string, reason?: string): ArmState;
25
+ export declare function disarm(repoRoot: string): ArmState;
26
+ export declare function isArmed(repoRoot: string): boolean;
27
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/zzzzz_probe/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAQxE,wBAAgB,wBAAwB,IAAI,IAAI,CAAgC;AA0BhF,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuE7F;AAqBD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,WAAW,EAAE,CAUvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,GAAE,MAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQpH;AAKD,MAAM,WAAW,QAAQ;IAAG,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAAE;AAE1E,wBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAK/D;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAKjD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASjD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * v2.39.0 — Zzzzz-PROBE orchestrator.
3
+ *
4
+ * Fuses anti-entropy + image-provenance + OS-polygraph signals into a
5
+ * single HMAC-signed ZzzzzReport. Composes with HGP: REFUTED /
6
+ * IMPOSSIBLE_REFUTE auto-emits an HGP-YYYY-NNNNN id (best-effort,
7
+ * lazy import to avoid cycles).
8
+ */
9
+ import { createHash, createHmac } from "node:crypto";
10
+ import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { analyzeText } from "./anti_entropy.js";
13
+ import { analyzeImage } from "./image_provenance.js";
14
+ import { classifyOS } from "./os_polygraph.js";
15
+ const HMAC_KEY = process.env["MNEME_ZZZZZ_KEY"] ?? "mneme-zzzzz-probe-v1";
16
+ const CHAIN_SEED = "0".repeat(64);
17
+ let lastChainLink = CHAIN_SEED;
18
+ export function __resetZzzzzChainForTest() { lastChainLink = CHAIN_SEED; }
19
+ function canon(v) {
20
+ if (v === null || typeof v !== "object")
21
+ return JSON.stringify(v);
22
+ if (Array.isArray(v))
23
+ return "[" + v.map(canon).join(",") + "]";
24
+ const keys = Object.keys(v).sort();
25
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
26
+ }
27
+ function sha(s) { return createHash("sha256").update(s).digest("hex"); }
28
+ function hmacOf(prev, payload) {
29
+ return createHmac("sha256", HMAC_KEY).update(prev + "|" + payload).digest("hex");
30
+ }
31
+ function classifyVerdict(score) {
32
+ // Honest threshold ladder (calibrated for false-positive avoidance on
33
+ // short text + natural images):
34
+ // < 0.40 → CRYSTAL_CLEAR (no signal)
35
+ // < 0.55 → PROBE_DRIFT (warn but don't refute)
36
+ // < 0.75 → REFUTED (clear anomaly)
37
+ // ≥ 0.75 → IMPOSSIBLE_REFUTE (multi-axis stack — auto-HGP)
38
+ if (score >= 0.75)
39
+ return { verdict: "IMPOSSIBLE_REFUTE", confidence: 0.95 };
40
+ if (score >= 0.55)
41
+ return { verdict: "REFUTED", confidence: 0.80 };
42
+ if (score >= 0.40)
43
+ return { verdict: "PROBE_DRIFT", confidence: 0.60 };
44
+ return { verdict: "CRYSTAL_CLEAR", confidence: 0.95 };
45
+ }
46
+ export async function probeArtifact(input, repoRoot) {
47
+ const at = new Date().toISOString();
48
+ const os = await classifyOS();
49
+ const caveats = [];
50
+ let score = 0;
51
+ let textMetrics;
52
+ let imageProvenance;
53
+ if (input.modality === "text" || input.modality === "code") {
54
+ if (!input.text) {
55
+ caveats.push("ZZZZZ_EMPTY_TEXT");
56
+ }
57
+ else {
58
+ textMetrics = analyzeText(input.text);
59
+ score = textMetrics.anomalyScore;
60
+ if (textMetrics.anomalyScore >= 0.40)
61
+ caveats.push(`ZZZZZ_TEXT_ANOMALY:${textMetrics.anomalyScore}`);
62
+ }
63
+ }
64
+ else if (input.modality === "image") {
65
+ if (!input.imageBytes || input.imageBytes.length === 0) {
66
+ caveats.push("ZZZZZ_EMPTY_IMAGE");
67
+ }
68
+ else {
69
+ imageProvenance = analyzeImage(input.imageBytes);
70
+ score = imageProvenance.suspicionScore;
71
+ if (imageProvenance.suspicionScore >= 0.40)
72
+ caveats.push(`ZZZZZ_IMAGE_SUSPICION:${imageProvenance.suspicionScore}`);
73
+ }
74
+ }
75
+ const { verdict, confidence } = classifyVerdict(score);
76
+ const headline = verdictHeadline(verdict, score, input.modality);
77
+ // Best-effort HGP auto-record for REFUTED / IMPOSSIBLE_REFUTE.
78
+ let hgpId;
79
+ if (verdict === "REFUTED" || verdict === "IMPOSSIBLE_REFUTE") {
80
+ try {
81
+ // Lazy import to avoid cycle (hgp imports nothing from us).
82
+ const hgp = await import("../hgp/index.js");
83
+ const claimSummary = input.modality === "image"
84
+ ? `IMAGE_SUSPICION:${imageProvenance?.suspicionScore} pHash=${imageProvenance?.pHash} format=${imageProvenance?.format}`
85
+ : `TEXT_ANOMALY:${textMetrics?.anomalyScore} shannon=${textMetrics?.shannonBitsPerChar} rep=${textMetrics?.repetitionRate}`;
86
+ const record = hgp.recordHallucination(repoRoot, {
87
+ claim: claimSummary,
88
+ signature: `zzzzz_probe:${input.modality}:${verdict}`,
89
+ ...(input.vendor ? { vendor: input.vendor } : {}),
90
+ });
91
+ hgpId = record.hgpId;
92
+ }
93
+ catch { /* HGP unavailable — degrade gracefully */ }
94
+ }
95
+ const body = {
96
+ spec: { name: "MNEME-ZZZZZ-PROBE", version: "1.0" },
97
+ modality: input.modality,
98
+ verdict,
99
+ confidence,
100
+ headline,
101
+ ...(textMetrics ? { textMetrics } : {}),
102
+ ...(imageProvenance ? { imageProvenance } : {}),
103
+ os,
104
+ caveats,
105
+ ...(hgpId ? { hgpId } : {}),
106
+ at,
107
+ };
108
+ const bodyDigest = sha(canon(body));
109
+ lastChainLink = hmacOf(lastChainLink, bodyDigest);
110
+ const report = {
111
+ ...body,
112
+ hmac: lastChainLink,
113
+ seq: parseInt(lastChainLink.slice(0, 8), 16),
114
+ bodyDigest,
115
+ };
116
+ try {
117
+ persistReport(repoRoot, report);
118
+ }
119
+ catch { /* best-effort */ }
120
+ return report;
121
+ }
122
+ function verdictHeadline(v, score, modality) {
123
+ if (v === "CRYSTAL_CLEAR")
124
+ return `💎 CRYSTAL_CLEAR — ${modality} passes Zzzzz-PROBE (score ${(score * 100).toFixed(0)}%)`;
125
+ if (v === "PROBE_DRIFT")
126
+ return `🟡 PROBE_DRIFT — ${modality} shows mild anomaly (score ${(score * 100).toFixed(0)}%); not refuted but worth a second look`;
127
+ if (v === "REFUTED")
128
+ return `🔴 REFUTED — ${modality} shows clear AI-generation signal (score ${(score * 100).toFixed(0)}%)`;
129
+ return `💥 IMPOSSIBLE_REFUTE — ${modality} multi-axis anomaly stack (score ${(score * 100).toFixed(0)}%); HGP-ID auto-issued`;
130
+ }
131
+ // ── Persistence ───────────────────────────────────────────────────────
132
+ function dirOf(repoRoot) {
133
+ const d = join(repoRoot, ".mneme", "zzzzz_probe");
134
+ if (!existsSync(d))
135
+ mkdirSync(d, { recursive: true });
136
+ return d;
137
+ }
138
+ function persistReport(repoRoot, r) {
139
+ appendFileSync(join(dirOf(repoRoot), "ledger.jsonl"), JSON.stringify(r) + "\n");
140
+ }
141
+ export function readLedger(repoRoot, limit = 100) {
142
+ const p = join(dirOf(repoRoot), "ledger.jsonl");
143
+ if (!existsSync(p))
144
+ return [];
145
+ try {
146
+ const out = [];
147
+ for (const ln of readFileSync(p, "utf8").split("\n").filter(Boolean).slice(-limit)) {
148
+ try {
149
+ out.push(JSON.parse(ln));
150
+ }
151
+ catch { /* skip */ }
152
+ }
153
+ return out;
154
+ }
155
+ catch {
156
+ return [];
157
+ }
158
+ }
159
+ export function verifyReport(r, prev = CHAIN_SEED) {
160
+ const { hmac, seq: _s, bodyDigest, ...body } = r;
161
+ void _s;
162
+ const recomputed = sha(canon(body));
163
+ if (recomputed !== bodyDigest)
164
+ return { ok: false, reason: "bodyDigest mismatch" };
165
+ const expected = hmacOf(prev, recomputed);
166
+ if (expected !== hmac)
167
+ return { ok: false, reason: "hmac mismatch" };
168
+ return { ok: true };
169
+ }
170
+ export function arm(repoRoot, reason) {
171
+ const state = { armed: true, at: new Date().toISOString(), ...(reason ? { reason } : {}) };
172
+ const p = join(dirOf(repoRoot), "armed.json");
173
+ try {
174
+ appendFileSync(p, JSON.stringify(state) + "\n");
175
+ }
176
+ catch { /* best-effort */ }
177
+ return state;
178
+ }
179
+ export function disarm(repoRoot) {
180
+ const state = { armed: false, at: new Date().toISOString() };
181
+ const p = join(dirOf(repoRoot), "armed.json");
182
+ try {
183
+ appendFileSync(p, JSON.stringify(state) + "\n");
184
+ }
185
+ catch { /* best-effort */ }
186
+ return state;
187
+ }
188
+ export function isArmed(repoRoot) {
189
+ const p = join(dirOf(repoRoot), "armed.json");
190
+ if (!existsSync(p))
191
+ return false;
192
+ try {
193
+ const lines = readFileSync(p, "utf8").split("\n").filter(Boolean);
194
+ if (lines.length === 0)
195
+ return false;
196
+ const last = JSON.parse(lines[lines.length - 1]);
197
+ return !!last.armed;
198
+ }
199
+ catch {
200
+ return false;
201
+ }
202
+ }
203
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/zzzzz_probe/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * v2.39.0 — Multi-Modal Image Provenance.
3
+ *
4
+ * Frequency-domain + perceptual signals for AI-generated image
5
+ * detection. No GPU, no ML model, no native deps — pure-Node.
6
+ *
7
+ * Signals (academically cited):
8
+ * 1. pHash (DCT-like 8x8 perceptual hash) for duplicate detection
9
+ * 2. Laplacian variance — AI images often unnaturally smooth (low var)
10
+ * 3. Color-histogram entropy — AI images cluster in narrow palettes
11
+ * 4. JPEG quantization-table fingerprint — distinct table per encoder
12
+ * 5. Distinct color count in 32×32 downsample — extra clustering signal
13
+ *
14
+ * Format detection via magic bytes (JPEG/PNG/WebP/GIF/BMP).
15
+ * Honest scope: we read SIZE + PIXEL DATA where format is supported
16
+ * (decoder-free for BMP/PNG; for JPEG/WebP/GIF we extract metadata
17
+ * + quantization tables but skip per-pixel decode — the heuristics
18
+ * still work on the header signals + downsampled pixel approximation).
19
+ */
20
+ import type { ImageProvenance } from "./types.js";
21
+ type Format = "jpeg" | "png" | "webp" | "gif" | "bmp" | "unknown";
22
+ export declare function detectFormat(b: Uint8Array): Format;
23
+ export declare function parseDimensions(b: Uint8Array, fmt: Format): {
24
+ width: number;
25
+ height: number;
26
+ };
27
+ export declare function perceptualHash(b: Uint8Array): string;
28
+ export declare function colorHistogramEntropy(b: Uint8Array): number;
29
+ export declare function laplacianVariance(b: Uint8Array): number;
30
+ export declare function distinctColorCount32(b: Uint8Array): number;
31
+ export declare function jpegQuantFingerprint(b: Uint8Array): string | null;
32
+ export declare function analyzeImage(b: Uint8Array): ImageProvenance;
33
+ export {};
34
+ //# sourceMappingURL=image_provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image_provenance.d.ts","sourceRoot":"","sources":["../../src/zzzzz_probe/image_provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AAIlE,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAclD;AAID,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgD7F;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAUpD;AAID,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAoB3D;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAWvD;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAU1D;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAkBjE;AAID,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,eAAe,CAgC3D"}