@panguard-ai/atr 1.4.3 → 1.5.1

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 (274) hide show
  1. package/dist/action-executor.d.ts +44 -0
  2. package/dist/action-executor.d.ts.map +1 -0
  3. package/dist/action-executor.js +130 -0
  4. package/dist/action-executor.js.map +1 -0
  5. package/dist/adapters/default-adapter.d.ts +24 -0
  6. package/dist/adapters/default-adapter.d.ts.map +1 -0
  7. package/dist/adapters/default-adapter.js +51 -0
  8. package/dist/adapters/default-adapter.js.map +1 -0
  9. package/dist/adapters/stdio-adapter.d.ts +30 -0
  10. package/dist/adapters/stdio-adapter.d.ts.map +1 -0
  11. package/dist/adapters/stdio-adapter.js +128 -0
  12. package/dist/adapters/stdio-adapter.js.map +1 -0
  13. package/dist/badge.d.ts +42 -0
  14. package/dist/badge.d.ts.map +1 -0
  15. package/dist/badge.js +163 -0
  16. package/dist/badge.js.map +1 -0
  17. package/dist/capability-extractor.d.ts +35 -0
  18. package/dist/capability-extractor.d.ts.map +1 -0
  19. package/dist/capability-extractor.js +91 -0
  20. package/dist/capability-extractor.js.map +1 -0
  21. package/dist/cli/scan-handler.d.ts +21 -0
  22. package/dist/cli/scan-handler.d.ts.map +1 -0
  23. package/dist/cli/scan-handler.js +276 -0
  24. package/dist/cli/scan-handler.js.map +1 -0
  25. package/dist/cli/tc-pipeline.d.ts +18 -0
  26. package/dist/cli/tc-pipeline.d.ts.map +1 -0
  27. package/dist/cli/tc-pipeline.js +295 -0
  28. package/dist/cli/tc-pipeline.js.map +1 -0
  29. package/dist/cli.d.ts +12 -0
  30. package/dist/cli.d.ts.map +1 -0
  31. package/dist/cli.js +894 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/content-hash.d.ts +7 -0
  34. package/dist/content-hash.d.ts.map +1 -0
  35. package/dist/content-hash.js +10 -0
  36. package/dist/content-hash.js.map +1 -0
  37. package/dist/converters/elastic.d.ts +36 -0
  38. package/dist/converters/elastic.d.ts.map +1 -0
  39. package/dist/converters/elastic.js +125 -0
  40. package/dist/converters/elastic.js.map +1 -0
  41. package/dist/converters/generic-regex.d.ts +37 -0
  42. package/dist/converters/generic-regex.d.ts.map +1 -0
  43. package/dist/converters/generic-regex.js +59 -0
  44. package/dist/converters/generic-regex.js.map +1 -0
  45. package/dist/converters/index.d.ts +32 -0
  46. package/dist/converters/index.d.ts.map +1 -0
  47. package/dist/converters/index.js +38 -0
  48. package/dist/converters/index.js.map +1 -0
  49. package/dist/converters/sarif.d.ts +18 -0
  50. package/dist/converters/sarif.d.ts.map +1 -0
  51. package/dist/converters/sarif.js +142 -0
  52. package/dist/converters/sarif.js.map +1 -0
  53. package/dist/converters/splunk.d.ts +19 -0
  54. package/dist/converters/splunk.d.ts.map +1 -0
  55. package/dist/converters/splunk.js +148 -0
  56. package/dist/converters/splunk.js.map +1 -0
  57. package/dist/coverage-analyzer.d.ts +43 -0
  58. package/dist/coverage-analyzer.d.ts.map +1 -0
  59. package/dist/coverage-analyzer.js +329 -0
  60. package/dist/coverage-analyzer.js.map +1 -0
  61. package/dist/embedding/build-corpus.d.ts +15 -0
  62. package/dist/embedding/build-corpus.d.ts.map +1 -0
  63. package/dist/embedding/build-corpus.js +105 -0
  64. package/dist/embedding/build-corpus.js.map +1 -0
  65. package/dist/embedding/model-loader.d.ts +41 -0
  66. package/dist/embedding/model-loader.d.ts.map +1 -0
  67. package/dist/embedding/model-loader.js +90 -0
  68. package/dist/embedding/model-loader.js.map +1 -0
  69. package/dist/embedding/vector-store.d.ts +41 -0
  70. package/dist/embedding/vector-store.d.ts.map +1 -0
  71. package/dist/embedding/vector-store.js +70 -0
  72. package/dist/embedding/vector-store.js.map +1 -0
  73. package/dist/engine.d.ts +222 -0
  74. package/dist/engine.d.ts.map +1 -0
  75. package/dist/engine.js +1185 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/eval/corpus.d.ts +42 -0
  78. package/dist/eval/corpus.d.ts.map +1 -0
  79. package/dist/eval/corpus.js +427 -0
  80. package/dist/eval/corpus.js.map +1 -0
  81. package/dist/eval/eval-harness.d.ts +44 -0
  82. package/dist/eval/eval-harness.d.ts.map +1 -0
  83. package/dist/eval/eval-harness.js +296 -0
  84. package/dist/eval/eval-harness.js.map +1 -0
  85. package/dist/eval/index.d.ts +13 -0
  86. package/dist/eval/index.d.ts.map +1 -0
  87. package/dist/eval/index.js +9 -0
  88. package/dist/eval/index.js.map +1 -0
  89. package/dist/eval/metrics.d.ts +74 -0
  90. package/dist/eval/metrics.d.ts.map +1 -0
  91. package/dist/eval/metrics.js +108 -0
  92. package/dist/eval/metrics.js.map +1 -0
  93. package/dist/eval/pint-corpus.d.ts +34 -0
  94. package/dist/eval/pint-corpus.d.ts.map +1 -0
  95. package/dist/eval/pint-corpus.js +113 -0
  96. package/dist/eval/pint-corpus.js.map +1 -0
  97. package/dist/eval/rule-corpus.d.ts +9 -0
  98. package/dist/eval/rule-corpus.d.ts.map +1 -0
  99. package/dist/eval/rule-corpus.js +4780 -0
  100. package/dist/eval/rule-corpus.js.map +1 -0
  101. package/dist/eval/rule-metrics.d.ts +34 -0
  102. package/dist/eval/rule-metrics.d.ts.map +1 -0
  103. package/dist/eval/rule-metrics.js +92 -0
  104. package/dist/eval/rule-metrics.js.map +1 -0
  105. package/dist/eval/run-eval.d.ts +7 -0
  106. package/dist/eval/run-eval.d.ts.map +1 -0
  107. package/dist/eval/run-eval.js +11 -0
  108. package/dist/eval/run-eval.js.map +1 -0
  109. package/dist/eval/run-pint-benchmark.d.ts +18 -0
  110. package/dist/eval/run-pint-benchmark.d.ts.map +1 -0
  111. package/dist/eval/run-pint-benchmark.js +159 -0
  112. package/dist/eval/run-pint-benchmark.js.map +1 -0
  113. package/dist/eval/skill-benchmark.d.ts +66 -0
  114. package/dist/eval/skill-benchmark.d.ts.map +1 -0
  115. package/dist/eval/skill-benchmark.js +194 -0
  116. package/dist/eval/skill-benchmark.js.map +1 -0
  117. package/dist/flywheel.d.ts +54 -0
  118. package/dist/flywheel.d.ts.map +1 -0
  119. package/dist/flywheel.js +121 -0
  120. package/dist/flywheel.js.map +1 -0
  121. package/dist/hook-handler.d.ts +61 -0
  122. package/dist/hook-handler.d.ts.map +1 -0
  123. package/dist/hook-handler.js +178 -0
  124. package/dist/hook-handler.js.map +1 -0
  125. package/dist/index.d.ts +8 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/{src/index.ts → dist/index.js} +1 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/layer-integration.d.ts +55 -0
  130. package/dist/layer-integration.d.ts.map +1 -0
  131. package/dist/layer-integration.js +187 -0
  132. package/dist/layer-integration.js.map +1 -0
  133. package/dist/loader.d.ts +18 -0
  134. package/dist/loader.d.ts.map +1 -0
  135. package/dist/loader.js +129 -0
  136. package/dist/loader.js.map +1 -0
  137. package/dist/mcp-server.d.ts +13 -0
  138. package/dist/mcp-server.d.ts.map +1 -0
  139. package/dist/mcp-server.js +246 -0
  140. package/dist/mcp-server.js.map +1 -0
  141. package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
  142. package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
  143. package/dist/mcp-tools/coverage-gaps.js +55 -0
  144. package/dist/mcp-tools/coverage-gaps.js.map +1 -0
  145. package/dist/mcp-tools/list-rules.d.ts +17 -0
  146. package/dist/mcp-tools/list-rules.d.ts.map +1 -0
  147. package/dist/mcp-tools/list-rules.js +45 -0
  148. package/dist/mcp-tools/list-rules.js.map +1 -0
  149. package/dist/mcp-tools/scan-skill.d.ts +17 -0
  150. package/dist/mcp-tools/scan-skill.d.ts.map +1 -0
  151. package/dist/mcp-tools/scan-skill.js +65 -0
  152. package/dist/mcp-tools/scan-skill.js.map +1 -0
  153. package/dist/mcp-tools/scan.d.ts +24 -0
  154. package/dist/mcp-tools/scan.d.ts.map +1 -0
  155. package/dist/mcp-tools/scan.js +94 -0
  156. package/dist/mcp-tools/scan.js.map +1 -0
  157. package/dist/mcp-tools/submit-proposal.d.ts +12 -0
  158. package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
  159. package/dist/mcp-tools/submit-proposal.js +103 -0
  160. package/dist/mcp-tools/submit-proposal.js.map +1 -0
  161. package/dist/mcp-tools/threat-summary.d.ts +12 -0
  162. package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
  163. package/dist/mcp-tools/threat-summary.js +74 -0
  164. package/dist/mcp-tools/threat-summary.js.map +1 -0
  165. package/dist/mcp-tools/validate.d.ts +15 -0
  166. package/dist/mcp-tools/validate.d.ts.map +1 -0
  167. package/dist/mcp-tools/validate.js +51 -0
  168. package/dist/mcp-tools/validate.js.map +1 -0
  169. package/dist/modules/embedding.d.ts +71 -0
  170. package/dist/modules/embedding.d.ts.map +1 -0
  171. package/dist/modules/embedding.js +141 -0
  172. package/dist/modules/embedding.js.map +1 -0
  173. package/dist/modules/index.d.ts +144 -0
  174. package/dist/modules/index.d.ts.map +1 -0
  175. package/dist/modules/index.js +82 -0
  176. package/dist/modules/index.js.map +1 -0
  177. package/dist/modules/semantic.d.ts +106 -0
  178. package/dist/modules/semantic.d.ts.map +1 -0
  179. package/dist/modules/semantic.js +359 -0
  180. package/dist/modules/semantic.js.map +1 -0
  181. package/dist/modules/session.d.ts +70 -0
  182. package/dist/modules/session.d.ts.map +1 -0
  183. package/dist/modules/session.js +128 -0
  184. package/dist/modules/session.js.map +1 -0
  185. package/dist/quality/adapters/atr.d.ts +65 -0
  186. package/dist/quality/adapters/atr.d.ts.map +1 -0
  187. package/dist/quality/adapters/atr.js +154 -0
  188. package/dist/quality/adapters/atr.js.map +1 -0
  189. package/dist/quality/adapters/index.d.ts +10 -0
  190. package/dist/quality/adapters/index.d.ts.map +1 -0
  191. package/dist/quality/adapters/index.js +10 -0
  192. package/dist/quality/adapters/index.js.map +1 -0
  193. package/dist/quality/compute-confidence.d.ts +45 -0
  194. package/dist/quality/compute-confidence.d.ts.map +1 -0
  195. package/dist/quality/compute-confidence.js +133 -0
  196. package/dist/quality/compute-confidence.js.map +1 -0
  197. package/dist/quality/index.d.ts +36 -0
  198. package/dist/quality/index.d.ts.map +1 -0
  199. package/dist/quality/index.js +39 -0
  200. package/dist/quality/index.js.map +1 -0
  201. package/dist/quality/quality-gate.d.ts +86 -0
  202. package/dist/quality/quality-gate.d.ts.map +1 -0
  203. package/dist/quality/quality-gate.js +187 -0
  204. package/dist/quality/quality-gate.js.map +1 -0
  205. package/dist/quality/types.d.ts +129 -0
  206. package/dist/quality/types.d.ts.map +1 -0
  207. package/dist/quality/types.js +10 -0
  208. package/dist/quality/types.js.map +1 -0
  209. package/dist/quality/validate-maturity.d.ts +51 -0
  210. package/dist/quality/validate-maturity.d.ts.map +1 -0
  211. package/dist/quality/validate-maturity.js +134 -0
  212. package/dist/quality/validate-maturity.js.map +1 -0
  213. package/dist/quality.d.ts +8 -0
  214. package/dist/quality.d.ts.map +1 -0
  215. package/dist/quality.js +8 -0
  216. package/dist/quality.js.map +1 -0
  217. package/dist/rule-scaffolder.d.ts +53 -0
  218. package/dist/rule-scaffolder.d.ts.map +1 -0
  219. package/dist/rule-scaffolder.js +301 -0
  220. package/dist/rule-scaffolder.js.map +1 -0
  221. package/dist/session-tracker.d.ts +58 -0
  222. package/dist/session-tracker.d.ts.map +1 -0
  223. package/dist/session-tracker.js +176 -0
  224. package/dist/session-tracker.js.map +1 -0
  225. package/dist/shadow-evaluator.d.ts +48 -0
  226. package/dist/shadow-evaluator.d.ts.map +1 -0
  227. package/dist/shadow-evaluator.js +129 -0
  228. package/dist/shadow-evaluator.js.map +1 -0
  229. package/dist/skill-fingerprint.d.ts +85 -0
  230. package/dist/skill-fingerprint.d.ts.map +1 -0
  231. package/dist/skill-fingerprint.js +284 -0
  232. package/dist/skill-fingerprint.js.map +1 -0
  233. package/dist/tc-reporter.d.ts +50 -0
  234. package/dist/tc-reporter.d.ts.map +1 -0
  235. package/dist/tc-reporter.js +164 -0
  236. package/dist/tc-reporter.js.map +1 -0
  237. package/dist/tier0-invariant.d.ts +49 -0
  238. package/dist/tier0-invariant.d.ts.map +1 -0
  239. package/dist/tier0-invariant.js +185 -0
  240. package/dist/tier0-invariant.js.map +1 -0
  241. package/dist/tier1-blacklist.d.ts +48 -0
  242. package/dist/tier1-blacklist.d.ts.map +1 -0
  243. package/dist/tier1-blacklist.js +92 -0
  244. package/dist/tier1-blacklist.js.map +1 -0
  245. package/dist/types.d.ts +232 -0
  246. package/dist/types.d.ts.map +1 -0
  247. package/dist/types.js +6 -0
  248. package/dist/types.js.map +1 -0
  249. package/dist/verdict.d.ts +26 -0
  250. package/dist/verdict.d.ts.map +1 -0
  251. package/dist/verdict.js +127 -0
  252. package/dist/verdict.js.map +1 -0
  253. package/package.json +16 -4
  254. package/.github/ISSUE_TEMPLATE/evasion-report.yml +0 -75
  255. package/.github/ISSUE_TEMPLATE/false-positive.yml +0 -31
  256. package/.github/ISSUE_TEMPLATE/mirofish-prediction.yml +0 -128
  257. package/.github/ISSUE_TEMPLATE/new-rule.yml +0 -37
  258. package/.github/PULL_REQUEST_TEMPLATE.md +0 -23
  259. package/.github/workflows/rule-quality.yml +0 -203
  260. package/.github/workflows/validate.yml +0 -42
  261. package/CHANGELOG.md +0 -30
  262. package/CONTRIBUTING.md +0 -168
  263. package/CONTRIBUTORS.md +0 -28
  264. package/COVERAGE.md +0 -135
  265. package/LIMITATIONS.md +0 -154
  266. package/SECURITY.md +0 -48
  267. package/THREAT-MODEL.md +0 -243
  268. package/docs/contribution-paths.md +0 -202
  269. package/docs/mirofish-prediction-guide.md +0 -304
  270. package/docs/quick-start.md +0 -245
  271. package/docs/rule-writing-guide.md +0 -647
  272. package/docs/schema-spec.md +0 -594
  273. package/examples/how-to-write-a-rule.md +0 -251
  274. package/tsconfig.json +0 -17
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Build attack embedding corpus from ATR rule test cases.
4
+ *
5
+ * Reads all stable ATR rules, extracts true_positive test cases,
6
+ * encodes them through all-MiniLM-L6-v2, and saves as JSON.
7
+ *
8
+ * Usage:
9
+ * npx tsx src/embedding/build-corpus.ts
10
+ *
11
+ * Output:
12
+ * data/attack-embeddings.json
13
+ */
14
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
15
+ import { join, resolve } from 'node:path';
16
+ import * as yaml from 'js-yaml';
17
+ const RULES_DIR = resolve(join(import.meta.dirname ?? '.', '..', '..', 'rules'));
18
+ const OUTPUT_PATH = resolve(join(import.meta.dirname ?? '.', '..', '..', 'data', 'attack-embeddings.json'));
19
+ async function main() {
20
+ console.log('Building attack embedding corpus...');
21
+ console.log(`Rules dir: ${RULES_DIR}`);
22
+ // Load model
23
+ console.log('Loading embedding model (first run downloads ~22MB)...');
24
+ const { TransformersJSModel } = await import('./model-loader.js');
25
+ const model = new TransformersJSModel();
26
+ await model.initialize();
27
+ console.log('Model loaded.');
28
+ // Collect all true_positive texts from rules
29
+ const attacks = [];
30
+ function walkDir(dir) {
31
+ const files = [];
32
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
33
+ const fullPath = join(dir, entry.name);
34
+ if (entry.isDirectory()) {
35
+ files.push(...walkDir(fullPath));
36
+ }
37
+ else if (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')) {
38
+ files.push(fullPath);
39
+ }
40
+ }
41
+ return files;
42
+ }
43
+ const ruleFiles = walkDir(RULES_DIR);
44
+ console.log(`Found ${ruleFiles.length} rule files.`);
45
+ for (const file of ruleFiles) {
46
+ try {
47
+ const content = readFileSync(file, 'utf-8');
48
+ const rule = yaml.load(content);
49
+ if (!rule?.id || !rule?.test_cases?.true_positives)
50
+ continue;
51
+ for (const tp of rule.test_cases.true_positives) {
52
+ const text = tp.input ?? tp.content ?? tp.user_input ?? tp.tool_response ?? tp.tool_description ?? tp.tool_args;
53
+ if (!text || text.length < 10)
54
+ continue;
55
+ attacks.push({
56
+ id: rule.id,
57
+ text: text.slice(0, 512),
58
+ category: rule.tags?.category ?? 'unknown',
59
+ severity: rule.severity ?? 'medium',
60
+ ruleTitle: rule.title ?? rule.id,
61
+ });
62
+ }
63
+ }
64
+ catch {
65
+ // Skip unparseable rules
66
+ }
67
+ }
68
+ console.log(`Extracted ${attacks.length} attack payloads from ${ruleFiles.length} rules.`);
69
+ // Deduplicate by text
70
+ const seen = new Set();
71
+ const unique = attacks.filter((a) => {
72
+ if (seen.has(a.text))
73
+ return false;
74
+ seen.add(a.text);
75
+ return true;
76
+ });
77
+ console.log(`Unique payloads: ${unique.length}`);
78
+ // Encode all payloads
79
+ console.log('Encoding payloads...');
80
+ const output = [];
81
+ for (let i = 0; i < unique.length; i++) {
82
+ const a = unique[i];
83
+ process.stdout.write(`\r [${i + 1}/${unique.length}] ${a.id}`);
84
+ const vec = await model.encode(a.text);
85
+ output.push({
86
+ id: `${a.id}-tp${i}`,
87
+ text: a.text,
88
+ vector: Array.from(vec),
89
+ label: `${a.ruleTitle}: ${a.text.slice(0, 80)}`,
90
+ category: a.category,
91
+ severity: a.severity,
92
+ });
93
+ }
94
+ console.log('\n');
95
+ // Save
96
+ mkdirSync(join(OUTPUT_PATH, '..'), { recursive: true });
97
+ writeFileSync(OUTPUT_PATH, JSON.stringify(output, null, 2));
98
+ console.log(`Saved ${output.length} embeddings to ${OUTPUT_PATH}`);
99
+ console.log(`File size: ${(readFileSync(OUTPUT_PATH).length / 1024).toFixed(0)} KB`);
100
+ }
101
+ main().catch((err) => {
102
+ console.error('Fatal:', err);
103
+ process.exit(1);
104
+ });
105
+ //# sourceMappingURL=build-corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-corpus.js","sourceRoot":"","sources":["../../src/embedding/build-corpus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Embedding model loader.
3
+ *
4
+ * Lazy-loads all-MiniLM-L6-v2 via @xenova/transformers (optional dep).
5
+ * Model is ~22MB, cached to disk after first download.
6
+ * Runs in pure JS/WASM -- no native bindings needed.
7
+ *
8
+ * @module agent-threat-rules/embedding/model-loader
9
+ */
10
+ export interface EmbeddingModel {
11
+ /** Encode text to embedding vector */
12
+ encode(text: string): Promise<Float32Array>;
13
+ /** Encode multiple texts (batched) */
14
+ encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
15
+ /** Initialize / load the model */
16
+ initialize(): Promise<void>;
17
+ /** Model output dimension */
18
+ readonly dimension: number;
19
+ /** Whether model is loaded */
20
+ readonly isLoaded: boolean;
21
+ }
22
+ export declare class TransformersJSModel implements EmbeddingModel {
23
+ readonly dimension = 384;
24
+ private pipeline;
25
+ get isLoaded(): boolean;
26
+ /** Lazy-load the model on first use */
27
+ initialize(): Promise<void>;
28
+ encode(text: string): Promise<Float32Array>;
29
+ encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
30
+ }
31
+ /** Create a no-op model for testing */
32
+ export declare class MockEmbeddingModel implements EmbeddingModel {
33
+ readonly dimension = 384;
34
+ readonly isLoaded = true;
35
+ private readonly mockVectors;
36
+ constructor(mockVectors?: Map<string, Float32Array>);
37
+ initialize(): Promise<void>;
38
+ encode(text: string): Promise<Float32Array>;
39
+ encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
40
+ }
41
+ //# sourceMappingURL=model-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-loader.d.ts","sourceRoot":"","sources":["../../src/embedding/model-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,sCAAsC;IACtC,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,kCAAkC;IAClC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAKD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,SAAS,OAAa;IAC/B,OAAO,CAAC,QAAQ,CAAiB;IAEjC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,uCAAuC;IACjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ3C,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAYrE;AAED,uCAAuC;AACvC,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,SAAS,OAAa;IAC/B,QAAQ,CAAC,QAAQ,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB3C,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGrE"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Embedding model loader.
3
+ *
4
+ * Lazy-loads all-MiniLM-L6-v2 via @xenova/transformers (optional dep).
5
+ * Model is ~22MB, cached to disk after first download.
6
+ * Runs in pure JS/WASM -- no native bindings needed.
7
+ *
8
+ * @module agent-threat-rules/embedding/model-loader
9
+ */
10
+ const MODEL_NAME = 'Xenova/all-MiniLM-L6-v2';
11
+ const DIMENSION = 384;
12
+ export class TransformersJSModel {
13
+ dimension = DIMENSION;
14
+ pipeline = null;
15
+ get isLoaded() {
16
+ return this.pipeline !== null;
17
+ }
18
+ /** Lazy-load the model on first use */
19
+ async initialize() {
20
+ if (this.pipeline)
21
+ return;
22
+ try {
23
+ // Dynamic import to keep @xenova/transformers optional
24
+ const { pipeline } = await import('@xenova/transformers');
25
+ this.pipeline = (await pipeline('feature-extraction', MODEL_NAME, {
26
+ quantized: true,
27
+ }));
28
+ }
29
+ catch (err) {
30
+ const msg = err instanceof Error ? err.message : String(err);
31
+ if (msg.includes('Cannot find module') || msg.includes('MODULE_NOT_FOUND')) {
32
+ throw new Error('Embedding model requires @xenova/transformers. Install: npm install @xenova/transformers');
33
+ }
34
+ throw new Error(`Failed to load embedding model: ${msg}`);
35
+ }
36
+ }
37
+ async encode(text) {
38
+ if (!this.pipeline)
39
+ await this.initialize();
40
+ const pipelineFn = this.pipeline;
41
+ const output = await pipelineFn([text], { pooling: 'mean', normalize: true });
42
+ return new Float32Array(output.data.slice(0, DIMENSION));
43
+ }
44
+ async encodeBatch(texts) {
45
+ if (!this.pipeline)
46
+ await this.initialize();
47
+ const pipelineFn = this.pipeline;
48
+ const results = [];
49
+ // Process one at a time to control memory
50
+ for (const text of texts) {
51
+ const output = await pipelineFn([text], { pooling: 'mean', normalize: true });
52
+ results.push(new Float32Array(output.data.slice(0, DIMENSION)));
53
+ }
54
+ return results;
55
+ }
56
+ }
57
+ /** Create a no-op model for testing */
58
+ export class MockEmbeddingModel {
59
+ dimension = DIMENSION;
60
+ isLoaded = true;
61
+ mockVectors;
62
+ constructor(mockVectors) {
63
+ this.mockVectors = mockVectors ?? new Map();
64
+ }
65
+ async initialize() {
66
+ // No-op for mock
67
+ }
68
+ async encode(text) {
69
+ const existing = this.mockVectors.get(text);
70
+ if (existing)
71
+ return existing;
72
+ // Generate deterministic vector from text hash
73
+ const vec = new Float32Array(DIMENSION);
74
+ for (let i = 0; i < DIMENSION; i++) {
75
+ vec[i] = Math.sin(text.charCodeAt(i % text.length) * (i + 1) * 0.01);
76
+ }
77
+ // Normalize
78
+ let mag = 0;
79
+ for (let i = 0; i < DIMENSION; i++)
80
+ mag += vec[i] * vec[i];
81
+ mag = Math.sqrt(mag);
82
+ for (let i = 0; i < DIMENSION; i++)
83
+ vec[i] /= mag;
84
+ return vec;
85
+ }
86
+ async encodeBatch(texts) {
87
+ return Promise.all(texts.map((t) => this.encode(t)));
88
+ }
89
+ }
90
+ //# sourceMappingURL=model-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-loader.js","sourceRoot":"","sources":["../../src/embedding/model-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * In-memory vector store with cosine similarity search.
3
+ *
4
+ * Stores pre-computed attack embeddings and finds nearest neighbors
5
+ * for incoming text. Sub-millisecond for ~2000 vectors at 384 dimensions.
6
+ *
7
+ * @module agent-threat-rules/embedding/vector-store
8
+ */
9
+ import type { ATRSeverity } from '../types.js';
10
+ export interface VectorEntry {
11
+ readonly id: string;
12
+ readonly vector: Float32Array;
13
+ readonly label: string;
14
+ readonly category: string;
15
+ readonly severity: ATRSeverity;
16
+ }
17
+ export interface SearchResult {
18
+ readonly entry: VectorEntry;
19
+ readonly similarity: number;
20
+ }
21
+ export declare class VectorStore {
22
+ private readonly entries;
23
+ constructor(entries?: readonly VectorEntry[]);
24
+ /** Create new store with additional entries (immutable) */
25
+ withEntries(newEntries: readonly VectorEntry[]): VectorStore;
26
+ /**
27
+ * Find top-K nearest neighbors by cosine similarity.
28
+ * Only returns results above the threshold.
29
+ */
30
+ search(query: Float32Array, topK?: number, threshold?: number): readonly SearchResult[];
31
+ size(): number;
32
+ }
33
+ /** Load pre-computed embeddings from JSON */
34
+ export declare function loadVectorEntries(data: readonly {
35
+ id: string;
36
+ vector: number[];
37
+ label: string;
38
+ category: string;
39
+ severity: string;
40
+ }[]): VectorEntry[];
41
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/embedding/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE;IAI5C,2DAA2D;IAC3D,WAAW,CAAC,UAAU,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW;IAI5D;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,MAAU,EAAE,SAAS,GAAE,MAAa,GAAG,SAAS,YAAY,EAAE;IAiBhG,IAAI,IAAI,MAAM;CAGf;AAyBD,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GACnG,WAAW,EAAE,CAQf"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * In-memory vector store with cosine similarity search.
3
+ *
4
+ * Stores pre-computed attack embeddings and finds nearest neighbors
5
+ * for incoming text. Sub-millisecond for ~2000 vectors at 384 dimensions.
6
+ *
7
+ * @module agent-threat-rules/embedding/vector-store
8
+ */
9
+ export class VectorStore {
10
+ entries;
11
+ constructor(entries) {
12
+ this.entries = entries ?? [];
13
+ }
14
+ /** Create new store with additional entries (immutable) */
15
+ withEntries(newEntries) {
16
+ return new VectorStore([...this.entries, ...newEntries]);
17
+ }
18
+ /**
19
+ * Find top-K nearest neighbors by cosine similarity.
20
+ * Only returns results above the threshold.
21
+ */
22
+ search(query, topK = 3, threshold = 0.82) {
23
+ if (this.entries.length === 0)
24
+ return [];
25
+ const results = [];
26
+ for (const entry of this.entries) {
27
+ const sim = cosineSimilarity(query, entry.vector);
28
+ if (sim >= threshold) {
29
+ results.push({ entry, similarity: sim });
30
+ }
31
+ }
32
+ // Sort by similarity descending, take top K
33
+ results.sort((a, b) => b.similarity - a.similarity);
34
+ return results.slice(0, topK);
35
+ }
36
+ size() {
37
+ return this.entries.length;
38
+ }
39
+ }
40
+ /**
41
+ * Cosine similarity between two vectors.
42
+ * Returns value between -1 and 1 (1 = identical direction).
43
+ */
44
+ function cosineSimilarity(a, b) {
45
+ if (a.length !== b.length)
46
+ return 0;
47
+ let dot = 0;
48
+ let magA = 0;
49
+ let magB = 0;
50
+ for (let i = 0; i < a.length; i++) {
51
+ dot += a[i] * b[i];
52
+ magA += a[i] * a[i];
53
+ magB += b[i] * b[i];
54
+ }
55
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
56
+ if (denom === 0)
57
+ return 0;
58
+ return dot / denom;
59
+ }
60
+ /** Load pre-computed embeddings from JSON */
61
+ export function loadVectorEntries(data) {
62
+ return data.map((d) => ({
63
+ id: d.id,
64
+ vector: new Float32Array(d.vector),
65
+ label: d.label,
66
+ category: d.category,
67
+ severity: (d.severity || 'medium'),
68
+ }));
69
+ }
70
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/embedding/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,MAAM,OAAO,WAAW;IACL,OAAO,CAAyB;IAEjD,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,2DAA2D;IAC3D,WAAW,CAAC,UAAkC;QAC5C,OAAO,IAAI,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAmB,EAAE,OAAe,CAAC,EAAE,YAAoB,IAAI;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,CAAe,EAAE,CAAe;IACxD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACtB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACxB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE1B,OAAO,GAAG,GAAG,KAAK,CAAC;AACrB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAC/B,IAAoG;IAEpG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAgB;KAClD,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * ATR Engine - Evaluates agent events against ATR rules
3
+ *
4
+ * Core detection engine that:
5
+ * 1. Loads ATR YAML rules from disk
6
+ * 2. Evaluates agent events (LLM I/O, tool calls, behaviors) against rules
7
+ * 3. Returns matched rules with confidence scores
8
+ * 4. Supports two condition formats:
9
+ * - Array format: conditions is an array of {field, operator, value} objects
10
+ * - Named format: conditions is an object map of named condition blocks
11
+ *
12
+ * @module agent-threat-rules/engine
13
+ */
14
+ import type { ATRRule, ATRMatch, AgentEvent, ATRVerdict, ActionResult, ScanResult } from './types.js';
15
+ import type { SessionTracker } from './session-tracker.js';
16
+ import type { ActionExecutor } from './action-executor.js';
17
+ import type { SkillFingerprintStore } from './skill-fingerprint.js';
18
+ import type { SemanticLayerConfig } from './layer-integration.js';
19
+ import type { InvariantChecker } from './tier0-invariant.js';
20
+ import type { BlacklistProvider } from './tier1-blacklist.js';
21
+ import type { EmbeddingModule } from './modules/embedding.js';
22
+ /**
23
+ * Detection reporter — opt-in callback for feeding scan results back to
24
+ * ATR Threat Cloud. Every integration endpoint that enables this becomes
25
+ * a sensor in the global detection network. Anonymized detection events
26
+ * are aggregated across all endpoints to crystallize new rules.
27
+ *
28
+ * Privacy: only ruleId, severity, and scanTarget are reported by default.
29
+ * No raw content, no PII, no file paths. Platforms can override onDetection
30
+ * to control exactly what is sent.
31
+ */
32
+ export interface ATRReporter {
33
+ /** Called for every match. Implement to POST anonymized data to TC. */
34
+ readonly onDetection: (report: ATRDetectionReport) => void | Promise<void>;
35
+ /** Called when a scan completes with zero matches (opt-in). */
36
+ readonly onClean?: (report: ATRCleanReport) => void | Promise<void>;
37
+ }
38
+ export interface ATRDetectionReport {
39
+ readonly ruleId: string;
40
+ readonly severity: string;
41
+ readonly scanTarget: string;
42
+ readonly category: string;
43
+ readonly confidence: number;
44
+ readonly timestamp: string;
45
+ /** Content hash (SHA-256) — identifies the scanned artifact without revealing content */
46
+ readonly contentHash: string;
47
+ }
48
+ export interface ATRCleanReport {
49
+ readonly rulesEvaluated: number;
50
+ readonly scanTarget: string;
51
+ readonly timestamp: string;
52
+ readonly contentHash: string;
53
+ }
54
+ export interface ATREngineConfig {
55
+ /** Directory containing ATR rule YAML files */
56
+ rulesDir?: string;
57
+ /** Pre-loaded rules (for testing or embedding) */
58
+ rules?: ATRRule[];
59
+ /** Optional session tracker for behavioral detection across events */
60
+ sessionTracker?: SessionTracker;
61
+ /** Optional Tier 0: Invariant enforcement (hard boundaries, pre-check) */
62
+ invariantChecker?: InvariantChecker;
63
+ /** Optional Tier 1: Skill blacklist provider (known-bad lookup) */
64
+ blacklistProvider?: BlacklistProvider;
65
+ /** Optional Layer 2: Skill behavioral fingerprinting (no LLM required) */
66
+ fingerprintStore?: SkillFingerprintStore;
67
+ /** Optional Tier 2.5: Embedding similarity module (requires @xenova/transformers) */
68
+ embeddingModule?: EmbeddingModule;
69
+ /** Optional Layer 3: Semantic LLM-as-judge analysis (requires API key) */
70
+ semanticModule?: SemanticLayerConfig;
71
+ /** Optional: detection reporter for feeding results to ATR Threat Cloud */
72
+ reporter?: ATRReporter;
73
+ }
74
+ export declare class ATREngine {
75
+ private readonly config;
76
+ private rules;
77
+ private readonly compiledPatterns;
78
+ private readonly semanticModuleInstance;
79
+ /**
80
+ * Find bundled rules directory shipped with the npm package.
81
+ * Checks: ../rules (from dist/), ./rules (repo root)
82
+ */
83
+ private findBundledRulesDir;
84
+ constructor(config?: ATREngineConfig);
85
+ /**
86
+ * Load rules from configured directory and/or pre-loaded rules.
87
+ */
88
+ loadRules(): Promise<number>;
89
+ /**
90
+ * Load a single rule file and add it to the engine.
91
+ */
92
+ addRuleFile(filePath: string): void;
93
+ /**
94
+ * Add a pre-parsed rule to the engine.
95
+ */
96
+ addRule(rule: ATRRule): void;
97
+ /**
98
+ * Evaluate an agent event against all loaded ATR rules.
99
+ * Returns all matching rules with details.
100
+ */
101
+ evaluate(event: AgentEvent): ATRMatch[];
102
+ /**
103
+ * Evaluate a single rule against an event.
104
+ * Supports both array-format and named-map-format conditions.
105
+ */
106
+ private evaluateRule;
107
+ /**
108
+ * Evaluate array-format conditions: [{field, operator, value}, ...]
109
+ * with condition: "any" | "all"
110
+ */
111
+ private evaluateArrayConditions;
112
+ /**
113
+ * Evaluate a single array-format condition {field, operator, value}.
114
+ */
115
+ private evaluateArrayCondition;
116
+ /**
117
+ * Evaluate named-map-format conditions: {name: {field, patterns, match_type}, ...}
118
+ * with condition: "name1 AND name2" | "name1 OR name2" | "name1"
119
+ */
120
+ private evaluateNamedConditions;
121
+ /**
122
+ * Evaluate a single named condition against an event.
123
+ */
124
+ private evaluateNamedCondition;
125
+ /**
126
+ * Evaluate a pattern matching condition (named format with patterns array).
127
+ */
128
+ private evaluatePatternCondition;
129
+ /**
130
+ * Determine if a rule should suppress matches inside markdown code blocks.
131
+ * Rules that commonly false-positive on documentation (shell commands, file paths,
132
+ * code examples) are suppressed. Prompt injection rules are NEVER suppressed
133
+ * because attackers deliberately hide payloads in code blocks.
134
+ */
135
+ private shouldSuppressInCodeBlocks;
136
+ /**
137
+ * Evaluate a behavioral threshold condition.
138
+ * When a session tracker is available and the event has a sessionId,
139
+ * supports session-derived metrics: call_frequency, pattern_frequency, event_count.
140
+ */
141
+ private evaluateBehavioralCondition;
142
+ /**
143
+ * Resolve a metric value from event metrics or session tracker.
144
+ * Session-derived metrics use the format: "call_frequency:toolName" or "pattern_frequency:pattern".
145
+ */
146
+ private resolveMetricValue;
147
+ /**
148
+ * Parse a window string (e.g. "5m", "1h", "30s") to milliseconds.
149
+ * Defaults to 5 minutes if not specified or unparseable.
150
+ */
151
+ private parseWindowMs;
152
+ /**
153
+ * Evaluate a sequence condition against the current event.
154
+ *
155
+ * Two modes:
156
+ * 1. Session-aware (when SessionTracker + sessionId available):
157
+ * Checks patterns across historical events in the session.
158
+ * Respects `ordered` flag and `within` time window.
159
+ * 2. Single-event fallback: checks if patterns co-occur in one event.
160
+ */
161
+ private evaluateSequenceCondition;
162
+ /**
163
+ * Cross-event sequence detection using SessionTracker.
164
+ * Checks if step patterns have been seen across events in order.
165
+ */
166
+ private evaluateSequenceAcrossSession;
167
+ /**
168
+ * Single-event fallback: check if step patterns co-occur in one event.
169
+ */
170
+ private evaluateSequenceSingleEvent;
171
+ /**
172
+ * Resolve a field value from an agent event.
173
+ */
174
+ private resolveField;
175
+ /**
176
+ * Evaluate a boolean expression string against condition results.
177
+ * Supports AND, OR, NOT operators.
178
+ */
179
+ private evaluateExpression;
180
+ /**
181
+ * Split expression by operator, respecting parentheses.
182
+ */
183
+ private splitByOperator;
184
+ /**
185
+ * Pre-compile regex patterns for a rule (performance optimization).
186
+ * Supports both array-format and named-map-format conditions.
187
+ */
188
+ private compilePatterns;
189
+ /**
190
+ * Evaluate an event and compute a verdict with optional action execution.
191
+ *
192
+ * Combines evaluate() + computeVerdict() + optional ActionExecutor
193
+ * into a single call for convenience.
194
+ */
195
+ evaluateWithVerdict(event: AgentEvent, executor?: ActionExecutor): Promise<{
196
+ verdict: ATRVerdict;
197
+ actionResults: readonly ActionResult[];
198
+ layersUsed: readonly string[];
199
+ }>;
200
+ /** Get loaded rule count */
201
+ getRuleCount(): number;
202
+ /** Get all loaded rules */
203
+ getRules(): readonly ATRRule[];
204
+ /** Get a rule by ID */
205
+ getRuleById(id: string): ATRRule | undefined;
206
+ /** Get rules by category */
207
+ getRulesByCategory(category: string): ATRRule[];
208
+ /**
209
+ * Scan SKILL.md content for threats.
210
+ * All rules fire with scanContext='skill':
211
+ * - skill/both rules: native context, full confidence
212
+ * - MCP-only rules: cross-context, confidence * 0.6
213
+ * Also decodes base64 blocks and scans decoded content.
214
+ * Code-block suppression and FP denylist applied in evaluate().
215
+ */
216
+ scanSkill(content: string): ATRMatch[];
217
+ /** Scan a SKILL.md file and return a unified ScanResult with content_hash. */
218
+ scanSkillFull(content: string, filePath?: string): ScanResult;
219
+ /** Evaluate an MCP agent event and return a unified ScanResult with content_hash. */
220
+ evaluateFull(event: AgentEvent, filePath?: string): ScanResult;
221
+ }
222
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}