@vfarcic/dot-ai 1.11.0 → 1.13.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 (49) hide show
  1. package/dist/core/ai-provider-factory.d.ts.map +1 -1
  2. package/dist/core/ai-provider-factory.js +1 -0
  3. package/dist/core/internal-tools.d.ts +34 -1
  4. package/dist/core/internal-tools.d.ts.map +1 -1
  5. package/dist/core/internal-tools.js +116 -1
  6. package/dist/core/mcp-client-manager.d.ts +88 -0
  7. package/dist/core/mcp-client-manager.d.ts.map +1 -0
  8. package/dist/core/mcp-client-manager.js +362 -0
  9. package/dist/core/mcp-client-registry.d.ts +36 -0
  10. package/dist/core/mcp-client-registry.d.ts.map +1 -0
  11. package/dist/core/mcp-client-registry.js +52 -0
  12. package/dist/core/mcp-client-types.d.ts +84 -0
  13. package/dist/core/mcp-client-types.d.ts.map +1 -0
  14. package/dist/core/mcp-client-types.js +24 -0
  15. package/dist/core/model-config.d.ts +1 -0
  16. package/dist/core/model-config.d.ts.map +1 -1
  17. package/dist/core/model-config.js +1 -0
  18. package/dist/core/providers/vercel-provider.d.ts.map +1 -1
  19. package/dist/core/providers/vercel-provider.js +5 -0
  20. package/dist/interfaces/mcp.d.ts.map +1 -1
  21. package/dist/interfaces/mcp.js +13 -0
  22. package/dist/mcp/server.js +26 -1
  23. package/dist/tools/generate-manifests.d.ts.map +1 -1
  24. package/dist/tools/generate-manifests.js +2 -1
  25. package/dist/tools/impact-analysis.d.ts +51 -0
  26. package/dist/tools/impact-analysis.d.ts.map +1 -0
  27. package/dist/tools/impact-analysis.js +204 -0
  28. package/dist/tools/index.d.ts +1 -0
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +6 -1
  31. package/dist/tools/operate-analysis.d.ts +1 -1
  32. package/dist/tools/operate-analysis.d.ts.map +1 -1
  33. package/dist/tools/operate-analysis.js +17 -6
  34. package/dist/tools/operate.d.ts +1 -1
  35. package/dist/tools/operate.d.ts.map +1 -1
  36. package/dist/tools/operate.js +1 -1
  37. package/dist/tools/organizational-data.d.ts +1 -1
  38. package/dist/tools/query.d.ts +1 -1
  39. package/dist/tools/query.d.ts.map +1 -1
  40. package/dist/tools/query.js +18 -8
  41. package/dist/tools/remediate.d.ts +8 -0
  42. package/dist/tools/remediate.d.ts.map +1 -1
  43. package/dist/tools/remediate.js +176 -41
  44. package/dist/tools/version.d.ts +12 -0
  45. package/dist/tools/version.d.ts.map +1 -1
  46. package/dist/tools/version.js +16 -1
  47. package/package.json +3 -1
  48. package/prompts/impact-analysis-system.md +32 -0
  49. package/prompts/remediate-system.md +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AA6BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IA2BnD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IAoFlC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWrD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAMxC;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
1
+ {"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AA8BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IA2BnD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IAoFlC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWrD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAMxC;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
@@ -28,6 +28,7 @@ const PROVIDER_ENV_KEYS = {
28
28
  google: 'GOOGLE_GENERATIVE_AI_API_KEY', // Standard Vercel AI SDK env var (also checks GOOGLE_API_KEY as fallback)
29
29
  google_flash: 'GOOGLE_GENERATIVE_AI_API_KEY', // PRD #294: Uses same API key as regular Google
30
30
  kimi: 'MOONSHOT_API_KEY', // PRD #353: Moonshot AI Kimi K2.5
31
+ alibaba: 'ALIBABA_API_KEY', // PRD #382: Alibaba Qwen 3.5 Plus
31
32
  xai: 'XAI_API_KEY',
32
33
  };
33
34
  const IMPLEMENTED_PROVIDERS = Object.keys(model_config_1.CURRENT_MODELS);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Internal Agentic-Loop Tools (PRD #407)
2
+ * Internal Agentic-Loop Tools (PRD #407, PRD #408)
3
3
  *
4
4
  * Tools that run locally in the MCP server, available to the AI
5
5
  * during investigation loops alongside plugin tools. NOT exposed
@@ -9,6 +9,7 @@
9
9
  * - git_clone: Clone a Git repo
10
10
  * - fs_list: List files at a path
11
11
  * - fs_read: Read a file at a path
12
+ * - git_create_pr: Create a PR with file changes (PRD #408)
12
13
  *
13
14
  * All filesystem operations are scoped to ./tmp/gitops-clones/
14
15
  * to prevent path traversal attacks.
@@ -20,7 +21,39 @@ import type { AITool, ToolExecutor } from './ai-provider.interface.js';
20
21
  * Exported for testing.
21
22
  */
22
23
  export declare function validatePathWithinClones(inputPath: string): string;
24
+ /**
25
+ * Returns internal tools available to the AI during investigation.
26
+ * Note: git_create_pr is executor-only and not exposed to investigation.
27
+ */
23
28
  export declare function getInternalTools(): AITool[];
29
+ export interface GitCreatePrInput {
30
+ repoPath: string;
31
+ files: Array<{
32
+ path: string;
33
+ content: string;
34
+ }>;
35
+ title: string;
36
+ body?: string;
37
+ branchName: string;
38
+ baseBranch?: string;
39
+ }
40
+ export type GitCreatePrResult = {
41
+ success: true;
42
+ prUrl: string;
43
+ prNumber: number;
44
+ branch: string;
45
+ baseBranch: string;
46
+ filesChanged: string[];
47
+ } | {
48
+ success: true;
49
+ branch: string;
50
+ baseBranch: string;
51
+ filesChanged: string[];
52
+ error: string;
53
+ } | {
54
+ success: false;
55
+ error: string;
56
+ };
24
57
  /**
25
58
  * Create a ToolExecutor that handles internal agentic-loop tools.
26
59
  * Designed to be passed as the fallbackExecutor to pluginManager.createToolExecutor().
@@ -1 +1 @@
1
- {"version":3,"file":"internal-tools.d.ts","sourceRoot":"","sources":["../../src/core/internal-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAcvE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUlE;AAkBD,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAgD3C;AAmHD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAoB1E;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAuB,GAAG,IAAI,CAoBxE"}
1
+ {"version":3,"file":"internal-tools.d.ts","sourceRoot":"","sources":["../../src/core/internal-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAsBvE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUlE;AAkBD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAkD3C;AAiHD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9G;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5F;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAgItC;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAqB1E;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAuB,GAAG,IAAI,CAoBxE"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * Internal Agentic-Loop Tools (PRD #407)
3
+ * Internal Agentic-Loop Tools (PRD #407, PRD #408)
4
4
  *
5
5
  * Tools that run locally in the MCP server, available to the AI
6
6
  * during investigation loops alongside plugin tools. NOT exposed
@@ -10,6 +10,7 @@
10
10
  * - git_clone: Clone a Git repo
11
11
  * - fs_list: List files at a path
12
12
  * - fs_read: Read a file at a path
13
+ * - git_create_pr: Create a PR with file changes (PRD #408)
13
14
  *
14
15
  * All filesystem operations are scoped to ./tmp/gitops-clones/
15
16
  * to prevent path traversal attacks.
@@ -47,6 +48,9 @@ var __importStar = (this && this.__importStar) || (function () {
47
48
  return result;
48
49
  };
49
50
  })();
51
+ var __importDefault = (this && this.__importDefault) || function (mod) {
52
+ return (mod && mod.__esModule) ? mod : { "default": mod };
53
+ };
50
54
  Object.defineProperty(exports, "__esModule", { value: true });
51
55
  exports.validatePathWithinClones = validatePathWithinClones;
52
56
  exports.getInternalTools = getInternalTools;
@@ -56,6 +60,7 @@ const fs = __importStar(require("fs"));
56
60
  const path = __importStar(require("path"));
57
61
  const git_utils_js_1 = require("./git-utils.js");
58
62
  const solution_utils_js_1 = require("./solution-utils.js");
63
+ const simple_git_1 = __importDefault(require("simple-git"));
59
64
  const CLONES_SUBDIR = 'gitops-clones';
60
65
  const MAX_FILE_SIZE = 100 * 1024; // 100KB
61
66
  const DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour
@@ -94,6 +99,10 @@ function repoUrlToDirectoryName(repoUrl) {
94
99
  }
95
100
  }
96
101
  // ─── Tool definitions ───
102
+ /**
103
+ * Returns internal tools available to the AI during investigation.
104
+ * Note: git_create_pr is executor-only and not exposed to investigation.
105
+ */
97
106
  function getInternalTools() {
98
107
  return [
99
108
  {
@@ -138,6 +147,8 @@ function getInternalTools() {
138
147
  required: ['path'],
139
148
  },
140
149
  },
150
+ // git_create_pr is executor-only - not exposed during investigation
151
+ // It's only available via createInternalToolExecutor() during execution
141
152
  ];
142
153
  }
143
154
  // ─── Handlers ───
@@ -235,6 +246,109 @@ function handleFsRead(args) {
235
246
  }
236
247
  return fs.readFileSync(resolved, 'utf-8');
237
248
  }
249
+ async function handleGitCreatePr(args) {
250
+ const repoPath = args.repoPath;
251
+ const files = args.files;
252
+ const title = args.title;
253
+ const body = args.body || '';
254
+ const branchName = args.branchName;
255
+ const baseBranch = args.baseBranch || 'main';
256
+ if (!repoPath) {
257
+ return { success: false, error: 'repoPath is required' };
258
+ }
259
+ if (!files || !Array.isArray(files) || files.length === 0) {
260
+ return { success: false, error: 'files array is required and must not be empty' };
261
+ }
262
+ if (!title) {
263
+ return { success: false, error: 'title is required' };
264
+ }
265
+ if (!branchName) {
266
+ return { success: false, error: 'branchName is required' };
267
+ }
268
+ let resolvedRepoPath;
269
+ try {
270
+ resolvedRepoPath = validatePathWithinClones(repoPath);
271
+ }
272
+ catch (err) {
273
+ return {
274
+ success: false,
275
+ error: `Invalid repo path: ${err instanceof Error ? err.message : String(err)}`,
276
+ };
277
+ }
278
+ if (!fs.existsSync(resolvedRepoPath)) {
279
+ return {
280
+ success: false,
281
+ error: `Repository not found at path: ${repoPath}. It may have been cleaned up.`,
282
+ };
283
+ }
284
+ const stat = fs.statSync(resolvedRepoPath);
285
+ if (!stat.isDirectory()) {
286
+ return { success: false, error: `Path is not a directory: ${repoPath}` };
287
+ }
288
+ try {
289
+ const git = (0, simple_git_1.default)(resolvedRepoPath);
290
+ await git.checkout(baseBranch);
291
+ const pushResult = await (0, git_utils_js_1.pushRepo)(resolvedRepoPath, files, title, {
292
+ branch: branchName,
293
+ });
294
+ const authConfig = (0, git_utils_js_1.getGitAuthConfigFromEnv)();
295
+ const token = await (0, git_utils_js_1.getAuthToken)(authConfig);
296
+ const remotes = await git.getRemotes(true);
297
+ const origin = remotes.find(r => r.name === 'origin');
298
+ if (!origin?.refs?.fetch) {
299
+ return { success: false, error: 'Could not find origin remote URL' };
300
+ }
301
+ const remoteUrl = (0, git_utils_js_1.scrubCredentials)(origin.refs.fetch);
302
+ const repoMatch = remoteUrl.match(/github\.com[/:]([^/]+\/[^/]+?)(?:\.git)?$/);
303
+ if (!repoMatch) {
304
+ return {
305
+ success: true,
306
+ branch: branchName,
307
+ baseBranch,
308
+ filesChanged: pushResult.filesAdded,
309
+ error: 'Automatic PR creation is only supported for GitHub repositories. Changes were pushed to the branch — create a PR/MR manually.',
310
+ };
311
+ }
312
+ const ownerRepo = repoMatch[1];
313
+ const [owner, repo] = ownerRepo.split('/');
314
+ const prResponse = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls`, {
315
+ method: 'POST',
316
+ headers: {
317
+ Authorization: `Bearer ${token}`,
318
+ 'Content-Type': 'application/json',
319
+ Accept: 'application/vnd.github+json',
320
+ 'User-Agent': 'dot-ai-remediate',
321
+ },
322
+ body: JSON.stringify({
323
+ title,
324
+ body,
325
+ head: branchName,
326
+ base: baseBranch,
327
+ }),
328
+ signal: AbortSignal.timeout(30000),
329
+ });
330
+ if (!prResponse.ok) {
331
+ const errorBody = await prResponse.text();
332
+ return {
333
+ success: false,
334
+ error: `GitHub API error (${prResponse.status}): ${errorBody}`,
335
+ };
336
+ }
337
+ const prData = (await prResponse.json());
338
+ return {
339
+ success: true,
340
+ prUrl: prData.html_url,
341
+ prNumber: prData.number,
342
+ branch: branchName,
343
+ baseBranch,
344
+ filesChanged: pushResult.filesAdded,
345
+ };
346
+ }
347
+ catch (err) {
348
+ const message = err instanceof Error ? err.message : String(err);
349
+ return { success: false, error: (0, git_utils_js_1.scrubCredentials)(message) };
350
+ }
351
+ }
238
352
  // ─── Combined executor ───
239
353
  /**
240
354
  * Create a ToolExecutor that handles internal agentic-loop tools.
@@ -245,6 +359,7 @@ function createInternalToolExecutor(sessionId) {
245
359
  git_clone: (args) => handleGitClone(args, sessionId),
246
360
  fs_list: handleFsList,
247
361
  fs_read: handleFsRead,
362
+ git_create_pr: handleGitCreatePr,
248
363
  };
249
364
  return async (toolName, input) => {
250
365
  const handler = handlers[toolName];
@@ -0,0 +1,88 @@
1
+ /**
2
+ * MCP Client Manager for dot-ai MCP Server Integration
3
+ *
4
+ * Connects to external MCP servers running in the cluster, discovers their tools,
5
+ * and makes them available to dot-ai operations (remediate, operate, query) via
6
+ * the attachTo routing mechanism.
7
+ *
8
+ * PRD #358: MCP Server Integration
9
+ */
10
+ import { McpServerConfig, DiscoveredMcpServer, McpServerStats, McpAttachableOperation } from './mcp-client-types';
11
+ import { Logger } from './error-handling';
12
+ import { AITool, ToolExecutor } from './ai-provider.interface';
13
+ /**
14
+ * Manages MCP server connections, tool discovery, and tool routing.
15
+ *
16
+ * Follows the same structural patterns as PluginManager but uses
17
+ * the MCP SDK (Client + StreamableHTTPClientTransport) instead of HTTP REST.
18
+ */
19
+ export declare class McpClientManager {
20
+ private readonly logger;
21
+ /** MCP SDK Client instances keyed by server name */
22
+ private readonly clients;
23
+ /** Transport instances keyed by server name (needed for cleanup) */
24
+ private readonly transports;
25
+ /** Discovered server metadata keyed by server name */
26
+ private readonly discoveredServers;
27
+ /** Maps namespaced tool name → server name for routing */
28
+ private readonly toolToServer;
29
+ constructor(logger: Logger);
30
+ /**
31
+ * Parse MCP server configuration from file.
32
+ *
33
+ * Reads from /etc/dot-ai-mcp/mcp-servers.json (mounted from ConfigMap in K8s).
34
+ * Returns empty array if file doesn't exist (MCP servers only work in-cluster).
35
+ * Throws on invalid JSON or malformed configuration.
36
+ */
37
+ static parseMcpServerConfig(): McpServerConfig[];
38
+ /**
39
+ * Discover all configured MCP servers.
40
+ *
41
+ * Connects to each server, performs MCP handshake, and discovers available tools.
42
+ * All servers must connect successfully — any failure throws McpDiscoveryError.
43
+ */
44
+ discoverMcpServers(configs: McpServerConfig[]): Promise<void>;
45
+ /**
46
+ * Connect to a single MCP server and discover its tools.
47
+ */
48
+ private connectAndDiscover;
49
+ /**
50
+ * Get tools available for a specific dot-ai operation, filtered by attachTo.
51
+ *
52
+ * Returns tools as AITool[] with namespaced names ({serverName}__{toolName}).
53
+ */
54
+ getToolsForOperation(operation: McpAttachableOperation): AITool[];
55
+ /**
56
+ * Get all discovered tools across all servers.
57
+ */
58
+ getAllDiscoveredTools(): AITool[];
59
+ /**
60
+ * Check if a tool name belongs to an MCP server (is namespaced).
61
+ */
62
+ isMcpTool(toolName: string): boolean;
63
+ /**
64
+ * Create a ToolExecutor that routes MCP tools to their servers.
65
+ *
66
+ * Returns a function compatible with toolLoop's toolExecutor parameter.
67
+ * MCP tools (namespaced) are routed to their MCP servers; non-MCP tools
68
+ * are routed to the optional fallback executor.
69
+ */
70
+ createToolExecutor(fallbackExecutor?: ToolExecutor): ToolExecutor;
71
+ /**
72
+ * Get statistics about MCP server connections.
73
+ */
74
+ getStats(): McpServerStats;
75
+ /**
76
+ * Get discovered server metadata.
77
+ */
78
+ getDiscoveredServers(): DiscoveredMcpServer[];
79
+ /**
80
+ * Close all MCP server connections.
81
+ */
82
+ close(): Promise<void>;
83
+ /**
84
+ * Convert an MCP tool definition to AITool format with namespaced name.
85
+ */
86
+ private convertToAITool;
87
+ }
88
+ //# sourceMappingURL=mcp-client-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client-manager.d.ts","sourceRoot":"","sources":["../../src/core/mcp-client-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EACL,eAAe,EAEf,mBAAmB,EACnB,cAAc,EAEd,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAW/D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyD;IAEpF,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+C;IAEjF,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;gBAEnD,MAAM,EAAE,MAAM;IAI1B;;;;;;OAMG;IACH,MAAM,CAAC,oBAAoB,IAAI,eAAe,EAAE;IA+DhD;;;;;OAKG;IACG,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCnE;;OAEG;YACW,kBAAkB;IAmGhC;;;;OAIG;IACH,oBAAoB,CAAC,SAAS,EAAE,sBAAsB,GAAG,MAAM,EAAE;IAoBjE;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAejC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;;;OAMG;IACH,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,YAAY,GAAG,YAAY;IA6DjE;;OAEG;IACH,QAAQ,IAAI,cAAc;IAQ1B;;OAEG;IACH,oBAAoB,IAAI,mBAAmB,EAAE;IAI7C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB"}