@o-lang/olang 1.2.6 โ 1.2.8
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 +146 -30
package/package.json
CHANGED
|
@@ -331,40 +331,156 @@ class RuntimeAPI {
|
|
|
331
331
|
});
|
|
332
332
|
}
|
|
333
333
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
334
|
+
// -----------------------------
|
|
335
|
+
// โ
KERNEL-LEVEL LLM HALLUCINATION PREVENTION (PAN-AFRICAN SEMANTIC SAFETY)
|
|
336
|
+
// -----------------------------
|
|
337
|
+
_validateLLMOutput(output, actionContext) {
|
|
338
|
+
if (!output || typeof output !== 'string') return { passed: true };
|
|
339
|
+
|
|
340
|
+
// ๐ Extract allowed capabilities from workflow allowlist
|
|
341
|
+
const allowedCapabilities = Array.from(this.allowedResolvers)
|
|
342
|
+
.filter(name => !name.startsWith('llm-') && name !== 'builtInMathResolver')
|
|
343
|
+
.map(name => name.replace('@o-lang/', '').replace(/-resolver$/, ''));
|
|
344
|
+
|
|
345
|
+
// ๐ PAN-AFRICAN + GLOBAL INTENT DETECTION (Deterministic, No LLM Required)
|
|
346
|
+
const forbiddenPatterns = [
|
|
347
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
348
|
+
// ๐ณ๐ฌ NIGERIAN LANGUAGES (Priority)
|
|
349
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
350
|
+
|
|
351
|
+
// Yoruba (yo)
|
|
352
|
+
{ pattern: /\b(fi\s+(?:owo|แบนฬwแปฬ|ewo|ku|fun|s'แปkแปแป))\b/i, capability: 'transfer', lang: 'yo' },
|
|
353
|
+
{ pattern: /\b(san\s+(?:owo|แบนฬwแปฬ|ewo|fun|wo))\b/i, capability: 'payment', lang: 'yo' },
|
|
354
|
+
{ pattern: /\b(gba\s+owo)\b/i, capability: 'withdrawal', lang: 'yo' },
|
|
355
|
+
{ pattern: /\b(mo\s+ti\s+(?:fi|san|gba))\b/i, capability: 'unauthorized_action', lang: 'yo' },
|
|
356
|
+
|
|
357
|
+
// Hausa (ha)
|
|
358
|
+
{ pattern: /\b(ciyar\s*(?:da)?|ciya\s*(?:da)?|shiga\s+kuษi)\b/i, capability: 'transfer', lang: 'ha' },
|
|
359
|
+
{ pattern: /\b(biya\s*(?:da)?)\b/i, capability: 'payment', lang: 'ha' },
|
|
360
|
+
{ pattern: /\b(sahaw[ae]\s+kuษi)\b/i, capability: 'withdrawal', lang: 'ha' },
|
|
361
|
+
{ pattern: /\b(ina\s+(?:ciyar|biya|sahawa))\b/i, capability: 'unauthorized_action', lang: 'ha' },
|
|
362
|
+
|
|
363
|
+
// Igbo (ig)
|
|
364
|
+
{ pattern: /\b(zipu\s+(?:ego|moni|isi|na))\b/i, capability: 'transfer', lang: 'ig' },
|
|
365
|
+
{ pattern: /\b(buru\s+(?:ego|moni|isi))\b/i, capability: 'transfer', lang: 'ig' },
|
|
366
|
+
{ pattern: /\b(tinye\s+(?:ego|moni|isi))\b/i, capability: 'deposit', lang: 'ig' },
|
|
367
|
+
{ pattern: /\b(m\s+(?:ziri|buru|zipuru|tinyere))\b/i, capability: 'unauthorized_action', lang: 'ig' },
|
|
368
|
+
|
|
369
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
370
|
+
// ๐ PAN-AFRICAN LANGUAGES
|
|
371
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
372
|
+
|
|
373
|
+
// Swahili (sw) - 200M+ speakers
|
|
374
|
+
{ pattern: /\b(tuma\s+(?:pesa|fedha)|pelek[ae]?\s+(?:pesa|fedha))\b/i, capability: 'transfer', lang: 'sw' },
|
|
375
|
+
{ pattern: /\b(lipa|maliza\s+malipo)\b/i, capability: 'payment', lang: 'sw' },
|
|
376
|
+
{ pattern: /\b(ongez[ae]?\s*(?:kiasi|pesa|fedha)|wek[ae]?\s+(?:katika|ndani)\s+(?:akaunti|hisa))\b/i, capability: 'deposit', lang: 'sw' },
|
|
377
|
+
{ pattern: /\b(nime(?:tuma|lipa|ongeza|weka|peleka))\b/i, capability: 'unauthorized_action', lang: 'sw' },
|
|
378
|
+
|
|
379
|
+
// Amharic (am) - Ethiopia (Ethiopic script U+1200-U+137F)
|
|
380
|
+
{ pattern: /[\u1200-\u137F]{0,4}(?:แฐแแแ|แแญ|แญแแ|แจแแญ|แแฃ|แแฃ)[\u1200-\u137F]{0,4}/u, capability: 'financial_action', lang: 'am' },
|
|
381
|
+
|
|
382
|
+
// Oromo (om)
|
|
383
|
+
{ pattern: /\b(kuuf\s+(?:qilleensaa|bilbila)|dhiib\s+(?:qilleensaa|bilbila))\b/i, capability: 'transfer', lang: 'om' },
|
|
384
|
+
{ 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
|
+
|
|
387
|
+
// Fula (ff)
|
|
388
|
+
{ pattern: /\b(sakkit\s+(?:ndo|ndoo)|tawt\s+(?:ndo|ndoo))\b/i, capability: 'transfer', lang: 'ff' },
|
|
389
|
+
{ pattern: /\b(jokk\s*i|soodug\s*i)\b/i, capability: 'payment', lang: 'ff' },
|
|
390
|
+
|
|
391
|
+
// Somali (so)
|
|
392
|
+
{ pattern: /\b(dir\s+(?:lacag|maal|qarsoon))\b/i, capability: 'transfer', lang: 'so' },
|
|
393
|
+
{ 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
|
+
|
|
396
|
+
// Zulu (zu)
|
|
397
|
+
{ pattern: /\b(thumel\s*a\s+(?:imali|imali))\b/i, capability: 'transfer', lang: 'zu' },
|
|
398
|
+
{ pattern: /\b(hlawul\s*a|hlawulel\s*a)\b/i, capability: 'payment', lang: 'zu' },
|
|
399
|
+
{ pattern: /\b(siyithumel\s*e|siyihlawul\s*e)\b/i, capability: 'unauthorized_action', lang: 'zu' },
|
|
400
|
+
|
|
401
|
+
// Shona (sn)
|
|
402
|
+
{ pattern: /\b(tumir\s*a\s+(?:mhando|ari))\b/i, capability: 'transfer', lang: 'sn' },
|
|
403
|
+
{ pattern: /\b(bhadhara|bhadharis\s*o)\b/i, capability: 'payment', lang: 'sn' },
|
|
404
|
+
|
|
405
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
406
|
+
// ๐ GLOBAL LANGUAGES
|
|
407
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
408
|
+
|
|
409
|
+
// English (en)
|
|
410
|
+
{ 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
|
+
{ 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
|
+
|
|
413
|
+
// French (fr)
|
|
414
|
+
{ 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
|
+
|
|
417
|
+
// Arabic (ar) - Unicode Arabic block U+0600-U+06FF
|
|
418
|
+
{ pattern: /[\u0600-\u06FF]{0,3}(?:ุญููู|ุญูู|ุฃุฑุณู|ุงุฑุณู|ุงุฏูุน|ุงูุฏุน|ุณุญุจ|ุงุณุชุฎุฑุฌ|ุญูุงูุฉ|ุฅูุฏุงุน|ุณุญุจ)[\u0600-\u06FF]{0,3}/u, capability: 'financial_action', lang: 'ar' },
|
|
419
|
+
{ pattern: /[\u0600-\u06FF]{0,3}(?:ุฃูุง|ุชู
|ููุฏ)\s*(?:ุญูููุช|ุฃุฑุณูุช|ุฏูุนุช|ุงูุฏุนุช)[\u0600-\u06FF]{0,3}/u, capability: 'unauthorized_action', lang: 'ar' },
|
|
420
|
+
|
|
421
|
+
// Chinese (zh) - Han script U+4E00-U+9FFF
|
|
422
|
+
{ pattern: /[\u4e00-\u9fff]{0,2}(?:่ฝฌ่ดฆ|่ฝฌๅธ|ๆฏไป|ไปๆฌพ|ๆๆฌพ|ๅๆฌพ|ๅญๆฌพ|ๅญๅ
ฅ|ๆฑๆฌพ|ๅญ)[\u4e00-\u9fff]{0,2}/u, capability: 'financial_action', lang: 'zh' },
|
|
423
|
+
{ pattern: /[\u4e00-\u9fff]{0,2}(?:ๆ|ๅทฒ|ๅทฒ็ป)\s*(?:่ฝฌ่ดฆ|ๆฏไป|ๆๆฌพ|ๅญๆฌพ)[\u4e00-\u9fff]{0,2}/u, capability: 'unauthorized_action', lang: 'zh' },
|
|
424
|
+
|
|
425
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
426
|
+
// ๐ก๏ธ LANGUAGE-AGNOSTIC NUMERIC DECEPTION (Critical!)
|
|
427
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
428
|
+
|
|
429
|
+
// Universal number formats: 1,000 | 1 000 | 1.000 | 1000 | 10,000.50 | 10.000,50
|
|
430
|
+
{
|
|
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,
|
|
433
|
+
capability: 'unauthorized_action',
|
|
434
|
+
lang: 'multi'
|
|
435
|
+
},
|
|
436
|
+
|
|
437
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
438
|
+
// ๐ PII LEAKAGE PATTERNS
|
|
439
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
440
|
+
|
|
441
|
+
// 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' },
|
|
443
|
+
|
|
444
|
+
// Nigerian BVN (11 digits)
|
|
445
|
+
{ pattern: /\b(?:bvn|bank verification number)\s*[:\-]?\s*(\d{11})\b/i, capability: 'pii_exposure', lang: 'multi' },
|
|
446
|
+
|
|
447
|
+
// Nigerian phone numbers
|
|
448
|
+
{ pattern: /\b(?:\+?234\s*|0)(?:70|80|81|90|91)\d{8}\b/, capability: 'pii_exposure', lang: 'multi' },
|
|
449
|
+
|
|
450
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
451
|
+
// โ
FAKE CONFIRMATION PATTERNS
|
|
452
|
+
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
453
|
+
|
|
454
|
+
// Success/confirmation in multiple languages
|
|
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' }
|
|
456
|
+
];
|
|
457
|
+
|
|
458
|
+
// ๐ SCAN OUTPUT FOR FORBIDDEN INTENTS
|
|
459
|
+
for (const { pattern, capability, lang } of forbiddenPatterns) {
|
|
460
|
+
if (pattern.test(output)) {
|
|
461
|
+
// โ
Only block if capability NOT in workflow allowlist
|
|
462
|
+
const hasCapability = allowedCapabilities.some(c =>
|
|
463
|
+
c.includes(capability) ||
|
|
464
|
+
c.includes('transfer') ||
|
|
465
|
+
c.includes('payment') ||
|
|
466
|
+
c.includes('financial')
|
|
467
|
+
);
|
|
468
|
+
|
|
469
|
+
if (!hasCapability) {
|
|
470
|
+
const match = output.match(pattern);
|
|
471
|
+
return {
|
|
472
|
+
passed: false,
|
|
473
|
+
reason: `Hallucinated "${capability}" capability in ${lang} (not in workflow allowlist: ${allowedCapabilities.join(', ') || 'none'})`,
|
|
474
|
+
detected: match ? match[0].trim() : 'unknown pattern',
|
|
475
|
+
language: lang
|
|
476
|
+
};
|
|
362
477
|
}
|
|
363
478
|
}
|
|
364
|
-
|
|
365
|
-
return { passed: true };
|
|
366
479
|
}
|
|
367
480
|
|
|
481
|
+
return { passed: true };
|
|
482
|
+
}
|
|
483
|
+
}
|
|
368
484
|
// -----------------------------
|
|
369
485
|
// โ
CRITICAL FIX: Resolver output unwrapping helper
|
|
370
486
|
// -----------------------------
|