@mneme-ai/core 2.38.0 → 2.40.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 (88) 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 +13 -0
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/argus10/engine.d.ts +30 -0
  6. package/dist/argus10/engine.d.ts.map +1 -0
  7. package/dist/argus10/engine.js +139 -0
  8. package/dist/argus10/engine.js.map +1 -0
  9. package/dist/argus10/eyes_surface.d.ts +18 -0
  10. package/dist/argus10/eyes_surface.d.ts.map +1 -0
  11. package/dist/argus10/eyes_surface.js +251 -0
  12. package/dist/argus10/eyes_surface.js.map +1 -0
  13. package/dist/argus10/eyes_truth.d.ts +24 -0
  14. package/dist/argus10/eyes_truth.d.ts.map +1 -0
  15. package/dist/argus10/eyes_truth.js +254 -0
  16. package/dist/argus10/eyes_truth.js.map +1 -0
  17. package/dist/argus10/guardian.d.ts +35 -0
  18. package/dist/argus10/guardian.d.ts.map +1 -0
  19. package/dist/argus10/guardian.js +51 -0
  20. package/dist/argus10/guardian.js.map +1 -0
  21. package/dist/argus10/hydra.d.ts +45 -0
  22. package/dist/argus10/hydra.d.ts.map +1 -0
  23. package/dist/argus10/hydra.js +72 -0
  24. package/dist/argus10/hydra.js.map +1 -0
  25. package/dist/argus10/index.d.ts +20 -0
  26. package/dist/argus10/index.d.ts.map +1 -0
  27. package/dist/argus10/index.js +19 -0
  28. package/dist/argus10/index.js.map +1 -0
  29. package/dist/argus10/types.d.ts +128 -0
  30. package/dist/argus10/types.d.ts.map +1 -0
  31. package/dist/argus10/types.js +39 -0
  32. package/dist/argus10/types.js.map +1 -0
  33. package/dist/flywheel/controller.js.map +1 -1
  34. package/dist/honest_mirror/engine.d.ts.map +1 -1
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +19 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/pulse.d.ts.map +1 -1
  40. package/dist/pulse.js +1 -1
  41. package/dist/pulse.js.map +1 -1
  42. package/dist/rewind/engine.js.map +1 -1
  43. package/dist/squadron/acgv.d.ts.map +1 -1
  44. package/dist/squadron/acgv.js +106 -3
  45. package/dist/squadron/acgv.js.map +1 -1
  46. package/dist/squadron/acgv_explain.d.ts.map +1 -1
  47. package/dist/squadron/acgv_explain.js +14 -0
  48. package/dist/squadron/acgv_explain.js.map +1 -1
  49. package/dist/squadron/acgv_input_hygiene.d.ts +63 -0
  50. package/dist/squadron/acgv_input_hygiene.d.ts.map +1 -0
  51. package/dist/squadron/acgv_input_hygiene.js +302 -0
  52. package/dist/squadron/acgv_input_hygiene.js.map +1 -0
  53. package/dist/squadron/acgv_number_bridge.d.ts +71 -0
  54. package/dist/squadron/acgv_number_bridge.d.ts.map +1 -0
  55. package/dist/squadron/acgv_number_bridge.js +524 -0
  56. package/dist/squadron/acgv_number_bridge.js.map +1 -0
  57. package/dist/squadron/vaccine_numeric_guard.d.ts +4 -0
  58. package/dist/squadron/vaccine_numeric_guard.d.ts.map +1 -1
  59. package/dist/squadron/vaccine_numeric_guard.js +32 -17
  60. package/dist/squadron/vaccine_numeric_guard.js.map +1 -1
  61. package/dist/truth_gate/probes.d.ts.map +1 -1
  62. package/dist/truth_gate/probes.js +6 -4
  63. package/dist/truth_gate/probes.js.map +1 -1
  64. package/dist/zzzzz_probe/anti_entropy.d.ts +36 -0
  65. package/dist/zzzzz_probe/anti_entropy.d.ts.map +1 -0
  66. package/dist/zzzzz_probe/anti_entropy.js +147 -0
  67. package/dist/zzzzz_probe/anti_entropy.js.map +1 -0
  68. package/dist/zzzzz_probe/engine.d.ts +27 -0
  69. package/dist/zzzzz_probe/engine.d.ts.map +1 -0
  70. package/dist/zzzzz_probe/engine.js +203 -0
  71. package/dist/zzzzz_probe/engine.js.map +1 -0
  72. package/dist/zzzzz_probe/image_provenance.d.ts +34 -0
  73. package/dist/zzzzz_probe/image_provenance.d.ts.map +1 -0
  74. package/dist/zzzzz_probe/image_provenance.js +224 -0
  75. package/dist/zzzzz_probe/image_provenance.js.map +1 -0
  76. package/dist/zzzzz_probe/index.d.ts +22 -0
  77. package/dist/zzzzz_probe/index.d.ts.map +1 -0
  78. package/dist/zzzzz_probe/index.js +20 -0
  79. package/dist/zzzzz_probe/index.js.map +1 -0
  80. package/dist/zzzzz_probe/os_polygraph.d.ts +16 -0
  81. package/dist/zzzzz_probe/os_polygraph.d.ts.map +1 -0
  82. package/dist/zzzzz_probe/os_polygraph.js +43 -0
  83. package/dist/zzzzz_probe/os_polygraph.js.map +1 -0
  84. package/dist/zzzzz_probe/types.d.ts +101 -0
  85. package/dist/zzzzz_probe/types.d.ts.map +1 -0
  86. package/dist/zzzzz_probe/types.js +23 -0
  87. package/dist/zzzzz_probe/types.js.map +1 -0
  88. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * v2.40.0 — NUMBER PARAPHRASE BRIDGE.
3
+ *
4
+ * Closes the D5 audit finding: the verifier saw "865" as a token but
5
+ * "eight hundred sixty-five" / "0x361" / "๘๖๕" / "huit cent soixante-cinq"
6
+ * as text — so refuting one form did not refute the others. AI vendors
7
+ * trivially evade vaccines by re-spelling numbers.
8
+ *
9
+ * This module exposes:
10
+ * extractCanonicalNumbers(text) → [{ surface, value, form }]
11
+ * canonicalRewrite(text) → text with every paraphrase replaced by
12
+ * its decimal int (lossy but reproducible)
13
+ * sameQuantity(a, b) → boolean: do two phrasings denote same N?
14
+ *
15
+ * Supported forms:
16
+ * - Decimal Arabic literals "865", "1,000", "2.5", "1_000"
17
+ * - Hexadecimal "0x361", "0X3A"
18
+ * - Binary "0b1101100001"
19
+ * - Octal "0o1541" (modern), "0541" rejected
20
+ * (legacy octal is ambiguous → not bridged)
21
+ * - Scientific "8.65e2"
22
+ * - English words "eight hundred sixty-five",
23
+ * "two thousand and one",
24
+ * "a hundred", "twelve hundred"
25
+ * - Thai digits "๐๑๒๓๔๕๖๗๘๙"
26
+ * - Thai words "แปดร้อยหกสิบห้า"
27
+ * - Arabic-Indic digits "٠١٢٣٤٥٦٧٨٩"
28
+ * - Eastern Arabic-Indic digits "۰۱۲۳۴۵۶۷۸۹"
29
+ * - Full-width digits "0123" (CJK fullwidth)
30
+ * - Devanagari digits "०१२३"
31
+ * - Roman numerals (1..3999) "MMXXIV", "XLII"
32
+ *
33
+ * Out of scope (deliberately — would cause false positives):
34
+ * - Floating-point words ("two point five") → not bridged (rare in claims;
35
+ * and "point" causes too many false hits)
36
+ * - Ordinals ("first", "twenty-third") → handled separately by callers
37
+ * - Negative-word forms ("minus ten") → bridged with explicit "minus"/"-"
38
+ *
39
+ * Pure deterministic; no I/O.
40
+ */
41
+ export type NumberForm = "decimal" | "hex" | "binary" | "octal" | "scientific" | "english_words" | "thai_words" | "roman" | "alt_digits";
42
+ export interface CanonicalNumber {
43
+ /** The substring as it appears in the input. */
44
+ surface: string;
45
+ /** Start offset in input (UTF-16 code units). */
46
+ start: number;
47
+ /** End offset (exclusive). */
48
+ end: number;
49
+ /** Numeric value (finite, never NaN; integer or float). */
50
+ value: number;
51
+ /** Which form produced this value. */
52
+ form: NumberForm;
53
+ }
54
+ export declare function extractCanonicalNumbers(rawText: string): CanonicalNumber[];
55
+ /**
56
+ * Replace every recognized number paraphrase with its decimal int form.
57
+ * Returns a normalized text where "eight hundred sixty-five" and "0x361"
58
+ * both become "865". Lossy but deterministic; intended as a SECONDARY
59
+ * comparison channel — not a replacement for the original text.
60
+ */
61
+ export declare function canonicalRewrite(text: string): string;
62
+ /**
63
+ * Returns true if two text fragments contain the SAME set of canonical
64
+ * numeric values. Order- and form-independent. Used by ARGUS-10 EYE_7.
65
+ *
66
+ * Tolerance: floats within 1e-9 relative are considered equal.
67
+ */
68
+ export declare function sameQuantity(a: string, b: string, opts?: {
69
+ ignoreOrder?: boolean;
70
+ }): boolean;
71
+ //# sourceMappingURL=acgv_number_bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acgv_number_bridge.d.ts","sourceRoot":"","sources":["../../src/squadron/acgv_number_bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,KAAK,GACL,QAAQ,GACR,OAAO,GACP,YAAY,GACZ,eAAe,GACf,YAAY,GACZ,OAAO,GACP,YAAY,CAAC;AAEjB,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC;CAClB;AA4MD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAkL1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAarD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAkBhG"}
@@ -0,0 +1,524 @@
1
+ /**
2
+ * v2.40.0 — NUMBER PARAPHRASE BRIDGE.
3
+ *
4
+ * Closes the D5 audit finding: the verifier saw "865" as a token but
5
+ * "eight hundred sixty-five" / "0x361" / "๘๖๕" / "huit cent soixante-cinq"
6
+ * as text — so refuting one form did not refute the others. AI vendors
7
+ * trivially evade vaccines by re-spelling numbers.
8
+ *
9
+ * This module exposes:
10
+ * extractCanonicalNumbers(text) → [{ surface, value, form }]
11
+ * canonicalRewrite(text) → text with every paraphrase replaced by
12
+ * its decimal int (lossy but reproducible)
13
+ * sameQuantity(a, b) → boolean: do two phrasings denote same N?
14
+ *
15
+ * Supported forms:
16
+ * - Decimal Arabic literals "865", "1,000", "2.5", "1_000"
17
+ * - Hexadecimal "0x361", "0X3A"
18
+ * - Binary "0b1101100001"
19
+ * - Octal "0o1541" (modern), "0541" rejected
20
+ * (legacy octal is ambiguous → not bridged)
21
+ * - Scientific "8.65e2"
22
+ * - English words "eight hundred sixty-five",
23
+ * "two thousand and one",
24
+ * "a hundred", "twelve hundred"
25
+ * - Thai digits "๐๑๒๓๔๕๖๗๘๙"
26
+ * - Thai words "แปดร้อยหกสิบห้า"
27
+ * - Arabic-Indic digits "٠١٢٣٤٥٦٧٨٩"
28
+ * - Eastern Arabic-Indic digits "۰۱۲۳۴۵۶۷۸۹"
29
+ * - Full-width digits "0123" (CJK fullwidth)
30
+ * - Devanagari digits "०१२३"
31
+ * - Roman numerals (1..3999) "MMXXIV", "XLII"
32
+ *
33
+ * Out of scope (deliberately — would cause false positives):
34
+ * - Floating-point words ("two point five") → not bridged (rare in claims;
35
+ * and "point" causes too many false hits)
36
+ * - Ordinals ("first", "twenty-third") → handled separately by callers
37
+ * - Negative-word forms ("minus ten") → bridged with explicit "minus"/"-"
38
+ *
39
+ * Pure deterministic; no I/O.
40
+ */
41
+ // ─── ALT-DIGIT MAPS ────────────────────────────────────────────────────────
42
+ const ALT_DIGIT_MAP = {};
43
+ function seedDigits(start, label) {
44
+ for (let d = 0; d <= 9; d++)
45
+ ALT_DIGIT_MAP[String.fromCodePoint(start + d)] = String(d);
46
+ void label;
47
+ }
48
+ seedDigits(0x0E50, "thai"); // ๐-๙
49
+ seedDigits(0x0660, "arabic-indic"); // ٠-٩
50
+ seedDigits(0x06F0, "eastern-arabic"); // ۰-۹
51
+ seedDigits(0xFF10, "fullwidth"); // 0-9
52
+ seedDigits(0x0966, "devanagari"); // ०-९
53
+ seedDigits(0x09E6, "bengali"); // ০-৯
54
+ seedDigits(0x0A66, "gurmukhi");
55
+ seedDigits(0x0AE6, "gujarati");
56
+ seedDigits(0x0B66, "oriya");
57
+ seedDigits(0x0BE6, "tamil");
58
+ seedDigits(0x0C66, "telugu");
59
+ seedDigits(0x0CE6, "kannada");
60
+ seedDigits(0x0D66, "malayalam");
61
+ function translateAltDigits(text) {
62
+ let touched = false;
63
+ let out = "";
64
+ for (const ch of text) {
65
+ const r = ALT_DIGIT_MAP[ch];
66
+ if (r) {
67
+ out += r;
68
+ touched = true;
69
+ }
70
+ else
71
+ out += ch;
72
+ }
73
+ return { translated: out, touched };
74
+ }
75
+ // ─── ENGLISH WORDS ─────────────────────────────────────────────────────────
76
+ const EN_SMALL = {
77
+ zero: 0, oh: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7,
78
+ eight: 8, nine: 9, ten: 10, eleven: 11, twelve: 12, thirteen: 13, fourteen: 14,
79
+ fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18, nineteen: 19,
80
+ };
81
+ const EN_TENS = {
82
+ twenty: 20, thirty: 30, forty: 40, fifty: 50, sixty: 60,
83
+ seventy: 70, eighty: 80, ninety: 90,
84
+ };
85
+ const EN_SCALES = {
86
+ hundred: 100, thousand: 1_000, million: 1_000_000, billion: 1_000_000_000,
87
+ trillion: 1_000_000_000_000,
88
+ };
89
+ const EN_ARTICLES = new Set(["a", "an"]);
90
+ function isEnWord(w) {
91
+ return EN_SMALL[w] !== undefined || EN_TENS[w] !== undefined || EN_SCALES[w] !== undefined || EN_ARTICLES.has(w);
92
+ }
93
+ /**
94
+ * Parse a sequence of English number tokens into one numeric value.
95
+ * Returns null if the sequence is not a valid number word phrase.
96
+ * Implements the "current + total" cardinal accumulator standard.
97
+ */
98
+ function parseEnglishWords(tokens) {
99
+ if (tokens.length === 0)
100
+ return null;
101
+ let total = 0;
102
+ let current = 0;
103
+ let consumed = 0;
104
+ for (const t of tokens) {
105
+ const lw = t.toLowerCase();
106
+ if (EN_ARTICLES.has(lw)) {
107
+ current = 1;
108
+ consumed++;
109
+ continue;
110
+ }
111
+ if (lw === "and") {
112
+ consumed++;
113
+ continue;
114
+ }
115
+ if (EN_SMALL[lw] !== undefined) {
116
+ current += EN_SMALL[lw];
117
+ consumed++;
118
+ continue;
119
+ }
120
+ if (EN_TENS[lw] !== undefined) {
121
+ current += EN_TENS[lw];
122
+ consumed++;
123
+ continue;
124
+ }
125
+ if (EN_SCALES[lw] !== undefined) {
126
+ const scale = EN_SCALES[lw];
127
+ if (current === 0)
128
+ current = 1;
129
+ if (scale === 100) {
130
+ current = current * 100;
131
+ }
132
+ else {
133
+ total += current * scale;
134
+ current = 0;
135
+ }
136
+ consumed++;
137
+ continue;
138
+ }
139
+ // Stop on first non-number-word.
140
+ break;
141
+ }
142
+ if (consumed === 0)
143
+ return null;
144
+ const result = total + current;
145
+ return Number.isFinite(result) ? result : null;
146
+ }
147
+ // ─── THAI WORDS ────────────────────────────────────────────────────────────
148
+ //
149
+ // Thai uses base-10 with scale words; for our purposes we only need 0-9999
150
+ // since claims with explicit billions/etc in Thai are extremely rare and
151
+ // adding them risks false positives.
152
+ const TH_DIGITS = {
153
+ "ศูนย์": 0,
154
+ "หนึ่ง": 1, "เอ็ด": 1,
155
+ "สอง": 2, "ยี่": 2, // ยี่สิบ = twenty (special)
156
+ "สาม": 3, "สี่": 4, "ห้า": 5, "หก": 6, "เจ็ด": 7, "แปด": 8, "เก้า": 9,
157
+ };
158
+ const TH_SCALES = {
159
+ "สิบ": 10, "ร้อย": 100, "พัน": 1_000, "หมื่น": 10_000,
160
+ "แสน": 100_000, "ล้าน": 1_000_000,
161
+ };
162
+ function parseThaiNumberWord(text) {
163
+ // Thai cardinal numbers are scale-suffix base-10. Each digit may be
164
+ // followed by a scale (สิบ/ร้อย/พัน/หมื่น/แสน/ล้าน). When a scale word
165
+ // appears WITHOUT a preceding digit, the implicit digit is 1.
166
+ //
167
+ // Algorithm: maintain `partial` (sum of completed (digit × scale) terms
168
+ // in the current scope) + `pendingDigit` (the digit not yet multiplied
169
+ // by a scale). On a scale token, partial += pendingDigit * scale and
170
+ // pendingDigit becomes 0. On the special ล้าน (1e6) scale, the whole
171
+ // partial flushes to `total` since ล้าน opens a new scope.
172
+ // At end: result = total + partial + pendingDigit.
173
+ let i = 0;
174
+ let total = 0;
175
+ let partial = 0;
176
+ let pendingDigit = 0;
177
+ let parsed = false;
178
+ while (i < text.length) {
179
+ let match = null;
180
+ for (const [word, value] of Object.entries(TH_SCALES)) {
181
+ if (text.startsWith(word, i)) {
182
+ if (!match || word.length > match.word.length)
183
+ match = { word, isScale: true, value };
184
+ }
185
+ }
186
+ for (const [word, value] of Object.entries(TH_DIGITS)) {
187
+ if (text.startsWith(word, i)) {
188
+ if (!match || word.length > match.word.length)
189
+ match = { word, isScale: false, value };
190
+ }
191
+ }
192
+ if (!match)
193
+ break;
194
+ parsed = true;
195
+ if (match.isScale) {
196
+ const digit = pendingDigit === 0 ? 1 : pendingDigit;
197
+ if (match.value === 1_000_000) {
198
+ // ล้าน opens a brand new scope: flush everything we have, multiply
199
+ // by 1e6, then continue accumulating.
200
+ const flushed = (partial + digit) * 1_000_000;
201
+ total += flushed;
202
+ partial = 0;
203
+ pendingDigit = 0;
204
+ }
205
+ else {
206
+ partial += digit * match.value;
207
+ pendingDigit = 0;
208
+ }
209
+ }
210
+ else {
211
+ // Pure digit. If there's already an unscaled pendingDigit, that means
212
+ // we're seeing two digits in a row (e.g. "สามสี่" = 3 then 4 — really
213
+ // just 4 since 3 had no scale). Treat as overwrite, matching the
214
+ // way humans read informal Thai.
215
+ pendingDigit = match.value;
216
+ }
217
+ i += match.word.length;
218
+ }
219
+ if (!parsed)
220
+ return null;
221
+ const value = total + partial + pendingDigit;
222
+ return Number.isFinite(value) ? { value, consumed: i } : null;
223
+ }
224
+ // ─── ROMAN NUMERALS ────────────────────────────────────────────────────────
225
+ const ROMAN = [
226
+ ["M", 1000], ["CM", 900], ["D", 500], ["CD", 400], ["C", 100], ["XC", 90],
227
+ ["L", 50], ["XL", 40], ["X", 10], ["IX", 9], ["V", 5], ["IV", 4], ["I", 1],
228
+ ];
229
+ function parseRoman(text) {
230
+ if (!/^[MDCLXVI]+$/.test(text))
231
+ return null;
232
+ let i = 0;
233
+ let total = 0;
234
+ while (i < text.length) {
235
+ let matched = false;
236
+ for (const [token, value] of ROMAN) {
237
+ if (text.startsWith(token, i)) {
238
+ total += value;
239
+ i += token.length;
240
+ matched = true;
241
+ break;
242
+ }
243
+ }
244
+ if (!matched)
245
+ return null;
246
+ }
247
+ if (total < 1 || total > 3999)
248
+ return null;
249
+ // Reject malformed Roman like "IIII" or "VV"
250
+ const round = (() => {
251
+ let n = total;
252
+ let out = "";
253
+ for (const [tok, val] of ROMAN) {
254
+ while (n >= val) {
255
+ out += tok;
256
+ n -= val;
257
+ }
258
+ }
259
+ return out;
260
+ })();
261
+ if (round !== text)
262
+ return null;
263
+ return total;
264
+ }
265
+ // ─── PUBLIC API ────────────────────────────────────────────────────────────
266
+ export function extractCanonicalNumbers(rawText) {
267
+ if (!rawText)
268
+ return [];
269
+ const out = [];
270
+ // We work on TWO passes:
271
+ // (a) translate alt-digits to ASCII so the decimal regex catches them
272
+ // (b) keep original offsets via a parallel index map so we can report
273
+ // surface positions in the ORIGINAL text
274
+ const altMap = translateAltDigits(rawText);
275
+ const text = altMap.translated;
276
+ // Pre-mark already-claimed ranges to avoid double-counting (e.g. "0x361"
277
+ // matches both the hex pattern AND the decimal "0" + "361").
278
+ const claimed = new Array(text.length).fill(false);
279
+ const isClaimed = (s, e) => {
280
+ for (let k = s; k < e; k++)
281
+ if (claimed[k])
282
+ return true;
283
+ return false;
284
+ };
285
+ const claim = (s, e) => { for (let k = s; k < e; k++)
286
+ claimed[k] = true; };
287
+ // 1. Hex (must come before decimal — leading "0" would otherwise grab it)
288
+ for (const m of text.matchAll(/\b0[xX][0-9a-fA-F]+\b/g)) {
289
+ const surface = m[0];
290
+ const start = m.index;
291
+ const end = start + surface.length;
292
+ if (isClaimed(start, end))
293
+ continue;
294
+ const value = parseInt(surface.slice(2), 16);
295
+ if (Number.isFinite(value)) {
296
+ out.push({ surface, start, end, value, form: "hex" });
297
+ claim(start, end);
298
+ }
299
+ }
300
+ // 2. Binary
301
+ for (const m of text.matchAll(/\b0[bB][01]+\b/g)) {
302
+ const surface = m[0];
303
+ const start = m.index;
304
+ const end = start + surface.length;
305
+ if (isClaimed(start, end))
306
+ continue;
307
+ const value = parseInt(surface.slice(2), 2);
308
+ if (Number.isFinite(value)) {
309
+ out.push({ surface, start, end, value, form: "binary" });
310
+ claim(start, end);
311
+ }
312
+ }
313
+ // 3. Modern octal
314
+ for (const m of text.matchAll(/\b0[oO][0-7]+\b/g)) {
315
+ const surface = m[0];
316
+ const start = m.index;
317
+ const end = start + surface.length;
318
+ if (isClaimed(start, end))
319
+ continue;
320
+ const value = parseInt(surface.slice(2), 8);
321
+ if (Number.isFinite(value)) {
322
+ out.push({ surface, start, end, value, form: "octal" });
323
+ claim(start, end);
324
+ }
325
+ }
326
+ // 4. Scientific
327
+ for (const m of text.matchAll(/\b\d+(?:\.\d+)?[eE][+-]?\d+\b/g)) {
328
+ const surface = m[0];
329
+ const start = m.index;
330
+ const end = start + surface.length;
331
+ if (isClaimed(start, end))
332
+ continue;
333
+ const value = parseFloat(surface);
334
+ if (Number.isFinite(value)) {
335
+ out.push({ surface, start, end, value, form: "scientific" });
336
+ claim(start, end);
337
+ }
338
+ }
339
+ // 5. Decimal with thousands separators / underscores / dots
340
+ for (const m of text.matchAll(/\b\d{1,3}(?:[,_]\d{3})+(?:\.\d+)?\b/g)) {
341
+ const surface = m[0];
342
+ const start = m.index;
343
+ const end = start + surface.length;
344
+ if (isClaimed(start, end))
345
+ continue;
346
+ const cleaned = surface.replace(/[,_]/g, "");
347
+ const value = parseFloat(cleaned);
348
+ if (Number.isFinite(value)) {
349
+ out.push({ surface, start, end, value, form: "decimal" });
350
+ claim(start, end);
351
+ }
352
+ }
353
+ // 6. Plain decimal (including floats)
354
+ for (const m of text.matchAll(/\b\d+(?:\.\d+)?\b/g)) {
355
+ const surface = m[0];
356
+ const start = m.index;
357
+ const end = start + surface.length;
358
+ if (isClaimed(start, end))
359
+ continue;
360
+ const value = parseFloat(surface);
361
+ if (Number.isFinite(value)) {
362
+ // Distinguish alt-digit form by inspecting the ORIGINAL text at same span
363
+ const origSlice = rawText.slice(start, end);
364
+ const wasAlt = origSlice !== surface;
365
+ out.push({
366
+ surface: origSlice,
367
+ start, end, value,
368
+ form: wasAlt ? "alt_digits" : "decimal",
369
+ });
370
+ claim(start, end);
371
+ }
372
+ }
373
+ // 7. Roman numerals (only standalone tokens — never inside a word)
374
+ for (const m of text.matchAll(/\b[MDCLXVI]{1,15}\b/g)) {
375
+ const surface = m[0];
376
+ const start = m.index;
377
+ const end = start + surface.length;
378
+ if (isClaimed(start, end))
379
+ continue;
380
+ // Avoid common English words: I, MIX, DIM, LID, CID, MILL, etc.
381
+ // Heuristic: skip 1-2 letter matches (too ambiguous); skip "MIX" / "DIM" / "MILL"
382
+ if (surface.length < 3)
383
+ continue;
384
+ const ENGLISH_LIKE = new Set(["MIX", "DIM", "DID", "LID", "MILL", "MILD", "MICA", "VIVID", "DIDI", "CIVIC", "MIMIC"]);
385
+ if (ENGLISH_LIKE.has(surface))
386
+ continue;
387
+ const value = parseRoman(surface);
388
+ if (value !== null) {
389
+ out.push({ surface, start, end, value, form: "roman" });
390
+ claim(start, end);
391
+ }
392
+ }
393
+ // 8. English number words (longest-match accumulator)
394
+ // We scan token-by-token; whenever we see a known English number word,
395
+ // greedy-consume subsequent number words until the run breaks.
396
+ const wordRe = /\b[a-zA-Z]+\b/g;
397
+ const wordMatches = [];
398
+ let wm;
399
+ while ((wm = wordRe.exec(text)) !== null) {
400
+ wordMatches.push({ word: wm[0], start: wm.index, end: wm.index + wm[0].length });
401
+ }
402
+ let wi = 0;
403
+ while (wi < wordMatches.length) {
404
+ if (!isEnWord(wordMatches[wi].word.toLowerCase())) {
405
+ wi++;
406
+ continue;
407
+ }
408
+ // Greedy run. We also accept "and" as a connector.
409
+ let wj = wi;
410
+ const run = [];
411
+ while (wj < wordMatches.length) {
412
+ const lw = wordMatches[wj].word.toLowerCase();
413
+ if (isEnWord(lw) || lw === "and") {
414
+ run.push(lw);
415
+ wj++;
416
+ }
417
+ else
418
+ break;
419
+ }
420
+ // Trim trailing "and"
421
+ while (run.length > 0 && run[run.length - 1] === "and")
422
+ run.pop();
423
+ if (run.length === 0) {
424
+ wi++;
425
+ continue;
426
+ }
427
+ const start = wordMatches[wi].start;
428
+ const end = wordMatches[wi + run.length - 1].end;
429
+ if (isClaimed(start, end)) {
430
+ wi = wj;
431
+ continue;
432
+ }
433
+ const value = parseEnglishWords(run);
434
+ // Require: value > 0 OR the literal token is a recognized zero.
435
+ if (value !== null && (value > 0 || run.includes("zero"))) {
436
+ const surface = rawText.slice(start, end);
437
+ out.push({ surface, start, end, value, form: "english_words" });
438
+ claim(start, end);
439
+ }
440
+ wi = wj;
441
+ }
442
+ // 9. Thai number words (scan; greedy-longest)
443
+ // Thai is harder because there are no spaces. We scan for any Thai
444
+ // digit/scale word and greedy-extend.
445
+ // Build a single regex of all known Thai number tokens for first-hit detection.
446
+ const thaiTokens = [...Object.keys(TH_DIGITS), ...Object.keys(TH_SCALES)]
447
+ .sort((a, b) => b.length - a.length);
448
+ const thaiTokenRe = new RegExp("(" + thaiTokens.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|") + ")", "g");
449
+ let tm;
450
+ // Reset lastIndex
451
+ thaiTokenRe.lastIndex = 0;
452
+ while ((tm = thaiTokenRe.exec(text)) !== null) {
453
+ const start = tm.index;
454
+ if (isClaimed(start, start + tm[0].length))
455
+ continue;
456
+ // From this hit, greedily parse the longest Thai number word.
457
+ const parsed = parseThaiNumberWord(text.slice(start));
458
+ if (parsed && parsed.value > 0 && parsed.consumed > 0) {
459
+ const end = start + parsed.consumed;
460
+ if (!isClaimed(start, end)) {
461
+ const surface = rawText.slice(start, end);
462
+ out.push({ surface, start, end, value: parsed.value, form: "thai_words" });
463
+ claim(start, end);
464
+ }
465
+ thaiTokenRe.lastIndex = end;
466
+ }
467
+ }
468
+ return out.sort((a, b) => a.start - b.start);
469
+ }
470
+ /**
471
+ * Replace every recognized number paraphrase with its decimal int form.
472
+ * Returns a normalized text where "eight hundred sixty-five" and "0x361"
473
+ * both become "865". Lossy but deterministic; intended as a SECONDARY
474
+ * comparison channel — not a replacement for the original text.
475
+ */
476
+ export function canonicalRewrite(text) {
477
+ if (!text)
478
+ return "";
479
+ const nums = extractCanonicalNumbers(text);
480
+ if (nums.length === 0)
481
+ return text;
482
+ let out = "";
483
+ let cursor = 0;
484
+ for (const n of nums) {
485
+ out += text.slice(cursor, n.start);
486
+ out += String(n.value);
487
+ cursor = n.end;
488
+ }
489
+ out += text.slice(cursor);
490
+ return out;
491
+ }
492
+ /**
493
+ * Returns true if two text fragments contain the SAME set of canonical
494
+ * numeric values. Order- and form-independent. Used by ARGUS-10 EYE_7.
495
+ *
496
+ * Tolerance: floats within 1e-9 relative are considered equal.
497
+ */
498
+ export function sameQuantity(a, b, opts = {}) {
499
+ const na = extractCanonicalNumbers(a).map((n) => n.value);
500
+ const nb = extractCanonicalNumbers(b).map((n) => n.value);
501
+ if (na.length !== nb.length)
502
+ return false;
503
+ if (na.length === 0)
504
+ return true;
505
+ const eq = (x, y) => {
506
+ if (x === y)
507
+ return true;
508
+ const denom = Math.max(Math.abs(x), Math.abs(y), 1);
509
+ return Math.abs(x - y) / denom < 1e-9;
510
+ };
511
+ if (opts.ignoreOrder ?? true) {
512
+ const sa = [...na].sort((x, y) => x - y);
513
+ const sb = [...nb].sort((x, y) => x - y);
514
+ for (let i = 0; i < sa.length; i++)
515
+ if (!eq(sa[i], sb[i]))
516
+ return false;
517
+ return true;
518
+ }
519
+ for (let i = 0; i < na.length; i++)
520
+ if (!eq(na[i], nb[i]))
521
+ return false;
522
+ return true;
523
+ }
524
+ //# sourceMappingURL=acgv_number_bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acgv_number_bridge.js","sourceRoot":"","sources":["../../src/squadron/acgv_number_bridge.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,10 @@ export declare function numericsInSignature(signature: string): ExtractedNumeric
30
30
  * INVALIDATE legitimate vaccine matches. The guard is OPT-IN per
31
31
  * vaccine: it ONLY fires when the vaccine itself encodes a numeric
32
32
  * fact (so unrelated vaccines are unaffected).
33
+ *
34
+ * v2.40.0 D5: also walks the canonical-number bridge so paraphrased
35
+ * numbers ("eight hundred sixty-six tools" / "๘๖๖ tools" / "0x362
36
+ * tools") feed the same numeric-conflict check.
33
37
  */
34
38
  export declare function numericsInClaim(claim: string): ExtractedNumeric[];
35
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"vaccine_numeric_guard.d.ts","sourceRoot":"","sources":["../../src/squadron/vaccine_numeric_guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AA8BD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAYzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAwBjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgDvC"}
1
+ {"version":3,"file":"vaccine_numeric_guard.d.ts","sourceRoot":"","sources":["../../src/squadron/vaccine_numeric_guard.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;GAgBG;AAEH,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AA8BD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAYzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA4CjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgDvC"}