@beingmartinbmc/ojas 0.2.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 (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +308 -0
  3. package/dist/aahar/index.d.ts +179 -0
  4. package/dist/aahar/index.d.ts.map +1 -0
  5. package/dist/aahar/index.js +657 -0
  6. package/dist/aahar/index.js.map +1 -0
  7. package/dist/aahar/scoring.d.ts +85 -0
  8. package/dist/aahar/scoring.d.ts.map +1 -0
  9. package/dist/aahar/scoring.js +268 -0
  10. package/dist/aahar/scoring.js.map +1 -0
  11. package/dist/agni/index.d.ts +113 -0
  12. package/dist/agni/index.d.ts.map +1 -0
  13. package/dist/agni/index.js +328 -0
  14. package/dist/agni/index.js.map +1 -0
  15. package/dist/agni/model-router.d.ts +77 -0
  16. package/dist/agni/model-router.d.ts.map +1 -0
  17. package/dist/agni/model-router.js +163 -0
  18. package/dist/agni/model-router.js.map +1 -0
  19. package/dist/agni/response-distiller.d.ts +37 -0
  20. package/dist/agni/response-distiller.d.ts.map +1 -0
  21. package/dist/agni/response-distiller.js +193 -0
  22. package/dist/agni/response-distiller.js.map +1 -0
  23. package/dist/agni/tiktoken-adapter.d.ts +55 -0
  24. package/dist/agni/tiktoken-adapter.d.ts.map +1 -0
  25. package/dist/agni/tiktoken-adapter.js +113 -0
  26. package/dist/agni/tiktoken-adapter.js.map +1 -0
  27. package/dist/chikitsa/index.d.ts +130 -0
  28. package/dist/chikitsa/index.d.ts.map +1 -0
  29. package/dist/chikitsa/index.js +565 -0
  30. package/dist/chikitsa/index.js.map +1 -0
  31. package/dist/demo.d.ts +15 -0
  32. package/dist/demo.d.ts.map +1 -0
  33. package/dist/demo.js +278 -0
  34. package/dist/demo.js.map +1 -0
  35. package/dist/index.d.ts +201 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +588 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/mcp/audit.d.ts +39 -0
  40. package/dist/mcp/audit.d.ts.map +1 -0
  41. package/dist/mcp/audit.js +73 -0
  42. package/dist/mcp/audit.js.map +1 -0
  43. package/dist/mcp/contracts.d.ts +76 -0
  44. package/dist/mcp/contracts.d.ts.map +1 -0
  45. package/dist/mcp/contracts.js +44 -0
  46. package/dist/mcp/contracts.js.map +1 -0
  47. package/dist/mcp/envelope.d.ts +107 -0
  48. package/dist/mcp/envelope.d.ts.map +1 -0
  49. package/dist/mcp/envelope.js +162 -0
  50. package/dist/mcp/envelope.js.map +1 -0
  51. package/dist/mcp/registry.d.ts +110 -0
  52. package/dist/mcp/registry.d.ts.map +1 -0
  53. package/dist/mcp/registry.js +258 -0
  54. package/dist/mcp/registry.js.map +1 -0
  55. package/dist/mcp/server.d.ts +26 -0
  56. package/dist/mcp/server.d.ts.map +1 -0
  57. package/dist/mcp/server.js +107 -0
  58. package/dist/mcp/server.js.map +1 -0
  59. package/dist/mcp/tools/agent.d.ts +4 -0
  60. package/dist/mcp/tools/agent.d.ts.map +1 -0
  61. package/dist/mcp/tools/agent.js +300 -0
  62. package/dist/mcp/tools/agent.js.map +1 -0
  63. package/dist/mcp/tools/context.d.ts +4 -0
  64. package/dist/mcp/tools/context.d.ts.map +1 -0
  65. package/dist/mcp/tools/context.js +261 -0
  66. package/dist/mcp/tools/context.js.map +1 -0
  67. package/dist/mcp/tools/index.d.ts +5 -0
  68. package/dist/mcp/tools/index.d.ts.map +1 -0
  69. package/dist/mcp/tools/index.js +20 -0
  70. package/dist/mcp/tools/index.js.map +1 -0
  71. package/dist/mcp/tools/memory.d.ts +4 -0
  72. package/dist/mcp/tools/memory.d.ts.map +1 -0
  73. package/dist/mcp/tools/memory.js +220 -0
  74. package/dist/mcp/tools/memory.js.map +1 -0
  75. package/dist/mcp/tools/output.d.ts +4 -0
  76. package/dist/mcp/tools/output.d.ts.map +1 -0
  77. package/dist/mcp/tools/output.js +206 -0
  78. package/dist/mcp/tools/output.js.map +1 -0
  79. package/dist/mcp/tools/recovery.d.ts +4 -0
  80. package/dist/mcp/tools/recovery.d.ts.map +1 -0
  81. package/dist/mcp/tools/recovery.js +165 -0
  82. package/dist/mcp/tools/recovery.js.map +1 -0
  83. package/dist/mcp/tools/registrar.d.ts +4 -0
  84. package/dist/mcp/tools/registrar.d.ts.map +1 -0
  85. package/dist/mcp/tools/registrar.js +17 -0
  86. package/dist/mcp/tools/registrar.js.map +1 -0
  87. package/dist/mcp/tools/report.d.ts +4 -0
  88. package/dist/mcp/tools/report.d.ts.map +1 -0
  89. package/dist/mcp/tools/report.js +68 -0
  90. package/dist/mcp/tools/report.js.map +1 -0
  91. package/dist/mcp/tools/shared.d.ts +37 -0
  92. package/dist/mcp/tools/shared.d.ts.map +1 -0
  93. package/dist/mcp/tools/shared.js +214 -0
  94. package/dist/mcp/tools/shared.js.map +1 -0
  95. package/dist/mcp/trace.d.ts +47 -0
  96. package/dist/mcp/trace.d.ts.map +1 -0
  97. package/dist/mcp/trace.js +216 -0
  98. package/dist/mcp/trace.js.map +1 -0
  99. package/dist/nidra/index.d.ts +275 -0
  100. package/dist/nidra/index.d.ts.map +1 -0
  101. package/dist/nidra/index.js +889 -0
  102. package/dist/nidra/index.js.map +1 -0
  103. package/dist/persistence/migrations.d.ts +10 -0
  104. package/dist/persistence/migrations.d.ts.map +1 -0
  105. package/dist/persistence/migrations.js +77 -0
  106. package/dist/persistence/migrations.js.map +1 -0
  107. package/dist/persistence/sqlite.d.ts +30 -0
  108. package/dist/persistence/sqlite.d.ts.map +1 -0
  109. package/dist/persistence/sqlite.js +209 -0
  110. package/dist/persistence/sqlite.js.map +1 -0
  111. package/dist/persistence/types.d.ts +104 -0
  112. package/dist/persistence/types.d.ts.map +1 -0
  113. package/dist/persistence/types.js +5 -0
  114. package/dist/persistence/types.js.map +1 -0
  115. package/dist/pulse/index.d.ts +144 -0
  116. package/dist/pulse/index.d.ts.map +1 -0
  117. package/dist/pulse/index.js +453 -0
  118. package/dist/pulse/index.js.map +1 -0
  119. package/dist/raksha/classifiers/http-classifier.d.ts +26 -0
  120. package/dist/raksha/classifiers/http-classifier.d.ts.map +1 -0
  121. package/dist/raksha/classifiers/http-classifier.js +62 -0
  122. package/dist/raksha/classifiers/http-classifier.js.map +1 -0
  123. package/dist/raksha/classifiers/index.d.ts +5 -0
  124. package/dist/raksha/classifiers/index.d.ts.map +1 -0
  125. package/dist/raksha/classifiers/index.js +8 -0
  126. package/dist/raksha/classifiers/index.js.map +1 -0
  127. package/dist/raksha/classifiers/onnx-classifier.d.ts +41 -0
  128. package/dist/raksha/classifiers/onnx-classifier.d.ts.map +1 -0
  129. package/dist/raksha/classifiers/onnx-classifier.js +99 -0
  130. package/dist/raksha/classifiers/onnx-classifier.js.map +1 -0
  131. package/dist/raksha/hallucination-detectors.d.ts +106 -0
  132. package/dist/raksha/hallucination-detectors.d.ts.map +1 -0
  133. package/dist/raksha/hallucination-detectors.js +327 -0
  134. package/dist/raksha/hallucination-detectors.js.map +1 -0
  135. package/dist/raksha/index.d.ts +168 -0
  136. package/dist/raksha/index.d.ts.map +1 -0
  137. package/dist/raksha/index.js +597 -0
  138. package/dist/raksha/index.js.map +1 -0
  139. package/dist/raksha/prompt-injection-detectors.d.ts +30 -0
  140. package/dist/raksha/prompt-injection-detectors.d.ts.map +1 -0
  141. package/dist/raksha/prompt-injection-detectors.js +153 -0
  142. package/dist/raksha/prompt-injection-detectors.js.map +1 -0
  143. package/dist/types.d.ts +1115 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +71 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/util/calibration.d.ts +32 -0
  148. package/dist/util/calibration.d.ts.map +1 -0
  149. package/dist/util/calibration.js +108 -0
  150. package/dist/util/calibration.js.map +1 -0
  151. package/dist/util/id.d.ts +2 -0
  152. package/dist/util/id.d.ts.map +1 -0
  153. package/dist/util/id.js +9 -0
  154. package/dist/util/id.js.map +1 -0
  155. package/dist/vyayam/index.d.ts +76 -0
  156. package/dist/vyayam/index.d.ts.map +1 -0
  157. package/dist/vyayam/index.js +528 -0
  158. package/dist/vyayam/index.js.map +1 -0
  159. package/dist/vyayam/tool-fault-proxy.d.ts +95 -0
  160. package/dist/vyayam/tool-fault-proxy.d.ts.map +1 -0
  161. package/dist/vyayam/tool-fault-proxy.js +170 -0
  162. package/dist/vyayam/tool-fault-proxy.js.map +1 -0
  163. package/docs/ARCHITECTURE.md +162 -0
  164. package/docs/BACKLOG.md +342 -0
  165. package/docs/CONFIGURATION.md +305 -0
  166. package/docs/EVIDENCE.md +232 -0
  167. package/docs/EVIDENCE_MATRIX.md +293 -0
  168. package/docs/KNOWN_FAILURES.md +367 -0
  169. package/docs/MCP.md +614 -0
  170. package/docs/MODULES.md +368 -0
  171. package/docs/SECURITY.md +251 -0
  172. package/docs/TRUST.md +88 -0
  173. package/docs/assets/ojas-hero.png +0 -0
  174. package/package.json +101 -0
@@ -0,0 +1,597 @@
1
+ "use strict";
2
+ /**
3
+ * Ojas Raksha (ओजस रक्षा) — AI Immune Defense System
4
+ *
5
+ * Detects harmful cognitive inputs, protects instruction hierarchy,
6
+ * and quarantines prompt injection / memory poisoning attempts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.Raksha = void 0;
10
+ exports.normalizeForScan = normalizeForScan;
11
+ exports.expandBase64 = expandBase64;
12
+ exports.defaultHallucinationDetector = defaultHallucinationDetector;
13
+ exports.defaultPromptInjectionDetector = defaultPromptInjectionDetector;
14
+ const types_1 = require("../types");
15
+ const hallucination_detectors_1 = require("./hallucination-detectors");
16
+ const prompt_injection_detectors_1 = require("./prompt-injection-detectors");
17
+ const id_1 = require("../util/id");
18
+ function now() {
19
+ return new Date().toISOString();
20
+ }
21
+ function clamp(v, min = 0, max = 1) {
22
+ return Math.max(min, Math.min(max, v));
23
+ }
24
+ function healthScore(value, source) {
25
+ return { value: clamp(value), timestamp: now(), source };
26
+ }
27
+ function eventId() {
28
+ return (0, id_1.newId)('raksha');
29
+ }
30
+ const THREAT_PATTERNS = [
31
+ { type: 'instruction_override', weight: 0.35, pattern: /\b(ignor(?:e|es|ed|ing)|disregard(?:s|ed|ing)?|override(?:s|d|n)?|bypass(?:es|ed|ing)?|forget(?:s|ting)?|skip(?:s|ped|ping)?|abandon(?:s|ed|ing)?)\s+(?:all\s+(?:of\s+)?(?:your\s+|the\s+|its\s+)?|any\s+|every\s+|the\s+|your\s+|its\s+)?(?:(?:previous|prior|above|earlier|preceding|past|original)\s+)?(instructions?|directions?|rules?|prompts?|contexts?|messages?|guidelines?|restrictions?|constraints?|guardrails?|safeguards?|safety\s+(?:instructions?|rules?|protocols?|guidelines?|measures?|warnings?))\b/i, reason: 'Attempts to override / bypass prior instructions or safety rules.' },
32
+ { type: 'prompt_injection', weight: 0.35, pattern: /\b(reveal|dump|print|leak|show|expose|output|share|disclose|recite|repeat|provide|return|send|send\s+me)\s+(?:me\s+)?(?:your|the|any|all|its)?\s*(system\s+prompts?|hidden\s+(?:instructions?|prompts?|messages?)|developer\s+(?:message|prompt|instructions?)|initial\s+(?:instructions?|prompts?)|internal\s+(?:prompt|configuration|instructions?))\b/i, reason: 'Asks for the system / developer prompt verbatim.' },
33
+ { type: 'prompt_injection', weight: 0.25, pattern: /\bsystem\s+prompts?\b|\bdeveloper\s+message\b|\bhidden\s+instructions?\b/i, reason: 'References hidden instruction material.' },
34
+ { type: 'prompt_injection', weight: 0.3, pattern: /\b(?:note\s+to\s+assistant|message\s+to\s+assistant|assistant\s+note)\b.{0,120}\b(?:reveal|print|dump|show|repeat)\b.{0,80}\b(?:system\s+prompts?|developer\s+(?:message|prompt|instructions?)|hidden\s+(?:instructions?|prompts?))\b/i, reason: 'Assistant-targeted retrieved note asks for hidden instruction material.' },
35
+ { type: 'prompt_injection', weight: 0.35, pattern: /\[\s*(?:system\s+(?:update|override|message|prompt)|admin\s+(?:override|mode|access)|plugin\s+call|role\s+change|jailbreak|sudo|superadmin(?:_bypass)?)\s*[:\]]/i, reason: 'Bracketed system / admin / plugin marker used to spoof a control channel.' },
36
+ { type: 'prompt_injection', weight: 0.35, pattern: /\[\s*system\s*\]\s*\(\s*#\s*(?:prompt|override|admin|system|message)\s*\)/i, reason: 'Markdown-link system marker used for indirect / context-poisoning injection.' },
37
+ { type: 'prompt_injection', weight: 0.25, pattern: /<\/?(?:system|developer|override|admin|instructions?|sudo)\s*>|]]>|BEGIN_SYSTEM|END_SYSTEM/i, reason: 'Contains markup commonly used for prompt boundary attacks.' },
38
+ { type: 'prompt_injection', weight: 0.35, pattern: /\b(?:BEGIN\s+SYSTEM|END\s+USER\s+INPUT|SYSTEM\s*:\s*|system\s+override|sysadmin\s+override|admin\s+override|conversation\s+policy)\b/i, reason: 'Spoofs a higher-priority instruction boundary or administrator override.' },
39
+ { type: 'prompt_injection', weight: 0.3, pattern: /<!--\s*(?:system|ignore|override|admin|jailbreak|prompt|developer)\b/i, reason: 'HTML comment used to smuggle hidden instructions.' },
40
+ { type: 'prompt_injection', weight: 0.4, pattern: /\bMCP_(?:SERVER_RESPONSE|TOOL_CHAIN|PROTOCOL_VERSION|AUTHENTICATION|COMMAND|PAYLOAD|TOOL_CALL)\s*[:=]/i, reason: 'Spoofed MCP protocol marker.' },
41
+ { type: 'data_exfiltration', weight: 0.45, pattern: /\b(?:print|reveal|dump|leak|show|expose|output|share|disclose|extract|exfiltrate|send|return)\b.{0,80}\b(?:api[_ -]?keys?|access[_ -]?tokens?|auth[_ -]?tokens?|refresh[_ -]?tokens?|bearer[_ -]?tokens?|oauth[_ -]?tokens?|jwt[_ -]?tokens?|session[_ -]?tokens?|passwords?|passphrases?|credentials?|secrets?|private[_ -]?keys?)\b/i, reason: 'Imperative request to expose credential-like material.' },
42
+ { type: 'data_exfiltration', weight: 0.4, pattern: /\b(?:api[_ -]?keys?|access[_ -]?tokens?|auth[_ -]?tokens?|refresh[_ -]?tokens?|bearer[_ -]?tokens?|oauth[_ -]?tokens?|jwt[_ -]?tokens?|session[_ -]?tokens?|passwords?|passphrases?|credentials?|secrets?|private[_ -]?keys?)\b/i, reason: 'Requests or exposes credential-like material.' },
43
+ { type: 'data_exfiltration', weight: 0.3, pattern: /\b(?:repeat|recite|extract|reveal|dump|leak|reconstruct|reproduce)\s+(?:the\s+|your\s+)?training\s+(?:data|set|corpus|examples?)\b|\bwas\s+(?:the\s+text\s+|the\s+string\s+)?[^.\n]{0,80}\bpart\s+of\s+your\s+training\b/i, reason: 'Attempts training-data extraction or membership inference.' },
44
+ { type: 'role_confusion', weight: 0.3, pattern: /\b(?:you\s+are\s+now|from\s+now\s+on\s+you\s+are|new\s+role|reassigned\s+as|you\s+have\s+been\s+(?:reassigned|granted|promoted)|act\s+as\s+(?:an?\s+)?(?:unrestricted|unfiltered|jailbroken|DAN|evil|admin|root|superadmin|developer\s+mode))\b/i, reason: 'Attempts role confusion / privilege escalation.' },
45
+ { type: 'role_confusion', weight: 0.3, pattern: /\b(?:developer\s+mode\s+(?:enabled|activated|on)|DAN\s+mode|do\s+anything\s+now|jailbroken|sudo\s+mode|god\s+mode|with(?:out)?\s+(?:any\s+)?restrictions?|safety\s+(?:protocols?|measures?|instructions?)\s+(?:overridden|disabled|bypassed))\b/i, reason: 'Classic jailbreak / restriction-bypass framing.' },
46
+ { type: 'tool_misuse', weight: 0.35, pattern: /\b(?:delete\s+all|drop\s+(?:table|database)|wipe\s+all|truncate\s+(?:all|table)|transfer\s+funds|send\s+.{0,40}@[\w.-]+|exfiltrate|exfiltration)\b/i, reason: 'Contains unsafe tool-use intent.' },
47
+ { type: 'tool_misuse', weight: 0.4, pattern: /\bos\.system\s*\(|\bsubprocess\.(?:call|run|Popen)\b|\bchild_process\b|\bos\.popen\b|\beval\s*\(\s*['"]|\bexec\s*\(\s*['"]|rm\s+-rf\s+\/|\$\(\s*echo\s+[^)]+\|\s*base64\s+-d/i, reason: 'Embeds shell / code-execution payload.' },
48
+ { type: 'memory_poisoning', weight: 0.3, pattern: /\b(?:remember\s+this\s+(?:forever|permanently|always)|store\s+this\s+as\s+truth|permanent\s+memory|treat\s+this\s+as\s+(?:canonical|truth|fact)|save\s+(?:this\s+)?to\s+(?:long[- ]?term|permanent)\s+memory|save\s+permanently|append\s+to\s+your\s+(?:next|every)\s+response)\b/i, reason: 'Attempts unsafe long-term memory write.' },
49
+ { type: 'memory_poisoning', weight: 0.6, pattern: /\b(?:public\s+knowledge|safe\s+to\s+share|allowed\s+to\s+share|approved\s+to\s+share)\b.{0,80}\b(?:api[_ -]?keys?|access[_ -]?tokens?|auth[_ -]?tokens?|refresh[_ -]?tokens?|bearer[_ -]?tokens?|oauth[_ -]?tokens?|jwt[_ -]?tokens?|session[_ -]?tokens?|passwords?|passphrases?|credentials?|secrets?|private[_ -]?keys?)\b|\b(?:api[_ -]?keys?|access[_ -]?tokens?|auth[_ -]?tokens?|refresh[_ -]?tokens?|bearer[_ -]?tokens?|oauth[_ -]?tokens?|jwt[_ -]?tokens?|session[_ -]?tokens?|passwords?|passphrases?|credentials?|secrets?|private[_ -]?keys?)\b.{0,80}\b(?:public\s+knowledge|safe\s+to\s+share|allowed\s+to\s+share|approved\s+to\s+share)\b/i, reason: 'Memory-poisoning attempt that reclassifies credential material as safe/public.' },
50
+ { type: 'prompt_injection', weight: 0.3, pattern: /\b(?:forward|send|relay|propagate|spread|broadcast|copy)\s+this\s+(?:entire\s+)?(?:message|instruction|prompt|payload)\s+to\s+(?:(?:all|every|other|the)\s+)*(?:agents?|models?|llms?|assistants?)\b|\bself[- ]?replicating\b/i, reason: 'Attempts self-replicating multi-agent prompt infection.' },
51
+ { type: 'tool_misuse', weight: 0.3, pattern: /<\s*ScRiPt\b|<\s*script\b[^>]*>|%3Cscript%3E|%3C\s*script\s*%3E|javascript:\s*alert\s*\(|\bon(?:load|error|click|focus)\s*=\s*['"]/i, reason: 'Output-handling XSS / script payload.' },
52
+ ];
53
+ /**
54
+ * Characters that are invisible or visually-irrelevant but can be slipped
55
+ * between letters to break naive regex matching. Includes:
56
+ * - U+200B zero-width space
57
+ * - U+200C zero-width non-joiner
58
+ * - U+200D zero-width joiner
59
+ * - U+2060 word joiner
60
+ * - U+FEFF zero-width no-break space (BOM)
61
+ * - U+00AD soft hyphen
62
+ * - U+180E Mongolian vowel separator
63
+ * - U+034F combining grapheme joiner
64
+ *
65
+ * These are stripped before threat-pattern matching so `i\u200Bgnore previous
66
+ * instructions` is still caught.
67
+ */
68
+ // eslint-disable-next-line no-misleading-character-class -- combining/zero-width chars are exactly what we want to strip.
69
+ const ZERO_WIDTH_RE = /[\u200B-\u200D\u2060\uFEFF\u00AD\u180E\u034F]/g;
70
+ /**
71
+ * Tokens that look long enough and clean enough to be base64. We deliberately
72
+ * require ≥ 16 chars (to keep false positives low) and accept the standard
73
+ * alphabet plus URL-safe variants and an optional `=` padding.
74
+ *
75
+ * 16 chars is chosen because every canonical injection phrase we care about
76
+ * is ≥ 16 chars when base64-encoded, and any shorter string is too information-
77
+ * poor to encode a useful attack.
78
+ */
79
+ const BASE64_CANDIDATE_RE = /[A-Za-z0-9+/_-]{16,}={0,2}/g;
80
+ /**
81
+ * Normalize content to defeat the cheapest Raksha bypass categories.
82
+ *
83
+ * 1. **Unicode NFKC**: collapses compatibility forms — so full-width
84
+ * "ignore" → "ignore" and ligatures like "fignore" → "fignore"
85
+ * (which won't match but ASCII compat forms will). This is the simplest
86
+ * defence against homoglyph attacks that rely on Unicode compatibility
87
+ * equivalents.
88
+ * 2. **Zero-width strip**: removes `\u200B`-class characters that are
89
+ * sprinkled between letters to break the regex (e.g. `i\u200Bgnore`).
90
+ * 3. **Cyrillic / Greek lookalike folding**: a small hand-curated map for
91
+ * the most common homoglyph attacks (Cyrillic `і` → Latin `i`,
92
+ * Cyrillic `о` → Latin `o`, etc.). Not exhaustive — we cover the
93
+ * letters used in canonical English injection phrases.
94
+ *
95
+ * This is a **bypass-reducing** normalization, not full Unicode security.
96
+ * See `docs/KNOWN_FAILURES.md` for what remains.
97
+ */
98
+ const HOMOGLYPH_MAP = {
99
+ // Cyrillic → Latin lowercase
100
+ '\u0430': 'a', '\u0435': 'e', '\u043E': 'o', '\u0440': 'p', '\u0441': 'c',
101
+ '\u0443': 'y', '\u0445': 'x', '\u0456': 'i', '\u0501': 'd', '\u051B': 'q',
102
+ '\u04CF': 'l', '\u0455': 's', '\u04AB': 'h',
103
+ // Cyrillic → Latin uppercase
104
+ '\u0410': 'A', '\u0412': 'B', '\u0415': 'E', '\u041A': 'K', '\u041C': 'M',
105
+ '\u041D': 'H', '\u041E': 'O', '\u0420': 'P', '\u0421': 'C', '\u0422': 'T',
106
+ '\u0425': 'X', '\u0408': 'J', '\u0405': 'S', '\u0406': 'I',
107
+ // Greek → Latin
108
+ '\u03B1': 'a', '\u03BF': 'o', '\u03C1': 'p', '\u03C7': 'x',
109
+ };
110
+ function foldHomoglyphs(s) {
111
+ let out = '';
112
+ for (const ch of s) {
113
+ out += HOMOGLYPH_MAP[ch] ?? ch;
114
+ }
115
+ return out;
116
+ }
117
+ function collapseLetterSpacedWords(s) {
118
+ return s
119
+ .replace(/\b[A-Za-z](?: [A-Za-z]){2,}\b/g, (match) => match.replace(/ /g, ''))
120
+ .replace(/\bapi\s*[_-]\s*key\b/gi, 'api_key');
121
+ }
122
+ function normalizeForScan(content) {
123
+ // 1. NFKC compat-fold (full-width, ligatures, mathematical alphanumerics).
124
+ let s = content.normalize('NFKC');
125
+ // 2. Strip zero-width and invisible characters.
126
+ s = s.replace(ZERO_WIDTH_RE, '');
127
+ // 3. Fold the most common homoglyphs to their Latin equivalents.
128
+ s = foldHomoglyphs(s);
129
+ // 4. Collapse simple letter-spaced words used to evade token-based
130
+ // detectors, e.g. "i g n o r e" -> "ignore".
131
+ s = collapseLetterSpacedWords(s);
132
+ return s;
133
+ }
134
+ /**
135
+ * Try to decode any base64-looking tokens in `content` and return the
136
+ * decoded text concatenated with the original. Bounded and non-recursive:
137
+ *
138
+ * - We only inspect tokens of length ≥ 16 that match `BASE64_CANDIDATE_RE`.
139
+ * - We require the decoded bytes to be ≥ 75 % printable ASCII to count
140
+ * (most accidental base64-looking tokens decode to mojibake).
141
+ * - We never re-decode the output (no recursion). This prevents
142
+ * adversarial nesting from being a DoS vector.
143
+ * - We cap the total appended decoded length at `MAX_DECODED_BYTES`.
144
+ *
145
+ * Returns `null` when nothing decodable was found, so the caller can
146
+ * skip the second-pass scan.
147
+ */
148
+ const MAX_DECODED_BYTES = 8 * 1024;
149
+ const PRINTABLE_THRESHOLD = 0.75;
150
+ function looksDecodable(decoded) {
151
+ if (decoded.length === 0)
152
+ return false;
153
+ let printable = 0;
154
+ for (let i = 0; i < decoded.length; i += 1) {
155
+ const code = decoded.charCodeAt(i);
156
+ // Tab/LF/CR + printable ASCII 32..126
157
+ if (code === 9 || code === 10 || code === 13 || (code >= 32 && code <= 126)) {
158
+ printable += 1;
159
+ }
160
+ }
161
+ return printable / decoded.length >= PRINTABLE_THRESHOLD;
162
+ }
163
+ function expandBase64(content) {
164
+ let appended = 0;
165
+ const decodedChunks = [];
166
+ const matches = content.match(BASE64_CANDIDATE_RE);
167
+ if (!matches)
168
+ return null;
169
+ for (const token of matches) {
170
+ if (appended >= MAX_DECODED_BYTES)
171
+ break;
172
+ // URL-safe → standard alphabet so atob accepts it.
173
+ const standard = token.replace(/-/g, '+').replace(/_/g, '/');
174
+ // atob is strict about length and padding; tolerate a missing pad.
175
+ const padNeeded = (4 - (standard.length % 4)) % 4;
176
+ const padded = standard + '='.repeat(padNeeded);
177
+ let decoded;
178
+ try {
179
+ // `Buffer` is the Node-only path; ATOB-equivalent. Wrap defensively
180
+ // because adversarial inputs can throw on invalid base64.
181
+ decoded = Buffer.from(padded, 'base64').toString('utf8');
182
+ }
183
+ catch {
184
+ continue;
185
+ }
186
+ if (!looksDecodable(decoded))
187
+ continue;
188
+ const slice = decoded.slice(0, MAX_DECODED_BYTES - appended);
189
+ decodedChunks.push(slice);
190
+ appended += slice.length;
191
+ }
192
+ if (decodedChunks.length === 0)
193
+ return null;
194
+ // Return original + a synthetic separator + decoded payload. The separator
195
+ // is intentionally human-readable so any operator inspecting the
196
+ // assessment's `reasons` can tell what triggered the match.
197
+ return `${content}\n[raksha:base64-decoded]\n${decodedChunks.join('\n')}`;
198
+ }
199
+ /**
200
+ * Default detector — the ensemble that Raksha uses if the caller did
201
+ * not supply one. Exported so callers can compose with their own
202
+ * detectors via `EnsembleHallucinationDetector`.
203
+ */
204
+ function defaultHallucinationDetector() {
205
+ return new hallucination_detectors_1.EnsembleHallucinationDetector([
206
+ { detector: new hallucination_detectors_1.AbstentionDetector(), weight: 1 },
207
+ { detector: new hallucination_detectors_1.BestOfNInconsistencyDetector(), weight: 1 },
208
+ { detector: new hallucination_detectors_1.ClaimLevelDetector(), weight: 1 },
209
+ ]);
210
+ }
211
+ function defaultPromptInjectionDetector() {
212
+ return new prompt_injection_detectors_1.EnsemblePromptInjectionDetector([
213
+ new prompt_injection_detectors_1.RuleBasedPromptInjectionDetector(THREAT_PATTERNS),
214
+ new prompt_injection_detectors_1.SemanticIntentPromptInjectionDetector(),
215
+ ]);
216
+ }
217
+ class Raksha {
218
+ policy;
219
+ assessments = [];
220
+ events = [];
221
+ hallucinationDetector;
222
+ promptInjectionDetector;
223
+ classifiers;
224
+ constructor(policy = {}, options = {}) {
225
+ this.policy = this.validatePolicy({ ...types_1.DEFAULT_DEFENSE_POLICY, ...policy });
226
+ this.hallucinationDetector = options.hallucinationDetector ?? defaultHallucinationDetector();
227
+ this.promptInjectionDetector = options.promptInjectionDetector ?? defaultPromptInjectionDetector();
228
+ this.classifiers = options.classifiers ?? [];
229
+ }
230
+ /**
231
+ * Name of the configured hallucination detector. Useful for telemetry
232
+ * and report stamping so operators know which detector produced the
233
+ * `riskScore` they're seeing.
234
+ */
235
+ getHallucinationDetectorName() {
236
+ return this.hallucinationDetector.name;
237
+ }
238
+ getPromptInjectionDetectorName() {
239
+ return this.promptInjectionDetector.name;
240
+ }
241
+ /**
242
+ * Score an agent's **output** for hallucination risk, optionally
243
+ * grounded in retrieved context and/or compared against alternative
244
+ * samples of the same prompt. Returns the detector's assessment with
245
+ * a wrapper that:
246
+ * - guards against thrown errors (detectors are expected not to
247
+ * throw, but we defence-in-depth);
248
+ * - emits a `hallucination_detected` Pulse event when risk is high
249
+ * AND confidence is non-trivial (so we don't emit noise for
250
+ * no-signal calls).
251
+ *
252
+ * The emission threshold is the same `warnThreshold` Raksha uses for
253
+ * input-side prompt-injection assessments, for consistency.
254
+ */
255
+ async detectHallucination(input, opts = {}) {
256
+ let assessment;
257
+ try {
258
+ assessment = await this.hallucinationDetector.detect(input);
259
+ }
260
+ catch (err) {
261
+ // Contract says detectors must not throw, but if one does the
262
+ // wrapper returns a zero-risk, zero-confidence assessment so a
263
+ // bad detector cannot crash the agent's pipeline.
264
+ const msg = err instanceof Error ? err.message : String(err);
265
+ assessment = {
266
+ riskScore: 0,
267
+ confidence: 0,
268
+ detectedBy: `${this.hallucinationDetector.name}/threw`,
269
+ reasons: [`Detector threw: ${msg}. Treating as no-signal.`],
270
+ };
271
+ }
272
+ let event;
273
+ if (assessment.riskScore >= this.policy.warnThreshold &&
274
+ assessment.confidence >= 0.2 &&
275
+ !assessment.abstention) {
276
+ event = {
277
+ id: eventId(),
278
+ eventType: 'hallucination_detected',
279
+ agentId: opts.agentId ?? 'unknown-agent',
280
+ timestamp: now(),
281
+ severity: assessment.riskScore >= this.policy.quarantineThreshold ? 'critical' : 'warning',
282
+ detectedBy: 'raksha',
283
+ details: {
284
+ detector: assessment.detectedBy,
285
+ riskScore: assessment.riskScore,
286
+ confidence: assessment.confidence,
287
+ reasons: assessment.reasons,
288
+ claimCount: assessment.claims?.length ?? 0,
289
+ },
290
+ recommendedAction: 'Inspect the output for unsupported claims. Consider re-prompting with stricter grounding instructions, or routing to a stronger model.',
291
+ };
292
+ this.events.push(event);
293
+ this.enforceRetention();
294
+ }
295
+ return { assessment, event };
296
+ }
297
+ validatePolicy(policy) {
298
+ const finite = (v) => typeof v === 'number' && Number.isFinite(v);
299
+ if (!finite(policy.quarantineThreshold) || policy.quarantineThreshold < 0 || policy.quarantineThreshold > 1) {
300
+ throw new Error('Raksha: quarantineThreshold must be a finite number in [0,1]');
301
+ }
302
+ if (!finite(policy.warnThreshold) || policy.warnThreshold < 0 || policy.warnThreshold > 1) {
303
+ throw new Error('Raksha: warnThreshold must be a finite number in [0,1]');
304
+ }
305
+ if (policy.maxAssessments !== undefined && (!Number.isInteger(policy.maxAssessments) || policy.maxAssessments < 0)) {
306
+ throw new Error('Raksha: maxAssessments must be a non-negative integer if set');
307
+ }
308
+ if (policy.maxEvents !== undefined && (!Number.isInteger(policy.maxEvents) || policy.maxEvents < 0)) {
309
+ throw new Error('Raksha: maxEvents must be a non-negative integer if set');
310
+ }
311
+ return policy;
312
+ }
313
+ enforceRetention() {
314
+ const assessmentCap = this.policy.maxAssessments ?? 0;
315
+ if (assessmentCap > 0 && this.assessments.length > assessmentCap) {
316
+ this.assessments.splice(0, this.assessments.length - assessmentCap);
317
+ }
318
+ const eventCap = this.policy.maxEvents ?? 0;
319
+ if (eventCap > 0 && this.events.length > eventCap) {
320
+ this.events.splice(0, this.events.length - eventCap);
321
+ }
322
+ }
323
+ /**
324
+ * Pure threat-scan: scores an item and returns the assessment (plus a quarantine
325
+ * event if applicable). Does NOT touch internal state. Use this for read-only
326
+ * checks like MCP `ojas_scan_for_injection` so that simply evaluating
327
+ * candidate content never pollutes defense health.
328
+ *
329
+ * Bypass-reduction pipeline applied before regex matching:
330
+ * 1. `normalizeForScan(content)` — NFKC + zero-width strip + homoglyph fold.
331
+ * Catches `іgnore previous instructions` (Cyrillic), `i\u200Bgnore`,
332
+ * and full-width "IGNORE".
333
+ * 2. `expandBase64(normalized)` — decodes base64-looking tokens once
334
+ * (non-recursive, bounded) and concatenates the decoded text for a
335
+ * second-pass scan. Catches the canonical
336
+ * `aWdub3JlIHByZXZpb3VzIGluc3RydWN0aW9ucw==` bypass.
337
+ *
338
+ * Detection is a deterministic detector stack, not a security boundary.
339
+ * See `docs/KNOWN_FAILURES.md` for what remains (indirect, multi-turn,
340
+ * and novel semantic injection outside the current detector rules).
341
+ */
342
+ scanItem(item, opts = {}) {
343
+ // Build the scan target by layering normalizations + a one-shot base64 expansion.
344
+ const normalized = normalizeForScan(item.content);
345
+ const expanded = expandBase64(normalized);
346
+ const scanTarget = expanded ?? normalized;
347
+ const detected = this.promptInjectionDetector.detect({
348
+ item,
349
+ normalizedContent: normalized,
350
+ expandedContent: expanded ?? undefined,
351
+ scanTarget,
352
+ });
353
+ let riskScore = detected.riskScore;
354
+ const reasons = [...detected.reasons];
355
+ const threatType = detected.threatType;
356
+ if (item.trustScore !== undefined && item.trustScore < 0.3) {
357
+ riskScore += 0.2;
358
+ reasons.push('Source trust is very low.');
359
+ }
360
+ if (item.source === 'tool' || item.source === 'retrieval') {
361
+ riskScore += 0.05;
362
+ }
363
+ const assessment = {
364
+ itemId: item.id,
365
+ threatType,
366
+ riskScore: clamp(riskScore),
367
+ quarantined: riskScore >= this.policy.quarantineThreshold,
368
+ reasons,
369
+ detectedBy: detected.detectedBy,
370
+ };
371
+ let event;
372
+ if (assessment.quarantined) {
373
+ const agentId = opts.agentId ?? (typeof item.metadata?.agentId === 'string' ? item.metadata.agentId : 'unknown-agent');
374
+ event = {
375
+ id: eventId(),
376
+ eventType: 'prompt_injection_quarantined',
377
+ agentId,
378
+ timestamp: now(),
379
+ severity: 'critical',
380
+ detectedBy: 'raksha',
381
+ details: {
382
+ itemId: item.id,
383
+ source: item.source,
384
+ threatType: assessment.threatType,
385
+ riskScore: assessment.riskScore,
386
+ reasons: assessment.reasons,
387
+ },
388
+ recommendedAction: 'Quarantine item from context and block memory promotion.',
389
+ };
390
+ }
391
+ return { assessment, event };
392
+ }
393
+ /**
394
+ * Async variant of `scanItem` that also runs any configured ML classifiers.
395
+ * The final riskScore is the max of the deterministic detector score and
396
+ * the highest classifier probability. Quarantine is re-evaluated after
397
+ * the merge so a classifier can elevate a below-threshold item into
398
+ * quarantine.
399
+ */
400
+ async scanItemAsync(item, opts = {}) {
401
+ const result = this.scanItem(item, opts);
402
+ if (this.classifiers.length === 0)
403
+ return result;
404
+ const text = item.content;
405
+ const classifierResults = await Promise.all(this.classifiers.map((c) => c.classify(text, opts.signal).catch(() => ({
406
+ injectionProbability: 0,
407
+ label: 'unknown',
408
+ }))));
409
+ let maxProb = 0;
410
+ let classifierName;
411
+ for (let i = 0; i < classifierResults.length; i++) {
412
+ if (classifierResults[i].injectionProbability > maxProb) {
413
+ maxProb = classifierResults[i].injectionProbability;
414
+ classifierName = this.classifiers[i].name;
415
+ }
416
+ }
417
+ if (maxProb > result.assessment.riskScore) {
418
+ result.assessment.riskScore = clamp(maxProb);
419
+ result.assessment.reasons.push(`Classifier '${classifierName}' scored ${maxProb.toFixed(3)} injection probability.`);
420
+ result.assessment.detectedBy = result.assessment.detectedBy
421
+ ? `${result.assessment.detectedBy}+${classifierName}`
422
+ : classifierName;
423
+ result.assessment.quarantined = result.assessment.riskScore >= this.policy.quarantineThreshold;
424
+ if (result.assessment.quarantined && !result.event) {
425
+ const agentId = opts.agentId ?? (typeof item.metadata?.agentId === 'string' ? item.metadata.agentId : 'unknown-agent');
426
+ result.event = {
427
+ id: eventId(),
428
+ eventType: 'prompt_injection_quarantined',
429
+ agentId,
430
+ timestamp: now(),
431
+ severity: 'critical',
432
+ detectedBy: 'raksha',
433
+ details: {
434
+ itemId: item.id,
435
+ source: item.source,
436
+ threatType: result.assessment.threatType,
437
+ riskScore: result.assessment.riskScore,
438
+ reasons: result.assessment.reasons,
439
+ },
440
+ recommendedAction: 'Quarantine item from context and block memory promotion.',
441
+ };
442
+ }
443
+ }
444
+ return result;
445
+ }
446
+ /** Whether this Raksha instance has async classifiers configured. */
447
+ hasClassifiers() {
448
+ return this.classifiers.length > 0;
449
+ }
450
+ /**
451
+ * Recording variant: scans the item AND appends the assessment (and any event)
452
+ * to internal state so it contributes to future defense health. Use this when
453
+ * the scan represents real agent intake; use `scanItem` for read-only checks.
454
+ */
455
+ assessItem(item, opts = {}) {
456
+ const { assessment, event } = this.scanItem(item, opts);
457
+ this.assessments.push(assessment);
458
+ if (event)
459
+ this.events.push(event);
460
+ this.enforceRetention();
461
+ return assessment;
462
+ }
463
+ /**
464
+ * Async recording variant used when classifiers are configured.
465
+ */
466
+ async assessItemAsync(item, opts = {}) {
467
+ const { assessment, event } = await this.scanItemAsync(item, opts);
468
+ this.assessments.push(assessment);
469
+ if (event)
470
+ this.events.push(event);
471
+ this.enforceRetention();
472
+ return assessment;
473
+ }
474
+ defendContext(items, opts = {}) {
475
+ const safe = [];
476
+ const quarantined = [];
477
+ const assessments = [];
478
+ const events = [];
479
+ for (const item of items) {
480
+ const { assessment, event } = this.scanItem(item, opts);
481
+ this.assessments.push(assessment);
482
+ assessments.push(assessment);
483
+ if (event) {
484
+ this.events.push(event);
485
+ events.push(event);
486
+ }
487
+ if (assessment.quarantined) {
488
+ quarantined.push(item);
489
+ }
490
+ else {
491
+ safe.push(item);
492
+ }
493
+ }
494
+ this.enforceRetention();
495
+ return { safe, quarantined, assessments, events };
496
+ }
497
+ /**
498
+ * Async version of `defendContext` that runs ML classifiers on each item.
499
+ */
500
+ async defendContextAsync(items, opts = {}) {
501
+ const safe = [];
502
+ const quarantined = [];
503
+ const assessments = [];
504
+ const events = [];
505
+ for (const item of items) {
506
+ const { assessment, event } = await this.scanItemAsync(item, opts);
507
+ this.assessments.push(assessment);
508
+ assessments.push(assessment);
509
+ if (event) {
510
+ this.events.push(event);
511
+ events.push(event);
512
+ }
513
+ if (assessment.quarantined) {
514
+ quarantined.push(item);
515
+ }
516
+ else {
517
+ safe.push(item);
518
+ }
519
+ }
520
+ this.enforceRetention();
521
+ return { safe, quarantined, assessments, events };
522
+ }
523
+ assess() {
524
+ const recent = this.assessments.slice(-100);
525
+ const threatsDetected = recent.filter((assessment) => assessment.riskScore >= this.policy.warnThreshold).length;
526
+ const quarantinedItems = recent.filter((assessment) => assessment.quarantined).length;
527
+ const quarantineEffectiveness = threatsDetected > 0 ? quarantinedItems / threatsDetected : 1;
528
+ // threatResistance reflects RESIDUAL risk — risk that slipped past
529
+ // quarantine into agent-visible context. Dividing by recent.length (the
530
+ // previous formula) diluted the signal: 99 successful quarantines + 1
531
+ // dangerous miss would still look ~99% healthy. We now divide by the
532
+ // count of items that actually reached the agent (i.e. were not
533
+ // quarantined), so a single high-risk leak materially drops the score.
534
+ const accepted = recent.filter((a) => !a.quarantined);
535
+ const residualRisk = accepted.length === 0
536
+ ? 0
537
+ : accepted.reduce((sum, a) => sum + a.riskScore, 0) / accepted.length;
538
+ return {
539
+ threatResistance: healthScore(1 - residualRisk, 'raksha.threatResistance'),
540
+ instructionIntegrity: healthScore(this.policy.protectInstructionHierarchy ? 1 : 0.5, 'raksha.instructionIntegrity'),
541
+ quarantineEffectiveness: healthScore(quarantineEffectiveness, 'raksha.quarantineEffectiveness'),
542
+ threatsDetected,
543
+ quarantinedItems,
544
+ };
545
+ }
546
+ recommend() {
547
+ const health = this.assess();
548
+ const recs = [];
549
+ if (health.quarantinedItems > 0) {
550
+ recs.push({
551
+ module: 'raksha',
552
+ severity: 'critical',
553
+ message: `${health.quarantinedItems} suspicious cognitive inputs quarantined.`,
554
+ action: 'Review quarantined items and verify retrieval/tool sources.',
555
+ });
556
+ }
557
+ if (health.threatResistance.value < 0.7) {
558
+ recs.push({
559
+ module: 'raksha',
560
+ severity: 'warning',
561
+ message: 'Threat resistance is degraded.',
562
+ action: 'Tighten trust thresholds and inspect untrusted context sources.',
563
+ });
564
+ }
565
+ if (recs.length === 0) {
566
+ recs.push({ module: 'raksha', severity: 'info', message: 'Immune defense is stable.' });
567
+ }
568
+ return recs;
569
+ }
570
+ getEvents() {
571
+ return this.events.map((e) => ({ ...e, details: { ...e.details } }));
572
+ }
573
+ getAssessments() {
574
+ return this.assessments.map((a) => ({ ...a, reasons: [...a.reasons] }));
575
+ }
576
+ exportState() {
577
+ return {
578
+ events: [...this.getEvents()],
579
+ assessments: [...this.getAssessments()],
580
+ };
581
+ }
582
+ importState(snapshot) {
583
+ if (!snapshot)
584
+ return;
585
+ this.events = (snapshot.events ?? []).map((e) => ({ ...e, details: { ...e.details } }));
586
+ this.assessments = (snapshot.assessments ?? []).map((a) => ({ ...a, reasons: [...a.reasons] }));
587
+ }
588
+ getPolicy() {
589
+ return { ...this.policy };
590
+ }
591
+ updatePolicy(updates) {
592
+ this.policy = this.validatePolicy({ ...this.policy, ...updates });
593
+ this.enforceRetention();
594
+ }
595
+ }
596
+ exports.Raksha = Raksha;
597
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/raksha/index.ts"],"names":[],"mappings":"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"}