@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.
- package/dist/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +13 -0
- package/dist/agent_manifest.js.map +1 -1
- package/dist/argus10/engine.d.ts +30 -0
- package/dist/argus10/engine.d.ts.map +1 -0
- package/dist/argus10/engine.js +139 -0
- package/dist/argus10/engine.js.map +1 -0
- package/dist/argus10/eyes_surface.d.ts +18 -0
- package/dist/argus10/eyes_surface.d.ts.map +1 -0
- package/dist/argus10/eyes_surface.js +251 -0
- package/dist/argus10/eyes_surface.js.map +1 -0
- package/dist/argus10/eyes_truth.d.ts +24 -0
- package/dist/argus10/eyes_truth.d.ts.map +1 -0
- package/dist/argus10/eyes_truth.js +254 -0
- package/dist/argus10/eyes_truth.js.map +1 -0
- package/dist/argus10/guardian.d.ts +35 -0
- package/dist/argus10/guardian.d.ts.map +1 -0
- package/dist/argus10/guardian.js +51 -0
- package/dist/argus10/guardian.js.map +1 -0
- package/dist/argus10/hydra.d.ts +45 -0
- package/dist/argus10/hydra.d.ts.map +1 -0
- package/dist/argus10/hydra.js +72 -0
- package/dist/argus10/hydra.js.map +1 -0
- package/dist/argus10/index.d.ts +20 -0
- package/dist/argus10/index.d.ts.map +1 -0
- package/dist/argus10/index.js +19 -0
- package/dist/argus10/index.js.map +1 -0
- package/dist/argus10/types.d.ts +128 -0
- package/dist/argus10/types.d.ts.map +1 -0
- package/dist/argus10/types.js +39 -0
- package/dist/argus10/types.js.map +1 -0
- package/dist/flywheel/controller.js.map +1 -1
- package/dist/honest_mirror/engine.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/pulse.d.ts.map +1 -1
- package/dist/pulse.js +1 -1
- package/dist/pulse.js.map +1 -1
- package/dist/rewind/engine.js.map +1 -1
- package/dist/squadron/acgv.d.ts.map +1 -1
- package/dist/squadron/acgv.js +106 -3
- package/dist/squadron/acgv.js.map +1 -1
- package/dist/squadron/acgv_explain.d.ts.map +1 -1
- package/dist/squadron/acgv_explain.js +14 -0
- package/dist/squadron/acgv_explain.js.map +1 -1
- package/dist/squadron/acgv_input_hygiene.d.ts +63 -0
- package/dist/squadron/acgv_input_hygiene.d.ts.map +1 -0
- package/dist/squadron/acgv_input_hygiene.js +302 -0
- package/dist/squadron/acgv_input_hygiene.js.map +1 -0
- package/dist/squadron/acgv_number_bridge.d.ts +71 -0
- package/dist/squadron/acgv_number_bridge.d.ts.map +1 -0
- package/dist/squadron/acgv_number_bridge.js +524 -0
- package/dist/squadron/acgv_number_bridge.js.map +1 -0
- package/dist/squadron/vaccine_numeric_guard.d.ts +4 -0
- package/dist/squadron/vaccine_numeric_guard.d.ts.map +1 -1
- package/dist/squadron/vaccine_numeric_guard.js +32 -17
- package/dist/squadron/vaccine_numeric_guard.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +6 -4
- package/dist/truth_gate/probes.js.map +1 -1
- package/dist/zzzzz_probe/anti_entropy.d.ts +36 -0
- package/dist/zzzzz_probe/anti_entropy.d.ts.map +1 -0
- package/dist/zzzzz_probe/anti_entropy.js +147 -0
- package/dist/zzzzz_probe/anti_entropy.js.map +1 -0
- package/dist/zzzzz_probe/engine.d.ts +27 -0
- package/dist/zzzzz_probe/engine.d.ts.map +1 -0
- package/dist/zzzzz_probe/engine.js +203 -0
- package/dist/zzzzz_probe/engine.js.map +1 -0
- package/dist/zzzzz_probe/image_provenance.d.ts +34 -0
- package/dist/zzzzz_probe/image_provenance.d.ts.map +1 -0
- package/dist/zzzzz_probe/image_provenance.js +224 -0
- package/dist/zzzzz_probe/image_provenance.js.map +1 -0
- package/dist/zzzzz_probe/index.d.ts +22 -0
- package/dist/zzzzz_probe/index.d.ts.map +1 -0
- package/dist/zzzzz_probe/index.js +20 -0
- package/dist/zzzzz_probe/index.js.map +1 -0
- package/dist/zzzzz_probe/os_polygraph.d.ts +16 -0
- package/dist/zzzzz_probe/os_polygraph.d.ts.map +1 -0
- package/dist/zzzzz_probe/os_polygraph.js +43 -0
- package/dist/zzzzz_probe/os_polygraph.js.map +1 -0
- package/dist/zzzzz_probe/types.d.ts +101 -0
- package/dist/zzzzz_probe/types.d.ts.map +1 -0
- package/dist/zzzzz_probe/types.js +23 -0
- package/dist/zzzzz_probe/types.js.map +1 -0
- 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":"
|
|
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"}
|