@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,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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAuB,MAAM,UAAU,CAAC;AA4BjE,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,KAAgC,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,OAAe;IACvE,sEAAsE;IACtE,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACzI,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,6BAA6B;IAC7B,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3C,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEnC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,UAAyB,EAAE;IAE3B,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,YAAY,GAAG,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,sCAAsC;QACtC,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/E,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,8CAA8C;QAC9C,MAAM,UAAU,GAAG,UAAU;YAC3B,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI;YAClC,CAAC,CAAC,YAAY,CAAC;QAEjB,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAExC,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;QAE7D,kCAAkC;QAClC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;QAClH,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,CAAC,oBAAoB,QAAQ,CAAC,IAAI,SAAS,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;QAEzE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,IAAI,EAAE,YAAY;SACnB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,CAAC,gCAAgC,YAAY,KAAK,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAE1E,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK;YACL,IAAI,EAAE,YAAY;SACnB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAuB,EACvB,UAAyB,EAAE;IAE3B,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAmC,EACnC,UAAyB,EAAE;IAM3B,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,CAAC,WAAW,aAAa,CAAC,MAAM,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,uBAAuB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACtH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,kBAAkB,MAAM,CAAC,MAAM,cAAc,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;QACN,KAAK,EAAE,aAAa,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,gBAAgB,CAAC,yBAAyB,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC,UAAU,EAAE,CAAC;AACvC,CAAC"}