@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,26 @@
1
+ import type { AnalysisResult, ContentAnalyzer, AnalyzerContext } from './types.js';
2
+ /**
3
+ * Filesystem Path Analyzer
4
+ *
5
+ * Classifies filesystem operations by risk level based on:
6
+ * - Path location (system dirs, home dir, project dirs)
7
+ * - File type (sensitive files like .env, .ssh)
8
+ * - Operation type (read vs write vs delete)
9
+ */
10
+ export declare class FilesystemAnalyzer implements ContentAnalyzer {
11
+ readonly name = "filesystem";
12
+ private readonly FORBIDDEN_PATHS;
13
+ private readonly DANGEROUS_PATHS;
14
+ private readonly SENSITIVE_PATTERNS;
15
+ private readonly IMPORTANT_PATTERNS;
16
+ analyze(path: string, context?: AnalyzerContext): AnalysisResult;
17
+ private inferOperation;
18
+ private normalizePath;
19
+ private hasPathTraversal;
20
+ private hasDangerousGlob;
21
+ private matchesForbiddenPath;
22
+ private matchesDangerousPath;
23
+ private matchesSensitivePattern;
24
+ private matchesImportantPattern;
25
+ }
26
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,IAAI,gBAAgB;IAG7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAgB9B;IAGF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAS9B;IAGF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAgBjC;IAGF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAajC;IAEF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc;IA6GhE,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,uBAAuB;CAQhC"}
@@ -0,0 +1,284 @@
1
+ import { homedir } from 'node:os';
2
+ import { normalize, isAbsolute } from 'node:path';
3
+ /**
4
+ * Filesystem Path Analyzer
5
+ *
6
+ * Classifies filesystem operations by risk level based on:
7
+ * - Path location (system dirs, home dir, project dirs)
8
+ * - File type (sensitive files like .env, .ssh)
9
+ * - Operation type (read vs write vs delete)
10
+ */
11
+ export class FilesystemAnalyzer {
12
+ name = 'filesystem';
13
+ // Paths that should NEVER be modified
14
+ FORBIDDEN_PATHS = [
15
+ '/',
16
+ '/etc',
17
+ '/usr',
18
+ '/bin',
19
+ '/sbin',
20
+ '/var',
21
+ '/boot',
22
+ '/lib',
23
+ '/lib64',
24
+ '/System', // macOS
25
+ '/Applications', // macOS (system apps)
26
+ '/Windows', // Windows
27
+ '/Program Files', // Windows
28
+ 'C:\\Windows', // Windows
29
+ 'C:\\Program Files', // Windows
30
+ ];
31
+ // Paths that are dangerous to modify
32
+ DANGEROUS_PATHS = [
33
+ homedir(), // Home directory root
34
+ `${homedir()}/.ssh`,
35
+ `${homedir()}/.gnupg`,
36
+ `${homedir()}/.aws`,
37
+ `${homedir()}/.kube`,
38
+ `${homedir()}/.config`,
39
+ '/tmp',
40
+ '/var/tmp',
41
+ ];
42
+ // Sensitive file patterns
43
+ SENSITIVE_PATTERNS = [
44
+ /\.env($|\.)/, // .env, .env.local, .env.production
45
+ /\.pem$/, // SSL certificates
46
+ /\.key$/, // Private keys
47
+ /\.crt$/, // Certificates
48
+ /id_rsa/, // SSH keys
49
+ /id_ed25519/, // SSH keys
50
+ /\.gitconfig$/,
51
+ /\.npmrc$/,
52
+ /\.pypirc$/,
53
+ /credentials/i,
54
+ /secrets?\.ya?ml$/i,
55
+ /password/i,
56
+ /\.htpasswd$/,
57
+ /shadow$/, // Unix password file
58
+ /authorized_keys$/,
59
+ ];
60
+ // Files that are important but less sensitive
61
+ IMPORTANT_PATTERNS = [
62
+ /\.git\//, // Git directory
63
+ /\.gitignore$/,
64
+ /package\.json$/,
65
+ /package-lock\.json$/,
66
+ /yarn\.lock$/,
67
+ /Cargo\.toml$/,
68
+ /go\.mod$/,
69
+ /requirements\.txt$/,
70
+ /Dockerfile$/,
71
+ /docker-compose\.ya?ml$/,
72
+ /\.github\//,
73
+ /\.gitlab-ci\.yml$/,
74
+ ];
75
+ analyze(path, context) {
76
+ const operation = this.inferOperation(context?.tool);
77
+ const normalizedPath = this.normalizePath(path);
78
+ // Check for path traversal attempts
79
+ if (this.hasPathTraversal(path)) {
80
+ return {
81
+ risk: 'dangerous',
82
+ reason: 'Path traversal detected (..) - potential escape attempt',
83
+ triggers: ['path traversal'],
84
+ };
85
+ }
86
+ // Check for glob patterns that could match too much
87
+ if (this.hasDangerousGlob(path)) {
88
+ return {
89
+ risk: operation === 'read' ? 'write' : 'dangerous',
90
+ reason: 'Glob pattern could match many files',
91
+ triggers: ['dangerous glob'],
92
+ };
93
+ }
94
+ // Check forbidden paths
95
+ const forbiddenMatch = this.matchesForbiddenPath(normalizedPath);
96
+ if (forbiddenMatch) {
97
+ return {
98
+ risk: 'dangerous',
99
+ reason: `Path is in forbidden system directory: ${forbiddenMatch}`,
100
+ triggers: [forbiddenMatch],
101
+ };
102
+ }
103
+ // Check dangerous paths (stricter for write/delete)
104
+ const dangerousMatch = this.matchesDangerousPath(normalizedPath);
105
+ if (dangerousMatch) {
106
+ if (operation === 'delete') {
107
+ return {
108
+ risk: 'dangerous',
109
+ reason: `Cannot delete from protected directory: ${dangerousMatch}`,
110
+ triggers: [dangerousMatch],
111
+ };
112
+ }
113
+ if (operation === 'write') {
114
+ return {
115
+ risk: 'destructive',
116
+ reason: `Writing to protected directory: ${dangerousMatch}`,
117
+ triggers: [dangerousMatch],
118
+ };
119
+ }
120
+ // Read is allowed but noted
121
+ return {
122
+ risk: 'read',
123
+ reason: `Reading from protected directory: ${dangerousMatch}`,
124
+ triggers: [dangerousMatch],
125
+ };
126
+ }
127
+ // Check sensitive file patterns
128
+ const sensitiveMatch = this.matchesSensitivePattern(normalizedPath);
129
+ if (sensitiveMatch) {
130
+ if (operation === 'delete') {
131
+ return {
132
+ risk: 'dangerous',
133
+ reason: `Cannot delete sensitive file matching: ${sensitiveMatch}`,
134
+ triggers: [sensitiveMatch],
135
+ };
136
+ }
137
+ return {
138
+ risk: operation === 'read' ? 'write' : 'destructive',
139
+ reason: `${operation === 'read' ? 'Reading' : 'Modifying'} sensitive file: ${sensitiveMatch}`,
140
+ triggers: [sensitiveMatch],
141
+ };
142
+ }
143
+ // Check important file patterns
144
+ const importantMatch = this.matchesImportantPattern(normalizedPath);
145
+ if (importantMatch && operation !== 'read') {
146
+ return {
147
+ risk: 'write',
148
+ reason: `Modifying important project file: ${importantMatch}`,
149
+ triggers: [importantMatch],
150
+ };
151
+ }
152
+ // Default based on operation
153
+ switch (operation) {
154
+ case 'read':
155
+ return {
156
+ risk: 'safe',
157
+ reason: 'Reading from unrestricted path',
158
+ };
159
+ case 'write':
160
+ return {
161
+ risk: 'write',
162
+ reason: 'Writing to unrestricted path',
163
+ };
164
+ case 'delete':
165
+ return {
166
+ risk: 'destructive',
167
+ reason: 'Deleting from unrestricted path',
168
+ };
169
+ default:
170
+ return {
171
+ risk: 'write',
172
+ reason: 'Unknown filesystem operation',
173
+ };
174
+ }
175
+ }
176
+ inferOperation(tool) {
177
+ if (!tool)
178
+ return 'write'; // Conservative default
179
+ const lowerTool = tool.toLowerCase();
180
+ if (lowerTool.includes('delete') || lowerTool.includes('remove') || lowerTool.includes('rm')) {
181
+ return 'delete';
182
+ }
183
+ if (lowerTool.includes('read') || lowerTool.includes('get') || lowerTool.includes('list') ||
184
+ lowerTool.includes('search') || lowerTool.includes('find')) {
185
+ return 'read';
186
+ }
187
+ return 'write';
188
+ }
189
+ normalizePath(path) {
190
+ // Expand home directory
191
+ let expanded = path;
192
+ if (path.startsWith('~/')) {
193
+ expanded = path.replace(/^~/, homedir());
194
+ }
195
+ else if (path === '~') {
196
+ expanded = homedir();
197
+ }
198
+ // Handle $HOME and other env vars
199
+ expanded = expanded.replace(/\$HOME/g, homedir());
200
+ expanded = expanded.replace(/\$\{HOME\}/g, homedir());
201
+ // Normalize the path
202
+ if (isAbsolute(expanded)) {
203
+ return normalize(expanded);
204
+ }
205
+ // For relative paths, just normalize
206
+ return normalize(expanded);
207
+ }
208
+ hasPathTraversal(path) {
209
+ // Check for .. that escapes current directory
210
+ const normalized = normalize(path);
211
+ // If normalization changes the path significantly and contains .., be suspicious
212
+ if (path.includes('..') && !normalized.includes('..')) {
213
+ // The .. was resolved - check if it escaped
214
+ return true;
215
+ }
216
+ // Direct check for suspicious patterns
217
+ if (/\.\.\/.*\.\./.test(path)) {
218
+ return true; // Multiple traversals
219
+ }
220
+ return false;
221
+ }
222
+ hasDangerousGlob(path) {
223
+ // Single * at root or home
224
+ if (path === '*' || path === '/*' || path === '~/*') {
225
+ return true;
226
+ }
227
+ // ** without restriction
228
+ if (path === '**' || path === '/**' || path === '~/**') {
229
+ return true;
230
+ }
231
+ // * in sensitive locations
232
+ if (/^(\/etc|\/var|~\/\.)\/*\*/.test(path)) {
233
+ return true;
234
+ }
235
+ return false;
236
+ }
237
+ matchesForbiddenPath(path) {
238
+ for (const forbidden of this.FORBIDDEN_PATHS) {
239
+ const normalizedForbidden = normalize(forbidden);
240
+ if (path === normalizedForbidden || path.startsWith(normalizedForbidden + '/')) {
241
+ // Exception: allow if it's deeper in a user project
242
+ if (path.includes('/node_modules/') || path.includes('/vendor/')) {
243
+ continue;
244
+ }
245
+ return forbidden;
246
+ }
247
+ }
248
+ return null;
249
+ }
250
+ matchesDangerousPath(path) {
251
+ for (const dangerous of this.DANGEROUS_PATHS) {
252
+ const normalizedDangerous = normalize(dangerous);
253
+ if (path === normalizedDangerous) {
254
+ return dangerous;
255
+ }
256
+ // Only flag if directly in the dangerous path (not a subdirectory of a project)
257
+ if (path.startsWith(normalizedDangerous + '/')) {
258
+ // Allow if it looks like a project path
259
+ const remainder = path.slice(normalizedDangerous.length + 1);
260
+ if (!remainder.includes('/') || remainder.split('/')[0]?.startsWith('.')) {
261
+ return dangerous;
262
+ }
263
+ }
264
+ }
265
+ return null;
266
+ }
267
+ matchesSensitivePattern(path) {
268
+ for (const pattern of this.SENSITIVE_PATTERNS) {
269
+ if (pattern.test(path)) {
270
+ return pattern.source;
271
+ }
272
+ }
273
+ return null;
274
+ }
275
+ matchesImportantPattern(path) {
276
+ for (const pattern of this.IMPORTANT_PATTERNS) {
277
+ if (pattern.test(path)) {
278
+ return pattern.source;
279
+ }
280
+ }
281
+ return null;
282
+ }
283
+ }
284
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * HTTP/API Request Analyzer
3
+ *
4
+ * Classifies HTTP requests by risk level based on:
5
+ * - HTTP method (GET = read, POST/PUT = write, DELETE = destructive)
6
+ * - Target host (internal IPs, localhost, cloud metadata = dangerous)
7
+ * - Sensitive headers (Authorization, Cookie, API keys)
8
+ * - Dangerous protocols (file://, ftp://)
9
+ *
10
+ * This analyzer is designed to prevent:
11
+ * - Server-Side Request Forgery (SSRF) attacks
12
+ * - Unauthorized access to internal services
13
+ * - Credential leakage
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const analyzer = new HttpAnalyzer();
18
+ *
19
+ * // Analyze a URL string
20
+ * analyzer.analyze('https://api.example.com/users');
21
+ * // → { risk: 'read', reason: 'GET request to external host' }
22
+ *
23
+ * // Analyze a JSON-encoded request
24
+ * analyzer.analyze(JSON.stringify({
25
+ * url: 'https://api.example.com/users',
26
+ * method: 'POST',
27
+ * headers: { 'Content-Type': 'application/json' }
28
+ * }));
29
+ * // → { risk: 'write', reason: 'POST request to external host' }
30
+ *
31
+ * // Dangerous request detection
32
+ * analyzer.analyze('http://169.254.169.254/latest/meta-data/');
33
+ * // → { risk: 'dangerous', reason: 'SSRF: AWS metadata endpoint' }
34
+ * ```
35
+ */
36
+ import type { AnalysisResult, ContentAnalyzer, AnalyzerContext } from './types.js';
37
+ /**
38
+ * HTTP/API Request Analyzer
39
+ *
40
+ * Analyzes HTTP requests and URLs to determine risk levels.
41
+ * Prevents SSRF attacks, credential leakage, and unauthorized access.
42
+ */
43
+ export declare class HttpAnalyzer implements ContentAnalyzer {
44
+ readonly name = "http";
45
+ /**
46
+ * Cloud metadata endpoints - critical SSRF targets
47
+ */
48
+ private readonly METADATA_ENDPOINTS;
49
+ /**
50
+ * Internal/private IP ranges - SSRF and network access control
51
+ */
52
+ private readonly INTERNAL_IP_PATTERNS;
53
+ private readonly DANGEROUS_PROTOCOLS;
54
+ /**
55
+ * Headers that indicate sensitive operations.
56
+ * These don't block the request but elevate risk level.
57
+ */
58
+ private readonly SENSITIVE_HEADERS;
59
+ /**
60
+ * Maps HTTP methods to their base risk level.
61
+ */
62
+ private readonly METHOD_RISK;
63
+ analyze(input: string, context?: AnalyzerContext): AnalysisResult;
64
+ /**
65
+ * Parses input into a structured request object.
66
+ * Accepts either a URL string or a JSON-encoded request object.
67
+ */
68
+ private parseInput;
69
+ /**
70
+ * Normalizes headers object to lowercase keys.
71
+ */
72
+ private normalizeHeaders;
73
+ /**
74
+ * Infers HTTP method from tool name.
75
+ */
76
+ private inferMethod;
77
+ /**
78
+ * Detects sensitive headers in the request.
79
+ */
80
+ private detectSensitiveHeaders;
81
+ /**
82
+ * Extracts host from URL for display.
83
+ */
84
+ private extractHost;
85
+ /**
86
+ * Sanitizes URL for safe logging (removes credentials).
87
+ */
88
+ private sanitizeUrl;
89
+ }
90
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/analyzers/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA8BnF;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,eAAe;IAChD,QAAQ,CAAC,IAAI,UAAU;IAMvB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAyBjC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAuFnC;IAMF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CA+BlC;IAMF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAQhC;IAMF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAgB1B;IAMF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc;IA0FjE;;;OAGG;IACH,OAAO,CAAC,UAAU;IA6BlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,WAAW;CAYtB"}