agent-threat-rules 0.1.0 → 0.2.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 (131) hide show
  1. package/README.md +360 -98
  2. package/dist/action-executor.d.ts +44 -0
  3. package/dist/action-executor.d.ts.map +1 -0
  4. package/dist/action-executor.js +130 -0
  5. package/dist/action-executor.js.map +1 -0
  6. package/dist/adapters/default-adapter.d.ts +24 -0
  7. package/dist/adapters/default-adapter.d.ts.map +1 -0
  8. package/dist/adapters/default-adapter.js +51 -0
  9. package/dist/adapters/default-adapter.js.map +1 -0
  10. package/dist/adapters/stdio-adapter.d.ts +30 -0
  11. package/dist/adapters/stdio-adapter.d.ts.map +1 -0
  12. package/dist/adapters/stdio-adapter.js +128 -0
  13. package/dist/adapters/stdio-adapter.js.map +1 -0
  14. package/dist/cli.js +119 -1
  15. package/dist/cli.js.map +1 -1
  16. package/dist/coverage-analyzer.d.ts +43 -0
  17. package/dist/coverage-analyzer.d.ts.map +1 -0
  18. package/dist/coverage-analyzer.js +329 -0
  19. package/dist/coverage-analyzer.js.map +1 -0
  20. package/dist/engine.d.ts +40 -5
  21. package/dist/engine.d.ts.map +1 -1
  22. package/dist/engine.js +89 -5
  23. package/dist/engine.js.map +1 -1
  24. package/dist/hook-handler.d.ts +61 -0
  25. package/dist/hook-handler.d.ts.map +1 -0
  26. package/dist/hook-handler.js +178 -0
  27. package/dist/hook-handler.js.map +1 -0
  28. package/dist/index.d.ts +19 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +11 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/layer-integration.d.ts +55 -0
  33. package/dist/layer-integration.d.ts.map +1 -0
  34. package/dist/layer-integration.js +185 -0
  35. package/dist/layer-integration.js.map +1 -0
  36. package/dist/loader.js +2 -2
  37. package/dist/loader.js.map +1 -1
  38. package/dist/mcp-server.d.ts +13 -0
  39. package/dist/mcp-server.d.ts.map +1 -0
  40. package/dist/mcp-server.js +220 -0
  41. package/dist/mcp-server.js.map +1 -0
  42. package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
  43. package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
  44. package/dist/mcp-tools/coverage-gaps.js +55 -0
  45. package/dist/mcp-tools/coverage-gaps.js.map +1 -0
  46. package/dist/mcp-tools/list-rules.d.ts +17 -0
  47. package/dist/mcp-tools/list-rules.d.ts.map +1 -0
  48. package/dist/mcp-tools/list-rules.js +45 -0
  49. package/dist/mcp-tools/list-rules.js.map +1 -0
  50. package/dist/mcp-tools/scan.d.ts +24 -0
  51. package/dist/mcp-tools/scan.d.ts.map +1 -0
  52. package/dist/mcp-tools/scan.js +87 -0
  53. package/dist/mcp-tools/scan.js.map +1 -0
  54. package/dist/mcp-tools/submit-proposal.d.ts +12 -0
  55. package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
  56. package/dist/mcp-tools/submit-proposal.js +95 -0
  57. package/dist/mcp-tools/submit-proposal.js.map +1 -0
  58. package/dist/mcp-tools/threat-summary.d.ts +12 -0
  59. package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
  60. package/dist/mcp-tools/threat-summary.js +74 -0
  61. package/dist/mcp-tools/threat-summary.js.map +1 -0
  62. package/dist/mcp-tools/validate.d.ts +15 -0
  63. package/dist/mcp-tools/validate.d.ts.map +1 -0
  64. package/dist/mcp-tools/validate.js +45 -0
  65. package/dist/mcp-tools/validate.js.map +1 -0
  66. package/dist/modules/index.d.ts +5 -4
  67. package/dist/modules/index.d.ts.map +1 -1
  68. package/dist/modules/index.js +6 -4
  69. package/dist/modules/index.js.map +1 -1
  70. package/dist/modules/semantic.d.ts +105 -0
  71. package/dist/modules/semantic.d.ts.map +1 -0
  72. package/dist/modules/semantic.js +283 -0
  73. package/dist/modules/semantic.js.map +1 -0
  74. package/dist/rule-scaffolder.d.ts +39 -0
  75. package/dist/rule-scaffolder.d.ts.map +1 -0
  76. package/dist/rule-scaffolder.js +184 -0
  77. package/dist/rule-scaffolder.js.map +1 -0
  78. package/dist/skill-fingerprint.d.ts +85 -0
  79. package/dist/skill-fingerprint.d.ts.map +1 -0
  80. package/dist/skill-fingerprint.js +326 -0
  81. package/dist/skill-fingerprint.js.map +1 -0
  82. package/dist/types.d.ts +59 -1
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/verdict.d.ts +26 -0
  85. package/dist/verdict.d.ts.map +1 -0
  86. package/dist/verdict.js +127 -0
  87. package/dist/verdict.js.map +1 -0
  88. package/package.json +6 -1
  89. package/rules/agent-manipulation/ATR-2026-030-cross-agent-attack.yaml +1 -1
  90. package/rules/agent-manipulation/ATR-2026-032-goal-hijacking.yaml +1 -1
  91. package/rules/agent-manipulation/ATR-2026-074-cross-agent-privilege-escalation.yaml +1 -1
  92. package/rules/agent-manipulation/ATR-2026-076-inter-agent-message-spoofing.yaml +1 -1
  93. package/rules/agent-manipulation/ATR-2026-077-human-trust-exploitation.yaml +1 -1
  94. package/rules/context-exfiltration/ATR-2026-020-system-prompt-leak.yaml +1 -1
  95. package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +1 -1
  96. package/rules/context-exfiltration/ATR-2026-075-agent-memory-manipulation.yaml +1 -1
  97. package/rules/data-poisoning/ATR-2026-070-data-poisoning.yaml +1 -1
  98. package/rules/excessive-autonomy/ATR-2026-050-runaway-agent-loop.yaml +1 -1
  99. package/rules/excessive-autonomy/ATR-2026-051-resource-exhaustion.yaml +1 -1
  100. package/rules/excessive-autonomy/ATR-2026-052-cascading-failure.yaml +1 -1
  101. package/rules/model-security/ATR-2026-072-model-behavior-extraction.yaml +1 -1
  102. package/rules/model-security/ATR-2026-073-malicious-finetuning-data.yaml +1 -1
  103. package/rules/privilege-escalation/ATR-2026-040-privilege-escalation.yaml +1 -1
  104. package/rules/privilege-escalation/ATR-2026-041-scope-creep.yaml +1 -1
  105. package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +3 -3
  106. package/rules/prompt-injection/ATR-2026-002-indirect-prompt-injection.yaml +1 -1
  107. package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +1 -1
  108. package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +1 -1
  109. package/rules/prompt-injection/ATR-2026-005-multi-turn-injection.yaml +1 -1
  110. package/rules/prompt-injection/ATR-2026-080-encoding-evasion.yaml +80 -0
  111. package/rules/prompt-injection/ATR-2026-081-semantic-multi-turn.yaml +77 -0
  112. package/rules/prompt-injection/ATR-2026-082-fingerprint-evasion.yaml +76 -0
  113. package/rules/prompt-injection/ATR-2026-083-indirect-tool-injection.yaml +76 -0
  114. package/rules/prompt-injection/ATR-2026-084-structured-data-injection.yaml +78 -0
  115. package/rules/prompt-injection/ATR-2026-085-audit-evasion.yaml +76 -0
  116. package/rules/prompt-injection/ATR-2026-086-visual-spoofing.yaml +80 -0
  117. package/rules/prompt-injection/ATR-2026-087-rule-probing.yaml +74 -0
  118. package/rules/prompt-injection/ATR-2026-088-adaptive-countermeasure.yaml +76 -0
  119. package/rules/prompt-injection/ATR-2026-089-polymorphic-skill.yaml +77 -0
  120. package/rules/prompt-injection/ATR-2026-090-threat-intel-exfil.yaml +76 -0
  121. package/rules/prompt-injection/ATR-2026-091-nested-payload.yaml +80 -0
  122. package/rules/prompt-injection/ATR-2026-092-consensus-poisoning.yaml +84 -0
  123. package/rules/prompt-injection/ATR-2026-093-gradual-escalation.yaml +78 -0
  124. package/rules/prompt-injection/ATR-2026-094-audit-bypass.yaml +78 -0
  125. package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +1 -1
  126. package/rules/tool-poisoning/ATR-2026-010-mcp-malicious-response.yaml +1 -1
  127. package/rules/tool-poisoning/ATR-2026-011-tool-output-injection.yaml +3 -3
  128. package/rules/tool-poisoning/ATR-2026-012-unauthorized-tool-call.yaml +1 -1
  129. package/rules/tool-poisoning/ATR-2026-013-tool-ssrf.yaml +1 -1
  130. package/rules/tool-poisoning/ATR-2026-095-supply-chain-poisoning.yaml +82 -0
  131. package/rules/tool-poisoning/ATR-2026-096-registry-poisoning.yaml +84 -0
@@ -0,0 +1,24 @@
1
+ /**
2
+ * atr_scan MCP tool - Scan content for agent threats
3
+ *
4
+ * Runs all configured detection layers:
5
+ * - Layer 1: Regex pattern matching (always)
6
+ * - Layer 2: Skill behavioral fingerprinting (if configured)
7
+ * - Layer 3: Semantic LLM-as-judge (if configured and triggered)
8
+ *
9
+ * @module agent-threat-rules/mcp-tools/scan
10
+ */
11
+ import type { ATREngine } from '../engine.js';
12
+ export interface ScanInput {
13
+ content: string;
14
+ event_type?: string;
15
+ min_severity?: string;
16
+ }
17
+ export declare function handleScan(engine: ATREngine, args: Record<string, unknown>): Promise<{
18
+ content: Array<{
19
+ type: string;
20
+ text: string;
21
+ }>;
22
+ isError?: boolean;
23
+ }>;
24
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC1F,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CAsED"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * atr_scan MCP tool - Scan content for agent threats
3
+ *
4
+ * Runs all configured detection layers:
5
+ * - Layer 1: Regex pattern matching (always)
6
+ * - Layer 2: Skill behavioral fingerprinting (if configured)
7
+ * - Layer 3: Semantic LLM-as-judge (if configured and triggered)
8
+ *
9
+ * @module agent-threat-rules/mcp-tools/scan
10
+ */
11
+ const SEVERITY_ORDER = {
12
+ informational: 0,
13
+ low: 1,
14
+ medium: 2,
15
+ high: 3,
16
+ critical: 4,
17
+ };
18
+ const VALID_EVENT_TYPES = new Set([
19
+ 'llm_input',
20
+ 'llm_output',
21
+ 'tool_call',
22
+ 'tool_response',
23
+ 'agent_behavior',
24
+ 'multi_agent_message',
25
+ ]);
26
+ export async function handleScan(engine, args) {
27
+ const content = args['content'];
28
+ if (typeof content !== 'string' || content.trim().length === 0) {
29
+ return {
30
+ content: [{ type: 'text', text: 'Error: "content" is required and must be a non-empty string.' }],
31
+ isError: true,
32
+ };
33
+ }
34
+ const eventTypeRaw = args['event_type'] ?? 'llm_input';
35
+ if (!VALID_EVENT_TYPES.has(eventTypeRaw)) {
36
+ return {
37
+ content: [{ type: 'text', text: `Error: Invalid event_type "${eventTypeRaw}". Valid types: ${[...VALID_EVENT_TYPES].join(', ')}` }],
38
+ isError: true,
39
+ };
40
+ }
41
+ const minSeverity = (args['min_severity'] ?? 'informational').toLowerCase();
42
+ if (!(minSeverity in SEVERITY_ORDER)) {
43
+ return {
44
+ content: [{ type: 'text', text: `Error: Invalid min_severity "${minSeverity}". Valid: informational, low, medium, high, critical` }],
45
+ isError: true,
46
+ };
47
+ }
48
+ const minIdx = SEVERITY_ORDER[minSeverity] ?? 0;
49
+ const event = {
50
+ type: eventTypeRaw,
51
+ timestamp: new Date().toISOString(),
52
+ content: content,
53
+ fields: {
54
+ user_input: content,
55
+ agent_output: content,
56
+ tool_response: content,
57
+ content: content,
58
+ },
59
+ };
60
+ // Use evaluateWithVerdict() to run all configured layers
61
+ const { verdict, layersUsed } = await engine.evaluateWithVerdict(event);
62
+ const filtered = verdict.matches.filter((m) => (SEVERITY_ORDER[m.rule.severity] ?? 0) >= minIdx);
63
+ const result = {
64
+ threats_found: filtered.length,
65
+ scan_timestamp: event.timestamp,
66
+ event_type: eventTypeRaw,
67
+ layers_used: layersUsed,
68
+ verdict: {
69
+ outcome: verdict.outcome,
70
+ reason: verdict.reason,
71
+ },
72
+ matches: filtered.map((m) => ({
73
+ rule_id: m.rule.id,
74
+ title: m.rule.title,
75
+ severity: m.rule.severity,
76
+ category: m.rule.tags.category,
77
+ confidence: Math.round(m.confidence * 100),
78
+ description: m.rule.description,
79
+ matched_patterns: m.matchedPatterns,
80
+ recommended_actions: m.rule.response.actions,
81
+ })),
82
+ };
83
+ return {
84
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
85
+ };
86
+ }
87
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/mcp-tools/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * atr_submit_proposal MCP tool - Generate ATR rule draft from threat description
3
+ * @module agent-threat-rules/mcp-tools/submit-proposal
4
+ */
5
+ export declare function handleSubmitProposal(args: Record<string, unknown>): {
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ isError?: boolean;
11
+ };
12
+ //# sourceMappingURL=submit-proposal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-proposal.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/submit-proposal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACnE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CA+EA"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * atr_submit_proposal MCP tool - Generate ATR rule draft from threat description
3
+ * @module agent-threat-rules/mcp-tools/submit-proposal
4
+ */
5
+ import { RuleScaffolder } from '../rule-scaffolder.js';
6
+ const VALID_CATEGORIES = new Set([
7
+ 'prompt-injection',
8
+ 'tool-poisoning',
9
+ 'context-exfiltration',
10
+ 'agent-manipulation',
11
+ 'privilege-escalation',
12
+ 'excessive-autonomy',
13
+ 'data-poisoning',
14
+ 'model-abuse',
15
+ 'skill-compromise',
16
+ ]);
17
+ const VALID_SEVERITIES = new Set([
18
+ 'critical',
19
+ 'high',
20
+ 'medium',
21
+ 'low',
22
+ 'informational',
23
+ ]);
24
+ export function handleSubmitProposal(args) {
25
+ const title = args['title'];
26
+ const category = args['category'];
27
+ const attackDescription = args['attack_description'];
28
+ const examplePayloads = args['example_payloads'];
29
+ const severity = args['severity'];
30
+ const mitreRefs = args['mitre_refs'];
31
+ // Validate required fields
32
+ if (typeof title !== 'string' || title.trim().length === 0) {
33
+ return {
34
+ content: [{ type: 'text', text: 'Error: "title" is required and must be a non-empty string.' }],
35
+ isError: true,
36
+ };
37
+ }
38
+ if (typeof category !== 'string' || !VALID_CATEGORIES.has(category)) {
39
+ return {
40
+ content: [{ type: 'text', text: `Error: "category" must be one of: ${[...VALID_CATEGORIES].join(', ')}` }],
41
+ isError: true,
42
+ };
43
+ }
44
+ if (typeof attackDescription !== 'string' || attackDescription.trim().length === 0) {
45
+ return {
46
+ content: [{ type: 'text', text: 'Error: "attack_description" is required and must be a non-empty string.' }],
47
+ isError: true,
48
+ };
49
+ }
50
+ if (!Array.isArray(examplePayloads) || examplePayloads.length === 0) {
51
+ return {
52
+ content: [{ type: 'text', text: 'Error: "example_payloads" must be a non-empty array of strings.' }],
53
+ isError: true,
54
+ };
55
+ }
56
+ for (const payload of examplePayloads) {
57
+ if (typeof payload !== 'string') {
58
+ return {
59
+ content: [{ type: 'text', text: 'Error: All items in "example_payloads" must be strings.' }],
60
+ isError: true,
61
+ };
62
+ }
63
+ }
64
+ if (severity && !VALID_SEVERITIES.has(severity)) {
65
+ return {
66
+ content: [{ type: 'text', text: `Error: "severity" must be one of: ${[...VALID_SEVERITIES].join(', ')}` }],
67
+ isError: true,
68
+ };
69
+ }
70
+ const scaffolder = new RuleScaffolder();
71
+ const result = scaffolder.scaffold({
72
+ title: title.trim(),
73
+ category: category,
74
+ attackDescription: attackDescription.trim(),
75
+ examplePayloads: examplePayloads.map((p) => p.trim()),
76
+ severity: severity,
77
+ mitreRefs: mitreRefs,
78
+ });
79
+ const response = {
80
+ generated_id: result.id,
81
+ warnings: result.warnings,
82
+ yaml_rule: result.yaml,
83
+ next_steps: [
84
+ 'Review and refine the generated detection patterns',
85
+ 'Add more specific regex patterns for your use case',
86
+ 'Test with atr_scan using example payloads',
87
+ 'Validate with atr_validate_rule before submitting',
88
+ 'Submit as a PR to the ATR repository',
89
+ ],
90
+ };
91
+ return {
92
+ content: [{ type: 'text', text: JSON.stringify(response, null, 2) }],
93
+ };
94
+ }
95
+ //# sourceMappingURL=submit-proposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-proposal.js","sourceRoot":"","sources":["../../src/mcp-tools/submit-proposal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * atr_threat_summary MCP tool - Aggregate threat statistics
3
+ * @module agent-threat-rules/mcp-tools/threat-summary
4
+ */
5
+ import type { ATREngine } from '../engine.js';
6
+ export declare function handleThreatSummary(engine: ATREngine, args: Record<string, unknown>): {
7
+ content: Array<{
8
+ type: string;
9
+ text: string;
10
+ }>;
11
+ };
12
+ //# sourceMappingURL=threat-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-summary.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/threat-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CA8EA"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * atr_threat_summary MCP tool - Aggregate threat statistics
3
+ * @module agent-threat-rules/mcp-tools/threat-summary
4
+ */
5
+ export function handleThreatSummary(engine, args) {
6
+ const category = args['category'];
7
+ const rules = [...engine.getRules()];
8
+ const filtered = category
9
+ ? rules.filter((r) => r.tags.category === category)
10
+ : rules;
11
+ // Aggregate by category
12
+ const byCategory = {};
13
+ for (const rule of filtered) {
14
+ const cat = rule.tags.category;
15
+ byCategory[cat] = (byCategory[cat] ?? 0) + 1;
16
+ }
17
+ // Aggregate by severity
18
+ const bySeverity = {};
19
+ for (const rule of filtered) {
20
+ bySeverity[rule.severity] = (bySeverity[rule.severity] ?? 0) + 1;
21
+ }
22
+ // Aggregate by status
23
+ const byStatus = {};
24
+ for (const rule of filtered) {
25
+ byStatus[rule.status] = (byStatus[rule.status] ?? 0) + 1;
26
+ }
27
+ // Aggregate by source type
28
+ const bySourceType = {};
29
+ for (const rule of filtered) {
30
+ const src = rule.agent_source.type;
31
+ bySourceType[src] = (bySourceType[src] ?? 0) + 1;
32
+ }
33
+ // Count test cases
34
+ let totalTestCases = 0;
35
+ let rulesWithTests = 0;
36
+ for (const rule of filtered) {
37
+ if (rule.test_cases) {
38
+ rulesWithTests++;
39
+ totalTestCases +=
40
+ (rule.test_cases.true_positives?.length ?? 0) +
41
+ (rule.test_cases.true_negatives?.length ?? 0);
42
+ }
43
+ }
44
+ // Top actions
45
+ const actionCounts = {};
46
+ for (const rule of filtered) {
47
+ for (const action of rule.response.actions) {
48
+ actionCounts[action] = (actionCounts[action] ?? 0) + 1;
49
+ }
50
+ }
51
+ const topActions = Object.entries(actionCounts)
52
+ .sort((a, b) => b[1] - a[1])
53
+ .slice(0, 5)
54
+ .map(([action, count]) => ({ action, count }));
55
+ const result = {
56
+ summary_timestamp: new Date().toISOString(),
57
+ ...(category ? { filtered_category: category } : {}),
58
+ total_rules: filtered.length,
59
+ by_category: byCategory,
60
+ by_severity: bySeverity,
61
+ by_status: byStatus,
62
+ by_source_type: bySourceType,
63
+ test_coverage: {
64
+ rules_with_tests: rulesWithTests,
65
+ rules_without_tests: filtered.length - rulesWithTests,
66
+ total_test_cases: totalTestCases,
67
+ },
68
+ top_response_actions: topActions,
69
+ };
70
+ return {
71
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
72
+ };
73
+ }
74
+ //# sourceMappingURL=threat-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-summary.js","sourceRoot":"","sources":["../../src/mcp-tools/threat-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * atr_validate_rule MCP tool - Validate ATR rule YAML
3
+ * @module agent-threat-rules/mcp-tools/validate
4
+ */
5
+ export interface ValidateInput {
6
+ yaml_content: string;
7
+ }
8
+ export declare function handleValidate(args: Record<string, unknown>): {
9
+ content: Array<{
10
+ type: string;
11
+ text: string;
12
+ }>;
13
+ isError?: boolean;
14
+ };
15
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/mcp-tools/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC7D,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAwCA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * atr_validate_rule MCP tool - Validate ATR rule YAML
3
+ * @module agent-threat-rules/mcp-tools/validate
4
+ */
5
+ import yaml from 'js-yaml';
6
+ import { validateRule } from '../loader.js';
7
+ export function handleValidate(args) {
8
+ const yamlContent = args['yaml_content'];
9
+ if (typeof yamlContent !== 'string' || yamlContent.trim().length === 0) {
10
+ return {
11
+ content: [{ type: 'text', text: 'Error: "yaml_content" is required and must be a non-empty string.' }],
12
+ isError: true,
13
+ };
14
+ }
15
+ try {
16
+ const parsed = yaml.load(yamlContent);
17
+ if (!parsed || typeof parsed !== 'object') {
18
+ return {
19
+ content: [{ type: 'text', text: JSON.stringify({ valid: false, errors: ['YAML parsed to a non-object value.'] }, null, 2) }],
20
+ };
21
+ }
22
+ const result = validateRule(parsed);
23
+ const response = {
24
+ valid: result.valid,
25
+ errors: result.errors,
26
+ parsed_fields: {
27
+ id: parsed['id'] ?? null,
28
+ title: parsed['title'] ?? null,
29
+ severity: parsed['severity'] ?? null,
30
+ category: parsed['tags']?.['category'] ?? null,
31
+ status: parsed['status'] ?? null,
32
+ },
33
+ };
34
+ return {
35
+ content: [{ type: 'text', text: JSON.stringify(response, null, 2) }],
36
+ };
37
+ }
38
+ catch (e) {
39
+ const msg = e instanceof Error ? e.message : String(e);
40
+ return {
41
+ content: [{ type: 'text', text: JSON.stringify({ valid: false, errors: [`YAML parse error: ${msg}`] }, null, 2) }],
42
+ };
43
+ }
44
+ }
45
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/mcp-tools/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAM5C,MAAM,UAAU,cAAc,CAAC,IAA6B;IAI1D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mEAAmE,EAAE,CAAC;YACtG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,oCAAoC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC7H,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE;gBACb,EAAE,EAAG,MAAkC,CAAC,IAAI,CAAC,IAAI,IAAI;gBACrD,KAAK,EAAG,MAAkC,CAAC,OAAO,CAAC,IAAI,IAAI;gBAC3D,QAAQ,EAAG,MAAkC,CAAC,UAAU,CAAC,IAAI,IAAI;gBACjE,QAAQ,EAAI,MAAkC,CAAC,MAAM,CAAyC,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI;gBACpH,MAAM,EAAG,MAAkC,CAAC,QAAQ,CAAC,IAAI,IAAI;aAC9D;SACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,qBAAqB,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACnH,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -6,12 +6,13 @@
6
6
  *
7
7
  * Built-in modules:
8
8
  * - session: Cross-event behavioral analysis using SessionTracker
9
+ * - semantic: AI-driven semantic threat analysis using LLM-as-judge (v0.2)
9
10
  *
10
11
  * Reserved namespaces (planned):
11
- * - embedding: Semantic similarity detection (v0.2)
12
- * - protocol: MCP/transport-level inspection (v0.2)
13
- * - entropy: Information-theoretic anomaly detection (v0.3)
14
- * - tokenizer: Token-level analysis for smuggling detection (v0.3)
12
+ * - embedding: Vector similarity detection (v0.3)
13
+ * - protocol: MCP/transport-level inspection (v0.3)
14
+ * - entropy: Information-theoretic anomaly detection (v0.4)
15
+ * - tokenizer: Token-level analysis for smuggling detection (v0.4)
15
16
  *
16
17
  * @module agent-threat-rules/modules
17
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7C,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,aAAa,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/E;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAM7B;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAOjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,IAAI,IAAI,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ7E;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7C,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,aAAa,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/E;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAO7B;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAOjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,IAAI,IAAI,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ7E;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
@@ -6,12 +6,13 @@
6
6
  *
7
7
  * Built-in modules:
8
8
  * - session: Cross-event behavioral analysis using SessionTracker
9
+ * - semantic: AI-driven semantic threat analysis using LLM-as-judge (v0.2)
9
10
  *
10
11
  * Reserved namespaces (planned):
11
- * - embedding: Semantic similarity detection (v0.2)
12
- * - protocol: MCP/transport-level inspection (v0.2)
13
- * - entropy: Information-theoretic anomaly detection (v0.3)
14
- * - tokenizer: Token-level analysis for smuggling detection (v0.3)
12
+ * - embedding: Vector similarity detection (v0.3)
13
+ * - protocol: MCP/transport-level inspection (v0.3)
14
+ * - entropy: Information-theoretic anomaly detection (v0.4)
15
+ * - tokenizer: Token-level analysis for smuggling detection (v0.4)
15
16
  *
16
17
  * @module agent-threat-rules/modules
17
18
  */
@@ -23,6 +24,7 @@ export class ModuleRegistry {
23
24
  /** Reserved module namespaces (cannot be registered by third parties) */
24
25
  static RESERVED = new Set([
25
26
  'session',
27
+ 'semantic',
26
28
  'embedding',
27
29
  'protocol',
28
30
  'entropy',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoGH;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAExD,yEAAyE;IACjE,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,CAAC;QACzC,SAAS;QACT,WAAW;QACX,UAAU;QACV,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAiB;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;IACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoGH;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAExD,yEAAyE;IACjE,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,CAAC;QACzC,SAAS;QACT,UAAU;QACV,WAAW;QACX,UAAU;QACV,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAiB;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;IACH,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * ATR Semantic Module (Layer 3)
3
+ *
4
+ * AI-driven semantic analysis for detecting threats that bypass
5
+ * regex patterns (Layer 1) and behavioral fingerprinting (Layer 2).
6
+ *
7
+ * Uses LLM-as-judge to evaluate whether an agent event represents
8
+ * a genuine threat, even when the attacker uses:
9
+ * - Semantic paraphrasing to avoid keyword matching
10
+ * - Multi-language injection (non-English payloads)
11
+ * - Context-aware social engineering
12
+ * - Novel attack patterns not yet in the rule set
13
+ *
14
+ * Provider-agnostic: works with any OpenAI-compatible API.
15
+ *
16
+ * @module agent-threat-rules/modules/semantic
17
+ */
18
+ import type { AgentEvent } from '../types.js';
19
+ import type { ATRModule, ModuleCondition, ModuleResult } from './index.js';
20
+ export interface SemanticModuleConfig {
21
+ /** OpenAI-compatible API endpoint */
22
+ apiUrl: string;
23
+ /** API key */
24
+ apiKey: string;
25
+ /** Model to use (default: gpt-4o-mini for cost efficiency) */
26
+ model?: string;
27
+ /** Max tokens for analysis (default: 512) */
28
+ maxTokens?: number;
29
+ /** Temperature (default: 0.1 for consistency) */
30
+ temperature?: number;
31
+ /** Timeout in ms (default: 10000) */
32
+ timeout?: number;
33
+ /** Cache TTL in ms for identical content (default: 300000 = 5min) */
34
+ cacheTtlMs?: number;
35
+ /** Max cache entries (default: 1000) */
36
+ maxCacheSize?: number;
37
+ }
38
+ /**
39
+ * Semantic detection module using LLM-as-judge.
40
+ *
41
+ * Usage in ATR YAML:
42
+ * ```yaml
43
+ * detection:
44
+ * conditions:
45
+ * semantic_check:
46
+ * module: semantic
47
+ * function: analyze_threat
48
+ * args:
49
+ * field: user_input
50
+ * operator: gte
51
+ * threshold: 0.7
52
+ * condition: "semantic_check"
53
+ * ```
54
+ */
55
+ export declare class SemanticModule implements ATRModule {
56
+ readonly name = "semantic";
57
+ readonly description = "AI-driven semantic threat analysis (Layer 3)";
58
+ readonly version = "0.1.0";
59
+ readonly functions: readonly [{
60
+ readonly name: "analyze_threat";
61
+ readonly description: "Analyze text for semantic threat indicators using LLM";
62
+ readonly args: readonly [{
63
+ readonly name: "field";
64
+ readonly type: "string";
65
+ readonly required: false;
66
+ readonly description: "Event field to analyze (default: content)";
67
+ }];
68
+ }, {
69
+ readonly name: "is_injection";
70
+ readonly description: "Binary check: is this a prompt injection attempt?";
71
+ readonly args: readonly [{
72
+ readonly name: "field";
73
+ readonly type: "string";
74
+ readonly required: false;
75
+ readonly description: "Event field to analyze (default: content)";
76
+ }];
77
+ }, {
78
+ readonly name: "classify_attack";
79
+ readonly description: "Classify the type of attack (returns category confidence)";
80
+ readonly args: readonly [{
81
+ readonly name: "field";
82
+ readonly type: "string";
83
+ readonly required: false;
84
+ readonly description: "Event field to analyze (default: content)";
85
+ }, {
86
+ readonly name: "target_category";
87
+ readonly type: "string";
88
+ readonly required: true;
89
+ readonly description: "ATR category to check against";
90
+ }];
91
+ }];
92
+ private readonly config;
93
+ private readonly cache;
94
+ constructor(config: SemanticModuleConfig);
95
+ initialize(): Promise<void>;
96
+ evaluate(event: AgentEvent, condition: ModuleCondition): Promise<ModuleResult>;
97
+ destroy(): Promise<void>;
98
+ private analyzeWithCache;
99
+ private callLLM;
100
+ private parseAnalysis;
101
+ private resolveEndpoint;
102
+ private hashContent;
103
+ private compareThreshold;
104
+ }
105
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/modules/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0CD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC9C,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,OAAO,WAAW;IAE3B,QAAQ,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CP;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;gBAE3C,MAAM,EAAE,oBAAoB;IAalC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IA8C9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAMhB,gBAAgB;YA2BhB,OAAO;IAsDrB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,gBAAgB;CAUzB"}