@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.
Files changed (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +885 -0
  3. package/dist/analyzers/filesystem.d.ts +26 -0
  4. package/dist/analyzers/filesystem.d.ts.map +1 -0
  5. package/dist/analyzers/filesystem.js +284 -0
  6. package/dist/analyzers/filesystem.js.map +1 -0
  7. package/dist/analyzers/http.d.ts +90 -0
  8. package/dist/analyzers/http.d.ts.map +1 -0
  9. package/dist/analyzers/http.js +433 -0
  10. package/dist/analyzers/http.js.map +1 -0
  11. package/dist/analyzers/index.d.ts +101 -0
  12. package/dist/analyzers/index.d.ts.map +1 -0
  13. package/dist/analyzers/index.js +342 -0
  14. package/dist/analyzers/index.js.map +1 -0
  15. package/dist/analyzers/loader.d.ts +114 -0
  16. package/dist/analyzers/loader.d.ts.map +1 -0
  17. package/dist/analyzers/loader.js +184 -0
  18. package/dist/analyzers/loader.js.map +1 -0
  19. package/dist/analyzers/prompt-injection.d.ts +95 -0
  20. package/dist/analyzers/prompt-injection.d.ts.map +1 -0
  21. package/dist/analyzers/prompt-injection.js +725 -0
  22. package/dist/analyzers/prompt-injection.js.map +1 -0
  23. package/dist/analyzers/sdk.d.ts +230 -0
  24. package/dist/analyzers/sdk.d.ts.map +1 -0
  25. package/dist/analyzers/sdk.js +283 -0
  26. package/dist/analyzers/sdk.js.map +1 -0
  27. package/dist/analyzers/shell.d.ts +20 -0
  28. package/dist/analyzers/shell.d.ts.map +1 -0
  29. package/dist/analyzers/shell.js +297 -0
  30. package/dist/analyzers/shell.js.map +1 -0
  31. package/dist/analyzers/sql.d.ts +37 -0
  32. package/dist/analyzers/sql.d.ts.map +1 -0
  33. package/dist/analyzers/sql.js +455 -0
  34. package/dist/analyzers/sql.js.map +1 -0
  35. package/dist/analyzers/types.d.ts +117 -0
  36. package/dist/analyzers/types.d.ts.map +1 -0
  37. package/dist/analyzers/types.js +46 -0
  38. package/dist/analyzers/types.js.map +1 -0
  39. package/dist/approval/interactive.d.ts +72 -0
  40. package/dist/approval/interactive.d.ts.map +1 -0
  41. package/dist/approval/interactive.js +550 -0
  42. package/dist/approval/interactive.js.map +1 -0
  43. package/dist/approval/terminal.d.ts +59 -0
  44. package/dist/approval/terminal.d.ts.map +1 -0
  45. package/dist/approval/terminal.js +238 -0
  46. package/dist/approval/terminal.js.map +1 -0
  47. package/dist/approval/types.d.ts +66 -0
  48. package/dist/approval/types.d.ts.map +1 -0
  49. package/dist/approval/types.js +2 -0
  50. package/dist/approval/types.js.map +1 -0
  51. package/dist/audit/exporter.d.ts +138 -0
  52. package/dist/audit/exporter.d.ts.map +1 -0
  53. package/dist/audit/exporter.js +366 -0
  54. package/dist/audit/exporter.js.map +1 -0
  55. package/dist/audit/logger.d.ts +156 -0
  56. package/dist/audit/logger.d.ts.map +1 -0
  57. package/dist/audit/logger.js +406 -0
  58. package/dist/audit/logger.js.map +1 -0
  59. package/dist/audit/redaction.d.ts +110 -0
  60. package/dist/audit/redaction.d.ts.map +1 -0
  61. package/dist/audit/redaction.js +307 -0
  62. package/dist/audit/redaction.js.map +1 -0
  63. package/dist/audit/schema.d.ts +76 -0
  64. package/dist/audit/schema.d.ts.map +1 -0
  65. package/dist/audit/schema.js +122 -0
  66. package/dist/audit/schema.js.map +1 -0
  67. package/dist/cli/commands/doctor.d.ts +34 -0
  68. package/dist/cli/commands/doctor.d.ts.map +1 -0
  69. package/dist/cli/commands/doctor.js +431 -0
  70. package/dist/cli/commands/doctor.js.map +1 -0
  71. package/dist/cli/commands/export.d.ts +18 -0
  72. package/dist/cli/commands/export.d.ts.map +1 -0
  73. package/dist/cli/commands/export.js +63 -0
  74. package/dist/cli/commands/export.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +12 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +102 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/commands/logs.d.ts +11 -0
  80. package/dist/cli/commands/logs.d.ts.map +1 -0
  81. package/dist/cli/commands/logs.js +60 -0
  82. package/dist/cli/commands/logs.js.map +1 -0
  83. package/dist/cli/commands/scan.d.ts +29 -0
  84. package/dist/cli/commands/scan.d.ts.map +1 -0
  85. package/dist/cli/commands/scan.js +251 -0
  86. package/dist/cli/commands/scan.js.map +1 -0
  87. package/dist/cli/commands/serve.d.ts +26 -0
  88. package/dist/cli/commands/serve.d.ts.map +1 -0
  89. package/dist/cli/commands/serve.js +424 -0
  90. package/dist/cli/commands/serve.js.map +1 -0
  91. package/dist/cli/commands/start.d.ts +20 -0
  92. package/dist/cli/commands/start.d.ts.map +1 -0
  93. package/dist/cli/commands/start.js +82 -0
  94. package/dist/cli/commands/start.js.map +1 -0
  95. package/dist/cli/commands/stats.d.ts +10 -0
  96. package/dist/cli/commands/stats.d.ts.map +1 -0
  97. package/dist/cli/commands/stats.js +42 -0
  98. package/dist/cli/commands/stats.js.map +1 -0
  99. package/dist/cli/commands/templates.d.ts +26 -0
  100. package/dist/cli/commands/templates.d.ts.map +1 -0
  101. package/dist/cli/commands/templates.js +221 -0
  102. package/dist/cli/commands/templates.js.map +1 -0
  103. package/dist/cli/commands/validate.d.ts +12 -0
  104. package/dist/cli/commands/validate.d.ts.map +1 -0
  105. package/dist/cli/commands/validate.js +107 -0
  106. package/dist/cli/commands/validate.js.map +1 -0
  107. package/dist/cli/commands/wrap.d.ts +19 -0
  108. package/dist/cli/commands/wrap.d.ts.map +1 -0
  109. package/dist/cli/commands/wrap.js +59 -0
  110. package/dist/cli/commands/wrap.js.map +1 -0
  111. package/dist/cli/index.d.ts +17 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +202 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/cli/ui.d.ts +139 -0
  116. package/dist/cli/ui.d.ts.map +1 -0
  117. package/dist/cli/ui.js +271 -0
  118. package/dist/cli/ui.js.map +1 -0
  119. package/dist/constants.d.ts +33 -0
  120. package/dist/constants.d.ts.map +1 -0
  121. package/dist/constants.js +54 -0
  122. package/dist/constants.js.map +1 -0
  123. package/dist/errors.d.ts +28 -0
  124. package/dist/errors.d.ts.map +1 -0
  125. package/dist/errors.js +37 -0
  126. package/dist/errors.js.map +1 -0
  127. package/dist/index.d.ts +49 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +82 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/orchestrator/index.d.ts +11 -0
  132. package/dist/orchestrator/index.d.ts.map +1 -0
  133. package/dist/orchestrator/index.js +10 -0
  134. package/dist/orchestrator/index.js.map +1 -0
  135. package/dist/orchestrator/manager.d.ts +127 -0
  136. package/dist/orchestrator/manager.d.ts.map +1 -0
  137. package/dist/orchestrator/manager.js +498 -0
  138. package/dist/orchestrator/manager.js.map +1 -0
  139. package/dist/orchestrator/types.d.ts +141 -0
  140. package/dist/orchestrator/types.d.ts.map +1 -0
  141. package/dist/orchestrator/types.js +9 -0
  142. package/dist/orchestrator/types.js.map +1 -0
  143. package/dist/policy/engine.d.ts +55 -0
  144. package/dist/policy/engine.d.ts.map +1 -0
  145. package/dist/policy/engine.js +288 -0
  146. package/dist/policy/engine.js.map +1 -0
  147. package/dist/policy/natural-language.d.ts +141 -0
  148. package/dist/policy/natural-language.d.ts.map +1 -0
  149. package/dist/policy/natural-language.js +552 -0
  150. package/dist/policy/natural-language.js.map +1 -0
  151. package/dist/policy/parser.d.ts +141 -0
  152. package/dist/policy/parser.d.ts.map +1 -0
  153. package/dist/policy/parser.js +314 -0
  154. package/dist/policy/parser.js.map +1 -0
  155. package/dist/policy/types.d.ts +428 -0
  156. package/dist/policy/types.d.ts.map +1 -0
  157. package/dist/policy/types.js +32 -0
  158. package/dist/policy/types.js.map +1 -0
  159. package/dist/policy/validator.d.ts +72 -0
  160. package/dist/policy/validator.d.ts.map +1 -0
  161. package/dist/policy/validator.js +453 -0
  162. package/dist/policy/validator.js.map +1 -0
  163. package/dist/proxy/bridge.d.ts +84 -0
  164. package/dist/proxy/bridge.d.ts.map +1 -0
  165. package/dist/proxy/bridge.js +217 -0
  166. package/dist/proxy/bridge.js.map +1 -0
  167. package/dist/proxy/client.d.ts +130 -0
  168. package/dist/proxy/client.d.ts.map +1 -0
  169. package/dist/proxy/client.js +290 -0
  170. package/dist/proxy/client.js.map +1 -0
  171. package/dist/proxy/server.d.ts +111 -0
  172. package/dist/proxy/server.d.ts.map +1 -0
  173. package/dist/proxy/server.js +444 -0
  174. package/dist/proxy/server.js.map +1 -0
  175. package/dist/scanner.d.ts +91 -0
  176. package/dist/scanner.d.ts.map +1 -0
  177. package/dist/scanner.js +373 -0
  178. package/dist/scanner.js.map +1 -0
  179. package/dist/session/index.d.ts +32 -0
  180. package/dist/session/index.d.ts.map +1 -0
  181. package/dist/session/index.js +31 -0
  182. package/dist/session/index.js.map +1 -0
  183. package/dist/session/manager.d.ts +166 -0
  184. package/dist/session/manager.d.ts.map +1 -0
  185. package/dist/session/manager.js +454 -0
  186. package/dist/session/manager.js.map +1 -0
  187. package/dist/session/sqlite-store.d.ts +54 -0
  188. package/dist/session/sqlite-store.d.ts.map +1 -0
  189. package/dist/session/sqlite-store.js +209 -0
  190. package/dist/session/sqlite-store.js.map +1 -0
  191. package/dist/session/types.d.ts +179 -0
  192. package/dist/session/types.d.ts.map +1 -0
  193. package/dist/session/types.js +38 -0
  194. package/dist/session/types.js.map +1 -0
  195. package/dist/templates.d.ts +64 -0
  196. package/dist/templates.d.ts.map +1 -0
  197. package/dist/templates.js +451 -0
  198. package/dist/templates.js.map +1 -0
  199. package/dist/utils/config.d.ts +57 -0
  200. package/dist/utils/config.d.ts.map +1 -0
  201. package/dist/utils/config.js +104 -0
  202. package/dist/utils/config.js.map +1 -0
  203. package/dist/utils/errors.d.ts +18 -0
  204. package/dist/utils/errors.d.ts.map +1 -0
  205. package/dist/utils/errors.js +35 -0
  206. package/dist/utils/errors.js.map +1 -0
  207. package/dist/utils/logger.d.ts +144 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +300 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/wizard.d.ts +68 -0
  212. package/dist/wizard.d.ts.map +1 -0
  213. package/dist/wizard.js +395 -0
  214. package/dist/wizard.js.map +1 -0
  215. 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"}