@dotsetlabs/tollgate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +885 -0
- package/dist/analyzers/filesystem.d.ts +26 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -0
- package/dist/analyzers/filesystem.js +284 -0
- package/dist/analyzers/filesystem.js.map +1 -0
- package/dist/analyzers/http.d.ts +90 -0
- package/dist/analyzers/http.d.ts.map +1 -0
- package/dist/analyzers/http.js +433 -0
- package/dist/analyzers/http.js.map +1 -0
- package/dist/analyzers/index.d.ts +101 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +342 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/loader.d.ts +114 -0
- package/dist/analyzers/loader.d.ts.map +1 -0
- package/dist/analyzers/loader.js +184 -0
- package/dist/analyzers/loader.js.map +1 -0
- package/dist/analyzers/prompt-injection.d.ts +95 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -0
- package/dist/analyzers/prompt-injection.js +725 -0
- package/dist/analyzers/prompt-injection.js.map +1 -0
- package/dist/analyzers/sdk.d.ts +230 -0
- package/dist/analyzers/sdk.d.ts.map +1 -0
- package/dist/analyzers/sdk.js +283 -0
- package/dist/analyzers/sdk.js.map +1 -0
- package/dist/analyzers/shell.d.ts +20 -0
- package/dist/analyzers/shell.d.ts.map +1 -0
- package/dist/analyzers/shell.js +297 -0
- package/dist/analyzers/shell.js.map +1 -0
- package/dist/analyzers/sql.d.ts +37 -0
- package/dist/analyzers/sql.d.ts.map +1 -0
- package/dist/analyzers/sql.js +455 -0
- package/dist/analyzers/sql.js.map +1 -0
- package/dist/analyzers/types.d.ts +117 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +46 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/approval/interactive.d.ts +72 -0
- package/dist/approval/interactive.d.ts.map +1 -0
- package/dist/approval/interactive.js +550 -0
- package/dist/approval/interactive.js.map +1 -0
- package/dist/approval/terminal.d.ts +59 -0
- package/dist/approval/terminal.d.ts.map +1 -0
- package/dist/approval/terminal.js +238 -0
- package/dist/approval/terminal.js.map +1 -0
- package/dist/approval/types.d.ts +66 -0
- package/dist/approval/types.d.ts.map +1 -0
- package/dist/approval/types.js +2 -0
- package/dist/approval/types.js.map +1 -0
- package/dist/audit/exporter.d.ts +138 -0
- package/dist/audit/exporter.d.ts.map +1 -0
- package/dist/audit/exporter.js +366 -0
- package/dist/audit/exporter.js.map +1 -0
- package/dist/audit/logger.d.ts +156 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +406 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/redaction.d.ts +110 -0
- package/dist/audit/redaction.d.ts.map +1 -0
- package/dist/audit/redaction.js +307 -0
- package/dist/audit/redaction.js.map +1 -0
- package/dist/audit/schema.d.ts +76 -0
- package/dist/audit/schema.d.ts.map +1 -0
- package/dist/audit/schema.js +122 -0
- package/dist/audit/schema.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +431 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +18 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +63 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +102 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +11 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +60 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +29 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +251 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +26 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +424 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +20 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +82 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +10 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +42 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/templates.d.ts +26 -0
- package/dist/cli/commands/templates.d.ts.map +1 -0
- package/dist/cli/commands/templates.js +221 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +107 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +19 -0
- package/dist/cli/commands/wrap.d.ts.map +1 -0
- package/dist/cli/commands/wrap.js +59 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +202 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui.d.ts +139 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +271 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/index.d.ts +11 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/manager.d.ts +127 -0
- package/dist/orchestrator/manager.d.ts.map +1 -0
- package/dist/orchestrator/manager.js +498 -0
- package/dist/orchestrator/manager.js.map +1 -0
- package/dist/orchestrator/types.d.ts +141 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +9 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/policy/engine.d.ts +55 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +288 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/natural-language.d.ts +141 -0
- package/dist/policy/natural-language.d.ts.map +1 -0
- package/dist/policy/natural-language.js +552 -0
- package/dist/policy/natural-language.js.map +1 -0
- package/dist/policy/parser.d.ts +141 -0
- package/dist/policy/parser.d.ts.map +1 -0
- package/dist/policy/parser.js +314 -0
- package/dist/policy/parser.js.map +1 -0
- package/dist/policy/types.d.ts +428 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +32 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/policy/validator.d.ts +72 -0
- package/dist/policy/validator.d.ts.map +1 -0
- package/dist/policy/validator.js +453 -0
- package/dist/policy/validator.js.map +1 -0
- package/dist/proxy/bridge.d.ts +84 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +217 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/client.d.ts +130 -0
- package/dist/proxy/client.d.ts.map +1 -0
- package/dist/proxy/client.js +290 -0
- package/dist/proxy/client.js.map +1 -0
- package/dist/proxy/server.d.ts +111 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +444 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/scanner.d.ts +91 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +373 -0
- package/dist/scanner.js.map +1 -0
- package/dist/session/index.d.ts +32 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +31 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +166 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +454 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/sqlite-store.d.ts +54 -0
- package/dist/session/sqlite-store.d.ts.map +1 -0
- package/dist/session/sqlite-store.js +209 -0
- package/dist/session/sqlite-store.js.map +1 -0
- package/dist/session/types.d.ts +179 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +38 -0
- package/dist/session/types.js.map +1 -0
- package/dist/templates.d.ts +64 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +451 -0
- package/dist/templates.js.map +1 -0
- package/dist/utils/config.d.ts +57 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +104 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +35 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +144 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +300 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wizard.d.ts +68 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +395 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { SqlAnalyzer } from './sql.js';
|
|
3
|
+
export { FilesystemAnalyzer } from './filesystem.js';
|
|
4
|
+
export { ShellAnalyzer } from './shell.js';
|
|
5
|
+
export { HttpAnalyzer } from './http.js';
|
|
6
|
+
export { PromptInjectionAnalyzer } from './prompt-injection.js';
|
|
7
|
+
// SDK exports for custom analyzers
|
|
8
|
+
export { defineAnalyzer, defineAsyncAnalyzer, createPatternAnalyzer, isCustomAnalyzer, isAsyncAnalyzer, } from './sdk.js';
|
|
9
|
+
// Loader exports for dynamic analyzer loading
|
|
10
|
+
export { loadAnalyzer, loadAnalyzers, loadAnalyzersFromConfig, initializeAnalyzers, cleanupAnalyzers, unloadAnalyzer, listCustomAnalyzers, resolveAnalyzerPath, } from './loader.js';
|
|
11
|
+
import { DEFAULT_RISK_MAPPING } from './types.js';
|
|
12
|
+
import { SqlAnalyzer } from './sql.js';
|
|
13
|
+
import { FilesystemAnalyzer } from './filesystem.js';
|
|
14
|
+
import { ShellAnalyzer } from './shell.js';
|
|
15
|
+
import { HttpAnalyzer } from './http.js';
|
|
16
|
+
import { PromptInjectionAnalyzer } from './prompt-injection.js';
|
|
17
|
+
import { isCustomAnalyzer, isAsyncAnalyzer } from './sdk.js';
|
|
18
|
+
/** Default timeout for analyzer operations (5 seconds) */
|
|
19
|
+
const DEFAULT_ANALYZER_TIMEOUT_MS = 5000;
|
|
20
|
+
/**
|
|
21
|
+
* Registry of all available analyzers
|
|
22
|
+
*/
|
|
23
|
+
export class AnalyzerRegistry {
|
|
24
|
+
analyzers = new Map();
|
|
25
|
+
customAnalyzers = new Map();
|
|
26
|
+
timeoutMs;
|
|
27
|
+
constructor(timeoutMs = DEFAULT_ANALYZER_TIMEOUT_MS) {
|
|
28
|
+
this.timeoutMs = timeoutMs;
|
|
29
|
+
// Register built-in analyzers
|
|
30
|
+
this.register(new SqlAnalyzer());
|
|
31
|
+
this.register(new FilesystemAnalyzer());
|
|
32
|
+
this.register(new ShellAnalyzer());
|
|
33
|
+
this.register(new HttpAnalyzer());
|
|
34
|
+
this.register(new PromptInjectionAnalyzer());
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register a new analyzer
|
|
38
|
+
*/
|
|
39
|
+
register(analyzer) {
|
|
40
|
+
this.analyzers.set(analyzer.name, analyzer);
|
|
41
|
+
// Track custom analyzers separately for lifecycle management
|
|
42
|
+
if (isCustomAnalyzer(analyzer)) {
|
|
43
|
+
this.customAnalyzers.set(analyzer.name, analyzer);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Unregister an analyzer by name
|
|
48
|
+
*/
|
|
49
|
+
unregister(name) {
|
|
50
|
+
const analyzer = this.analyzers.get(name);
|
|
51
|
+
if (!analyzer) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
this.analyzers.delete(name);
|
|
55
|
+
this.customAnalyzers.delete(name);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get an analyzer by name
|
|
60
|
+
*/
|
|
61
|
+
get(name) {
|
|
62
|
+
return this.analyzers.get(name);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if an analyzer exists
|
|
66
|
+
*/
|
|
67
|
+
has(name) {
|
|
68
|
+
return this.analyzers.has(name);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* List all registered analyzer names
|
|
72
|
+
*/
|
|
73
|
+
list() {
|
|
74
|
+
return Array.from(this.analyzers.keys());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* List only custom (non-built-in) analyzer names
|
|
78
|
+
*/
|
|
79
|
+
listCustom() {
|
|
80
|
+
return Array.from(this.customAnalyzers.keys());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Set the timeout for analyzer operations.
|
|
84
|
+
*/
|
|
85
|
+
setTimeout(timeoutMs) {
|
|
86
|
+
this.timeoutMs = timeoutMs;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the current timeout for analyzer operations.
|
|
90
|
+
*/
|
|
91
|
+
getTimeout() {
|
|
92
|
+
return this.timeoutMs;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Analyze content with a specific analyzer
|
|
96
|
+
*/
|
|
97
|
+
analyze(analyzerName, content, context) {
|
|
98
|
+
const analyzer = this.analyzers.get(analyzerName);
|
|
99
|
+
if (!analyzer) {
|
|
100
|
+
// Return 'dangerous' to fail safely when analyzer is unknown
|
|
101
|
+
// A typo in analyzer name should not allow requests through
|
|
102
|
+
return {
|
|
103
|
+
risk: 'dangerous',
|
|
104
|
+
reason: `Unknown analyzer: ${analyzerName}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return analyzer.analyze(content, context);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Analyze content with a specific analyzer with timeout protection.
|
|
111
|
+
* Returns a 'dangerous' result if the analysis times out.
|
|
112
|
+
*
|
|
113
|
+
* @param analyzerName - Name of the analyzer to use
|
|
114
|
+
* @param content - Content to analyze
|
|
115
|
+
* @param context - Optional analyzer context
|
|
116
|
+
* @param timeoutMs - Optional timeout override (defaults to registry timeout)
|
|
117
|
+
*/
|
|
118
|
+
async analyzeWithTimeout(analyzerName, content, context, timeoutMs) {
|
|
119
|
+
const timeout = timeoutMs ?? this.timeoutMs;
|
|
120
|
+
try {
|
|
121
|
+
const result = await Promise.race([
|
|
122
|
+
this.analyzeAsync(analyzerName, content, context),
|
|
123
|
+
new Promise((_, reject) => {
|
|
124
|
+
setTimeout(() => reject(new Error('Analyzer timeout')), timeout);
|
|
125
|
+
}),
|
|
126
|
+
]);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
if (message === 'Analyzer timeout') {
|
|
132
|
+
return {
|
|
133
|
+
risk: 'dangerous',
|
|
134
|
+
reason: `Analyzer '${analyzerName}' timed out after ${timeout}ms (possible DoS attempt)`,
|
|
135
|
+
metadata: { timeout: true, timeoutMs: timeout },
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// For other errors, fail safely
|
|
139
|
+
return {
|
|
140
|
+
risk: 'dangerous',
|
|
141
|
+
reason: `Analyzer '${analyzerName}' error: ${message}`,
|
|
142
|
+
metadata: { error: true },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Analyze content with a specific analyzer (async version)
|
|
148
|
+
* Supports both sync and async analyzers
|
|
149
|
+
*/
|
|
150
|
+
async analyzeAsync(analyzerName, content, context) {
|
|
151
|
+
const analyzer = this.analyzers.get(analyzerName);
|
|
152
|
+
if (!analyzer) {
|
|
153
|
+
// Return 'dangerous' to fail safely when analyzer is unknown
|
|
154
|
+
// A typo in analyzer name should not allow requests through
|
|
155
|
+
return {
|
|
156
|
+
risk: 'dangerous',
|
|
157
|
+
reason: `Unknown analyzer: ${analyzerName}`,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Check if analyzer supports async
|
|
161
|
+
if (isAsyncAnalyzer(analyzer)) {
|
|
162
|
+
return analyzer.analyzeAsync(content, context);
|
|
163
|
+
}
|
|
164
|
+
// Fall back to sync
|
|
165
|
+
return analyzer.analyze(content, context);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Initialize all custom analyzers
|
|
169
|
+
*/
|
|
170
|
+
async initializeCustomAnalyzers() {
|
|
171
|
+
for (const analyzer of this.customAnalyzers.values()) {
|
|
172
|
+
await analyzer.init();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Cleanup all custom analyzers
|
|
177
|
+
*/
|
|
178
|
+
async cleanupCustomAnalyzers() {
|
|
179
|
+
for (const analyzer of this.customAnalyzers.values()) {
|
|
180
|
+
await analyzer.cleanup();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get custom content extraction function for an analyzer
|
|
185
|
+
*/
|
|
186
|
+
getContentExtractor(analyzerName) {
|
|
187
|
+
const analyzer = this.customAnalyzers.get(analyzerName);
|
|
188
|
+
return analyzer?.extractContent;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Convert a risk level to a concrete policy action using a risk mapping
|
|
193
|
+
*/
|
|
194
|
+
export function riskToAction(risk, mapping = DEFAULT_RISK_MAPPING) {
|
|
195
|
+
const action = mapping[risk] ?? DEFAULT_RISK_MAPPING[risk];
|
|
196
|
+
return action;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Global analyzer registry instance
|
|
200
|
+
*/
|
|
201
|
+
export const analyzerRegistry = new AnalyzerRegistry();
|
|
202
|
+
/**
|
|
203
|
+
* Helper to determine which analyzer to use based on tool/server
|
|
204
|
+
*/
|
|
205
|
+
export function inferAnalyzer(server, tool, _args) {
|
|
206
|
+
const lowerServer = server.toLowerCase();
|
|
207
|
+
const lowerTool = tool.toLowerCase();
|
|
208
|
+
// Database servers -> SQL analyzer
|
|
209
|
+
if (lowerServer.includes('postgres') ||
|
|
210
|
+
lowerServer.includes('mysql') ||
|
|
211
|
+
lowerServer.includes('sqlite') ||
|
|
212
|
+
lowerServer.includes('database') ||
|
|
213
|
+
lowerServer.includes('sql')) {
|
|
214
|
+
// Only for query/execute tools
|
|
215
|
+
if (lowerTool.includes('query') ||
|
|
216
|
+
lowerTool.includes('execute') ||
|
|
217
|
+
lowerTool.includes('sql')) {
|
|
218
|
+
return 'sql';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Filesystem servers -> filesystem analyzer
|
|
222
|
+
if (lowerServer.includes('filesystem') ||
|
|
223
|
+
lowerServer.includes('file') ||
|
|
224
|
+
lowerServer.includes('fs')) {
|
|
225
|
+
return 'filesystem';
|
|
226
|
+
}
|
|
227
|
+
// Shell/terminal servers -> shell analyzer
|
|
228
|
+
if (lowerServer.includes('shell') ||
|
|
229
|
+
lowerServer.includes('terminal') ||
|
|
230
|
+
lowerServer.includes('bash') ||
|
|
231
|
+
lowerServer.includes('exec') ||
|
|
232
|
+
lowerTool.includes('exec') ||
|
|
233
|
+
lowerTool.includes('run') ||
|
|
234
|
+
lowerTool.includes('command')) {
|
|
235
|
+
return 'shell';
|
|
236
|
+
}
|
|
237
|
+
// HTTP/API servers -> http analyzer
|
|
238
|
+
if (lowerServer.includes('http') ||
|
|
239
|
+
lowerServer.includes('fetch') ||
|
|
240
|
+
lowerServer.includes('request') ||
|
|
241
|
+
lowerServer.includes('api') ||
|
|
242
|
+
lowerServer.includes('web') ||
|
|
243
|
+
lowerServer.includes('scrape') ||
|
|
244
|
+
lowerServer.includes('puppeteer') ||
|
|
245
|
+
lowerServer.includes('browser') ||
|
|
246
|
+
lowerTool.includes('fetch') ||
|
|
247
|
+
lowerTool.includes('request') ||
|
|
248
|
+
lowerTool.includes('http') ||
|
|
249
|
+
lowerTool.includes('get_url') ||
|
|
250
|
+
lowerTool.includes('navigate') ||
|
|
251
|
+
lowerTool.includes('scrape')) {
|
|
252
|
+
return 'http';
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Extract the content to analyze from tool arguments.
|
|
258
|
+
* First checks if the analyzer has a custom extractor, then falls back to built-in extraction.
|
|
259
|
+
*/
|
|
260
|
+
export function extractAnalyzableContent(analyzerName, tool, args) {
|
|
261
|
+
// Check for custom extractor first
|
|
262
|
+
const customExtractor = analyzerRegistry.getContentExtractor(analyzerName);
|
|
263
|
+
if (customExtractor) {
|
|
264
|
+
return customExtractor(tool, args);
|
|
265
|
+
}
|
|
266
|
+
switch (analyzerName) {
|
|
267
|
+
case 'sql':
|
|
268
|
+
// Common SQL argument names
|
|
269
|
+
return (args.query ??
|
|
270
|
+
args.sql ??
|
|
271
|
+
args.statement ??
|
|
272
|
+
null);
|
|
273
|
+
case 'filesystem':
|
|
274
|
+
// Common path argument names
|
|
275
|
+
return (args.path ??
|
|
276
|
+
args.file ??
|
|
277
|
+
args.filepath ??
|
|
278
|
+
args.file_path ??
|
|
279
|
+
args.filename ??
|
|
280
|
+
null);
|
|
281
|
+
case 'shell':
|
|
282
|
+
// Common command argument names
|
|
283
|
+
return (args.command ??
|
|
284
|
+
args.cmd ??
|
|
285
|
+
args.script ??
|
|
286
|
+
args.shell ??
|
|
287
|
+
null);
|
|
288
|
+
case 'http':
|
|
289
|
+
// Common HTTP argument names - could be URL string or JSON object
|
|
290
|
+
if (args.url) {
|
|
291
|
+
// If we have structured args, convert to JSON for the analyzer
|
|
292
|
+
return JSON.stringify({
|
|
293
|
+
url: args.url,
|
|
294
|
+
method: args.method ?? 'GET',
|
|
295
|
+
headers: args.headers ?? {},
|
|
296
|
+
body: args.body,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
return (args.uri ??
|
|
300
|
+
args.href ??
|
|
301
|
+
args.endpoint ??
|
|
302
|
+
null);
|
|
303
|
+
case 'prompt-injection': {
|
|
304
|
+
// For prompt injection, we analyze ALL string arguments
|
|
305
|
+
// Concatenate all string values to check for injection patterns
|
|
306
|
+
const stringValues = [];
|
|
307
|
+
for (const value of Object.values(args)) {
|
|
308
|
+
if (typeof value === 'string') {
|
|
309
|
+
stringValues.push(value);
|
|
310
|
+
}
|
|
311
|
+
else if (typeof value === 'object' && value !== null) {
|
|
312
|
+
// Also check nested string values (one level deep)
|
|
313
|
+
for (const nestedValue of Object.values(value)) {
|
|
314
|
+
if (typeof nestedValue === 'string') {
|
|
315
|
+
stringValues.push(nestedValue);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return stringValues.length > 0 ? stringValues.join('\n') : null;
|
|
321
|
+
}
|
|
322
|
+
default: {
|
|
323
|
+
// For custom analyzers without a specific extractor,
|
|
324
|
+
// try common argument names, then fall back to all strings
|
|
325
|
+
const commonNames = ['content', 'data', 'input', 'text', 'body', 'payload', 'message'];
|
|
326
|
+
for (const name of commonNames) {
|
|
327
|
+
if (typeof args[name] === 'string') {
|
|
328
|
+
return args[name];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Fall back to concatenating all string values
|
|
332
|
+
const allStrings = [];
|
|
333
|
+
for (const value of Object.values(args)) {
|
|
334
|
+
if (typeof value === 'string') {
|
|
335
|
+
allStrings.push(value);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return allStrings.length > 0 ? allStrings.join('\n') : null;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Analyzer Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles dynamic loading of custom analyzers from file paths specified
|
|
5
|
+
* in the tollgate.yaml configuration.
|
|
6
|
+
*
|
|
7
|
+
* @module analyzers/loader
|
|
8
|
+
*/
|
|
9
|
+
import { type CustomAnalyzer } from './sdk.js';
|
|
10
|
+
/**
|
|
11
|
+
* Result of loading a custom analyzer.
|
|
12
|
+
*/
|
|
13
|
+
export interface LoadResult {
|
|
14
|
+
/** Whether the analyzer was loaded successfully */
|
|
15
|
+
success: boolean;
|
|
16
|
+
/** The loaded analyzer (if successful) */
|
|
17
|
+
analyzer?: CustomAnalyzer;
|
|
18
|
+
/** Error message (if failed) */
|
|
19
|
+
error?: string;
|
|
20
|
+
/** The path that was attempted to load */
|
|
21
|
+
path: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Options for the analyzer loader.
|
|
25
|
+
*/
|
|
26
|
+
export interface LoaderOptions {
|
|
27
|
+
/** Base directory for resolving relative paths (default: process.cwd()) */
|
|
28
|
+
baseDir?: string;
|
|
29
|
+
/** Whether to throw on load errors (default: false, just logs warnings) */
|
|
30
|
+
throwOnError?: boolean;
|
|
31
|
+
/** Custom logger function */
|
|
32
|
+
logger?: (message: string, level: 'info' | 'warn' | 'error') => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve an analyzer path to an absolute path or module specifier.
|
|
36
|
+
*
|
|
37
|
+
* Handles:
|
|
38
|
+
* - Relative paths (./analyzers/graphql.ts)
|
|
39
|
+
* - Absolute paths (/path/to/analyzer.js)
|
|
40
|
+
* - Package names (@myorg/custom-analyzers)
|
|
41
|
+
*
|
|
42
|
+
* @param analyzerPath - The path from configuration
|
|
43
|
+
* @param baseDir - Base directory for resolving relative paths
|
|
44
|
+
* @returns The resolved path or module specifier
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveAnalyzerPath(analyzerPath: string, baseDir: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Load a single custom analyzer from a path.
|
|
49
|
+
*
|
|
50
|
+
* @param analyzerPath - Path to the analyzer module
|
|
51
|
+
* @param options - Loader options
|
|
52
|
+
* @returns Load result with success status and loaded analyzer
|
|
53
|
+
*/
|
|
54
|
+
export declare function loadAnalyzer(analyzerPath: string, options?: LoaderOptions): Promise<LoadResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Load multiple custom analyzers from an array of paths.
|
|
57
|
+
*
|
|
58
|
+
* @param analyzerPaths - Array of paths to analyzer modules
|
|
59
|
+
* @param options - Loader options
|
|
60
|
+
* @returns Array of load results
|
|
61
|
+
*/
|
|
62
|
+
export declare function loadAnalyzers(analyzerPaths: string[], options?: LoaderOptions): Promise<LoadResult[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Load custom analyzers from a TollgateConfig.
|
|
65
|
+
*
|
|
66
|
+
* This is the main entry point for loading analyzers during startup.
|
|
67
|
+
*
|
|
68
|
+
* @param analyzerPaths - The analyzers array from TollgateConfig
|
|
69
|
+
* @param options - Loader options
|
|
70
|
+
* @returns Summary of loaded analyzers
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* import { loadAnalyzersFromConfig } from '@dotsetlabs/tollgate/analyzers/loader';
|
|
75
|
+
* import { loadConfig } from '@dotsetlabs/tollgate';
|
|
76
|
+
*
|
|
77
|
+
* const config = await loadConfig();
|
|
78
|
+
* if (config.analyzers) {
|
|
79
|
+
* const { loaded, failed } = await loadAnalyzersFromConfig(config.analyzers);
|
|
80
|
+
* console.log(`Loaded ${loaded.length} analyzers, ${failed.length} failed`);
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function loadAnalyzersFromConfig(analyzerPaths: string[] | undefined, options?: LoaderOptions): Promise<{
|
|
85
|
+
loaded: LoadResult[];
|
|
86
|
+
failed: LoadResult[];
|
|
87
|
+
total: number;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Initialize all loaded custom analyzers.
|
|
91
|
+
*
|
|
92
|
+
* Should be called after loading analyzers and before processing requests.
|
|
93
|
+
*/
|
|
94
|
+
export declare function initializeAnalyzers(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Cleanup all loaded custom analyzers.
|
|
97
|
+
*
|
|
98
|
+
* Should be called during shutdown.
|
|
99
|
+
*/
|
|
100
|
+
export declare function cleanupAnalyzers(): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Unload a custom analyzer by name.
|
|
103
|
+
*
|
|
104
|
+
* @param name - The name of the analyzer to unload
|
|
105
|
+
* @returns Whether the analyzer was found and unloaded
|
|
106
|
+
*/
|
|
107
|
+
export declare function unloadAnalyzer(name: string): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* List all currently loaded custom analyzers.
|
|
110
|
+
*
|
|
111
|
+
* @returns Array of custom analyzer names
|
|
112
|
+
*/
|
|
113
|
+
export declare function listCustomAnalyzers(): string[];
|
|
114
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CACtE;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAYjF;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA0DrB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CASvB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EAAE,GAAG,SAAS,EACnC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CA0BD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Analyzer Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles dynamic loading of custom analyzers from file paths specified
|
|
5
|
+
* in the tollgate.yaml configuration.
|
|
6
|
+
*
|
|
7
|
+
* @module analyzers/loader
|
|
8
|
+
*/
|
|
9
|
+
import { pathToFileURL } from 'node:url';
|
|
10
|
+
import { resolve, isAbsolute } from 'node:path';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { analyzerRegistry } from './index.js';
|
|
13
|
+
import { isCustomAnalyzer } from './sdk.js';
|
|
14
|
+
const defaultLogger = (message, level) => {
|
|
15
|
+
const prefix = level === 'error' ? '✗' : level === 'warn' ? '⚠' : '✓';
|
|
16
|
+
console.log(`${prefix} ${message}`);
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Resolve an analyzer path to an absolute path or module specifier.
|
|
20
|
+
*
|
|
21
|
+
* Handles:
|
|
22
|
+
* - Relative paths (./analyzers/graphql.ts)
|
|
23
|
+
* - Absolute paths (/path/to/analyzer.js)
|
|
24
|
+
* - Package names (@myorg/custom-analyzers)
|
|
25
|
+
*
|
|
26
|
+
* @param analyzerPath - The path from configuration
|
|
27
|
+
* @param baseDir - Base directory for resolving relative paths
|
|
28
|
+
* @returns The resolved path or module specifier
|
|
29
|
+
*/
|
|
30
|
+
export function resolveAnalyzerPath(analyzerPath, baseDir) {
|
|
31
|
+
// Package names (start with @ or are bare specifiers without ./ or /)
|
|
32
|
+
if (analyzerPath.startsWith('@') || (!analyzerPath.startsWith('./') && !analyzerPath.startsWith('/') && !analyzerPath.startsWith('../'))) {
|
|
33
|
+
return analyzerPath;
|
|
34
|
+
}
|
|
35
|
+
// Relative or absolute paths
|
|
36
|
+
const absolutePath = isAbsolute(analyzerPath)
|
|
37
|
+
? analyzerPath
|
|
38
|
+
: resolve(baseDir, analyzerPath);
|
|
39
|
+
return absolutePath;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Load a single custom analyzer from a path.
|
|
43
|
+
*
|
|
44
|
+
* @param analyzerPath - Path to the analyzer module
|
|
45
|
+
* @param options - Loader options
|
|
46
|
+
* @returns Load result with success status and loaded analyzer
|
|
47
|
+
*/
|
|
48
|
+
export async function loadAnalyzer(analyzerPath, options = {}) {
|
|
49
|
+
const { baseDir = process.cwd(), logger = defaultLogger } = options;
|
|
50
|
+
const resolvedPath = resolveAnalyzerPath(analyzerPath, baseDir);
|
|
51
|
+
try {
|
|
52
|
+
// Check if file exists for file paths
|
|
53
|
+
const isFilePath = resolvedPath.startsWith('/') || resolvedPath.includes('\\');
|
|
54
|
+
if (isFilePath && !existsSync(resolvedPath)) {
|
|
55
|
+
throw new Error(`Analyzer file not found: ${resolvedPath}`);
|
|
56
|
+
}
|
|
57
|
+
// Convert file path to URL for dynamic import
|
|
58
|
+
const importPath = isFilePath
|
|
59
|
+
? pathToFileURL(resolvedPath).href
|
|
60
|
+
: resolvedPath;
|
|
61
|
+
// Dynamically import the module
|
|
62
|
+
const module = await import(importPath);
|
|
63
|
+
// Get the analyzer from the module
|
|
64
|
+
const analyzer = module.default ?? module.analyzer ?? module;
|
|
65
|
+
// Validate it's a proper analyzer
|
|
66
|
+
if (!analyzer || typeof analyzer !== 'object') {
|
|
67
|
+
throw new Error('Module does not export a valid analyzer. Expected default export or named "analyzer" export.');
|
|
68
|
+
}
|
|
69
|
+
if (!isCustomAnalyzer(analyzer)) {
|
|
70
|
+
throw new Error('Module does not export a CustomAnalyzer. Use defineAnalyzer() or defineAsyncAnalyzer() to create your analyzer.');
|
|
71
|
+
}
|
|
72
|
+
// Register the analyzer
|
|
73
|
+
analyzerRegistry.register(analyzer);
|
|
74
|
+
logger(`Loaded analyzer: ${analyzer.name} from ${analyzerPath}`, 'info');
|
|
75
|
+
return {
|
|
76
|
+
success: true,
|
|
77
|
+
analyzer,
|
|
78
|
+
path: analyzerPath,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
83
|
+
logger(`Failed to load analyzer from ${analyzerPath}: ${error}`, 'error');
|
|
84
|
+
if (options.throwOnError) {
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
error,
|
|
90
|
+
path: analyzerPath,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Load multiple custom analyzers from an array of paths.
|
|
96
|
+
*
|
|
97
|
+
* @param analyzerPaths - Array of paths to analyzer modules
|
|
98
|
+
* @param options - Loader options
|
|
99
|
+
* @returns Array of load results
|
|
100
|
+
*/
|
|
101
|
+
export async function loadAnalyzers(analyzerPaths, options = {}) {
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const path of analyzerPaths) {
|
|
104
|
+
const result = await loadAnalyzer(path, options);
|
|
105
|
+
results.push(result);
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Load custom analyzers from a TollgateConfig.
|
|
111
|
+
*
|
|
112
|
+
* This is the main entry point for loading analyzers during startup.
|
|
113
|
+
*
|
|
114
|
+
* @param analyzerPaths - The analyzers array from TollgateConfig
|
|
115
|
+
* @param options - Loader options
|
|
116
|
+
* @returns Summary of loaded analyzers
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* import { loadAnalyzersFromConfig } from '@dotsetlabs/tollgate/analyzers/loader';
|
|
121
|
+
* import { loadConfig } from '@dotsetlabs/tollgate';
|
|
122
|
+
*
|
|
123
|
+
* const config = await loadConfig();
|
|
124
|
+
* if (config.analyzers) {
|
|
125
|
+
* const { loaded, failed } = await loadAnalyzersFromConfig(config.analyzers);
|
|
126
|
+
* console.log(`Loaded ${loaded.length} analyzers, ${failed.length} failed`);
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export async function loadAnalyzersFromConfig(analyzerPaths, options = {}) {
|
|
131
|
+
if (!analyzerPaths || analyzerPaths.length === 0) {
|
|
132
|
+
return { loaded: [], failed: [], total: 0 };
|
|
133
|
+
}
|
|
134
|
+
const { logger = defaultLogger } = options;
|
|
135
|
+
logger(`Loading ${analyzerPaths.length} custom analyzer(s)...`, 'info');
|
|
136
|
+
const results = await loadAnalyzers(analyzerPaths, options);
|
|
137
|
+
const loaded = results.filter(r => r.success);
|
|
138
|
+
const failed = results.filter(r => !r.success);
|
|
139
|
+
if (loaded.length > 0) {
|
|
140
|
+
logger(`Successfully loaded ${loaded.length} analyzer(s): ${loaded.map(r => r.analyzer?.name).join(', ')}`, 'info');
|
|
141
|
+
}
|
|
142
|
+
if (failed.length > 0) {
|
|
143
|
+
logger(`Failed to load ${failed.length} analyzer(s)`, 'warn');
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
loaded,
|
|
147
|
+
failed,
|
|
148
|
+
total: analyzerPaths.length,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Initialize all loaded custom analyzers.
|
|
153
|
+
*
|
|
154
|
+
* Should be called after loading analyzers and before processing requests.
|
|
155
|
+
*/
|
|
156
|
+
export async function initializeAnalyzers() {
|
|
157
|
+
await analyzerRegistry.initializeCustomAnalyzers();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Cleanup all loaded custom analyzers.
|
|
161
|
+
*
|
|
162
|
+
* Should be called during shutdown.
|
|
163
|
+
*/
|
|
164
|
+
export async function cleanupAnalyzers() {
|
|
165
|
+
await analyzerRegistry.cleanupCustomAnalyzers();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Unload a custom analyzer by name.
|
|
169
|
+
*
|
|
170
|
+
* @param name - The name of the analyzer to unload
|
|
171
|
+
* @returns Whether the analyzer was found and unloaded
|
|
172
|
+
*/
|
|
173
|
+
export function unloadAnalyzer(name) {
|
|
174
|
+
return analyzerRegistry.unregister(name);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* List all currently loaded custom analyzers.
|
|
178
|
+
*
|
|
179
|
+
* @returns Array of custom analyzer names
|
|
180
|
+
*/
|
|
181
|
+
export function listCustomAnalyzers() {
|
|
182
|
+
return analyzerRegistry.listCustom();
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"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"}
|