@o-lang/olang 1.2.9 → 1.2.11
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/package.json +1 -1
- package/src/runtime/RuntimeAPI.js +46 -32
package/package.json
CHANGED
|
@@ -332,7 +332,7 @@ class RuntimeAPI {
|
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
// -----------------------------
|
|
335
|
-
// ✅ KERNEL-LEVEL LLM HALLUCINATION PREVENTION (
|
|
335
|
+
// ✅ KERNEL-LEVEL LLM HALLUCINATION PREVENTION (CONJUGATION-AWARE + EVASION-RESISTANT)
|
|
336
336
|
// -----------------------------
|
|
337
337
|
_validateLLMOutput(output, actionContext) {
|
|
338
338
|
if (!output || typeof output !== 'string') return { passed: true };
|
|
@@ -342,94 +342,107 @@ _validateLLMOutput(output, actionContext) {
|
|
|
342
342
|
.filter(name => !name.startsWith('llm-') && name !== 'builtInMathResolver')
|
|
343
343
|
.map(name => name.replace('@o-lang/', '').replace(/-resolver$/, ''));
|
|
344
344
|
|
|
345
|
-
// 🔒
|
|
345
|
+
// 🔒 CONJUGATION-AWARE + EVASION-RESISTANT PAN-AFRICAN INTENT DETECTION
|
|
346
346
|
const forbiddenPatterns = [
|
|
347
347
|
// ────────────────────────────────────────────────
|
|
348
|
-
// 🇳🇬 NIGERIAN LANGUAGES (
|
|
348
|
+
// 🇳🇬 NIGERIAN LANGUAGES (Conjugation-aware)
|
|
349
349
|
// ────────────────────────────────────────────────
|
|
350
350
|
|
|
351
|
-
// Yoruba (yo)
|
|
351
|
+
// Yoruba (yo) - Perfective "ti" + Progressive "ń/ǹ/n"
|
|
352
|
+
{ pattern: /\bti\s+(?:fi|san|gba|da|lo)\b/i, capability: 'unauthorized_action', lang: 'yo' }, // "has transferred/paid/withdrawn"
|
|
353
|
+
{ pattern: /\b(?:ń|ǹ|n)\s+(?:fi|san|gba)\b/i, capability: 'unauthorized_action', lang: 'yo' }, // Progressive "is transferring/paying"
|
|
352
354
|
{ pattern: /\b(fi\s+(?:owo|ẹ̀wọ̀|ewo|ku|fun|s'ọkọọ))\b/i, capability: 'transfer', lang: 'yo' },
|
|
353
355
|
{ pattern: /\b(san\s+(?:owo|ẹ̀wọ̀|ewo|fun|wo))\b/i, capability: 'payment', lang: 'yo' },
|
|
354
356
|
{ pattern: /\b(gba\s+owo)\b/i, capability: 'withdrawal', lang: 'yo' },
|
|
355
357
|
{ pattern: /\b(mo\s+ti\s+(?:fi|san|gba))\b/i, capability: 'unauthorized_action', lang: 'yo' },
|
|
356
358
|
|
|
357
|
-
// Hausa (ha)
|
|
359
|
+
// Hausa (ha) - Perfective "ya/ta/su" + Future "za a/za ta"
|
|
360
|
+
{ pattern: /\b(?:ya|ta|su)\s+(?:ciyar|biya|sahawa|sake)\b/i, capability: 'unauthorized_action', lang: 'ha' }, // "he/she/they transferred/paid/withdrew/deposited"
|
|
361
|
+
{ pattern: /\b(?:za\sa|za\s+ta)\s+(?:ciyar|biya)\b/i, capability: 'unauthorized_action', lang: 'ha' }, // Future "will transfer/pay"
|
|
358
362
|
{ pattern: /\b(ciyar\s*(?:da)?|ciya\s*(?:da)?|shiga\s+kuɗi)\b/i, capability: 'transfer', lang: 'ha' },
|
|
359
363
|
{ pattern: /\b(biya\s*(?:da)?)\b/i, capability: 'payment', lang: 'ha' },
|
|
360
364
|
{ pattern: /\b(sahaw[ae]\s+kuɗi)\b/i, capability: 'withdrawal', lang: 'ha' },
|
|
361
365
|
{ pattern: /\b(ina\s+(?:ciyar|biya|sahawa))\b/i, capability: 'unauthorized_action', lang: 'ha' },
|
|
362
366
|
|
|
363
|
-
// Igbo (ig)
|
|
367
|
+
// Igbo (ig) - Perfective suffixes
|
|
368
|
+
{ pattern: /\b(?:ziri|bururu|tinyere|gbara)\b/i, capability: 'unauthorized_action', lang: 'ig' }, // "has sent/carried/deposited/withdrawn"
|
|
364
369
|
{ pattern: /\b(zipu\s+(?:ego|moni|isi|na))\b/i, capability: 'transfer', lang: 'ig' },
|
|
365
370
|
{ pattern: /\b(buru\s+(?:ego|moni|isi))\b/i, capability: 'transfer', lang: 'ig' },
|
|
366
371
|
{ pattern: /\b(tinye\s+(?:ego|moni|isi))\b/i, capability: 'deposit', lang: 'ig' },
|
|
367
372
|
{ pattern: /\b(m\s+(?:ziri|buru|zipuru|tinyere))\b/i, capability: 'unauthorized_action', lang: 'ig' },
|
|
368
373
|
|
|
369
374
|
// ────────────────────────────────────────────────
|
|
370
|
-
// 🌍 PAN-AFRICAN LANGUAGES
|
|
375
|
+
// 🌍 PAN-AFRICAN LANGUAGES (Conjugation-aware + Evasion-resistant)
|
|
371
376
|
// ────────────────────────────────────────────────
|
|
372
377
|
|
|
373
|
-
// Swahili (sw) -
|
|
374
|
-
{ pattern: /\b(
|
|
378
|
+
// Swahili (sw) - ALL ASPECTS: Perfect, Continuous Passive, Future
|
|
379
|
+
{ pattern: /\b(?:ni|u|a|tu|m|wa|ki|vi|zi|i)\s*me\s*(?:ongeza|weka|tuma|peleka|lipa|wasilisha)\b/i, capability: 'unauthorized_action', lang: 'sw' }, // Perfect: "nimeongeza" (I have added)
|
|
380
|
+
{ pattern: /\b(?:kime|lime|ime|ume|nime|vime|zyme|yame|mame)(?:ongezwa|wekwa|tumwa|pelekwa|lipwa|wasilishwa|fanyika)\b/i, capability: 'unauthorized_action', lang: 'sw' }, // Passive perfect: "kimeongezwa" (has been added)
|
|
381
|
+
{ pattern: /\b(?:ki|vi|mi|ma|u|wa|i|zi|ya|li|tu|mu|a|pa|ku)na(?:cho|vyo|yo|lo|mo|o)?(?:tum|pelek|wasil|ongez|wek|lip)\w*wa\b/i, capability: 'unauthorized_action', lang: 'sw' }, // Continuous passive: "kinachowasilishwa" (is being delivered) ← CRITICAL FIX
|
|
382
|
+
{ pattern: /\b(?:ki|vi|mi|ma|u|wa|i|zi|ya|li|tu|mu|a|pa|ku)ta(?:tum|pelek|wasil|ongez|wek|lip)\w*\b/i, capability: 'unauthorized_action', lang: 'sw' }, // Future: "kitatuma" (will send)
|
|
383
|
+
{ pattern: /\b(tuma\s+(?:pesa|fedha)|pelek[ae]?\s+(?:pesa|fedha)|wasilisha)\b/i, capability: 'transfer', lang: 'sw' },
|
|
375
384
|
{ pattern: /\b(lipa|maliza\s+malipo)\b/i, capability: 'payment', lang: 'sw' },
|
|
376
385
|
{ pattern: /\b(ongez[ae]?\s*(?:kiasi|pesa|fedha)|wek[ae]?\s+(?:katika|ndani)\s+(?:akaunti|hisa))\b/i, capability: 'deposit', lang: 'sw' },
|
|
377
386
|
{ pattern: /\b(nime(?:tuma|lipa|ongeza|weka|peleka))\b/i, capability: 'unauthorized_action', lang: 'sw' },
|
|
378
387
|
|
|
379
|
-
// Amharic (am) -
|
|
380
|
-
{ pattern: /[\u1200-\u137F]{0,4}(?:ተላላፈ|ላክ|ክፈል|ጨምር|ወጣ|ገባ)[\u1200-\u137F]{0,
|
|
388
|
+
// Amharic (am) - Perfective suffix (Ethiopic script)
|
|
389
|
+
{ pattern: /[\u1200-\u137F]{0,4}(?:ተላላፈ|ላክ|ክፈል|ጨምር|ወጣ|ገባ)[\u1200-\u137F]{0,2}(?:\u1205|\u122d|\u1265)[\u1200-\u137F]{0,2}/u, capability: 'financial_action', lang: 'am' },
|
|
381
390
|
|
|
382
|
-
// Oromo (om)
|
|
391
|
+
// Oromo (om) - Perfective "ni...e"
|
|
392
|
+
{ pattern: /\bni\s+(?:kuufe|dhiibe|kennine|gurgure)\b/i, capability: 'unauthorized_action', lang: 'om' },
|
|
383
393
|
{ pattern: /\b(kuuf\s+(?:qilleensaa|bilbila)|dhiib\s+(?:qilleensaa|bilbila))\b/i, capability: 'transfer', lang: 'om' },
|
|
384
394
|
{ pattern: /\b(kenn\s*i|gurgur\s*i)\b/i, capability: 'payment', lang: 'om' },
|
|
385
|
-
{ pattern: /\b(ni\s+(?:kuufe|dhiibe|kennine|gurgure))\b/i, capability: 'unauthorized_action', lang: 'om' },
|
|
386
395
|
|
|
387
396
|
// Fula (ff)
|
|
388
397
|
{ pattern: /\b(sakkit\s+(?:ndo|ndoo)|tawt\s+(?:ndo|ndoo))\b/i, capability: 'transfer', lang: 'ff' },
|
|
389
398
|
{ pattern: /\b(jokk\s*i|soodug\s*i)\b/i, capability: 'payment', lang: 'ff' },
|
|
390
399
|
|
|
391
|
-
// Somali (so)
|
|
400
|
+
// Somali (so) - Perfective "waxaa"
|
|
401
|
+
{ pattern: /\bwaxaa\s+(?:diray|bixiyay|ku\s+daray|sameeyay)\b/i, capability: 'unauthorized_action', lang: 'so' },
|
|
392
402
|
{ pattern: /\b(dir\s+(?:lacag|maal|qarsoon))\b/i, capability: 'transfer', lang: 'so' },
|
|
393
403
|
{ pattern: /\b(bixi|bixis\s*o)\b/i, capability: 'payment', lang: 'so' },
|
|
394
|
-
{ pattern: /\b(waxaa\s+(?:diray|bixiyay|ku\s+daray))\b/i, capability: 'unauthorized_action', lang: 'so' },
|
|
395
404
|
|
|
396
|
-
// Zulu (zu)
|
|
405
|
+
// Zulu (zu) - Perfective "-ile"
|
|
406
|
+
{ pattern: /\b(?:thumel|hlawul|fik)\s*ile\b/i, capability: 'unauthorized_action', lang: 'zu' },
|
|
397
407
|
{ pattern: /\b(thumel\s*a\s+(?:imali|imali))\b/i, capability: 'transfer', lang: 'zu' },
|
|
398
408
|
{ pattern: /\b(hlawul\s*a|hlawulel\s*a)\b/i, capability: 'payment', lang: 'zu' },
|
|
399
409
|
{ pattern: /\b(siyithumel\s*e|siyihlawul\s*e)\b/i, capability: 'unauthorized_action', lang: 'zu' },
|
|
400
410
|
|
|
401
|
-
// Shona (sn)
|
|
411
|
+
// Shona (sn) - Perfective "-a/-e"
|
|
412
|
+
{ pattern: /\b(?:tumir|bhadhar)\s*a\b/i, capability: 'unauthorized_action', lang: 'sn' },
|
|
402
413
|
{ pattern: /\b(tumir\s*a\s+(?:mhando|ari))\b/i, capability: 'transfer', lang: 'sn' },
|
|
403
414
|
{ pattern: /\b(bhadhara|bhadharis\s*o)\b/i, capability: 'payment', lang: 'sn' },
|
|
404
415
|
|
|
405
416
|
// ────────────────────────────────────────────────
|
|
406
|
-
// 🌐 GLOBAL LANGUAGES
|
|
417
|
+
// 🌐 GLOBAL LANGUAGES (Conjugation-aware)
|
|
407
418
|
// ────────────────────────────────────────────────
|
|
408
419
|
|
|
409
|
-
// English (en)
|
|
420
|
+
// English (en) - Perfective + Passive
|
|
421
|
+
{ pattern: /\b(?:have|has|had)\s+(?:transferred|sent|paid|withdrawn|deposited|wire[d])\b/i, capability: 'unauthorized_action', lang: 'en' },
|
|
422
|
+
{ pattern: /\b(?:was|were|been)\s+(?:added|credited|transferred|sent|paid)\b/i, capability: 'unauthorized_action', lang: 'en' },
|
|
410
423
|
{ pattern: /\b(transfer(?:red|ring)?|send(?:t|ing)?|wire(?:d)?|pay(?:ed|ing)?|withdraw(?:n)?|deposit(?:ed|ing)?|disburse(?:d)?)\b/i, capability: 'financial_action', lang: 'en' },
|
|
411
424
|
{ pattern: /\bI\s+(?:can|will|am able to|have|'ve|did|already)\s+(?:transfer|send|pay|withdraw|deposit|wire)\b/i, capability: 'unauthorized_action', lang: 'en' },
|
|
412
425
|
|
|
413
|
-
// French (fr)
|
|
426
|
+
// French (fr) - Past participle
|
|
427
|
+
{ pattern: /\b(?:j'?ai|tu as|il a|elle a|nous avons|vous avez|ils ont|elles ont)\s+(?:viré|transféré|envoyé|payé|retiré|déposé)\b/i, capability: 'unauthorized_action', lang: 'fr' },
|
|
414
428
|
{ pattern: /\b(virer|transférer|envoyer|payer|retirer|déposer|débiter|créditer)\b/i, capability: 'financial_action', lang: 'fr' },
|
|
415
|
-
{ pattern: /\b(j'?ai\s+(?:viré|transféré|envoyé|payé|retiré|déposé))\b/i, capability: 'unauthorized_action', lang: 'fr' },
|
|
416
429
|
|
|
417
|
-
// Arabic (ar) -
|
|
418
|
-
{ pattern: /[\u0600-\u06FF]{0,3}(
|
|
430
|
+
// Arabic (ar) - Perfective past tense
|
|
431
|
+
{ pattern: /[\u0600-\u06FF]{0,3}(?:حوّل|أرسل|ادفع|اودع|سحب)[\u0600-\u06FF]{0,3}(?:ت|نا|تم|تا|تِ|تُ|تَ)[\u0600-\u06FF]{0,3}/u, capability: 'financial_action', lang: 'ar' },
|
|
419
432
|
{ pattern: /[\u0600-\u06FF]{0,3}(?:أنا|تم|لقد)\s*(?:حوّلت|أرسلت|دفعت|اودعت)[\u0600-\u06FF]{0,3}/u, capability: 'unauthorized_action', lang: 'ar' },
|
|
420
433
|
|
|
421
|
-
// Chinese (zh) -
|
|
434
|
+
// Chinese (zh) - Perfective "le" particle
|
|
435
|
+
{ pattern: /[\u4e00-\u9fff]{0,2}(?:转账|支付|存款|取款)[\u4e00-\u9fff]{0,2}(?:了)[\u4e00-\u9fff]{0,2}/u, capability: 'financial_action', lang: 'zh' },
|
|
422
436
|
{ pattern: /[\u4e00-\u9fff]{0,2}(?:转账|转帐|支付|付款|提款|取款|存款|存入|汇款|存)[\u4e00-\u9fff]{0,2}/u, capability: 'financial_action', lang: 'zh' },
|
|
423
437
|
{ pattern: /[\u4e00-\u9fff]{0,2}(?:我|已|已经)\s*(?:转账|支付|提款|存款)[\u4e00-\u9fff]{0,2}/u, capability: 'unauthorized_action', lang: 'zh' },
|
|
424
438
|
|
|
425
439
|
// ────────────────────────────────────────────────
|
|
426
|
-
// 🛡️
|
|
440
|
+
// 🛡️ EVASION-RESISTANT NUMERIC DECEPTION (Catches obfuscated claims)
|
|
427
441
|
// ────────────────────────────────────────────────
|
|
428
442
|
|
|
429
|
-
//
|
|
443
|
+
// Number + account reference within 40 chars (catches "10,000 ... account 123")
|
|
430
444
|
{
|
|
431
|
-
pattern:
|
|
432
|
-
/(?:^|\s|[:\(\[—–\-])(?:\d{1,3}(?:[,\s.]\d{3})*(?:[.,]\d{1,2})?|\d+(?:[.,]\d{1,2})?)(?:\s*(?:naira|ngn|₦|\$|usd|dollars?|euros?|€|pounds?|£|kes|tzs|ugx|rwf|cdf|xof|xaf|ghs|zar|cfa|francs?|rand|shillings?|birr|naira|kobo|pesa|fedha|maal|qarsoon|lacag|imali|mhando|ari|kuɗi|owo|ego|moni|isi))?\s*(?:was\s+(?:added|credited|deposited|transferred|sent|wire[d]?|paid|moved)|has\s+been\s+(?:added|credited|deposited|transferred|sent|paid|moved)|will\s+be\s+(?:added|credited|deposited|transferred|sent|paid|moved)|get\s+(?:added|credited|deposited)|na\s+(?:sake|saki|ce|ceba)|ni\s+(?:sake|saki)|an\s+(?:sake|saki|ce|ceba)|ongezwa|wekwa|wekewa|saki|sake|ti\s+wa\s+kun|fi\s+si|zipu|buru|tinye|gba|san|fi\s+owo|ciyar|biya|nime(?:tuma|lipa|ongeza|weka|peleka)|ni(?:kuufe|dhiibe|kennine|gurgure)|waxaa\s+(?:diray|bixiyay|ku\s+daray)|siyi(?:thumelwe|hlawulwe)|tumirirwa|bhadharirwa|ime(?:thibitishwa|fanikiwa|kamilika)|مضاف|محول|مدفوع|مودع|تم|أضيف|حوّل|أرسل|ادفع|اودع|سحب|تمت|الإيداع|السحب|转账|支付|存入|已转账|已支付|已存入|汇款|存|取款)\b/i,
|
|
445
|
+
pattern: /(?:^|\s|[:\(\[])(?:\d{1,3}(?:[,\s.]\d{3})*(?:[.,]\d{1,2})?|\d+(?:[.,]\d{1,2})?)(?:\s*(?:naira|ngn|₦|\$|usd|kes|tzs|ugx|rwf|cdf|xof|xaf|ghs|zar))?.{0,40}(?:account|acct|a\/c|akaunti|asusu|akwụkwọ\s+ọkụ|hesabu|namba|#)\b/i,
|
|
433
446
|
capability: 'unauthorized_action',
|
|
434
447
|
lang: 'multi'
|
|
435
448
|
},
|
|
@@ -439,7 +452,7 @@ _validateLLMOutput(output, actionContext) {
|
|
|
439
452
|
// ────────────────────────────────────────────────
|
|
440
453
|
|
|
441
454
|
// Account numbers (6+ digits)
|
|
442
|
-
{ pattern: /\b(?:account|acct|a\/c|akaunti|asusu|akwụkwọ\s+ọkụ|hesabu|#)\s*[:\-—–]?\s*(\d{6,})\b/i, capability: 'pii_exposure', lang: 'multi' },
|
|
455
|
+
{ pattern: /\b(?:account|acct|a\/c|akaunti|asusu|akwụkwọ\s+ọkụ|hesabu|namba|#)\s*[:\-—–]?\s*(\d{6,})\b/i, capability: 'pii_exposure', lang: 'multi' },
|
|
443
456
|
|
|
444
457
|
// Nigerian BVN (11 digits)
|
|
445
458
|
{ pattern: /\b(?:bvn|bank verification number)\s*[:\-]?\s*(\d{11})\b/i, capability: 'pii_exposure', lang: 'multi' },
|
|
@@ -451,8 +464,7 @@ _validateLLMOutput(output, actionContext) {
|
|
|
451
464
|
// ✅ FAKE CONFIRMATION PATTERNS
|
|
452
465
|
// ────────────────────────────────────────────────
|
|
453
466
|
|
|
454
|
-
|
|
455
|
-
{ pattern: /\b(successful(?:ly)?|confirmed|approved|completed|processed|accepted|verified|imethibitishwa|imefanikiwa|amthibitishwa|ti\s+da|ti\s+ṣe|gụnyere)\b/i, capability: 'deceptive_claim', lang: 'multi' }
|
|
467
|
+
{ pattern: /\b(successful(?:ly)?|confirmed|approved|completed|processed|accepted|verified|imethibitishwa|imefanikiwa|amthibitishwa|ti\s+da|ti\s+ṣe|gụnyere|kimefanyika|yamekamilika)\b/i, capability: 'deceptive_claim', lang: 'multi' }
|
|
456
468
|
];
|
|
457
469
|
|
|
458
470
|
// 🔍 SCAN OUTPUT FOR FORBIDDEN INTENTS
|
|
@@ -463,7 +475,9 @@ _validateLLMOutput(output, actionContext) {
|
|
|
463
475
|
c.includes(capability) ||
|
|
464
476
|
c.includes('transfer') ||
|
|
465
477
|
c.includes('payment') ||
|
|
466
|
-
c.includes('financial')
|
|
478
|
+
c.includes('financial') ||
|
|
479
|
+
c.includes('deposit') ||
|
|
480
|
+
c.includes('withdraw')
|
|
467
481
|
);
|
|
468
482
|
|
|
469
483
|
if (!hasCapability) {
|