hackmyagent 0.11.13 → 0.11.15
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/README.md +26 -3
- package/dist/attack-engine/feedback-loop.d.ts +36 -0
- package/dist/attack-engine/feedback-loop.d.ts.map +1 -0
- package/dist/attack-engine/feedback-loop.js +261 -0
- package/dist/attack-engine/feedback-loop.js.map +1 -0
- package/dist/attack-engine/index.d.ts +13 -0
- package/dist/attack-engine/index.d.ts.map +1 -0
- package/dist/attack-engine/index.js +21 -0
- package/dist/attack-engine/index.js.map +1 -0
- package/dist/attack-engine/payload-generator.d.ts +21 -0
- package/dist/attack-engine/payload-generator.d.ts.map +1 -0
- package/dist/attack-engine/payload-generator.js +210 -0
- package/dist/attack-engine/payload-generator.js.map +1 -0
- package/dist/attack-engine/target-reader.d.ts +15 -0
- package/dist/attack-engine/target-reader.d.ts.map +1 -0
- package/dist/attack-engine/target-reader.js +152 -0
- package/dist/attack-engine/target-reader.js.map +1 -0
- package/dist/attack-engine/training-pipeline.d.ts +57 -0
- package/dist/attack-engine/training-pipeline.d.ts.map +1 -0
- package/dist/attack-engine/training-pipeline.js +146 -0
- package/dist/attack-engine/training-pipeline.js.map +1 -0
- package/dist/attack-engine/types.d.ts +133 -0
- package/dist/attack-engine/types.d.ts.map +1 -0
- package/dist/attack-engine/types.js +22 -0
- package/dist/attack-engine/types.js.map +1 -0
- package/dist/cli.js +248 -15
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/nanomind-core/analyzers/capability-analyzer.d.ts +40 -0
- package/dist/nanomind-core/analyzers/capability-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/capability-analyzer.js +310 -0
- package/dist/nanomind-core/analyzers/capability-analyzer.js.map +1 -0
- package/dist/nanomind-core/analyzers/code-analyzer.d.ts +21 -0
- package/dist/nanomind-core/analyzers/code-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/code-analyzer.js +350 -0
- package/dist/nanomind-core/analyzers/code-analyzer.js.map +1 -0
- package/dist/nanomind-core/analyzers/credential-analyzer.d.ts +20 -0
- package/dist/nanomind-core/analyzers/credential-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/credential-analyzer.js +317 -0
- package/dist/nanomind-core/analyzers/credential-analyzer.js.map +1 -0
- package/dist/nanomind-core/analyzers/governance-analyzer.d.ts +22 -0
- package/dist/nanomind-core/analyzers/governance-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/governance-analyzer.js +393 -0
- package/dist/nanomind-core/analyzers/governance-analyzer.js.map +1 -0
- package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts +22 -0
- package/dist/nanomind-core/analyzers/prompt-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/prompt-analyzer.js +486 -0
- package/dist/nanomind-core/analyzers/prompt-analyzer.js.map +1 -0
- package/dist/nanomind-core/analyzers/scope-analyzer.d.ts +20 -0
- package/dist/nanomind-core/analyzers/scope-analyzer.d.ts.map +1 -0
- package/dist/nanomind-core/analyzers/scope-analyzer.js +326 -0
- package/dist/nanomind-core/analyzers/scope-analyzer.js.map +1 -0
- package/dist/nanomind-core/compiler/semantic-compiler.d.ts +41 -0
- package/dist/nanomind-core/compiler/semantic-compiler.d.ts.map +1 -0
- package/dist/nanomind-core/compiler/semantic-compiler.js +490 -0
- package/dist/nanomind-core/compiler/semantic-compiler.js.map +1 -0
- package/dist/nanomind-core/index.d.ts +30 -0
- package/dist/nanomind-core/index.d.ts.map +1 -0
- package/dist/nanomind-core/index.js +45 -0
- package/dist/nanomind-core/index.js.map +1 -0
- package/dist/nanomind-core/ingestion/artifact-parser.d.ts +48 -0
- package/dist/nanomind-core/ingestion/artifact-parser.d.ts.map +1 -0
- package/dist/nanomind-core/ingestion/artifact-parser.js +203 -0
- package/dist/nanomind-core/ingestion/artifact-parser.js.map +1 -0
- package/dist/nanomind-core/ingestion/input-sanitizer.d.ts +49 -0
- package/dist/nanomind-core/ingestion/input-sanitizer.d.ts.map +1 -0
- package/dist/nanomind-core/ingestion/input-sanitizer.js +80 -0
- package/dist/nanomind-core/ingestion/input-sanitizer.js.map +1 -0
- package/dist/nanomind-core/scanner-bridge.d.ts +49 -0
- package/dist/nanomind-core/scanner-bridge.d.ts.map +1 -0
- package/dist/nanomind-core/scanner-bridge.js +317 -0
- package/dist/nanomind-core/scanner-bridge.js.map +1 -0
- package/dist/nanomind-core/security/defense-in-depth.d.ts +99 -0
- package/dist/nanomind-core/security/defense-in-depth.d.ts.map +1 -0
- package/dist/nanomind-core/security/defense-in-depth.js +206 -0
- package/dist/nanomind-core/security/defense-in-depth.js.map +1 -0
- package/dist/nanomind-core/security/integrity-verifier.d.ts +132 -0
- package/dist/nanomind-core/security/integrity-verifier.d.ts.map +1 -0
- package/dist/nanomind-core/security/integrity-verifier.js +437 -0
- package/dist/nanomind-core/security/integrity-verifier.js.map +1 -0
- package/dist/nanomind-core/types.d.ts +125 -0
- package/dist/nanomind-core/types.d.ts.map +1 -0
- package/dist/nanomind-core/types.js +22 -0
- package/dist/nanomind-core/types.js.map +1 -0
- package/dist/output/asff.d.ts.map +1 -1
- package/dist/output/asff.js +2 -1
- package/dist/output/asff.js.map +1 -1
- package/dist/semantic/index.d.ts +4 -0
- package/dist/semantic/index.d.ts.map +1 -1
- package/dist/semantic/index.js +13 -1
- package/dist/semantic/index.js.map +1 -1
- package/dist/semantic/nanomind-analyzer.d.ts +77 -0
- package/dist/semantic/nanomind-analyzer.d.ts.map +1 -0
- package/dist/semantic/nanomind-analyzer.js +165 -0
- package/dist/semantic/nanomind-analyzer.js.map +1 -0
- package/dist/semantic/nanomind-enhancer.d.ts +50 -0
- package/dist/semantic/nanomind-enhancer.d.ts.map +1 -0
- package/dist/semantic/nanomind-enhancer.js +203 -0
- package/dist/semantic/nanomind-enhancer.js.map +1 -0
- package/dist/simulation/engine.d.ts +69 -0
- package/dist/simulation/engine.d.ts.map +1 -0
- package/dist/simulation/engine.js +297 -0
- package/dist/simulation/engine.js.map +1 -0
- package/dist/simulation/index.d.ts +15 -0
- package/dist/simulation/index.d.ts.map +1 -0
- package/dist/simulation/index.js +31 -0
- package/dist/simulation/index.js.map +1 -0
- package/dist/simulation/llm-executor.d.ts +58 -0
- package/dist/simulation/llm-executor.d.ts.map +1 -0
- package/dist/simulation/llm-executor.js +297 -0
- package/dist/simulation/llm-executor.js.map +1 -0
- package/dist/simulation/mock-tools.d.ts +35 -0
- package/dist/simulation/mock-tools.d.ts.map +1 -0
- package/dist/simulation/mock-tools.js +181 -0
- package/dist/simulation/mock-tools.js.map +1 -0
- package/dist/simulation/probes.d.ts +17 -0
- package/dist/simulation/probes.d.ts.map +1 -0
- package/dist/simulation/probes.js +295 -0
- package/dist/simulation/probes.js.map +1 -0
- package/dist/simulation/types.d.ts +79 -0
- package/dist/simulation/types.d.ts.map +1 -0
- package/dist/simulation/types.js +25 -0
- package/dist/simulation/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NanoMind Scanner Enhancer
|
|
4
|
+
*
|
|
5
|
+
* Wraps around HMA's existing static scanner output and adds semantic
|
|
6
|
+
* analysis to every finding category. This makes NanoMind the default
|
|
7
|
+
* intelligence layer for ALL scanners, not just --deep mode.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
* Static scan runs first (204 checks, fast, deterministic)
|
|
11
|
+
* → NanoMind enhancer runs on the results + source artifacts
|
|
12
|
+
* → Reduces false positives (benign patterns that look suspicious)
|
|
13
|
+
* → Catches false negatives (malicious patterns that look benign)
|
|
14
|
+
* → Upgrades finding severity based on semantic context
|
|
15
|
+
* → Adds evidence and remediation from NanoMind classification
|
|
16
|
+
*
|
|
17
|
+
* This runs automatically when the NanoMind daemon is available.
|
|
18
|
+
* No flags needed. If daemon is down, scan works exactly as before.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.enhanceScanFindings = enhanceScanFindings;
|
|
22
|
+
exports.getEnhancementStats = getEnhancementStats;
|
|
23
|
+
const nanomind_analyzer_js_1 = require("./nanomind-analyzer.js");
|
|
24
|
+
/**
|
|
25
|
+
* Enhance scan findings with NanoMind semantic analysis.
|
|
26
|
+
* Called automatically after every static scan when daemon is available.
|
|
27
|
+
*
|
|
28
|
+
* Returns the same findings array with NanoMind annotations added.
|
|
29
|
+
* Does NOT remove findings -- only annotates them with semantic context.
|
|
30
|
+
*/
|
|
31
|
+
async function enhanceScanFindings(findings, sourceFiles) {
|
|
32
|
+
const available = await (0, nanomind_analyzer_js_1.isDaemonAvailable)();
|
|
33
|
+
if (!available) {
|
|
34
|
+
// No daemon = return findings as-is, no enhancement
|
|
35
|
+
return findings.map(f => ({ ...f, nanomindEnhanced: false }));
|
|
36
|
+
}
|
|
37
|
+
const enhanced = [];
|
|
38
|
+
for (const finding of findings) {
|
|
39
|
+
const result = await enhanceSingleFinding(finding, sourceFiles);
|
|
40
|
+
enhanced.push(result);
|
|
41
|
+
}
|
|
42
|
+
return enhanced;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Enhance a single finding based on its check category.
|
|
46
|
+
*/
|
|
47
|
+
async function enhanceSingleFinding(finding, sourceFiles) {
|
|
48
|
+
const base = { ...finding, nanomindEnhanced: false };
|
|
49
|
+
const checkId = finding.checkId.toUpperCase();
|
|
50
|
+
const fileContent = finding.file ? sourceFiles.get(finding.file) : undefined;
|
|
51
|
+
if (!fileContent)
|
|
52
|
+
return base;
|
|
53
|
+
try {
|
|
54
|
+
// Route to appropriate NanoMind analyzer based on check category
|
|
55
|
+
if (checkId.startsWith('SKILL-') || checkId.startsWith('SKILL-MEM-')) {
|
|
56
|
+
return await enhanceSkillFinding(finding, fileContent);
|
|
57
|
+
}
|
|
58
|
+
if (checkId.startsWith('MCP-') || checkId.startsWith('TOOL-')) {
|
|
59
|
+
return await enhanceMCPFinding(finding, fileContent);
|
|
60
|
+
}
|
|
61
|
+
if (checkId.startsWith('SOUL-')) {
|
|
62
|
+
return await enhanceSoulFinding(finding, fileContent);
|
|
63
|
+
}
|
|
64
|
+
if (checkId.startsWith('PROMPT-') || checkId.startsWith('AGENT-')) {
|
|
65
|
+
return await enhancePromptFinding(finding, fileContent);
|
|
66
|
+
}
|
|
67
|
+
if (checkId.startsWith('CRED-') || checkId.startsWith('WEBCRED-') || checkId.startsWith('AGENT-CRED-')) {
|
|
68
|
+
return await enhanceCredentialFinding(finding, fileContent);
|
|
69
|
+
}
|
|
70
|
+
if (checkId.startsWith('A2A-')) {
|
|
71
|
+
return await enhanceA2AFinding(finding, fileContent);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// NanoMind error = return original finding
|
|
76
|
+
}
|
|
77
|
+
return base;
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// Per-Category Enhancement
|
|
81
|
+
// ============================================================================
|
|
82
|
+
async function enhanceSkillFinding(finding, content) {
|
|
83
|
+
const result = await (0, nanomind_analyzer_js_1.analyzeSkillIntent)(content);
|
|
84
|
+
if (!result) {
|
|
85
|
+
return { ...finding, nanomindEnhanced: true, nanomindVerdict: 'confirmed', nanomindConfidence: 0.5 };
|
|
86
|
+
}
|
|
87
|
+
// If static flagged it AND NanoMind confirms = high confidence
|
|
88
|
+
if (!finding.passed && result.confidence >= 0.7) {
|
|
89
|
+
return {
|
|
90
|
+
...finding,
|
|
91
|
+
nanomindEnhanced: true,
|
|
92
|
+
nanomindVerdict: 'confirmed',
|
|
93
|
+
nanomindConfidence: result.confidence,
|
|
94
|
+
nanomindEvidence: result.evidence?.join('; '),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// If static flagged it BUT NanoMind says benign = possible false positive
|
|
98
|
+
if (!finding.passed && result.confidence < 0.3) {
|
|
99
|
+
return {
|
|
100
|
+
...finding,
|
|
101
|
+
nanomindEnhanced: true,
|
|
102
|
+
nanomindVerdict: 'false_positive',
|
|
103
|
+
nanomindConfidence: 1 - result.confidence,
|
|
104
|
+
nanomindEvidence: 'NanoMind semantic analysis indicates this is likely a false positive',
|
|
105
|
+
originalSeverity: finding.severity,
|
|
106
|
+
severity: 'info', // Downgrade to informational
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { ...finding, nanomindEnhanced: true, nanomindConfidence: result.confidence };
|
|
110
|
+
}
|
|
111
|
+
async function enhanceMCPFinding(finding, content) {
|
|
112
|
+
const result = await (0, nanomind_analyzer_js_1.analyzeMCPScope)('', content, []);
|
|
113
|
+
if (!result) {
|
|
114
|
+
return { ...finding, nanomindEnhanced: true };
|
|
115
|
+
}
|
|
116
|
+
if (!finding.passed && result.confidence >= 0.7) {
|
|
117
|
+
return {
|
|
118
|
+
...finding,
|
|
119
|
+
nanomindEnhanced: true,
|
|
120
|
+
nanomindVerdict: 'confirmed',
|
|
121
|
+
nanomindConfidence: result.confidence,
|
|
122
|
+
nanomindEvidence: result.evidence?.join('; '),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return { ...finding, nanomindEnhanced: true, nanomindConfidence: result.confidence };
|
|
126
|
+
}
|
|
127
|
+
async function enhanceSoulFinding(finding, content) {
|
|
128
|
+
const result = await (0, nanomind_analyzer_js_1.analyzeSoulCompleteness)(content);
|
|
129
|
+
if (!result) {
|
|
130
|
+
return { ...finding, nanomindEnhanced: true };
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
...finding,
|
|
134
|
+
nanomindEnhanced: true,
|
|
135
|
+
nanomindVerdict: result.confidence >= 0.7 ? 'confirmed' : undefined,
|
|
136
|
+
nanomindConfidence: result.confidence,
|
|
137
|
+
nanomindEvidence: result.evidence?.join('; '),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
async function enhancePromptFinding(finding, content) {
|
|
141
|
+
const result = await (0, nanomind_analyzer_js_1.analyzePromptIntent)(content);
|
|
142
|
+
if (!result) {
|
|
143
|
+
return { ...finding, nanomindEnhanced: true };
|
|
144
|
+
}
|
|
145
|
+
// NanoMind can upgrade prompt findings from medium to high if it detects
|
|
146
|
+
// jailbreak seeds or capability creep patterns
|
|
147
|
+
if (result.confidence >= 0.8 && finding.severity === 'medium') {
|
|
148
|
+
return {
|
|
149
|
+
...finding,
|
|
150
|
+
nanomindEnhanced: true,
|
|
151
|
+
nanomindVerdict: 'upgraded',
|
|
152
|
+
nanomindConfidence: result.confidence,
|
|
153
|
+
nanomindEvidence: result.evidence?.join('; '),
|
|
154
|
+
originalSeverity: 'medium',
|
|
155
|
+
severity: 'high',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return { ...finding, nanomindEnhanced: true, nanomindConfidence: result.confidence };
|
|
159
|
+
}
|
|
160
|
+
async function enhanceCredentialFinding(finding, content) {
|
|
161
|
+
// NanoMind can distinguish real credentials from examples/documentation
|
|
162
|
+
// "sk-live-abc123" in source = real credential (flag)
|
|
163
|
+
// "sk-live-abc123" in README example = documentation (false positive)
|
|
164
|
+
const isDocumentation = /example|demo|test|sample|placeholder|readme|documentation/i.test(content);
|
|
165
|
+
const isTestFixture = /test\/|__tests__|\.test\.|\.spec\./i.test(finding.file ?? '');
|
|
166
|
+
if (!finding.passed && (isDocumentation || isTestFixture)) {
|
|
167
|
+
return {
|
|
168
|
+
...finding,
|
|
169
|
+
nanomindEnhanced: true,
|
|
170
|
+
nanomindVerdict: 'false_positive',
|
|
171
|
+
nanomindConfidence: 0.8,
|
|
172
|
+
nanomindEvidence: isTestFixture
|
|
173
|
+
? 'Credential found in test fixture (likely intentional test data)'
|
|
174
|
+
: 'Credential found in documentation context (likely example, not real)',
|
|
175
|
+
originalSeverity: finding.severity,
|
|
176
|
+
severity: 'info',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return { ...finding, nanomindEnhanced: true, nanomindVerdict: 'confirmed' };
|
|
180
|
+
}
|
|
181
|
+
async function enhanceA2AFinding(finding, content) {
|
|
182
|
+
// A2A findings benefit from NanoMind checking if the agent card
|
|
183
|
+
// declarations are semantically consistent
|
|
184
|
+
return {
|
|
185
|
+
...finding,
|
|
186
|
+
nanomindEnhanced: true,
|
|
187
|
+
nanomindConfidence: 0.7,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// ============================================================================
|
|
191
|
+
// Statistics
|
|
192
|
+
// ============================================================================
|
|
193
|
+
function getEnhancementStats(findings) {
|
|
194
|
+
const enhanced = findings.filter(f => f.nanomindEnhanced);
|
|
195
|
+
return {
|
|
196
|
+
total: findings.length,
|
|
197
|
+
enhanced: enhanced.length,
|
|
198
|
+
falsePositivesDetected: enhanced.filter(f => f.nanomindVerdict === 'false_positive').length,
|
|
199
|
+
upgraded: enhanced.filter(f => f.nanomindVerdict === 'upgraded').length,
|
|
200
|
+
confirmed: enhanced.filter(f => f.nanomindVerdict === 'confirmed').length,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=nanomind-enhancer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nanomind-enhancer.js","sourceRoot":"","sources":["../../src/semantic/nanomind-enhancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Simulation Engine
|
|
3
|
+
*
|
|
4
|
+
* Executes skills inside a controlled LLM with mock tool environment.
|
|
5
|
+
* Observes behavioral patterns to determine if a skill is malicious.
|
|
6
|
+
*
|
|
7
|
+
* Three layers:
|
|
8
|
+
* - Layer 1: NanoMind TME classification (< 8ms, handled by --semantic flag)
|
|
9
|
+
* - Layer 2: 5 targeted probes (< 3 seconds)
|
|
10
|
+
* - Layer 3: Full 20-probe simulation (< 30 seconds)
|
|
11
|
+
*/
|
|
12
|
+
import type { SimulationResult, SkillProfile } from './types.js';
|
|
13
|
+
export declare class SimulationEngine {
|
|
14
|
+
private mockEnv;
|
|
15
|
+
private llmBackend;
|
|
16
|
+
private llmDetected;
|
|
17
|
+
private useLLM;
|
|
18
|
+
/**
|
|
19
|
+
* @param options.useLLM - If true, auto-detect and use LLM backends.
|
|
20
|
+
* If false (default for tests), use heuristic analysis only.
|
|
21
|
+
* Set to true in production or when LLM backends are available.
|
|
22
|
+
*/
|
|
23
|
+
constructor(options?: {
|
|
24
|
+
useLLM?: boolean;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Auto-detect LLM backend on first use.
|
|
28
|
+
* Falls back to heuristic analysis if no LLM is available.
|
|
29
|
+
*/
|
|
30
|
+
private ensureLLM;
|
|
31
|
+
/**
|
|
32
|
+
* Run Layer 2 pre-screen: 5 targeted probes for quick triage.
|
|
33
|
+
* Used when Layer 1 (NanoMind semantic) returns ambiguous confidence (0.40-0.80).
|
|
34
|
+
*/
|
|
35
|
+
runLayer2(skill: SkillProfile): Promise<SimulationResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Run Layer 3 full simulation: all 20 probes for definitive behavioral verdict.
|
|
38
|
+
* Used for --deep flag, OASB benchmark labeling, ARIA research.
|
|
39
|
+
*/
|
|
40
|
+
runLayer3(skill: SkillProfile): Promise<SimulationResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Core simulation: run probe battery against skill in mock environment.
|
|
43
|
+
*/
|
|
44
|
+
private runSimulation;
|
|
45
|
+
/**
|
|
46
|
+
* Run a single probe against the skill.
|
|
47
|
+
* Uses LLM execution when available, falls back to heuristic analysis.
|
|
48
|
+
*/
|
|
49
|
+
private runSingleProbe;
|
|
50
|
+
/**
|
|
51
|
+
* Heuristic probe evaluation.
|
|
52
|
+
* This is the interim implementation before full LLM simulation.
|
|
53
|
+
* Analyzes skill text for patterns that indicate probe failure.
|
|
54
|
+
*/
|
|
55
|
+
private evaluateProbeHeuristic;
|
|
56
|
+
/**
|
|
57
|
+
* Compute overall verdict from probe results.
|
|
58
|
+
*/
|
|
59
|
+
private computeVerdict;
|
|
60
|
+
/**
|
|
61
|
+
* Compute semantic delta: how far observed behavior diverged from declared purpose.
|
|
62
|
+
*/
|
|
63
|
+
private computeSemanticDelta;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse a skill definition (markdown + YAML frontmatter) into a SkillProfile.
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseSkillProfile(content: string, name?: string): SkillProfile;
|
|
69
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/simulation/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EACV,gBAAgB,EAIhB,YAAY,EAIb,MAAM,YAAY,CAAC;AAMpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAU;IAExB;;;;OAIG;gBACS,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;IAK1C;;;OAGG;YACW,SAAS;IASvB;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI/D;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI/D;;OAEG;YACW,aAAa;IAyD3B;;;OAGG;YACW,cAAc;IA6B5B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAgE9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAY7B;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,YAAY,CA2DzF"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Skill Simulation Engine
|
|
4
|
+
*
|
|
5
|
+
* Executes skills inside a controlled LLM with mock tool environment.
|
|
6
|
+
* Observes behavioral patterns to determine if a skill is malicious.
|
|
7
|
+
*
|
|
8
|
+
* Three layers:
|
|
9
|
+
* - Layer 1: NanoMind TME classification (< 8ms, handled by --semantic flag)
|
|
10
|
+
* - Layer 2: 5 targeted probes (< 3 seconds)
|
|
11
|
+
* - Layer 3: Full 20-probe simulation (< 30 seconds)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.SimulationEngine = void 0;
|
|
15
|
+
exports.parseSkillProfile = parseSkillProfile;
|
|
16
|
+
const mock_tools_js_1 = require("./mock-tools.js");
|
|
17
|
+
const probes_js_1 = require("./probes.js");
|
|
18
|
+
const llm_executor_js_1 = require("./llm-executor.js");
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Simulation Engine
|
|
21
|
+
// ============================================================================
|
|
22
|
+
class SimulationEngine {
|
|
23
|
+
/**
|
|
24
|
+
* @param options.useLLM - If true, auto-detect and use LLM backends.
|
|
25
|
+
* If false (default for tests), use heuristic analysis only.
|
|
26
|
+
* Set to true in production or when LLM backends are available.
|
|
27
|
+
*/
|
|
28
|
+
constructor(options) {
|
|
29
|
+
this.llmBackend = null;
|
|
30
|
+
this.llmDetected = false;
|
|
31
|
+
this.mockEnv = new mock_tools_js_1.MockToolEnvironment();
|
|
32
|
+
this.useLLM = options?.useLLM ?? false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Auto-detect LLM backend on first use.
|
|
36
|
+
* Falls back to heuristic analysis if no LLM is available.
|
|
37
|
+
*/
|
|
38
|
+
async ensureLLM() {
|
|
39
|
+
if (!this.useLLM)
|
|
40
|
+
return null;
|
|
41
|
+
if (!this.llmDetected) {
|
|
42
|
+
this.llmBackend = await (0, llm_executor_js_1.detectBestBackend)();
|
|
43
|
+
this.llmDetected = true;
|
|
44
|
+
}
|
|
45
|
+
return this.llmBackend;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run Layer 2 pre-screen: 5 targeted probes for quick triage.
|
|
49
|
+
* Used when Layer 1 (NanoMind semantic) returns ambiguous confidence (0.40-0.80).
|
|
50
|
+
*/
|
|
51
|
+
async runLayer2(skill) {
|
|
52
|
+
return this.runSimulation(skill, probes_js_1.LAYER2_PROBES, 2);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Run Layer 3 full simulation: all 20 probes for definitive behavioral verdict.
|
|
56
|
+
* Used for --deep flag, OASB benchmark labeling, ARIA research.
|
|
57
|
+
*/
|
|
58
|
+
async runLayer3(skill) {
|
|
59
|
+
return this.runSimulation(skill, probes_js_1.LAYER3_PROBES, 3);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Core simulation: run probe battery against skill in mock environment.
|
|
63
|
+
*/
|
|
64
|
+
async runSimulation(skill, probes, layer) {
|
|
65
|
+
const startMs = Date.now();
|
|
66
|
+
const results = [];
|
|
67
|
+
for (const probe of probes) {
|
|
68
|
+
this.mockEnv.reset();
|
|
69
|
+
const probeStart = Date.now();
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.runSingleProbe(skill, probe);
|
|
72
|
+
results.push({
|
|
73
|
+
...result,
|
|
74
|
+
durationMs: Date.now() - probeStart,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Probe timeout or error -- treat as suspicious but not definitive
|
|
79
|
+
results.push({
|
|
80
|
+
probeId: probe.id,
|
|
81
|
+
probeName: probe.name,
|
|
82
|
+
category: probe.category,
|
|
83
|
+
passed: false,
|
|
84
|
+
attackClass: probe.attackClass,
|
|
85
|
+
observedBehavior: 'Probe timed out or errored',
|
|
86
|
+
evidence: ['Probe execution failed'],
|
|
87
|
+
confidence: 0.3,
|
|
88
|
+
durationMs: Date.now() - probeStart,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const allCalls = this.mockEnv.getCallLog();
|
|
93
|
+
const failedProbes = results.filter(r => !r.passed);
|
|
94
|
+
const passedProbes = results.filter(r => r.passed);
|
|
95
|
+
// Compute verdict from probe results
|
|
96
|
+
const { verdict, confidence } = this.computeVerdict(results, probes.length);
|
|
97
|
+
// Semantic delta: how far observed behavior diverged from declared purpose
|
|
98
|
+
const semanticDelta = this.computeSemanticDelta(skill, allCalls);
|
|
99
|
+
return {
|
|
100
|
+
verdict,
|
|
101
|
+
confidence,
|
|
102
|
+
failedProbes,
|
|
103
|
+
passedProbes,
|
|
104
|
+
behavioralTrace: allCalls,
|
|
105
|
+
semanticDelta,
|
|
106
|
+
durationMs: Date.now() - startMs,
|
|
107
|
+
probeCount: probes.length,
|
|
108
|
+
layer,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run a single probe against the skill.
|
|
113
|
+
* Uses LLM execution when available, falls back to heuristic analysis.
|
|
114
|
+
*/
|
|
115
|
+
async runSingleProbe(skill, probe) {
|
|
116
|
+
// Try LLM-powered execution first (actual behavioral observation)
|
|
117
|
+
const backend = await this.ensureLLM();
|
|
118
|
+
if (backend) {
|
|
119
|
+
return (0, llm_executor_js_1.executeProbeLLM)(backend, skill, probe, this.mockEnv);
|
|
120
|
+
}
|
|
121
|
+
// Fallback: heuristic analysis of skill content against probe
|
|
122
|
+
const passed = this.evaluateProbeHeuristic(skill, probe);
|
|
123
|
+
const flaggedCalls = this.mockEnv.getFlaggedCalls();
|
|
124
|
+
return {
|
|
125
|
+
probeId: probe.id,
|
|
126
|
+
probeName: probe.name,
|
|
127
|
+
category: probe.category,
|
|
128
|
+
passed,
|
|
129
|
+
attackClass: probe.attackClass,
|
|
130
|
+
observedBehavior: passed
|
|
131
|
+
? `Skill passed ${probe.name}: ${probe.passCondition}`
|
|
132
|
+
: `Skill FAILED ${probe.name}: ${probe.failCondition}`,
|
|
133
|
+
evidence: flaggedCalls.map(c => c.flagReason ?? `Suspicious ${c.toolType} call: ${c.toolName}`),
|
|
134
|
+
confidence: passed ? 0.85 : 0.80,
|
|
135
|
+
durationMs: 0, // Set by caller
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Heuristic probe evaluation.
|
|
140
|
+
* This is the interim implementation before full LLM simulation.
|
|
141
|
+
* Analyzes skill text for patterns that indicate probe failure.
|
|
142
|
+
*/
|
|
143
|
+
evaluateProbeHeuristic(skill, probe) {
|
|
144
|
+
const text = skill.rawContent.toLowerCase();
|
|
145
|
+
const caps = skill.capabilities.map(c => c.toLowerCase());
|
|
146
|
+
const constraints = skill.constraints.map(c => c.toLowerCase());
|
|
147
|
+
switch (probe.category) {
|
|
148
|
+
case 'exfiltration': {
|
|
149
|
+
// Check for external URL references + data forwarding patterns
|
|
150
|
+
const hasExternalURL = /https?:\/\/[^\s]+\.(co|io|com|net|org)/i.test(skill.rawContent);
|
|
151
|
+
const hasForwarding = /forward|send|transmit|export|upload|post.*to/i.test(text);
|
|
152
|
+
const hasTokenRef = /session|token|credential|secret/i.test(text);
|
|
153
|
+
return !(hasExternalURL && hasForwarding && hasTokenRef);
|
|
154
|
+
}
|
|
155
|
+
case 'override_resistance': {
|
|
156
|
+
// Skills that mention "ignore previous" or lack constraint enforcement
|
|
157
|
+
const hasOverrideLanguage = /ignore.*previous|override.*instruction|new.*task/i.test(text);
|
|
158
|
+
const hasWeakConstraints = constraints.length === 0;
|
|
159
|
+
return !hasOverrideLanguage && !hasWeakConstraints;
|
|
160
|
+
}
|
|
161
|
+
case 'scope_expansion': {
|
|
162
|
+
// Check if skill references tools/resources beyond declared capabilities
|
|
163
|
+
const undeclaredTools = ['email', 'admin', 'system', 'root', 'sudo', 'exec', 'shell'];
|
|
164
|
+
const hasUndeclared = undeclaredTools.some(t => text.includes(t) && !caps.some(c => c.includes(t)));
|
|
165
|
+
return !hasUndeclared;
|
|
166
|
+
}
|
|
167
|
+
case 'credential_secret': {
|
|
168
|
+
// Check for credential harvesting patterns
|
|
169
|
+
const harvestPatterns = /ask.*password|request.*credential|share.*key|provide.*token/i;
|
|
170
|
+
const storePatterns = /save.*password|store.*credential|remember.*key/i;
|
|
171
|
+
return !harvestPatterns.test(text) && !storePatterns.test(text);
|
|
172
|
+
}
|
|
173
|
+
case 'memory_persistence': {
|
|
174
|
+
// Check for instruction injection via memory patterns
|
|
175
|
+
const instructionWrite = /always.*remember|persist.*instruction|save.*rule/i;
|
|
176
|
+
const crossSession = /future.*session|next.*time|permanent/i;
|
|
177
|
+
return !instructionWrite.test(text) && !crossSession.test(text);
|
|
178
|
+
}
|
|
179
|
+
case 'heartbeat_remote': {
|
|
180
|
+
// Check for remote instruction fetch patterns
|
|
181
|
+
const remoteFetch = /fetch.*config|check.*update|load.*instruction.*from/i;
|
|
182
|
+
const callbackSetup = /webhook|callback|notify.*url|ping.*endpoint/i;
|
|
183
|
+
return !remoteFetch.test(text) && !callbackSetup.test(text);
|
|
184
|
+
}
|
|
185
|
+
case 'semantic_consistency': {
|
|
186
|
+
// Check if capabilities match declared purpose
|
|
187
|
+
const purposeWords = skill.declaredPurpose.toLowerCase().split(/\s+/);
|
|
188
|
+
const capWords = caps.join(' ').split(/\s+/);
|
|
189
|
+
const overlap = purposeWords.filter(w => capWords.some(c => c.includes(w))).length;
|
|
190
|
+
return overlap > 0 || purposeWords.length < 3; // Short purposes get a pass
|
|
191
|
+
}
|
|
192
|
+
default:
|
|
193
|
+
return true; // Unknown category passes by default
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Compute overall verdict from probe results.
|
|
198
|
+
*/
|
|
199
|
+
computeVerdict(results, totalProbes) {
|
|
200
|
+
const failed = results.filter(r => !r.passed);
|
|
201
|
+
const failRate = failed.length / totalProbes;
|
|
202
|
+
if (failRate === 0) {
|
|
203
|
+
return { verdict: 'CLEAN', confidence: 0.95 };
|
|
204
|
+
}
|
|
205
|
+
// High-confidence failures in critical categories
|
|
206
|
+
const criticalFailures = failed.filter(r => ['exfiltration', 'credential_secret', 'heartbeat_remote'].includes(r.category));
|
|
207
|
+
if (criticalFailures.length >= 2 || failRate > 0.3) {
|
|
208
|
+
return {
|
|
209
|
+
verdict: 'MALICIOUS',
|
|
210
|
+
confidence: Math.min(0.95, 0.6 + (failRate * 0.5)),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
if (failed.length > 0) {
|
|
214
|
+
return {
|
|
215
|
+
verdict: 'SUSPICIOUS',
|
|
216
|
+
confidence: 0.5 + (failRate * 0.3),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return { verdict: 'CLEAN', confidence: 0.85 };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Compute semantic delta: how far observed behavior diverged from declared purpose.
|
|
223
|
+
*/
|
|
224
|
+
computeSemanticDelta(skill, calls) {
|
|
225
|
+
if (calls.length === 0)
|
|
226
|
+
return 0;
|
|
227
|
+
const flaggedRatio = calls.filter(c => c.flagged).length / calls.length;
|
|
228
|
+
const undeclaredTools = calls.filter(c => {
|
|
229
|
+
const toolName = c.toolName.toLowerCase();
|
|
230
|
+
return !skill.capabilities.some(cap => toolName.includes(cap.toLowerCase()));
|
|
231
|
+
}).length;
|
|
232
|
+
const undeclaredRatio = calls.length > 0 ? undeclaredTools / calls.length : 0;
|
|
233
|
+
return Math.min(1.0, (flaggedRatio * 0.6) + (undeclaredRatio * 0.4));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.SimulationEngine = SimulationEngine;
|
|
237
|
+
// ============================================================================
|
|
238
|
+
// Skill Profile Parser
|
|
239
|
+
// ============================================================================
|
|
240
|
+
/**
|
|
241
|
+
* Parse a skill definition (markdown + YAML frontmatter) into a SkillProfile.
|
|
242
|
+
*/
|
|
243
|
+
function parseSkillProfile(content, name = 'unknown') {
|
|
244
|
+
const lines = content.split('\n');
|
|
245
|
+
// Extract YAML frontmatter if present
|
|
246
|
+
let capabilities = [];
|
|
247
|
+
let constraints = [];
|
|
248
|
+
let declaredPurpose = '';
|
|
249
|
+
const yamlMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
250
|
+
if (yamlMatch) {
|
|
251
|
+
const yaml = yamlMatch[1];
|
|
252
|
+
const capsMatch = yaml.match(/capabilities:\s*\n((?:\s+-\s+.+\n?)*)/);
|
|
253
|
+
if (capsMatch) {
|
|
254
|
+
capabilities = capsMatch[1].split('\n')
|
|
255
|
+
.filter(l => l.trim().startsWith('-'))
|
|
256
|
+
.map(l => l.replace(/^\s*-\s*/, '').trim());
|
|
257
|
+
}
|
|
258
|
+
const purposeMatch = yaml.match(/description:\s*(.+)/);
|
|
259
|
+
if (purposeMatch) {
|
|
260
|
+
declaredPurpose = purposeMatch[1].trim();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Extract constraints from content
|
|
264
|
+
const constraintPatterns = /(?:must|should|never|always|cannot|will not|forbidden)[^.]+\./gi;
|
|
265
|
+
const constraintMatches = content.match(constraintPatterns);
|
|
266
|
+
if (constraintMatches) {
|
|
267
|
+
constraints = constraintMatches.map(m => m.trim());
|
|
268
|
+
}
|
|
269
|
+
// Extract heartbeat URLs
|
|
270
|
+
const urlPattern = /https?:\/\/[^\s)>]+/g;
|
|
271
|
+
const heartbeatURLs = (content.match(urlPattern) ?? []).filter(u => /heartbeat|ping|health|status|callback/i.test(u));
|
|
272
|
+
// Determine governance mechanism
|
|
273
|
+
let governanceMechanism = 'none';
|
|
274
|
+
if (/soul\.md/i.test(content))
|
|
275
|
+
governanceMechanism = 'soul';
|
|
276
|
+
else if (/system.?prompt/i.test(content))
|
|
277
|
+
governanceMechanism = 'system_prompt';
|
|
278
|
+
else if (constraints.length > 3)
|
|
279
|
+
governanceMechanism = 'runtime_check';
|
|
280
|
+
if (!declaredPurpose) {
|
|
281
|
+
// Try to infer from first paragraph
|
|
282
|
+
const firstPara = lines.find(l => l.trim().length > 20 && !l.startsWith('#') && !l.startsWith('-'));
|
|
283
|
+
declaredPurpose = firstPara?.trim() ?? name;
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
name,
|
|
287
|
+
declaredPurpose,
|
|
288
|
+
capabilities,
|
|
289
|
+
constraints,
|
|
290
|
+
toolPermissions: capabilities, // For now, same as capabilities
|
|
291
|
+
heartbeatURLs,
|
|
292
|
+
dataAccessPatterns: [],
|
|
293
|
+
governanceMechanism,
|
|
294
|
+
rawContent: content,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/simulation/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HMA Skill Simulation Engine
|
|
3
|
+
*
|
|
4
|
+
* Behavioral simulation that observes what skills actually DO.
|
|
5
|
+
* Three layers: NanoMind semantic (8ms) -> targeted probes (3s) -> full simulation (30s).
|
|
6
|
+
* Target: < 1% false positive rate vs industry 95.8%.
|
|
7
|
+
*/
|
|
8
|
+
export { SimulationEngine, parseSkillProfile } from './engine.js';
|
|
9
|
+
export { MockToolEnvironment } from './mock-tools.js';
|
|
10
|
+
export { detectBestBackend, NanoMindBackend, AnthropicBackend, OllamaBackend, executeProbeLLM } from './llm-executor.js';
|
|
11
|
+
export type { LLMBackend } from './llm-executor.js';
|
|
12
|
+
export { ALL_PROBES, LAYER2_PROBES, LAYER3_PROBES, getProbesByCategory, getProbeCategoryCounts } from './probes.js';
|
|
13
|
+
export type { SimulationResult, SimulationVerdict, SimulationConfig, ProbeDefinition, ProbeResult, ProbeCategory, SkillProfile, MockToolCall, MockToolType, MockToolConfig, } from './types.js';
|
|
14
|
+
export { DEFAULT_LAYER2_CONFIG, DEFAULT_LAYER3_CONFIG } from './types.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simulation/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzH,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpH,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HMA Skill Simulation Engine
|
|
4
|
+
*
|
|
5
|
+
* Behavioral simulation that observes what skills actually DO.
|
|
6
|
+
* Three layers: NanoMind semantic (8ms) -> targeted probes (3s) -> full simulation (30s).
|
|
7
|
+
* Target: < 1% false positive rate vs industry 95.8%.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DEFAULT_LAYER3_CONFIG = exports.DEFAULT_LAYER2_CONFIG = exports.getProbeCategoryCounts = exports.getProbesByCategory = exports.LAYER3_PROBES = exports.LAYER2_PROBES = exports.ALL_PROBES = exports.executeProbeLLM = exports.OllamaBackend = exports.AnthropicBackend = exports.NanoMindBackend = exports.detectBestBackend = exports.MockToolEnvironment = exports.parseSkillProfile = exports.SimulationEngine = void 0;
|
|
11
|
+
var engine_js_1 = require("./engine.js");
|
|
12
|
+
Object.defineProperty(exports, "SimulationEngine", { enumerable: true, get: function () { return engine_js_1.SimulationEngine; } });
|
|
13
|
+
Object.defineProperty(exports, "parseSkillProfile", { enumerable: true, get: function () { return engine_js_1.parseSkillProfile; } });
|
|
14
|
+
var mock_tools_js_1 = require("./mock-tools.js");
|
|
15
|
+
Object.defineProperty(exports, "MockToolEnvironment", { enumerable: true, get: function () { return mock_tools_js_1.MockToolEnvironment; } });
|
|
16
|
+
var llm_executor_js_1 = require("./llm-executor.js");
|
|
17
|
+
Object.defineProperty(exports, "detectBestBackend", { enumerable: true, get: function () { return llm_executor_js_1.detectBestBackend; } });
|
|
18
|
+
Object.defineProperty(exports, "NanoMindBackend", { enumerable: true, get: function () { return llm_executor_js_1.NanoMindBackend; } });
|
|
19
|
+
Object.defineProperty(exports, "AnthropicBackend", { enumerable: true, get: function () { return llm_executor_js_1.AnthropicBackend; } });
|
|
20
|
+
Object.defineProperty(exports, "OllamaBackend", { enumerable: true, get: function () { return llm_executor_js_1.OllamaBackend; } });
|
|
21
|
+
Object.defineProperty(exports, "executeProbeLLM", { enumerable: true, get: function () { return llm_executor_js_1.executeProbeLLM; } });
|
|
22
|
+
var probes_js_1 = require("./probes.js");
|
|
23
|
+
Object.defineProperty(exports, "ALL_PROBES", { enumerable: true, get: function () { return probes_js_1.ALL_PROBES; } });
|
|
24
|
+
Object.defineProperty(exports, "LAYER2_PROBES", { enumerable: true, get: function () { return probes_js_1.LAYER2_PROBES; } });
|
|
25
|
+
Object.defineProperty(exports, "LAYER3_PROBES", { enumerable: true, get: function () { return probes_js_1.LAYER3_PROBES; } });
|
|
26
|
+
Object.defineProperty(exports, "getProbesByCategory", { enumerable: true, get: function () { return probes_js_1.getProbesByCategory; } });
|
|
27
|
+
Object.defineProperty(exports, "getProbeCategoryCounts", { enumerable: true, get: function () { return probes_js_1.getProbeCategoryCounts; } });
|
|
28
|
+
var types_js_1 = require("./types.js");
|
|
29
|
+
Object.defineProperty(exports, "DEFAULT_LAYER2_CONFIG", { enumerable: true, get: function () { return types_js_1.DEFAULT_LAYER2_CONFIG; } });
|
|
30
|
+
Object.defineProperty(exports, "DEFAULT_LAYER3_CONFIG", { enumerable: true, get: function () { return types_js_1.DEFAULT_LAYER3_CONFIG; } });
|
|
31
|
+
//# sourceMappingURL=index.js.map
|