@mneme-ai/core 2.70.0 → 2.72.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 (33) hide show
  1. package/dist/protoplasm/super_quan/cull.d.ts +70 -0
  2. package/dist/protoplasm/super_quan/cull.d.ts.map +1 -0
  3. package/dist/protoplasm/super_quan/cull.js +218 -0
  4. package/dist/protoplasm/super_quan/cull.js.map +1 -0
  5. package/dist/protoplasm/super_quan/guards.test.d.ts +7 -0
  6. package/dist/protoplasm/super_quan/guards.test.d.ts.map +1 -0
  7. package/dist/protoplasm/super_quan/guards.test.js +142 -0
  8. package/dist/protoplasm/super_quan/guards.test.js.map +1 -0
  9. package/dist/protoplasm/super_quan/homograph_guard.d.ts +47 -0
  10. package/dist/protoplasm/super_quan/homograph_guard.d.ts.map +1 -0
  11. package/dist/protoplasm/super_quan/homograph_guard.js +210 -0
  12. package/dist/protoplasm/super_quan/homograph_guard.js.map +1 -0
  13. package/dist/protoplasm/super_quan/index.d.ts +10 -0
  14. package/dist/protoplasm/super_quan/index.d.ts.map +1 -1
  15. package/dist/protoplasm/super_quan/index.js +10 -0
  16. package/dist/protoplasm/super_quan/index.js.map +1 -1
  17. package/dist/protoplasm/super_quan/input_size_guard.d.ts +58 -0
  18. package/dist/protoplasm/super_quan/input_size_guard.d.ts.map +1 -0
  19. package/dist/protoplasm/super_quan/input_size_guard.js +102 -0
  20. package/dist/protoplasm/super_quan/input_size_guard.js.map +1 -0
  21. package/dist/protoplasm/super_quan/prism.d.ts +50 -0
  22. package/dist/protoplasm/super_quan/prism.d.ts.map +1 -0
  23. package/dist/protoplasm/super_quan/prism.js +231 -0
  24. package/dist/protoplasm/super_quan/prism.js.map +1 -0
  25. package/dist/protoplasm/super_quan/tide_guard.d.ts +71 -0
  26. package/dist/protoplasm/super_quan/tide_guard.d.ts.map +1 -0
  27. package/dist/protoplasm/super_quan/tide_guard.js +135 -0
  28. package/dist/protoplasm/super_quan/tide_guard.js.map +1 -0
  29. package/dist/protoplasm/super_quan/vulns2.test.d.ts +6 -0
  30. package/dist/protoplasm/super_quan/vulns2.test.d.ts.map +1 -0
  31. package/dist/protoplasm/super_quan/vulns2.test.js +164 -0
  32. package/dist/protoplasm/super_quan/vulns2.test.js.map +1 -0
  33. package/package.json +1 -1
@@ -0,0 +1,210 @@
1
+ /**
2
+ * 🛡 HOMOGRAPH GUARD — Unicode normalization + confusable detection
3
+ *
4
+ * Closes the v2.70 vuln: "٢.70.0" (Arabic-Indic digit) passed as MIXED
5
+ * instead of REFUTED → attacker bypassed version check by spelling the
6
+ * digit in a non-ASCII script.
7
+ *
8
+ * Solution stacks 4 lenses:
9
+ * 1. NFKC normalize → canonicalizes compatibility forms
10
+ * 2. Digit transliterate → maps all Unicode digits → ASCII 0-9
11
+ * 3. Confusable scan → flags homoglyph attempts (UTS #39 subset)
12
+ * 4. Pipeline annotation → caller knows input was canonicalized
13
+ *
14
+ * API:
15
+ * canonicalize(input) → { canonical, original, flags, transformations }
16
+ *
17
+ * Output flags drive verdict:
18
+ * "homograph_detected" → version claim has non-ASCII digits
19
+ * "mixed_script" → claim mixes script families (suspicious)
20
+ * "rtl_override" → contains BIDI override (U+202E)
21
+ * "control_char_injected" → contains null / BEL / BS / etc.
22
+ * "zwsp_injected" → zero-width space / joiner
23
+ *
24
+ * No external Unicode tables — uses Node's built-in normalize() + a
25
+ * small curated confusable map.
26
+ */
27
+ /** Per UTS #39 — common confusables. Extend over time. */
28
+ const CONFUSABLE_MAP = {
29
+ // Cyrillic → Latin (most common attack vector)
30
+ "а": "a", "е": "e", "о": "o", "р": "p", "с": "c", "у": "y", "х": "x",
31
+ "А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O",
32
+ "Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X",
33
+ // Greek → Latin
34
+ "α": "a", "β": "b", "ο": "o", "ρ": "p", "ν": "v", "Α": "A", "Β": "B",
35
+ // Cherokee letter A (very deceptive)
36
+ "Ꭺ": "A",
37
+ // Math alphanumerics
38
+ "𝟎": "0", "𝟏": "1", "𝟐": "2", "𝟑": "3", "𝟒": "4",
39
+ "𝟓": "5", "𝟔": "6", "𝟕": "7", "𝟖": "8", "𝟗": "9",
40
+ };
41
+ /** Map ALL Unicode digit code points to ASCII via Unicode digit value. */
42
+ function transliterateDigits(s) {
43
+ let changed = 0;
44
+ const out = Array.from(s, (ch) => {
45
+ const cp = ch.codePointAt(0);
46
+ // Latin ASCII already
47
+ if (cp >= 0x30 && cp <= 0x39)
48
+ return ch;
49
+ // Arabic-Indic 0660-0669
50
+ if (cp >= 0x0660 && cp <= 0x0669) {
51
+ changed++;
52
+ return String.fromCharCode(0x30 + (cp - 0x0660));
53
+ }
54
+ // Extended Arabic-Indic 06F0-06F9
55
+ if (cp >= 0x06F0 && cp <= 0x06F9) {
56
+ changed++;
57
+ return String.fromCharCode(0x30 + (cp - 0x06F0));
58
+ }
59
+ // Bengali 09E6-09EF
60
+ if (cp >= 0x09E6 && cp <= 0x09EF) {
61
+ changed++;
62
+ return String.fromCharCode(0x30 + (cp - 0x09E6));
63
+ }
64
+ // Devanagari 0966-096F
65
+ if (cp >= 0x0966 && cp <= 0x096F) {
66
+ changed++;
67
+ return String.fromCharCode(0x30 + (cp - 0x0966));
68
+ }
69
+ // Thai 0E50-0E59
70
+ if (cp >= 0x0E50 && cp <= 0x0E59) {
71
+ changed++;
72
+ return String.fromCharCode(0x30 + (cp - 0x0E50));
73
+ }
74
+ // Lao 0ED0-0ED9
75
+ if (cp >= 0x0ED0 && cp <= 0x0ED9) {
76
+ changed++;
77
+ return String.fromCharCode(0x30 + (cp - 0x0ED0));
78
+ }
79
+ // Burmese 1040-1049
80
+ if (cp >= 0x1040 && cp <= 0x1049) {
81
+ changed++;
82
+ return String.fromCharCode(0x30 + (cp - 0x1040));
83
+ }
84
+ // Khmer 17E0-17E9
85
+ if (cp >= 0x17E0 && cp <= 0x17E9) {
86
+ changed++;
87
+ return String.fromCharCode(0x30 + (cp - 0x17E0));
88
+ }
89
+ // Fullwidth FF10-FF19
90
+ if (cp >= 0xFF10 && cp <= 0xFF19) {
91
+ changed++;
92
+ return String.fromCharCode(0x30 + (cp - 0xFF10));
93
+ }
94
+ // Mathematical bold/italic digits 1D7CE-1D7FF
95
+ if (cp >= 0x1D7CE && cp <= 0x1D7FF) {
96
+ changed++;
97
+ return String.fromCharCode(0x30 + ((cp - 0x1D7CE) % 10));
98
+ }
99
+ return ch;
100
+ }).join("");
101
+ return { out, changedCount: changed };
102
+ }
103
+ function detectScripts(s) {
104
+ const scripts = new Set();
105
+ for (const ch of s) {
106
+ const cp = ch.codePointAt(0);
107
+ if (cp >= 0x0041 && cp <= 0x024F)
108
+ scripts.add("Latin");
109
+ else if (cp >= 0x0400 && cp <= 0x04FF)
110
+ scripts.add("Cyrillic");
111
+ else if (cp >= 0x0370 && cp <= 0x03FF)
112
+ scripts.add("Greek");
113
+ else if (cp >= 0x0590 && cp <= 0x05FF)
114
+ scripts.add("Hebrew");
115
+ else if (cp >= 0x0600 && cp <= 0x06FF)
116
+ scripts.add("Arabic");
117
+ else if (cp >= 0x0E00 && cp <= 0x0E7F)
118
+ scripts.add("Thai");
119
+ else if (cp >= 0x0900 && cp <= 0x097F)
120
+ scripts.add("Devanagari");
121
+ else if (cp >= 0x4E00 && cp <= 0x9FFF)
122
+ scripts.add("CJK");
123
+ }
124
+ return scripts;
125
+ }
126
+ const RTL_OVERRIDE_RE = /[‪-‮⁦-⁩]/g;
127
+ const ZWSP_RE = /[​-‍]/g;
128
+ const CONTROL_RE = /[\x00-\x08\x0B-\x0C\x0E-\x1F]/g;
129
+ const NON_ASCII_DIGIT_RE = /[٠-٩۰-۹߀-߉०-९০-৯੦-੯૦-૯୦-୯௦-௯౦-౯೦-೯൦-൯෦-෯๐-๙໐-໙༠-༩၀-၉႐-႙០-៩᠐-᠙᥆-᥏᧐-᧙᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙꘠-꘩꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9]/g;
130
+ export function canonicalize(input) {
131
+ const flags = [];
132
+ const transformations = [];
133
+ let working = input;
134
+ // Pre-detect: did the input contain ANY non-ASCII Unicode digit?
135
+ // (Catches fullwidth 2 which NFKC normalizes BEFORE our transliterator runs.)
136
+ const preNonAsciiDigitMatches = input.match(NON_ASCII_DIGIT_RE);
137
+ const preNonAsciiDigitCount = preNonAsciiDigitMatches ? preNonAsciiDigitMatches.length : 0;
138
+ // Stage 0: detect control chars BEFORE stripping (alert + strip)
139
+ if (CONTROL_RE.test(working)) {
140
+ flags.push("control_char_injected");
141
+ working = working.replace(CONTROL_RE, "");
142
+ transformations.push("stripped control chars (0x00-0x1F except tab/LF/CR)");
143
+ }
144
+ if (RTL_OVERRIDE_RE.test(working)) {
145
+ flags.push("rtl_override");
146
+ working = working.replace(RTL_OVERRIDE_RE, "");
147
+ transformations.push("stripped BIDI override (U+202A-202E + 2066-2069)");
148
+ }
149
+ if (ZWSP_RE.test(working)) {
150
+ flags.push("zwsp_injected");
151
+ working = working.replace(ZWSP_RE, "");
152
+ transformations.push("stripped zero-width chars (U+200B-200D + FEFF)");
153
+ }
154
+ // Stage 1: NFKC — canonicalize compatibility forms
155
+ const beforeNfkc = working;
156
+ working = working.normalize("NFKC");
157
+ if (beforeNfkc !== working) {
158
+ transformations.push("NFKC normalize");
159
+ }
160
+ // Stage 2: Digit transliteration (Arabic-Indic / Bengali / Thai / fullwidth / math)
161
+ const dt = transliterateDigits(working);
162
+ working = dt.out;
163
+ // Count: explicit transliteration + NFKC-induced non-ASCII digit changes
164
+ const totalDigitsChanged = dt.changedCount + Math.max(0, preNonAsciiDigitCount - dt.changedCount);
165
+ if (totalDigitsChanged > 0) {
166
+ flags.push("homograph_detected");
167
+ transformations.push(`transliterated ${totalDigitsChanged} non-Latin digit(s) to ASCII (NFKC + direct map)`);
168
+ }
169
+ // Stage 3: Confusable letter replacement
170
+ let confusables = 0;
171
+ working = Array.from(working, (ch) => {
172
+ if (CONFUSABLE_MAP[ch] !== undefined) {
173
+ confusables++;
174
+ return CONFUSABLE_MAP[ch];
175
+ }
176
+ return ch;
177
+ }).join("");
178
+ if (confusables > 0) {
179
+ flags.push("homograph_detected");
180
+ transformations.push(`replaced ${confusables} confusable letter(s) with ASCII equivalent`);
181
+ }
182
+ // Stage 4: mixed-script detection (only flag if NOT already Latin-only after canonicalization)
183
+ const scripts = detectScripts(working);
184
+ if (scripts.size > 1 && scripts.has("Latin")) {
185
+ flags.push("mixed_script");
186
+ transformations.push(`mixed scripts detected: ${[...scripts].join("+")}`);
187
+ }
188
+ return {
189
+ original: input,
190
+ canonical: working,
191
+ flags: [...new Set(flags)],
192
+ transformations,
193
+ confusablesReplaced: confusables,
194
+ digitsTransliterated: totalDigitsChanged,
195
+ };
196
+ }
197
+ /**
198
+ * Convenience: given a claim, return whether it's safe to verify as-is
199
+ * or needs caller to re-verify on the canonical form.
200
+ *
201
+ * Caller should:
202
+ * const c = canonicalize(input);
203
+ * if (c.flags.includes("homograph_detected")) {
204
+ * // verify on c.canonical instead — annotate verdict with c.flags
205
+ * }
206
+ */
207
+ export function shouldReVerify(result) {
208
+ return result.flags.length > 0 && result.original !== result.canonical;
209
+ }
210
+ //# sourceMappingURL=homograph_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homograph_guard.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/homograph_guard.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,14 @@ export { computeChshWitness, defaultScoreExtractor, instantiateProbes, probeSeed
17
17
  export type { ProbeKind, ProbeQuestion, ProbeResponse, ChshWitnessVerdict, ChshInput, } from "./chsh_witness.js";
18
18
  export { runStrs, strsBadgeUrl, STRS_PROBE_SET_V1 } from "./strs.js";
19
19
  export type { StrsProbe, StrsRunResult, StrsReport, StrsRunOptions, VerifyFn } from "./strs.js";
20
+ export { canonicalize, shouldReVerify } from "./homograph_guard.js";
21
+ export type { CanonicalizeResult } from "./homograph_guard.js";
22
+ export { checkInputSize, emitEnvelope, detectInputSource } from "./input_size_guard.js";
23
+ export type { SizeCheckResult, InputSource, CheckInputSizeOptions } from "./input_size_guard.js";
24
+ export { runPrism, lensFakeAuthority, lensFakeCommit, lensStatisticalReality, lensMagicNumber, lensNullInformation, } from "./prism.js";
25
+ export type { PrismResult, PrismVerdict, LensResult, FakeCommitOptions } from "./prism.js";
26
+ export { TideGuard, DEFAULT_TIDE } from "./tide_guard.js";
27
+ export type { TideGuardConfig, TideRequest, TideDecision } from "./tide_guard.js";
28
+ export { Cull, DEFAULT_CULL } from "./cull.js";
29
+ export type { CullConfig, CullHeartbeat, CullReport, CullPolicy } from "./cull.js";
20
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAAE,cAAc,EAAE,UAAU,GAC/C,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,GACvE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAAE,cAAc,EAAE,UAAU,GAC/C,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,GACvE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGhG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjG,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EACnE,eAAe,EAAE,mBAAmB,GACrC,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG3F,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -17,4 +17,14 @@ export { Negspace } from "./negspace.js";
17
17
  export { computeChshWitness, defaultScoreExtractor, instantiateProbes, probeSeed, CANONICAL_PROBES, } from "./chsh_witness.js";
18
18
  // 4. STRS
19
19
  export { runStrs, strsBadgeUrl, STRS_PROBE_SET_V1 } from "./strs.js";
20
+ // 5. HOMOGRAPH GUARD — closes v2.70 vuln #1 (Unicode bypass)
21
+ export { canonicalize, shouldReVerify } from "./homograph_guard.js";
22
+ // 6. INPUT SIZE GUARD — closes v2.70 vuln #2 (silent 28K reject)
23
+ export { checkInputSize, emitEnvelope, detectInputSource } from "./input_size_guard.js";
24
+ // 7. PRISM — closes v2.70 vuln #3 (multi-lens scope narrow → 86% claims got 0 lenses)
25
+ export { runPrism, lensFakeAuthority, lensFakeCommit, lensStatisticalReality, lensMagicNumber, lensNullInformation, } from "./prism.js";
26
+ // 8. TIDE GUARD — closes v2.70 vuln #1 (rate limit removed regression)
27
+ export { TideGuard, DEFAULT_TIDE } from "./tide_guard.js";
28
+ // 9. CULL — closes v2.70 vuln #4 (process leak — 6 procs per session)
29
+ export { Cull, DEFAULT_CULL } from "./cull.js";
20
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAK1B,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAK3B,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAK1B,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAK3B,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGrE,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGpE,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,sFAAsF;AACtF,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EACnE,eAAe,EAAE,mBAAmB,GACrC,MAAM,YAAY,CAAC;AAGpB,uEAAuE;AACvE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG1D,sEAAsE;AACtE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 🛡 INPUT SIZE GUARD — fail-loud envelope + truncation receipt
3
+ *
4
+ * Closes the v2.70 vuln: 28K char input → exit 1, 0 bytes, no warning.
5
+ *
6
+ * Strategy stacks 3 lenses:
7
+ * 1. Fail-loud: never silent. Every reject emits JSON envelope.
8
+ * 2. Truncation receipt: when allowTruncate=true, accept first N + flag
9
+ * "INPUT_TRUNCATED" so verdict consumer sees the caveat.
10
+ * 3. Auto-detect: if input came via argv and is too large, suggest stdin.
11
+ *
12
+ * Cross-platform argv limits (real-world safe values):
13
+ * Windows cmd.exe : ~8K (legacy)
14
+ * Windows powershell: ~32K (varies)
15
+ * Linux execve() : ~128K-2M
16
+ * macOS execve() : ~256K
17
+ *
18
+ * Hard limit chosen: 24K = safely below Windows cmd while still allowing
19
+ * substantial claims. For larger input, pipe via stdin.
20
+ */
21
+ export type InputSource = "argv" | "stdin" | "file" | "unknown";
22
+ export interface SizeCheckResult {
23
+ ok: boolean;
24
+ inputSize: number;
25
+ limit: number;
26
+ source: InputSource;
27
+ truncated: boolean;
28
+ truncatedAt?: number;
29
+ receipt: string;
30
+ reason?: string;
31
+ suggestion?: string;
32
+ envelope: {
33
+ ok: boolean;
34
+ error?: string;
35
+ sizeReceived: number;
36
+ sizeLimit: number;
37
+ source: InputSource;
38
+ hint?: string;
39
+ };
40
+ }
41
+ export interface CheckInputSizeOptions {
42
+ source: InputSource;
43
+ allowTruncate?: boolean;
44
+ customLimit?: number;
45
+ }
46
+ export declare function checkInputSize(input: string, opts: CheckInputSizeOptions): SizeCheckResult;
47
+ /**
48
+ * Emit JSON envelope to stdout. Caller in CLI should call this on EVERY
49
+ * exit path so the user never gets silent 0-byte exit.
50
+ *
51
+ * Returns suggested process exit code:
52
+ * 0 if ok
53
+ * 2 if input rejected (distinct from generic crash exit 1)
54
+ */
55
+ export declare function emitEnvelope(result: SizeCheckResult, write?: (s: string) => void): number;
56
+ /** Detect input source heuristically from argv/stdin state. */
57
+ export declare function detectInputSource(): InputSource;
58
+ //# sourceMappingURL=input_size_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input_size_guard.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/input_size_guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,WAAW,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AASD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,eAAe,CAkD1F;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAqC,GAAG,MAAM,CAGzH;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,IAAI,WAAW,CAI/C"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 🛡 INPUT SIZE GUARD — fail-loud envelope + truncation receipt
3
+ *
4
+ * Closes the v2.70 vuln: 28K char input → exit 1, 0 bytes, no warning.
5
+ *
6
+ * Strategy stacks 3 lenses:
7
+ * 1. Fail-loud: never silent. Every reject emits JSON envelope.
8
+ * 2. Truncation receipt: when allowTruncate=true, accept first N + flag
9
+ * "INPUT_TRUNCATED" so verdict consumer sees the caveat.
10
+ * 3. Auto-detect: if input came via argv and is too large, suggest stdin.
11
+ *
12
+ * Cross-platform argv limits (real-world safe values):
13
+ * Windows cmd.exe : ~8K (legacy)
14
+ * Windows powershell: ~32K (varies)
15
+ * Linux execve() : ~128K-2M
16
+ * macOS execve() : ~256K
17
+ *
18
+ * Hard limit chosen: 24K = safely below Windows cmd while still allowing
19
+ * substantial claims. For larger input, pipe via stdin.
20
+ */
21
+ const DEFAULT_LIMITS = {
22
+ argv: 24_000,
23
+ stdin: 10_000_000, // 10MB
24
+ file: 100_000_000, // 100MB
25
+ unknown: 24_000,
26
+ };
27
+ function makeReceipt(input, source) {
28
+ // Lightweight non-crypto receipt — caller can verify they sent X bytes
29
+ // without needing HMAC key
30
+ const size = input.length;
31
+ const head = input.slice(0, 24).replace(/\s/g, "·");
32
+ const tail = input.slice(-24).replace(/\s/g, "·");
33
+ return `[mneme-rcpt ${source}:${size}B head="${head}" tail="${tail}"]`;
34
+ }
35
+ export function checkInputSize(input, opts) {
36
+ const limit = opts.customLimit ?? DEFAULT_LIMITS[opts.source];
37
+ const inputSize = input.length;
38
+ const receipt = makeReceipt(input, opts.source);
39
+ if (inputSize <= limit) {
40
+ return {
41
+ ok: true, inputSize, limit, source: opts.source,
42
+ truncated: false, receipt,
43
+ envelope: { ok: true, sizeReceived: inputSize, sizeLimit: limit, source: opts.source },
44
+ };
45
+ }
46
+ // Over limit. Truncate or reject?
47
+ if (opts.allowTruncate) {
48
+ return {
49
+ ok: true, inputSize, limit, source: opts.source,
50
+ truncated: true, truncatedAt: limit,
51
+ reason: `input ${inputSize}B > limit ${limit}B; --allow-truncate accepted first ${limit}B`,
52
+ receipt,
53
+ envelope: {
54
+ ok: true,
55
+ sizeReceived: inputSize,
56
+ sizeLimit: limit,
57
+ source: opts.source,
58
+ hint: `Verdict computed on first ${limit}B only — re-run via stdin for full input.`,
59
+ },
60
+ };
61
+ }
62
+ // Hard reject — but LOUD. Caller MUST get JSON envelope.
63
+ const suggestion = opts.source === "argv"
64
+ ? "Input too large for command-line args. Pipe via stdin: `echo $CLAIM | mneme verify --stdin` (limit then becomes 10MB)."
65
+ : `Input ${inputSize}B exceeds ${opts.source} limit of ${limit}B. Use --allow-truncate or split into chunks.`;
66
+ return {
67
+ ok: false, inputSize, limit, source: opts.source,
68
+ truncated: false,
69
+ reason: `input ${inputSize}B exceeds ${opts.source} limit of ${limit}B`,
70
+ suggestion,
71
+ receipt,
72
+ envelope: {
73
+ ok: false,
74
+ error: "INPUT_TOO_LARGE",
75
+ sizeReceived: inputSize,
76
+ sizeLimit: limit,
77
+ source: opts.source,
78
+ hint: suggestion,
79
+ },
80
+ };
81
+ }
82
+ /**
83
+ * Emit JSON envelope to stdout. Caller in CLI should call this on EVERY
84
+ * exit path so the user never gets silent 0-byte exit.
85
+ *
86
+ * Returns suggested process exit code:
87
+ * 0 if ok
88
+ * 2 if input rejected (distinct from generic crash exit 1)
89
+ */
90
+ export function emitEnvelope(result, write = (s) => process.stdout.write(s)) {
91
+ write(JSON.stringify(result.envelope) + "\n");
92
+ return result.ok ? 0 : 2;
93
+ }
94
+ /** Detect input source heuristically from argv/stdin state. */
95
+ export function detectInputSource() {
96
+ if (!process.stdin.isTTY)
97
+ return "stdin";
98
+ if (process.argv.length > 2)
99
+ return "argv";
100
+ return "unknown";
101
+ }
102
+ //# sourceMappingURL=input_size_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input_size_guard.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/input_size_guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 🔮 PRISM — Universal Multi-Lens Verification Engine
3
+ *
4
+ * Closes v2.70 Vuln #3: multi-lens engine activated only on Mneme-self
5
+ * claims (6/7 generic test claims → 0 lenses → unknown). PRISM extends
6
+ * the lens engine to fire on ANY claim by adding 5 universal lenses
7
+ * that need no Mneme-specific entity to activate.
8
+ *
9
+ * 5 UNIVERSAL LENSES:
10
+ * 1. FAKE_AUTHORITY — "According to MIT, X" without verifiable cite
11
+ * 2. FAKE_COMMIT — "commit deadbeef" / "PR #N" that doesn't exist
12
+ * 3. STATISTICAL_REALITY — "all X are Y" / "every X is Y" absolutes
13
+ * 4. MAGIC_NUMBER — implausible numeric claim vs reality table
14
+ * 5. NULL_INFORMATION — TODO / AAAAAA / empty / noise → honest refusal
15
+ *
16
+ * Each lens emits {triggered, verdict, evidence, confidence}.
17
+ * Caller combines with Mneme-self lenses for unified verdict.
18
+ *
19
+ * Design principle: NO lens should produce false positives on legitimate
20
+ * factual claims. Each lens has narrow trigger pattern. If no pattern
21
+ * matches, lens returns {triggered: false} — caller stacks lenses freely.
22
+ */
23
+ export type PrismVerdict = "REFUTED" | "SUSPICIOUS" | "INSUFFICIENT_DATA" | "PASSTHROUGH";
24
+ export interface LensResult {
25
+ lens: string;
26
+ triggered: boolean;
27
+ verdict?: PrismVerdict;
28
+ evidence?: string;
29
+ confidence?: number;
30
+ }
31
+ export interface PrismResult {
32
+ claim: string;
33
+ lensesActivated: number;
34
+ lensesAvailable: number;
35
+ results: LensResult[];
36
+ combinedVerdict: PrismVerdict;
37
+ combinedConfidence: number;
38
+ rationale: string;
39
+ }
40
+ export declare function lensFakeAuthority(claim: string): LensResult;
41
+ export interface FakeCommitOptions {
42
+ validateSha?: (sha: string) => boolean;
43
+ validatePR?: (n: number) => boolean;
44
+ }
45
+ export declare function lensFakeCommit(claim: string, opts?: FakeCommitOptions): LensResult;
46
+ export declare function lensStatisticalReality(claim: string): LensResult;
47
+ export declare function lensMagicNumber(claim: string): LensResult;
48
+ export declare function lensNullInformation(claim: string): LensResult;
49
+ export declare function runPrism(claim: string, opts?: FakeCommitOptions): PrismResult;
50
+ //# sourceMappingURL=prism.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prism.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/prism.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,EAAE,YAAY,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAmB3D;AAOD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CAwCtF;AASD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAchE;AAoBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA2BzD;AAWD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA0B7D;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,WAAW,CAyCjF"}