@darkiceinteractive/mcp-conductor 1.0.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 (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +558 -0
  3. package/dist/bin/cli.d.ts +8 -0
  4. package/dist/bin/cli.d.ts.map +1 -0
  5. package/dist/bin/cli.js +940 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/bridge/http-server.d.ts +161 -0
  8. package/dist/bridge/http-server.d.ts.map +1 -0
  9. package/dist/bridge/http-server.js +367 -0
  10. package/dist/bridge/http-server.js.map +1 -0
  11. package/dist/bridge/index.d.ts +5 -0
  12. package/dist/bridge/index.d.ts.map +1 -0
  13. package/dist/bridge/index.js +5 -0
  14. package/dist/bridge/index.js.map +1 -0
  15. package/dist/config/defaults.d.ts +29 -0
  16. package/dist/config/defaults.d.ts.map +1 -0
  17. package/dist/config/defaults.js +60 -0
  18. package/dist/config/defaults.js.map +1 -0
  19. package/dist/config/index.d.ts +7 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +7 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/config/loader.d.ts +49 -0
  24. package/dist/config/loader.d.ts.map +1 -0
  25. package/dist/config/loader.js +272 -0
  26. package/dist/config/loader.js.map +1 -0
  27. package/dist/config/schema.d.ts +93 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +5 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/hub/index.d.ts +5 -0
  32. package/dist/hub/index.d.ts.map +1 -0
  33. package/dist/hub/index.js +5 -0
  34. package/dist/hub/index.js.map +1 -0
  35. package/dist/hub/mcp-hub.d.ts +176 -0
  36. package/dist/hub/mcp-hub.d.ts.map +1 -0
  37. package/dist/hub/mcp-hub.js +550 -0
  38. package/dist/hub/mcp-hub.js.map +1 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +45 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/metrics/index.d.ts +5 -0
  44. package/dist/metrics/index.d.ts.map +1 -0
  45. package/dist/metrics/index.js +5 -0
  46. package/dist/metrics/index.js.map +1 -0
  47. package/dist/metrics/metrics-collector.d.ts +211 -0
  48. package/dist/metrics/metrics-collector.d.ts.map +1 -0
  49. package/dist/metrics/metrics-collector.js +437 -0
  50. package/dist/metrics/metrics-collector.js.map +1 -0
  51. package/dist/modes/index.d.ts +5 -0
  52. package/dist/modes/index.d.ts.map +1 -0
  53. package/dist/modes/index.js +5 -0
  54. package/dist/modes/index.js.map +1 -0
  55. package/dist/modes/mode-handler.d.ts +132 -0
  56. package/dist/modes/mode-handler.d.ts.map +1 -0
  57. package/dist/modes/mode-handler.js +252 -0
  58. package/dist/modes/mode-handler.js.map +1 -0
  59. package/dist/runtime/executor.d.ts +57 -0
  60. package/dist/runtime/executor.d.ts.map +1 -0
  61. package/dist/runtime/executor.js +700 -0
  62. package/dist/runtime/executor.js.map +1 -0
  63. package/dist/runtime/index.d.ts +5 -0
  64. package/dist/runtime/index.d.ts.map +1 -0
  65. package/dist/runtime/index.js +5 -0
  66. package/dist/runtime/index.js.map +1 -0
  67. package/dist/server/index.d.ts +5 -0
  68. package/dist/server/index.d.ts.map +1 -0
  69. package/dist/server/index.js +5 -0
  70. package/dist/server/index.js.map +1 -0
  71. package/dist/server/mcp-server.d.ts +62 -0
  72. package/dist/server/mcp-server.d.ts.map +1 -0
  73. package/dist/server/mcp-server.js +1272 -0
  74. package/dist/server/mcp-server.js.map +1 -0
  75. package/dist/skills/index.d.ts +5 -0
  76. package/dist/skills/index.d.ts.map +1 -0
  77. package/dist/skills/index.js +5 -0
  78. package/dist/skills/index.js.map +1 -0
  79. package/dist/skills/skills-engine.d.ts +157 -0
  80. package/dist/skills/skills-engine.d.ts.map +1 -0
  81. package/dist/skills/skills-engine.js +405 -0
  82. package/dist/skills/skills-engine.js.map +1 -0
  83. package/dist/streaming/execution-stream.d.ts +158 -0
  84. package/dist/streaming/execution-stream.d.ts.map +1 -0
  85. package/dist/streaming/execution-stream.js +320 -0
  86. package/dist/streaming/execution-stream.js.map +1 -0
  87. package/dist/streaming/index.d.ts +5 -0
  88. package/dist/streaming/index.d.ts.map +1 -0
  89. package/dist/streaming/index.js +5 -0
  90. package/dist/streaming/index.js.map +1 -0
  91. package/dist/utils/errors.d.ts +36 -0
  92. package/dist/utils/errors.d.ts.map +1 -0
  93. package/dist/utils/errors.js +68 -0
  94. package/dist/utils/errors.js.map +1 -0
  95. package/dist/utils/helpers.d.ts +44 -0
  96. package/dist/utils/helpers.d.ts.map +1 -0
  97. package/dist/utils/helpers.js +95 -0
  98. package/dist/utils/helpers.js.map +1 -0
  99. package/dist/utils/index.d.ts +9 -0
  100. package/dist/utils/index.d.ts.map +1 -0
  101. package/dist/utils/index.js +9 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/dist/utils/logger.d.ts +13 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +48 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/permissions.d.ts +97 -0
  108. package/dist/utils/permissions.d.ts.map +1 -0
  109. package/dist/utils/permissions.js +165 -0
  110. package/dist/utils/permissions.js.map +1 -0
  111. package/dist/utils/rate-limiter.d.ts +87 -0
  112. package/dist/utils/rate-limiter.d.ts.map +1 -0
  113. package/dist/utils/rate-limiter.js +187 -0
  114. package/dist/utils/rate-limiter.js.map +1 -0
  115. package/dist/watcher/config-watcher.d.ts +67 -0
  116. package/dist/watcher/config-watcher.d.ts.map +1 -0
  117. package/dist/watcher/config-watcher.js +150 -0
  118. package/dist/watcher/config-watcher.js.map +1 -0
  119. package/dist/watcher/index.d.ts +5 -0
  120. package/dist/watcher/index.d.ts.map +1 -0
  121. package/dist/watcher/index.js +5 -0
  122. package/dist/watcher/index.js.map +1 -0
  123. package/package.json +86 -0
  124. package/templates/CLAUDE.md +137 -0
  125. package/templates/skill-mcp-conductor.md +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Modes module exports
3
+ */
4
+ export { ModeHandler, getModeHandler, shutdownModeHandler, } from './mode-handler.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,GAKpB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Mode Handler
3
+ *
4
+ * Manages operation modes for the MCP Executor:
5
+ * - execution: All requests go through code execution (maximum token savings)
6
+ * - passthrough: Direct tool exposure from connected MCP servers
7
+ * - hybrid: Automatic selection based on task complexity
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import type { ExecutionMode } from '../config/index.js';
11
+ export interface ModeMetrics {
12
+ executionCalls: number;
13
+ passthroughCalls: number;
14
+ hybridAutoExecutions: number;
15
+ hybridAutoPassthroughs: number;
16
+ tokensSavedEstimate: number;
17
+ }
18
+ export interface PassthroughToolCall {
19
+ server: string;
20
+ tool: string;
21
+ params: Record<string, unknown>;
22
+ timestamp: Date;
23
+ durationMs?: number;
24
+ success: boolean;
25
+ error?: string;
26
+ }
27
+ export interface HybridDecision {
28
+ task: string;
29
+ decision: 'execution' | 'passthrough';
30
+ reason: string;
31
+ confidence: number;
32
+ }
33
+ export interface ModeHandlerConfig {
34
+ /** Default operation mode */
35
+ defaultMode: ExecutionMode;
36
+ /** Hybrid mode threshold - tool calls above this use execution mode */
37
+ hybridToolCallThreshold: number;
38
+ /** Hybrid mode threshold - data above this KB uses execution mode */
39
+ hybridDataThreshold: number;
40
+ }
41
+ /**
42
+ * Handles operation mode logic and tracking
43
+ */
44
+ export declare class ModeHandler extends EventEmitter {
45
+ private currentMode;
46
+ private config;
47
+ private metrics;
48
+ private recentPassthroughCalls;
49
+ private maxRecentCalls;
50
+ constructor(config?: Partial<ModeHandlerConfig>);
51
+ /**
52
+ * Get current operation mode
53
+ */
54
+ getMode(): ExecutionMode;
55
+ /**
56
+ * Set operation mode
57
+ */
58
+ setMode(mode: ExecutionMode): ExecutionMode;
59
+ /**
60
+ * Check if passthrough mode is active
61
+ */
62
+ isPassthroughMode(): boolean;
63
+ /**
64
+ * Check if execution mode is active
65
+ */
66
+ isExecutionMode(): boolean;
67
+ /**
68
+ * Check if hybrid mode is active
69
+ */
70
+ isHybridMode(): boolean;
71
+ /**
72
+ * Decide which mode to use for a task (hybrid mode logic)
73
+ */
74
+ decideMode(task: {
75
+ description?: string;
76
+ estimatedToolCalls?: number;
77
+ estimatedDataKb?: number;
78
+ toolNames?: string[];
79
+ }): HybridDecision;
80
+ /**
81
+ * Check if description contains data processing keywords
82
+ */
83
+ private containsProcessingKeywords;
84
+ /**
85
+ * Record an execution mode call
86
+ */
87
+ recordExecutionCall(tokensSaved?: number): void;
88
+ /**
89
+ * Record a passthrough mode call
90
+ */
91
+ recordPassthroughCall(call: Omit<PassthroughToolCall, 'timestamp'>): void;
92
+ /**
93
+ * Get mode metrics
94
+ */
95
+ getMetrics(): ModeMetrics;
96
+ /**
97
+ * Reset metrics
98
+ */
99
+ resetMetrics(): void;
100
+ /**
101
+ * Get recent passthrough calls
102
+ */
103
+ getRecentPassthroughCalls(): PassthroughToolCall[];
104
+ /**
105
+ * Generate tool prefix for passthrough mode
106
+ */
107
+ generatePassthroughToolName(serverName: string, toolName: string): string;
108
+ /**
109
+ * Parse a passthrough tool name back to server and tool
110
+ */
111
+ parsePassthroughToolName(combinedName: string): {
112
+ server: string;
113
+ tool: string;
114
+ } | null;
115
+ /**
116
+ * Get effective mode for a request (handles hybrid auto-selection)
117
+ */
118
+ getEffectiveMode(task?: {
119
+ description?: string;
120
+ estimatedToolCalls?: number;
121
+ estimatedDataKb?: number;
122
+ }): 'execution' | 'passthrough';
123
+ }
124
+ /**
125
+ * Get or create the global mode handler
126
+ */
127
+ export declare function getModeHandler(config?: Partial<ModeHandlerConfig>): ModeHandler;
128
+ /**
129
+ * Shutdown the global mode handler
130
+ */
131
+ export declare function shutdownModeHandler(): void;
132
+ //# sourceMappingURL=mode-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-handler.d.ts","sourceRoot":"","sources":["../../src/modes/mode-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Mode Handler
3
+ *
4
+ * Manages operation modes for the MCP Executor:
5
+ * - execution: All requests go through code execution (maximum token savings)
6
+ * - passthrough: Direct tool exposure from connected MCP servers
7
+ * - hybrid: Automatic selection based on task complexity
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import { logger } from '../utils/index.js';
11
+ /**
12
+ * Handles operation mode logic and tracking
13
+ */
14
+ export class ModeHandler extends EventEmitter {
15
+ currentMode;
16
+ config;
17
+ metrics;
18
+ recentPassthroughCalls = [];
19
+ maxRecentCalls = 100;
20
+ constructor(config = {}) {
21
+ super();
22
+ this.config = {
23
+ defaultMode: 'execution',
24
+ hybridToolCallThreshold: 3,
25
+ hybridDataThreshold: 5,
26
+ ...config,
27
+ };
28
+ this.currentMode = this.config.defaultMode;
29
+ this.metrics = {
30
+ executionCalls: 0,
31
+ passthroughCalls: 0,
32
+ hybridAutoExecutions: 0,
33
+ hybridAutoPassthroughs: 0,
34
+ tokensSavedEstimate: 0,
35
+ };
36
+ }
37
+ /**
38
+ * Get current operation mode
39
+ */
40
+ getMode() {
41
+ return this.currentMode;
42
+ }
43
+ /**
44
+ * Set operation mode
45
+ */
46
+ setMode(mode) {
47
+ const previousMode = this.currentMode;
48
+ this.currentMode = mode;
49
+ if (previousMode !== mode) {
50
+ logger.info('Operation mode changed', { from: previousMode, to: mode });
51
+ this.emit('modeChanged', { previousMode, currentMode: mode });
52
+ }
53
+ return previousMode;
54
+ }
55
+ /**
56
+ * Check if passthrough mode is active
57
+ */
58
+ isPassthroughMode() {
59
+ return this.currentMode === 'passthrough';
60
+ }
61
+ /**
62
+ * Check if execution mode is active
63
+ */
64
+ isExecutionMode() {
65
+ return this.currentMode === 'execution';
66
+ }
67
+ /**
68
+ * Check if hybrid mode is active
69
+ */
70
+ isHybridMode() {
71
+ return this.currentMode === 'hybrid';
72
+ }
73
+ /**
74
+ * Decide which mode to use for a task (hybrid mode logic)
75
+ */
76
+ decideMode(task) {
77
+ const { estimatedToolCalls = 1, estimatedDataKb = 0, description = '' } = task;
78
+ // Simple heuristics for hybrid mode
79
+ let decision = 'passthrough';
80
+ let reason = '';
81
+ let confidence = 0.5;
82
+ // Check tool call count
83
+ if (estimatedToolCalls > this.config.hybridToolCallThreshold) {
84
+ decision = 'execution';
85
+ reason = `Multiple tool calls expected (${estimatedToolCalls})`;
86
+ confidence = 0.8;
87
+ }
88
+ // Check data volume
89
+ else if (estimatedDataKb > this.config.hybridDataThreshold) {
90
+ decision = 'execution';
91
+ reason = `Large data volume expected (${estimatedDataKb}KB)`;
92
+ confidence = 0.75;
93
+ }
94
+ // Check for data processing keywords
95
+ else if (this.containsProcessingKeywords(description)) {
96
+ decision = 'execution';
97
+ reason = 'Task involves data processing';
98
+ confidence = 0.7;
99
+ }
100
+ // Default to passthrough for simple tasks
101
+ else {
102
+ decision = 'passthrough';
103
+ reason = 'Simple task suitable for direct tool calls';
104
+ confidence = 0.6;
105
+ }
106
+ // Update metrics
107
+ if (decision === 'execution') {
108
+ this.metrics.hybridAutoExecutions++;
109
+ }
110
+ else {
111
+ this.metrics.hybridAutoPassthroughs++;
112
+ }
113
+ const result = {
114
+ task: description || 'Unknown task',
115
+ decision,
116
+ reason,
117
+ confidence,
118
+ };
119
+ this.emit('hybridDecision', result);
120
+ return result;
121
+ }
122
+ /**
123
+ * Check if description contains data processing keywords
124
+ */
125
+ containsProcessingKeywords(description) {
126
+ const keywords = [
127
+ 'filter',
128
+ 'aggregate',
129
+ 'summarise',
130
+ 'summarize',
131
+ 'analyse',
132
+ 'analyze',
133
+ 'process',
134
+ 'transform',
135
+ 'combine',
136
+ 'merge',
137
+ 'calculate',
138
+ 'compute',
139
+ 'iterate',
140
+ 'loop',
141
+ 'multiple',
142
+ 'batch',
143
+ 'bulk',
144
+ ];
145
+ const lower = description.toLowerCase();
146
+ return keywords.some((k) => lower.includes(k));
147
+ }
148
+ /**
149
+ * Record an execution mode call
150
+ */
151
+ recordExecutionCall(tokensSaved = 0) {
152
+ this.metrics.executionCalls++;
153
+ this.metrics.tokensSavedEstimate += tokensSaved;
154
+ }
155
+ /**
156
+ * Record a passthrough mode call
157
+ */
158
+ recordPassthroughCall(call) {
159
+ this.metrics.passthroughCalls++;
160
+ const record = {
161
+ ...call,
162
+ timestamp: new Date(),
163
+ };
164
+ this.recentPassthroughCalls.push(record);
165
+ // Trim old calls
166
+ if (this.recentPassthroughCalls.length > this.maxRecentCalls) {
167
+ this.recentPassthroughCalls.shift();
168
+ }
169
+ this.emit('passthroughCall', record);
170
+ }
171
+ /**
172
+ * Get mode metrics
173
+ */
174
+ getMetrics() {
175
+ return { ...this.metrics };
176
+ }
177
+ /**
178
+ * Reset metrics
179
+ */
180
+ resetMetrics() {
181
+ this.metrics = {
182
+ executionCalls: 0,
183
+ passthroughCalls: 0,
184
+ hybridAutoExecutions: 0,
185
+ hybridAutoPassthroughs: 0,
186
+ tokensSavedEstimate: 0,
187
+ };
188
+ this.recentPassthroughCalls = [];
189
+ }
190
+ /**
191
+ * Get recent passthrough calls
192
+ */
193
+ getRecentPassthroughCalls() {
194
+ return [...this.recentPassthroughCalls];
195
+ }
196
+ /**
197
+ * Generate tool prefix for passthrough mode
198
+ */
199
+ generatePassthroughToolName(serverName, toolName) {
200
+ return `${serverName}__${toolName}`;
201
+ }
202
+ /**
203
+ * Parse a passthrough tool name back to server and tool
204
+ */
205
+ parsePassthroughToolName(combinedName) {
206
+ const parts = combinedName.split('__');
207
+ if (parts.length !== 2)
208
+ return null;
209
+ const server = parts[0];
210
+ const tool = parts[1];
211
+ if (!server || !tool)
212
+ return null;
213
+ return { server, tool };
214
+ }
215
+ /**
216
+ * Get effective mode for a request (handles hybrid auto-selection)
217
+ */
218
+ getEffectiveMode(task) {
219
+ if (this.currentMode === 'execution')
220
+ return 'execution';
221
+ if (this.currentMode === 'passthrough')
222
+ return 'passthrough';
223
+ // Hybrid mode - decide automatically
224
+ if (task) {
225
+ const decision = this.decideMode(task);
226
+ return decision.decision;
227
+ }
228
+ // Default to execution for hybrid without task info
229
+ return 'execution';
230
+ }
231
+ }
232
+ // Global mode handler instance
233
+ let globalModeHandler = null;
234
+ /**
235
+ * Get or create the global mode handler
236
+ */
237
+ export function getModeHandler(config) {
238
+ if (!globalModeHandler) {
239
+ globalModeHandler = new ModeHandler(config);
240
+ }
241
+ return globalModeHandler;
242
+ }
243
+ /**
244
+ * Shutdown the global mode handler
245
+ */
246
+ export function shutdownModeHandler() {
247
+ if (globalModeHandler) {
248
+ globalModeHandler.removeAllListeners();
249
+ globalModeHandler = null;
250
+ }
251
+ }
252
+ //# sourceMappingURL=mode-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-handler.js","sourceRoot":"","sources":["../../src/modes/mode-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Deno Sandbox Executor
3
+ *
4
+ * Executes user code in an isolated Deno subprocess with access to the MCP API.
5
+ */
6
+ import type { SandboxConfig } from '../config/index.js';
7
+ export interface ExecutionResult {
8
+ /** Unique execution ID for tracking and streaming */
9
+ executionId: string;
10
+ success: boolean;
11
+ result?: unknown;
12
+ error?: {
13
+ type: 'syntax' | 'runtime' | 'timeout' | 'security';
14
+ message: string;
15
+ stack?: string;
16
+ line?: number;
17
+ };
18
+ logs: string[];
19
+ metrics: {
20
+ executionTimeMs: number;
21
+ toolCalls: number;
22
+ dataProcessedBytes: number;
23
+ resultSizeBytes: number;
24
+ };
25
+ }
26
+ export interface ExecutionOptions {
27
+ timeoutMs: number;
28
+ bridgeUrl: string;
29
+ servers: string[];
30
+ /** Enable streaming mode for real-time progress updates */
31
+ stream?: boolean;
32
+ }
33
+ /**
34
+ * Deno Sandbox Executor
35
+ */
36
+ export declare class DenoExecutor {
37
+ private config;
38
+ private tempDir;
39
+ constructor(config: SandboxConfig);
40
+ /**
41
+ * Check if Deno is available
42
+ */
43
+ checkDeno(): Promise<boolean>;
44
+ /**
45
+ * Execute code in the Deno sandbox
46
+ */
47
+ execute(code: string, options: ExecutionOptions): Promise<ExecutionResult>;
48
+ /**
49
+ * Get an execution ID without executing (for pre-creating streams)
50
+ */
51
+ generateExecutionId(): string;
52
+ /**
53
+ * Run Deno subprocess
54
+ */
55
+ private runDeno;
56
+ }
57
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/runtime/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;QACpD,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA+aD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,aAAa;IAUjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA6DhF;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,OAAO,CAAC,OAAO;CAkMhB"}