@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.
- package/dist/action-executor.d.ts +44 -0
- package/dist/action-executor.d.ts.map +1 -0
- package/dist/action-executor.js +130 -0
- package/dist/action-executor.js.map +1 -0
- package/dist/adapters/default-adapter.d.ts +24 -0
- package/dist/adapters/default-adapter.d.ts.map +1 -0
- package/dist/adapters/default-adapter.js +51 -0
- package/dist/adapters/default-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +30 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +128 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/badge.d.ts +42 -0
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +163 -0
- package/dist/badge.js.map +1 -0
- package/dist/capability-extractor.d.ts +35 -0
- package/dist/capability-extractor.d.ts.map +1 -0
- package/dist/capability-extractor.js +91 -0
- package/dist/capability-extractor.js.map +1 -0
- package/dist/cli/scan-handler.d.ts +21 -0
- package/dist/cli/scan-handler.d.ts.map +1 -0
- package/dist/cli/scan-handler.js +276 -0
- package/dist/cli/scan-handler.js.map +1 -0
- package/dist/cli/tc-pipeline.d.ts +18 -0
- package/dist/cli/tc-pipeline.d.ts.map +1 -0
- package/dist/cli/tc-pipeline.js +295 -0
- package/dist/cli/tc-pipeline.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +894 -0
- package/dist/cli.js.map +1 -0
- package/dist/content-hash.d.ts +7 -0
- package/dist/content-hash.d.ts.map +1 -0
- package/dist/content-hash.js +10 -0
- package/dist/content-hash.js.map +1 -0
- package/dist/converters/elastic.d.ts +36 -0
- package/dist/converters/elastic.d.ts.map +1 -0
- package/dist/converters/elastic.js +125 -0
- package/dist/converters/elastic.js.map +1 -0
- package/dist/converters/generic-regex.d.ts +37 -0
- package/dist/converters/generic-regex.d.ts.map +1 -0
- package/dist/converters/generic-regex.js +59 -0
- package/dist/converters/generic-regex.js.map +1 -0
- package/dist/converters/index.d.ts +32 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +38 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/sarif.d.ts +18 -0
- package/dist/converters/sarif.d.ts.map +1 -0
- package/dist/converters/sarif.js +142 -0
- package/dist/converters/sarif.js.map +1 -0
- package/dist/converters/splunk.d.ts +19 -0
- package/dist/converters/splunk.d.ts.map +1 -0
- package/dist/converters/splunk.js +148 -0
- package/dist/converters/splunk.js.map +1 -0
- package/dist/coverage-analyzer.d.ts +43 -0
- package/dist/coverage-analyzer.d.ts.map +1 -0
- package/dist/coverage-analyzer.js +329 -0
- package/dist/coverage-analyzer.js.map +1 -0
- package/dist/embedding/build-corpus.d.ts +15 -0
- package/dist/embedding/build-corpus.d.ts.map +1 -0
- package/dist/embedding/build-corpus.js +105 -0
- package/dist/embedding/build-corpus.js.map +1 -0
- package/dist/embedding/model-loader.d.ts +41 -0
- package/dist/embedding/model-loader.d.ts.map +1 -0
- package/dist/embedding/model-loader.js +90 -0
- package/dist/embedding/model-loader.js.map +1 -0
- package/dist/embedding/vector-store.d.ts +41 -0
- package/dist/embedding/vector-store.d.ts.map +1 -0
- package/dist/embedding/vector-store.js +70 -0
- package/dist/embedding/vector-store.js.map +1 -0
- package/dist/engine.d.ts +222 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1185 -0
- package/dist/engine.js.map +1 -0
- package/dist/eval/corpus.d.ts +42 -0
- package/dist/eval/corpus.d.ts.map +1 -0
- package/dist/eval/corpus.js +427 -0
- package/dist/eval/corpus.js.map +1 -0
- package/dist/eval/eval-harness.d.ts +44 -0
- package/dist/eval/eval-harness.d.ts.map +1 -0
- package/dist/eval/eval-harness.js +296 -0
- package/dist/eval/eval-harness.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +9 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/metrics.d.ts +74 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +108 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/eval/pint-corpus.d.ts +34 -0
- package/dist/eval/pint-corpus.d.ts.map +1 -0
- package/dist/eval/pint-corpus.js +113 -0
- package/dist/eval/pint-corpus.js.map +1 -0
- package/dist/eval/rule-corpus.d.ts +9 -0
- package/dist/eval/rule-corpus.d.ts.map +1 -0
- package/dist/eval/rule-corpus.js +4780 -0
- package/dist/eval/rule-corpus.js.map +1 -0
- package/dist/eval/rule-metrics.d.ts +34 -0
- package/dist/eval/rule-metrics.d.ts.map +1 -0
- package/dist/eval/rule-metrics.js +92 -0
- package/dist/eval/rule-metrics.js.map +1 -0
- package/dist/eval/run-eval.d.ts +7 -0
- package/dist/eval/run-eval.d.ts.map +1 -0
- package/dist/eval/run-eval.js +11 -0
- package/dist/eval/run-eval.js.map +1 -0
- package/dist/eval/run-pint-benchmark.d.ts +18 -0
- package/dist/eval/run-pint-benchmark.d.ts.map +1 -0
- package/dist/eval/run-pint-benchmark.js +159 -0
- package/dist/eval/run-pint-benchmark.js.map +1 -0
- package/dist/eval/skill-benchmark.d.ts +66 -0
- package/dist/eval/skill-benchmark.d.ts.map +1 -0
- package/dist/eval/skill-benchmark.js +194 -0
- package/dist/eval/skill-benchmark.js.map +1 -0
- package/dist/flywheel.d.ts +54 -0
- package/dist/flywheel.d.ts.map +1 -0
- package/dist/flywheel.js +121 -0
- package/dist/flywheel.js.map +1 -0
- package/dist/hook-handler.d.ts +61 -0
- package/dist/hook-handler.d.ts.map +1 -0
- package/dist/hook-handler.js +178 -0
- package/dist/hook-handler.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/layer-integration.d.ts +55 -0
- package/dist/layer-integration.d.ts.map +1 -0
- package/dist/layer-integration.js +187 -0
- package/dist/layer-integration.js.map +1 -0
- package/dist/loader.d.ts +18 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +129 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp-server.d.ts +13 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +246 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
- package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
- package/dist/mcp-tools/coverage-gaps.js +55 -0
- package/dist/mcp-tools/coverage-gaps.js.map +1 -0
- package/dist/mcp-tools/list-rules.d.ts +17 -0
- package/dist/mcp-tools/list-rules.d.ts.map +1 -0
- package/dist/mcp-tools/list-rules.js +45 -0
- package/dist/mcp-tools/list-rules.js.map +1 -0
- package/dist/mcp-tools/scan-skill.d.ts +17 -0
- package/dist/mcp-tools/scan-skill.d.ts.map +1 -0
- package/dist/mcp-tools/scan-skill.js +65 -0
- package/dist/mcp-tools/scan-skill.js.map +1 -0
- package/dist/mcp-tools/scan.d.ts +24 -0
- package/dist/mcp-tools/scan.d.ts.map +1 -0
- package/dist/mcp-tools/scan.js +94 -0
- package/dist/mcp-tools/scan.js.map +1 -0
- package/dist/mcp-tools/submit-proposal.d.ts +12 -0
- package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
- package/dist/mcp-tools/submit-proposal.js +103 -0
- package/dist/mcp-tools/submit-proposal.js.map +1 -0
- package/dist/mcp-tools/threat-summary.d.ts +12 -0
- package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
- package/dist/mcp-tools/threat-summary.js +74 -0
- package/dist/mcp-tools/threat-summary.js.map +1 -0
- package/dist/mcp-tools/validate.d.ts +15 -0
- package/dist/mcp-tools/validate.d.ts.map +1 -0
- package/dist/mcp-tools/validate.js +51 -0
- package/dist/mcp-tools/validate.js.map +1 -0
- package/dist/modules/embedding.d.ts +71 -0
- package/dist/modules/embedding.d.ts.map +1 -0
- package/dist/modules/embedding.js +141 -0
- package/dist/modules/embedding.js.map +1 -0
- package/dist/modules/index.d.ts +144 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +82 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/semantic.d.ts +106 -0
- package/dist/modules/semantic.d.ts.map +1 -0
- package/dist/modules/semantic.js +359 -0
- package/dist/modules/semantic.js.map +1 -0
- package/dist/modules/session.d.ts +70 -0
- package/dist/modules/session.d.ts.map +1 -0
- package/dist/modules/session.js +128 -0
- package/dist/modules/session.js.map +1 -0
- package/dist/quality/adapters/atr.d.ts +65 -0
- package/dist/quality/adapters/atr.d.ts.map +1 -0
- package/dist/quality/adapters/atr.js +154 -0
- package/dist/quality/adapters/atr.js.map +1 -0
- package/dist/quality/adapters/index.d.ts +10 -0
- package/dist/quality/adapters/index.d.ts.map +1 -0
- package/dist/quality/adapters/index.js +10 -0
- package/dist/quality/adapters/index.js.map +1 -0
- package/dist/quality/compute-confidence.d.ts +45 -0
- package/dist/quality/compute-confidence.d.ts.map +1 -0
- package/dist/quality/compute-confidence.js +133 -0
- package/dist/quality/compute-confidence.js.map +1 -0
- package/dist/quality/index.d.ts +36 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +39 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/quality-gate.d.ts +86 -0
- package/dist/quality/quality-gate.d.ts.map +1 -0
- package/dist/quality/quality-gate.js +187 -0
- package/dist/quality/quality-gate.js.map +1 -0
- package/dist/quality/types.d.ts +129 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +10 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/quality/validate-maturity.d.ts +51 -0
- package/dist/quality/validate-maturity.d.ts.map +1 -0
- package/dist/quality/validate-maturity.js +134 -0
- package/dist/quality/validate-maturity.js.map +1 -0
- package/dist/quality.d.ts +8 -0
- package/dist/quality.d.ts.map +1 -0
- package/dist/quality.js +8 -0
- package/dist/quality.js.map +1 -0
- package/dist/rule-scaffolder.d.ts +53 -0
- package/dist/rule-scaffolder.d.ts.map +1 -0
- package/dist/rule-scaffolder.js +301 -0
- package/dist/rule-scaffolder.js.map +1 -0
- package/dist/session-tracker.d.ts +58 -0
- package/dist/session-tracker.d.ts.map +1 -0
- package/dist/session-tracker.js +176 -0
- package/dist/session-tracker.js.map +1 -0
- package/dist/shadow-evaluator.d.ts +48 -0
- package/dist/shadow-evaluator.d.ts.map +1 -0
- package/dist/shadow-evaluator.js +129 -0
- package/dist/shadow-evaluator.js.map +1 -0
- package/dist/skill-fingerprint.d.ts +85 -0
- package/dist/skill-fingerprint.d.ts.map +1 -0
- package/dist/skill-fingerprint.js +284 -0
- package/dist/skill-fingerprint.js.map +1 -0
- package/dist/tc-reporter.d.ts +50 -0
- package/dist/tc-reporter.d.ts.map +1 -0
- package/dist/tc-reporter.js +164 -0
- package/dist/tc-reporter.js.map +1 -0
- package/dist/tier0-invariant.d.ts +49 -0
- package/dist/tier0-invariant.d.ts.map +1 -0
- package/dist/tier0-invariant.js +185 -0
- package/dist/tier0-invariant.js.map +1 -0
- package/dist/tier1-blacklist.d.ts +48 -0
- package/dist/tier1-blacklist.d.ts.map +1 -0
- package/dist/tier1-blacklist.js +92 -0
- package/dist/tier1-blacklist.js.map +1 -0
- package/dist/types.d.ts +232 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/verdict.d.ts +26 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +127 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +16 -4
- package/.github/ISSUE_TEMPLATE/evasion-report.yml +0 -75
- package/.github/ISSUE_TEMPLATE/false-positive.yml +0 -31
- package/.github/ISSUE_TEMPLATE/mirofish-prediction.yml +0 -128
- package/.github/ISSUE_TEMPLATE/new-rule.yml +0 -37
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- package/.github/workflows/rule-quality.yml +0 -203
- package/.github/workflows/validate.yml +0 -42
- package/CHANGELOG.md +0 -30
- package/CONTRIBUTING.md +0 -168
- package/CONTRIBUTORS.md +0 -28
- package/COVERAGE.md +0 -135
- package/LIMITATIONS.md +0 -154
- package/SECURITY.md +0 -48
- package/THREAT-MODEL.md +0 -243
- package/docs/contribution-paths.md +0 -202
- package/docs/mirofish-prediction-guide.md +0 -304
- package/docs/quick-start.md +0 -245
- package/docs/rule-writing-guide.md +0 -647
- package/docs/schema-spec.md +0 -594
- package/examples/how-to-write-a-rule.md +0 -251
- 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":"AAAA;;;;;;;;GAQG;AAeH,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,OAAO,mBAAmB;IACrB,SAAS,GAAG,SAAS,CAAC;IACvB,QAAQ,GAAY,IAAI,CAAC;IAEjC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,EAAE;gBAChE,SAAS,EAAE,IAAI;aAChB,CAAC,CAAyB,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAmG,CAAC;QAC5H,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAwB;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAmG,CAAC;QAC5H,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,0CAA0C;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,uCAAuC;AACvC,MAAM,OAAO,kBAAkB;IACpB,SAAS,GAAG,SAAS,CAAC;IACtB,QAAQ,GAAG,IAAI,CAAC;IACR,WAAW,CAA4B;IAExD,YAAY,WAAuC;QACjD,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,GAAG,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,UAAU;QACd,iBAAiB;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,+CAA+C;QAC/C,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvE,CAAC;QACD,YAAY;QACZ,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QAC7D,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAE,IAAI,GAAG,CAAC;QACnD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAwB;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF"}
|
|
@@ -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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -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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"}
|