@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,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Validator for Tollgate
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive validation of Tollgate configuration files
|
|
5
|
+
* with detailed error messages and suggestions for common issues.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { validateConfigWithDetails } from './validator.js';
|
|
10
|
+
*
|
|
11
|
+
* const issues = validateConfigWithDetails(config);
|
|
12
|
+
* if (issues.some(i => i.level === 'error')) {
|
|
13
|
+
* console.error('Configuration has errors');
|
|
14
|
+
* process.exit(1);
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import { minimatch } from 'minimatch';
|
|
19
|
+
import { analyzerRegistry } from '../analyzers/index.js';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Constants
|
|
22
|
+
// =============================================================================
|
|
23
|
+
const VALID_ACTIONS = ['allow', 'deny', 'prompt', 'smart'];
|
|
24
|
+
const VALID_SCOPES = ['exact', 'tool', 'server', 'pattern'];
|
|
25
|
+
const VALID_RISK_LEVELS = ['safe', 'read', 'write', 'destructive', 'dangerous'];
|
|
26
|
+
const VALID_APPROVAL_METHODS = ['terminal', 'interactive', 'webhook'];
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Main Validation Function
|
|
29
|
+
// =============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Validates a Tollgate configuration with detailed error reporting.
|
|
32
|
+
*
|
|
33
|
+
* @param config - The configuration to validate
|
|
34
|
+
* @param serverFilter - Optional: only validate a specific server
|
|
35
|
+
* @returns Validation result with all issues found
|
|
36
|
+
*/
|
|
37
|
+
export function validateConfigWithDetails(config, serverFilter) {
|
|
38
|
+
const issues = [];
|
|
39
|
+
const analyzersUsed = new Set();
|
|
40
|
+
let toolPoliciesCount = 0;
|
|
41
|
+
let smartAnalysisEnabled = false;
|
|
42
|
+
// Validate version
|
|
43
|
+
if (!config.version) {
|
|
44
|
+
issues.push({
|
|
45
|
+
level: 'error',
|
|
46
|
+
path: 'version',
|
|
47
|
+
message: 'Configuration must specify a version',
|
|
48
|
+
suggestion: 'Add: version: "1"',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else if (config.version !== '1') {
|
|
52
|
+
issues.push({
|
|
53
|
+
level: 'error',
|
|
54
|
+
path: 'version',
|
|
55
|
+
message: `Unsupported config version: ${config.version}`,
|
|
56
|
+
suggestion: 'Use version: "1"',
|
|
57
|
+
details: { supportedVersions: ['1'] },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Validate global defaults
|
|
61
|
+
if (config.defaults) {
|
|
62
|
+
if (config.defaults.action) {
|
|
63
|
+
if (!VALID_ACTIONS.includes(config.defaults.action)) {
|
|
64
|
+
issues.push({
|
|
65
|
+
level: 'error',
|
|
66
|
+
path: 'defaults.action',
|
|
67
|
+
message: `Invalid default action: ${config.defaults.action}`,
|
|
68
|
+
suggestion: `Use one of: ${VALID_ACTIONS.join(', ')}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (config.defaults.action === 'smart') {
|
|
72
|
+
issues.push({
|
|
73
|
+
level: 'warning',
|
|
74
|
+
path: 'defaults.action',
|
|
75
|
+
message: "'smart' as global default may not work as expected",
|
|
76
|
+
suggestion: "Set 'smart' at the server or tool level with an analyzer configured",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (config.defaults.timeout !== undefined) {
|
|
81
|
+
if (typeof config.defaults.timeout !== 'number' || config.defaults.timeout < 0) {
|
|
82
|
+
issues.push({
|
|
83
|
+
level: 'error',
|
|
84
|
+
path: 'defaults.timeout',
|
|
85
|
+
message: 'Timeout must be a positive number (milliseconds)',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (config.defaults.timeout < 5000) {
|
|
89
|
+
issues.push({
|
|
90
|
+
level: 'warning',
|
|
91
|
+
path: 'defaults.timeout',
|
|
92
|
+
message: `Timeout of ${config.defaults.timeout}ms may be too short for user approval`,
|
|
93
|
+
suggestion: 'Consider using at least 30000ms (30 seconds)',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Validate approval configuration
|
|
99
|
+
if (config.approval) {
|
|
100
|
+
if (config.approval.method && !VALID_APPROVAL_METHODS.includes(config.approval.method)) {
|
|
101
|
+
issues.push({
|
|
102
|
+
level: 'error',
|
|
103
|
+
path: 'approval.method',
|
|
104
|
+
message: `Invalid approval method: ${config.approval.method}`,
|
|
105
|
+
suggestion: `Use one of: ${VALID_APPROVAL_METHODS.join(', ')}`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (config.approval.method === 'webhook') {
|
|
109
|
+
if (!config.approval.url) {
|
|
110
|
+
issues.push({
|
|
111
|
+
level: 'error',
|
|
112
|
+
path: 'approval.url',
|
|
113
|
+
message: 'Webhook approval method requires a URL',
|
|
114
|
+
suggestion: 'Add: url: "https://your-webhook-endpoint.com"',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
issues.push({
|
|
118
|
+
level: 'info',
|
|
119
|
+
path: 'approval.method',
|
|
120
|
+
message: 'Webhook approval is not yet implemented',
|
|
121
|
+
suggestion: 'Use method: terminal for now',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Validate servers
|
|
126
|
+
if (!config.servers || Object.keys(config.servers).length === 0) {
|
|
127
|
+
issues.push({
|
|
128
|
+
level: 'warning',
|
|
129
|
+
path: 'servers',
|
|
130
|
+
message: 'No servers configured',
|
|
131
|
+
suggestion: 'Add at least one server configuration',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const serverNames = Object.keys(config.servers);
|
|
136
|
+
// Check for server filter
|
|
137
|
+
if (serverFilter && !serverNames.includes(serverFilter)) {
|
|
138
|
+
issues.push({
|
|
139
|
+
level: 'error',
|
|
140
|
+
path: 'servers',
|
|
141
|
+
message: `Server "${serverFilter}" not found in configuration`,
|
|
142
|
+
details: { availableServers: serverNames },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// Validate each server
|
|
146
|
+
for (const [name, server] of Object.entries(config.servers)) {
|
|
147
|
+
if (serverFilter && name !== serverFilter)
|
|
148
|
+
continue;
|
|
149
|
+
const serverPath = `servers.${name}`;
|
|
150
|
+
const serverIssues = validateServerConfig(name, server, serverPath);
|
|
151
|
+
issues.push(...serverIssues.issues);
|
|
152
|
+
toolPoliciesCount += serverIssues.toolPoliciesCount;
|
|
153
|
+
if (serverIssues.analyzersUsed.length > 0) {
|
|
154
|
+
smartAnalysisEnabled = true;
|
|
155
|
+
serverIssues.analyzersUsed.forEach((a) => analyzersUsed.add(a));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Count issues by level
|
|
160
|
+
const errorCount = issues.filter((i) => i.level === 'error').length;
|
|
161
|
+
const warningCount = issues.filter((i) => i.level === 'warning').length;
|
|
162
|
+
const infoCount = issues.filter((i) => i.level === 'info').length;
|
|
163
|
+
return {
|
|
164
|
+
valid: errorCount === 0,
|
|
165
|
+
issues,
|
|
166
|
+
errorCount,
|
|
167
|
+
warningCount,
|
|
168
|
+
infoCount,
|
|
169
|
+
stats: {
|
|
170
|
+
serversConfigured: Object.keys(config.servers ?? {}).length,
|
|
171
|
+
toolPoliciesConfigured: toolPoliciesCount,
|
|
172
|
+
smartAnalysisEnabled,
|
|
173
|
+
analyzersUsed: Array.from(analyzersUsed),
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function validateServerConfig(name, config, basePath) {
|
|
178
|
+
const issues = [];
|
|
179
|
+
const analyzersUsed = [];
|
|
180
|
+
let toolPoliciesCount = 0;
|
|
181
|
+
// Validate command
|
|
182
|
+
if (!config.command) {
|
|
183
|
+
issues.push({
|
|
184
|
+
level: 'error',
|
|
185
|
+
path: basePath,
|
|
186
|
+
message: `Server "${name}" must specify a command`,
|
|
187
|
+
suggestion: 'Add: command: "npx" (or path to your MCP server)',
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Validate args
|
|
191
|
+
if (config.args && !Array.isArray(config.args)) {
|
|
192
|
+
issues.push({
|
|
193
|
+
level: 'error',
|
|
194
|
+
path: `${basePath}.args`,
|
|
195
|
+
message: 'args must be an array of strings',
|
|
196
|
+
suggestion: 'Use: args: ["-y", "@modelcontextprotocol/server-postgres"]',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Check for environment variables
|
|
200
|
+
if (config.env) {
|
|
201
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
202
|
+
if (typeof value === 'string' && value.includes('${')) {
|
|
203
|
+
const varMatch = value.match(/\$\{(\w+)\}/);
|
|
204
|
+
if (varMatch && varMatch[1]) {
|
|
205
|
+
const envVar = varMatch[1];
|
|
206
|
+
if (!process.env[envVar]) {
|
|
207
|
+
issues.push({
|
|
208
|
+
level: 'warning',
|
|
209
|
+
path: `${basePath}.env.${key}`,
|
|
210
|
+
message: `Environment variable ${envVar} is not set`,
|
|
211
|
+
suggestion: `Set ${envVar} in your environment or .env file`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Validate server defaults
|
|
219
|
+
if (config.defaults) {
|
|
220
|
+
if (config.defaults.action && !VALID_ACTIONS.includes(config.defaults.action)) {
|
|
221
|
+
issues.push({
|
|
222
|
+
level: 'error',
|
|
223
|
+
path: `${basePath}.defaults.action`,
|
|
224
|
+
message: `Invalid default action: ${config.defaults.action}`,
|
|
225
|
+
suggestion: `Use one of: ${VALID_ACTIONS.join(', ')}`,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
if (config.defaults.analyzer) {
|
|
229
|
+
if (!analyzerRegistry.has(config.defaults.analyzer)) {
|
|
230
|
+
issues.push({
|
|
231
|
+
level: 'error',
|
|
232
|
+
path: `${basePath}.defaults.analyzer`,
|
|
233
|
+
message: `Unknown analyzer: ${config.defaults.analyzer}`,
|
|
234
|
+
suggestion: `Use one of: ${analyzerRegistry.list().join(', ')}`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
analyzersUsed.push(config.defaults.analyzer);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Validate tool policies
|
|
243
|
+
if (config.tools) {
|
|
244
|
+
const patterns = Object.keys(config.tools);
|
|
245
|
+
toolPoliciesCount = patterns.length;
|
|
246
|
+
// Check for catch-all pattern
|
|
247
|
+
const hasCatchAll = patterns.includes('*');
|
|
248
|
+
if (!hasCatchAll && !config.defaults?.action) {
|
|
249
|
+
issues.push({
|
|
250
|
+
level: 'info',
|
|
251
|
+
path: `${basePath}.tools`,
|
|
252
|
+
message: 'No catch-all pattern (*) and no server defaults configured',
|
|
253
|
+
suggestion: 'Add a catch-all policy: "*": { action: deny } for security',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Validate each tool policy
|
|
257
|
+
for (const [pattern, policy] of Object.entries(config.tools)) {
|
|
258
|
+
const policyPath = `${basePath}.tools.${pattern}`;
|
|
259
|
+
const policyIssues = validateToolPolicy(pattern, policy, policyPath, name);
|
|
260
|
+
issues.push(...policyIssues.issues);
|
|
261
|
+
if (policyIssues.analyzerUsed) {
|
|
262
|
+
analyzersUsed.push(policyIssues.analyzerUsed);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Check for potentially unreachable patterns
|
|
266
|
+
checkPatternReachability(patterns, issues, `${basePath}.tools`);
|
|
267
|
+
}
|
|
268
|
+
else if (!config.defaults?.action) {
|
|
269
|
+
issues.push({
|
|
270
|
+
level: 'warning',
|
|
271
|
+
path: basePath,
|
|
272
|
+
message: `Server "${name}" has no tool policies and no defaults`,
|
|
273
|
+
suggestion: 'Add tool policies or set defaults.action',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return { issues, toolPoliciesCount, analyzersUsed };
|
|
277
|
+
}
|
|
278
|
+
function validateToolPolicy(pattern, policy, basePath, serverName) {
|
|
279
|
+
const issues = [];
|
|
280
|
+
let analyzerUsed;
|
|
281
|
+
// Normalize policy
|
|
282
|
+
const normalizedPolicy = typeof policy === 'string' ? { action: policy } : policy;
|
|
283
|
+
// Validate action
|
|
284
|
+
if (!VALID_ACTIONS.includes(normalizedPolicy.action)) {
|
|
285
|
+
issues.push({
|
|
286
|
+
level: 'error',
|
|
287
|
+
path: basePath,
|
|
288
|
+
message: `Invalid action: ${normalizedPolicy.action}`,
|
|
289
|
+
suggestion: `Use one of: ${VALID_ACTIONS.join(', ')}`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
// Validate smart action configuration
|
|
293
|
+
if (normalizedPolicy.action === 'smart') {
|
|
294
|
+
if (normalizedPolicy.analyzer) {
|
|
295
|
+
if (!analyzerRegistry.has(normalizedPolicy.analyzer)) {
|
|
296
|
+
issues.push({
|
|
297
|
+
level: 'error',
|
|
298
|
+
path: `${basePath}.analyzer`,
|
|
299
|
+
message: `Unknown analyzer: ${normalizedPolicy.analyzer}`,
|
|
300
|
+
suggestion: `Use one of: ${analyzerRegistry.list().join(', ')}`,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
analyzerUsed = normalizedPolicy.analyzer;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// Check if we can infer the analyzer
|
|
309
|
+
const canInfer = ['postgres', 'mysql', 'sqlite', 'database', 'filesystem', 'file', 'fs', 'shell', 'terminal', 'bash'].some((keyword) => serverName.toLowerCase().includes(keyword));
|
|
310
|
+
if (!canInfer) {
|
|
311
|
+
issues.push({
|
|
312
|
+
level: 'warning',
|
|
313
|
+
path: basePath,
|
|
314
|
+
message: "Smart action without explicit analyzer - may fall back to 'prompt'",
|
|
315
|
+
suggestion: `Add: analyzer: sql (or filesystem, shell)`,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Validate risk mappings
|
|
320
|
+
if (normalizedPolicy.risks) {
|
|
321
|
+
for (const [risk, action] of Object.entries(normalizedPolicy.risks)) {
|
|
322
|
+
if (!VALID_RISK_LEVELS.includes(risk)) {
|
|
323
|
+
issues.push({
|
|
324
|
+
level: 'error',
|
|
325
|
+
path: `${basePath}.risks.${risk}`,
|
|
326
|
+
message: `Invalid risk level: ${risk}`,
|
|
327
|
+
suggestion: `Use one of: ${VALID_RISK_LEVELS.join(', ')}`,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (!['allow', 'deny', 'prompt'].includes(action)) {
|
|
331
|
+
issues.push({
|
|
332
|
+
level: 'error',
|
|
333
|
+
path: `${basePath}.risks.${risk}`,
|
|
334
|
+
message: `Invalid action for risk mapping: ${action}`,
|
|
335
|
+
suggestion: 'Use one of: allow, deny, prompt',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Validate session configuration
|
|
342
|
+
if (normalizedPolicy.session) {
|
|
343
|
+
if (normalizedPolicy.session.scope && !VALID_SCOPES.includes(normalizedPolicy.session.scope)) {
|
|
344
|
+
issues.push({
|
|
345
|
+
level: 'error',
|
|
346
|
+
path: `${basePath}.session.scope`,
|
|
347
|
+
message: `Invalid session scope: ${normalizedPolicy.session.scope}`,
|
|
348
|
+
suggestion: `Use one of: ${VALID_SCOPES.join(', ')}`,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
if (normalizedPolicy.session.ttl !== undefined) {
|
|
352
|
+
if (typeof normalizedPolicy.session.ttl !== 'number' || normalizedPolicy.session.ttl < 0) {
|
|
353
|
+
issues.push({
|
|
354
|
+
level: 'error',
|
|
355
|
+
path: `${basePath}.session.ttl`,
|
|
356
|
+
message: 'TTL must be a positive number (seconds)',
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
else if (normalizedPolicy.session.ttl > 86400) {
|
|
360
|
+
issues.push({
|
|
361
|
+
level: 'warning',
|
|
362
|
+
path: `${basePath}.session.ttl`,
|
|
363
|
+
message: 'Session TTL over 24 hours may pose security risks',
|
|
364
|
+
suggestion: 'Consider using a shorter TTL for security',
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Validate glob pattern syntax
|
|
370
|
+
if (pattern.includes('*')) {
|
|
371
|
+
try {
|
|
372
|
+
// Test the pattern with minimatch
|
|
373
|
+
minimatch('test', pattern);
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
issues.push({
|
|
377
|
+
level: 'error',
|
|
378
|
+
path: basePath,
|
|
379
|
+
message: `Invalid glob pattern: ${pattern}`,
|
|
380
|
+
suggestion: 'Check glob pattern syntax',
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return { issues, analyzerUsed };
|
|
385
|
+
}
|
|
386
|
+
// =============================================================================
|
|
387
|
+
// Pattern Analysis
|
|
388
|
+
// =============================================================================
|
|
389
|
+
/**
|
|
390
|
+
* Checks for patterns that might be unreachable due to ordering.
|
|
391
|
+
*/
|
|
392
|
+
function checkPatternReachability(patterns, issues, basePath) {
|
|
393
|
+
// Sort patterns by specificity (exact match > longer patterns > wildcards > catch-all)
|
|
394
|
+
const sortedPatterns = [...patterns].sort((a, b) => {
|
|
395
|
+
if (a === '*')
|
|
396
|
+
return 1;
|
|
397
|
+
if (b === '*')
|
|
398
|
+
return -1;
|
|
399
|
+
if (a.includes('*') && !b.includes('*'))
|
|
400
|
+
return 1;
|
|
401
|
+
if (!a.includes('*') && b.includes('*'))
|
|
402
|
+
return -1;
|
|
403
|
+
return b.length - a.length;
|
|
404
|
+
});
|
|
405
|
+
// Check if any specific pattern would match before a broader one
|
|
406
|
+
for (let i = 0; i < sortedPatterns.length; i++) {
|
|
407
|
+
const current = sortedPatterns[i];
|
|
408
|
+
if (!current || current === '*')
|
|
409
|
+
continue;
|
|
410
|
+
for (let j = i + 1; j < sortedPatterns.length; j++) {
|
|
411
|
+
const broader = sortedPatterns[j];
|
|
412
|
+
if (!broader || broader === '*')
|
|
413
|
+
continue;
|
|
414
|
+
// Check if broader pattern would match things current pattern matches
|
|
415
|
+
if (broader.includes('*') && !current.includes('*')) {
|
|
416
|
+
if (minimatch(current, broader)) {
|
|
417
|
+
issues.push({
|
|
418
|
+
level: 'info',
|
|
419
|
+
path: `${basePath}.${broader}`,
|
|
420
|
+
message: `Pattern "${broader}" would also match "${current}", but exact match takes precedence`,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// =============================================================================
|
|
428
|
+
// Output Formatting
|
|
429
|
+
// =============================================================================
|
|
430
|
+
/**
|
|
431
|
+
* Formats validation issues for console output.
|
|
432
|
+
*/
|
|
433
|
+
export function formatValidationIssues(issues) {
|
|
434
|
+
const lines = [];
|
|
435
|
+
const grouped = {
|
|
436
|
+
error: issues.filter((i) => i.level === 'error'),
|
|
437
|
+
warning: issues.filter((i) => i.level === 'warning'),
|
|
438
|
+
info: issues.filter((i) => i.level === 'info'),
|
|
439
|
+
};
|
|
440
|
+
for (const [level, levelIssues] of Object.entries(grouped)) {
|
|
441
|
+
if (levelIssues.length === 0)
|
|
442
|
+
continue;
|
|
443
|
+
const icon = level === 'error' ? '✗' : level === 'warning' ? '⚠' : 'ℹ';
|
|
444
|
+
for (const issue of levelIssues) {
|
|
445
|
+
lines.push(` ${icon} [${issue.path}] ${issue.message}`);
|
|
446
|
+
if (issue.suggestion) {
|
|
447
|
+
lines.push(` → ${issue.suggestion}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return lines.join('\n');
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/policy/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tollgate Bridge
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the proxy components: policy engine, session manager,
|
|
5
|
+
* audit logger, approval handler, and upstream client.
|
|
6
|
+
*
|
|
7
|
+
* Resilience features:
|
|
8
|
+
* - Graceful shutdown with configurable timeout
|
|
9
|
+
* - Force exit after graceful shutdown timeout
|
|
10
|
+
* - Health status monitoring
|
|
11
|
+
*/
|
|
12
|
+
import type { TollgateConfig, FailureMode } from '../policy/types.js';
|
|
13
|
+
export interface BridgeOptions {
|
|
14
|
+
config: TollgateConfig;
|
|
15
|
+
serverName: string;
|
|
16
|
+
auditPath?: string;
|
|
17
|
+
approvalTimeout?: number;
|
|
18
|
+
/** Disable session-based approvals */
|
|
19
|
+
disableSessions?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Enable dry-run mode.
|
|
22
|
+
* In dry-run mode:
|
|
23
|
+
* - Policies are fully evaluated
|
|
24
|
+
* - Prompts are shown (if policy requires)
|
|
25
|
+
* - Audit logs are written
|
|
26
|
+
* - BUT tool calls are NOT forwarded to the upstream server
|
|
27
|
+
*/
|
|
28
|
+
dryRun?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Override failure mode from config.
|
|
31
|
+
* - 'fail-closed': Deny all requests when upstream is down (default)
|
|
32
|
+
* - 'fail-open': Allow all requests when upstream is down
|
|
33
|
+
* - 'fail-readonly': Only allow read operations when upstream is down
|
|
34
|
+
*/
|
|
35
|
+
failureMode?: FailureMode;
|
|
36
|
+
}
|
|
37
|
+
export declare class TollgateBridge {
|
|
38
|
+
private server;
|
|
39
|
+
private options;
|
|
40
|
+
private resilience;
|
|
41
|
+
private isShuttingDown;
|
|
42
|
+
private forceExitTimeout;
|
|
43
|
+
constructor(options: BridgeOptions);
|
|
44
|
+
start(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Stop the bridge and all components.
|
|
47
|
+
* Waits for in-flight requests to complete before closing.
|
|
48
|
+
*/
|
|
49
|
+
stop(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Handle upstream health status changes.
|
|
52
|
+
*/
|
|
53
|
+
private handleHealthChange;
|
|
54
|
+
/**
|
|
55
|
+
* Creates the appropriate approval handler based on configuration.
|
|
56
|
+
*/
|
|
57
|
+
private createApprovalHandler;
|
|
58
|
+
/**
|
|
59
|
+
* Creates the appropriate session store based on configuration.
|
|
60
|
+
*/
|
|
61
|
+
private createSessionStore;
|
|
62
|
+
}
|
|
63
|
+
export interface WrapOptions {
|
|
64
|
+
command: string;
|
|
65
|
+
args: string[];
|
|
66
|
+
env?: Record<string, string>;
|
|
67
|
+
defaultAction?: 'allow' | 'deny' | 'prompt';
|
|
68
|
+
auditPath?: string;
|
|
69
|
+
approvalTimeout?: number;
|
|
70
|
+
/** Approval method: terminal or interactive */
|
|
71
|
+
approvalMethod?: 'terminal' | 'interactive';
|
|
72
|
+
/** Port for interactive approval UI */
|
|
73
|
+
approvalPort?: number;
|
|
74
|
+
/** Enable persistent session storage */
|
|
75
|
+
persistSessions?: boolean;
|
|
76
|
+
/** Path for persistent session database */
|
|
77
|
+
sessionPath?: string;
|
|
78
|
+
/** Enable dry-run mode */
|
|
79
|
+
dryRun?: boolean;
|
|
80
|
+
/** Failure mode when upstream is unavailable */
|
|
81
|
+
failureMode?: FailureMode;
|
|
82
|
+
}
|
|
83
|
+
export declare function startWrapMode(options: WrapOptions): Promise<void>;
|
|
84
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/proxy/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAoB,MAAM,oBAAoB,CAAC;AAgBxF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAA+B;gBAE3C,OAAO,EAAE,aAAa;IAqB5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF5B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAe3B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAC5C,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvE"}
|