@stackguide/mcp-server 3.3.0 → 3.8.2

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 (137) hide show
  1. package/README.md +259 -10
  2. package/dist/config/persistence.d.ts +16 -0
  3. package/dist/config/persistence.d.ts.map +1 -1
  4. package/dist/config/persistence.js +53 -0
  5. package/dist/config/persistence.js.map +1 -1
  6. package/dist/handlers/config.d.ts +1 -8
  7. package/dist/handlers/config.d.ts.map +1 -1
  8. package/dist/handlers/config.js +7 -1
  9. package/dist/handlers/config.js.map +1 -1
  10. package/dist/handlers/context.d.ts +1 -5
  11. package/dist/handlers/context.d.ts.map +1 -1
  12. package/dist/handlers/context.js +7 -1
  13. package/dist/handlers/context.js.map +1 -1
  14. package/dist/handlers/cursor.d.ts +1 -7
  15. package/dist/handlers/cursor.d.ts.map +1 -1
  16. package/dist/handlers/cursor.js +7 -1
  17. package/dist/handlers/cursor.js.map +1 -1
  18. package/dist/handlers/custom-rule.d.ts +1 -11
  19. package/dist/handlers/custom-rule.d.ts.map +1 -1
  20. package/dist/handlers/custom-rule.js +7 -1
  21. package/dist/handlers/custom-rule.js.map +1 -1
  22. package/dist/handlers/docs.d.ts +1 -8
  23. package/dist/handlers/docs.d.ts.map +1 -1
  24. package/dist/handlers/docs.js +7 -1
  25. package/dist/handlers/docs.js.map +1 -1
  26. package/dist/handlers/generate.d.ts +1 -13
  27. package/dist/handlers/generate.d.ts.map +1 -1
  28. package/dist/handlers/generate.js +6 -3
  29. package/dist/handlers/generate.js.map +1 -1
  30. package/dist/handlers/health.d.ts +1 -8
  31. package/dist/handlers/health.d.ts.map +1 -1
  32. package/dist/handlers/health.js +11 -3
  33. package/dist/handlers/health.js.map +1 -1
  34. package/dist/handlers/help.d.ts +1 -5
  35. package/dist/handlers/help.d.ts.map +1 -1
  36. package/dist/handlers/help.js +7 -1
  37. package/dist/handlers/help.js.map +1 -1
  38. package/dist/handlers/knowledge.d.ts +1 -8
  39. package/dist/handlers/knowledge.d.ts.map +1 -1
  40. package/dist/handlers/knowledge.js +7 -1
  41. package/dist/handlers/knowledge.js.map +1 -1
  42. package/dist/handlers/prompts.d.ts +31 -0
  43. package/dist/handlers/prompts.d.ts.map +1 -0
  44. package/dist/handlers/prompts.js +236 -0
  45. package/dist/handlers/prompts.js.map +1 -0
  46. package/dist/handlers/resources.d.ts +27 -0
  47. package/dist/handlers/resources.d.ts.map +1 -0
  48. package/dist/handlers/resources.js +210 -0
  49. package/dist/handlers/resources.js.map +1 -0
  50. package/dist/handlers/review.d.ts.map +1 -1
  51. package/dist/handlers/review.js +45 -4
  52. package/dist/handlers/review.js.map +1 -1
  53. package/dist/handlers/rules.d.ts +1 -9
  54. package/dist/handlers/rules.d.ts.map +1 -1
  55. package/dist/handlers/rules.js +7 -1
  56. package/dist/handlers/rules.js.map +1 -1
  57. package/dist/index.d.ts +4 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +29 -419
  60. package/dist/index.js.map +1 -1
  61. package/dist/router/index.d.ts +69 -0
  62. package/dist/router/index.d.ts.map +1 -0
  63. package/dist/router/index.js +151 -0
  64. package/dist/router/index.js.map +1 -0
  65. package/dist/services/ast/analyzer.d.ts +55 -0
  66. package/dist/services/ast/analyzer.d.ts.map +1 -0
  67. package/dist/services/ast/analyzer.js +268 -0
  68. package/dist/services/ast/analyzer.js.map +1 -0
  69. package/dist/services/ast/index.d.ts +10 -0
  70. package/dist/services/ast/index.d.ts.map +1 -0
  71. package/dist/services/ast/index.js +12 -0
  72. package/dist/services/ast/index.js.map +1 -0
  73. package/dist/services/ast/rules.d.ts +13 -0
  74. package/dist/services/ast/rules.d.ts.map +1 -0
  75. package/dist/services/ast/rules.js +358 -0
  76. package/dist/services/ast/rules.js.map +1 -0
  77. package/dist/services/ast/treeSitterParser.d.ts +54 -0
  78. package/dist/services/ast/treeSitterParser.d.ts.map +1 -0
  79. package/dist/services/ast/treeSitterParser.js +394 -0
  80. package/dist/services/ast/treeSitterParser.js.map +1 -0
  81. package/dist/services/ast/types.d.ts +167 -0
  82. package/dist/services/ast/types.d.ts.map +1 -0
  83. package/dist/services/ast/types.js +35 -0
  84. package/dist/services/ast/types.js.map +1 -0
  85. package/dist/services/codeAnalyzer.d.ts.map +1 -1
  86. package/dist/services/codeAnalyzer.js +43 -3
  87. package/dist/services/codeAnalyzer.js.map +1 -1
  88. package/dist/services/httpClient.d.ts +45 -0
  89. package/dist/services/httpClient.d.ts.map +1 -0
  90. package/dist/services/httpClient.js +309 -0
  91. package/dist/services/httpClient.js.map +1 -0
  92. package/dist/services/intelligence/projectFs.d.ts +11 -0
  93. package/dist/services/intelligence/projectFs.d.ts.map +1 -0
  94. package/dist/services/intelligence/projectFs.js +30 -0
  95. package/dist/services/intelligence/projectFs.js.map +1 -0
  96. package/dist/services/projectFs.d.ts +85 -0
  97. package/dist/services/projectFs.d.ts.map +1 -0
  98. package/dist/services/projectFs.js +287 -0
  99. package/dist/services/projectFs.js.map +1 -0
  100. package/dist/services/rulesEngine.d.ts +255 -0
  101. package/dist/services/rulesEngine.d.ts.map +1 -0
  102. package/dist/services/rulesEngine.js +523 -0
  103. package/dist/services/rulesEngine.js.map +1 -0
  104. package/dist/services/webDocumentation.d.ts +11 -0
  105. package/dist/services/webDocumentation.d.ts.map +1 -1
  106. package/dist/services/webDocumentation.js +231 -27
  107. package/dist/services/webDocumentation.js.map +1 -1
  108. package/dist/storage/index.d.ts +7 -0
  109. package/dist/storage/index.d.ts.map +1 -0
  110. package/dist/storage/index.js +7 -0
  111. package/dist/storage/index.js.map +1 -0
  112. package/dist/storage/sqlite.d.ts +92 -0
  113. package/dist/storage/sqlite.d.ts.map +1 -0
  114. package/dist/storage/sqlite.js +471 -0
  115. package/dist/storage/sqlite.js.map +1 -0
  116. package/dist/storage/types.d.ts +147 -0
  117. package/dist/storage/types.d.ts.map +1 -0
  118. package/dist/storage/types.js +13 -0
  119. package/dist/storage/types.js.map +1 -0
  120. package/dist/utils/logger.d.ts +11 -2
  121. package/dist/utils/logger.d.ts.map +1 -1
  122. package/dist/utils/logger.js +30 -2
  123. package/dist/utils/logger.js.map +1 -1
  124. package/dist/utils/safeFetch.d.ts +12 -0
  125. package/dist/utils/safeFetch.d.ts.map +1 -0
  126. package/dist/utils/safeFetch.js +107 -0
  127. package/dist/utils/safeFetch.js.map +1 -0
  128. package/dist/utils/validation.d.ts +1 -1
  129. package/dist/validation/index.d.ts +8 -0
  130. package/dist/validation/index.d.ts.map +1 -0
  131. package/dist/validation/index.js +19 -0
  132. package/dist/validation/index.js.map +1 -0
  133. package/dist/validation/schemas.d.ts +346 -0
  134. package/dist/validation/schemas.d.ts.map +1 -0
  135. package/dist/validation/schemas.js +256 -0
  136. package/dist/validation/schemas.js.map +1 -0
  137. package/package.json +9 -2
@@ -0,0 +1,85 @@
1
+ /**
2
+ * ProjectFs - Injectable Filesystem Abstraction
3
+ * Enables real FS access in production, mocks in tests
4
+ * @version 3.4.0
5
+ */
6
+ export interface FileInfo {
7
+ name: string;
8
+ path: string;
9
+ isDirectory: boolean;
10
+ isFile: boolean;
11
+ size?: number;
12
+ modifiedAt?: Date;
13
+ }
14
+ export interface DirectoryScanOptions {
15
+ maxDepth?: number;
16
+ ignorePatterns?: string[];
17
+ includeHidden?: boolean;
18
+ }
19
+ export interface ProjectFs {
20
+ /** Check if path exists */
21
+ exists(filepath: string): Promise<boolean>;
22
+ /** Check if path is a directory */
23
+ isDirectory(filepath: string): Promise<boolean>;
24
+ /** Check if path is a file */
25
+ isFile(filepath: string): Promise<boolean>;
26
+ /** Read file contents */
27
+ readFile(filepath: string): Promise<string>;
28
+ /** Write file contents */
29
+ writeFile(filepath: string, content: string): Promise<void>;
30
+ /** Read directory entries */
31
+ readDir(dirpath: string): Promise<FileInfo[]>;
32
+ /** Recursively scan directory */
33
+ scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
34
+ /** Get file/directory info */
35
+ stat(filepath: string): Promise<FileInfo | null>;
36
+ /** Resolve path relative to base */
37
+ resolve(...paths: string[]): string;
38
+ /** Join paths */
39
+ join(...paths: string[]): string;
40
+ /** Get base directory */
41
+ getBasePath(): string;
42
+ }
43
+ export declare class RealProjectFs implements ProjectFs {
44
+ private basePath;
45
+ constructor(basePath?: string);
46
+ exists(filepath: string): Promise<boolean>;
47
+ isDirectory(filepath: string): Promise<boolean>;
48
+ isFile(filepath: string): Promise<boolean>;
49
+ readFile(filepath: string): Promise<string>;
50
+ writeFile(filepath: string, content: string): Promise<void>;
51
+ readDir(dirpath: string): Promise<FileInfo[]>;
52
+ scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
53
+ stat(filepath: string): Promise<FileInfo | null>;
54
+ resolve(...paths: string[]): string;
55
+ join(...paths: string[]): string;
56
+ getBasePath(): string;
57
+ }
58
+ export interface MockFileEntry {
59
+ content?: string;
60
+ isDirectory?: boolean;
61
+ }
62
+ export declare class MockProjectFs implements ProjectFs {
63
+ private basePath;
64
+ private files;
65
+ constructor(basePath?: string, initialFiles?: Record<string, MockFileEntry>);
66
+ addFile(filepath: string, content: string): void;
67
+ addDirectory(dirpath: string): void;
68
+ exists(filepath: string): Promise<boolean>;
69
+ isDirectory(filepath: string): Promise<boolean>;
70
+ isFile(filepath: string): Promise<boolean>;
71
+ readFile(filepath: string): Promise<string>;
72
+ writeFile(filepath: string, content: string): Promise<void>;
73
+ readDir(dirpath: string): Promise<FileInfo[]>;
74
+ scanDir(dirpath: string, options?: DirectoryScanOptions): Promise<FileInfo[]>;
75
+ stat(filepath: string): Promise<FileInfo | null>;
76
+ resolve(...paths: string[]): string;
77
+ join(...paths: string[]): string;
78
+ getBasePath(): string;
79
+ private hasChildrenAt;
80
+ }
81
+ export declare function createProjectFs(basePath?: string): ProjectFs;
82
+ export declare function getProjectFs(): ProjectFs;
83
+ export declare function setProjectFs(fs: ProjectFs): void;
84
+ export declare function resetProjectFs(): void;
85
+ //# sourceMappingURL=projectFs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectFs.d.ts","sourceRoot":"","sources":["../../src/services/projectFs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,mCAAmC;IACnC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,8BAA8B;IAC9B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D,6BAA6B;IAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9C,iCAAiC;IACjC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9E,8BAA8B;IAC9B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEjD,oCAAoC;IACpC,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEpC,iBAAiB;IACjB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEjC,yBAAyB;IACzB,WAAW,IAAI,MAAM,CAAC;CACvB;AA0BD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAsB;IAItC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU/C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAY7C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqCjF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAkBtD,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAWnC,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAIhC,WAAW,IAAI,MAAM;CAGtB;AAMD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAA6B;gBAE9B,QAAQ,GAAE,MAAwB,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAK5F,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0B7C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAyBjF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAetD,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAWnC,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAIhC,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,aAAa;CAQtB;AAQD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAE5D;AAED,wBAAgB,YAAY,IAAI,SAAS,CAKxC;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAEhD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * ProjectFs - Injectable Filesystem Abstraction
3
+ * Enables real FS access in production, mocks in tests
4
+ * @version 3.4.0
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ // ============================================================================
9
+ // Real Filesystem Implementation
10
+ // ============================================================================
11
+ const DEFAULT_IGNORE_PATTERNS = [
12
+ 'node_modules',
13
+ '.git',
14
+ '.svn',
15
+ '.hg',
16
+ '__pycache__',
17
+ '.pytest_cache',
18
+ '.mypy_cache',
19
+ 'target',
20
+ 'dist',
21
+ 'build',
22
+ '.next',
23
+ '.nuxt',
24
+ 'coverage',
25
+ '.nyc_output',
26
+ 'vendor',
27
+ '.idea',
28
+ '.vscode'
29
+ ];
30
+ export class RealProjectFs {
31
+ basePath;
32
+ constructor(basePath = process.cwd()) {
33
+ this.basePath = path.resolve(basePath);
34
+ }
35
+ async exists(filepath) {
36
+ try {
37
+ const fullPath = this.resolve(filepath);
38
+ await fs.promises.access(fullPath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ async isDirectory(filepath) {
46
+ try {
47
+ const fullPath = this.resolve(filepath);
48
+ const stats = await fs.promises.stat(fullPath);
49
+ return stats.isDirectory();
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ async isFile(filepath) {
56
+ try {
57
+ const fullPath = this.resolve(filepath);
58
+ const stats = await fs.promises.stat(fullPath);
59
+ return stats.isFile();
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ async readFile(filepath) {
66
+ const fullPath = this.resolve(filepath);
67
+ return fs.promises.readFile(fullPath, 'utf-8');
68
+ }
69
+ async writeFile(filepath, content) {
70
+ const fullPath = this.resolve(filepath);
71
+ const dir = path.dirname(fullPath);
72
+ // Ensure directory exists
73
+ await fs.promises.mkdir(dir, { recursive: true });
74
+ await fs.promises.writeFile(fullPath, content, 'utf-8');
75
+ }
76
+ async readDir(dirpath) {
77
+ const fullPath = this.resolve(dirpath);
78
+ const entries = await fs.promises.readdir(fullPath, { withFileTypes: true });
79
+ return entries.map(entry => ({
80
+ name: entry.name,
81
+ path: path.join(dirpath, entry.name),
82
+ isDirectory: entry.isDirectory(),
83
+ isFile: entry.isFile()
84
+ }));
85
+ }
86
+ async scanDir(dirpath, options = {}) {
87
+ const { maxDepth = 5, ignorePatterns = DEFAULT_IGNORE_PATTERNS, includeHidden = false } = options;
88
+ const results = [];
89
+ const scan = async (currentPath, depth) => {
90
+ if (depth > maxDepth)
91
+ return;
92
+ try {
93
+ const entries = await this.readDir(currentPath);
94
+ for (const entry of entries) {
95
+ // Skip hidden files unless requested
96
+ if (!includeHidden && entry.name.startsWith('.'))
97
+ continue;
98
+ // Skip ignored patterns
99
+ if (ignorePatterns.some(pattern => entry.name === pattern))
100
+ continue;
101
+ results.push(entry);
102
+ if (entry.isDirectory) {
103
+ await scan(entry.path, depth + 1);
104
+ }
105
+ }
106
+ }
107
+ catch (error) {
108
+ // Directory may not exist or be inaccessible
109
+ }
110
+ };
111
+ await scan(dirpath, 0);
112
+ return results;
113
+ }
114
+ async stat(filepath) {
115
+ try {
116
+ const fullPath = this.resolve(filepath);
117
+ const stats = await fs.promises.stat(fullPath);
118
+ return {
119
+ name: path.basename(filepath),
120
+ path: filepath,
121
+ isDirectory: stats.isDirectory(),
122
+ isFile: stats.isFile(),
123
+ size: stats.size,
124
+ modifiedAt: stats.mtime
125
+ };
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ resolve(...paths) {
132
+ if (paths.length === 0)
133
+ return this.basePath;
134
+ const firstPath = paths[0];
135
+ if (path.isAbsolute(firstPath)) {
136
+ return path.resolve(...paths);
137
+ }
138
+ return path.resolve(this.basePath, ...paths);
139
+ }
140
+ join(...paths) {
141
+ return path.join(...paths);
142
+ }
143
+ getBasePath() {
144
+ return this.basePath;
145
+ }
146
+ }
147
+ export class MockProjectFs {
148
+ basePath;
149
+ files;
150
+ constructor(basePath = '/mock/project', initialFiles) {
151
+ this.basePath = basePath;
152
+ this.files = new Map(Object.entries(initialFiles || {}));
153
+ }
154
+ addFile(filepath, content) {
155
+ this.files.set(filepath, { content, isDirectory: false });
156
+ }
157
+ addDirectory(dirpath) {
158
+ this.files.set(dirpath, { isDirectory: true });
159
+ }
160
+ async exists(filepath) {
161
+ const resolved = this.resolve(filepath);
162
+ return this.files.has(resolved) || this.hasChildrenAt(resolved);
163
+ }
164
+ async isDirectory(filepath) {
165
+ const resolved = this.resolve(filepath);
166
+ const entry = this.files.get(resolved);
167
+ if (entry?.isDirectory)
168
+ return true;
169
+ return this.hasChildrenAt(resolved);
170
+ }
171
+ async isFile(filepath) {
172
+ const resolved = this.resolve(filepath);
173
+ const entry = this.files.get(resolved);
174
+ return entry?.content !== undefined;
175
+ }
176
+ async readFile(filepath) {
177
+ const resolved = this.resolve(filepath);
178
+ const entry = this.files.get(resolved);
179
+ if (!entry?.content) {
180
+ throw new Error(`ENOENT: no such file: ${resolved}`);
181
+ }
182
+ return entry.content;
183
+ }
184
+ async writeFile(filepath, content) {
185
+ const resolved = this.resolve(filepath);
186
+ this.files.set(resolved, { content, isDirectory: false });
187
+ }
188
+ async readDir(dirpath) {
189
+ const resolved = this.resolve(dirpath);
190
+ const results = [];
191
+ const seen = new Set();
192
+ for (const [filePath, entry] of this.files) {
193
+ if (filePath.startsWith(resolved + '/')) {
194
+ const relativePath = filePath.slice(resolved.length + 1);
195
+ const parts = relativePath.split('/');
196
+ const name = parts[0];
197
+ if (!seen.has(name)) {
198
+ seen.add(name);
199
+ results.push({
200
+ name,
201
+ path: path.join(dirpath, name),
202
+ isDirectory: parts.length > 1 || entry.isDirectory === true,
203
+ isFile: parts.length === 1 && entry.content !== undefined
204
+ });
205
+ }
206
+ }
207
+ }
208
+ return results;
209
+ }
210
+ async scanDir(dirpath, options = {}) {
211
+ const { maxDepth = 5, ignorePatterns = [], includeHidden = false } = options;
212
+ const results = [];
213
+ const scan = async (currentPath, depth) => {
214
+ if (depth > maxDepth)
215
+ return;
216
+ const entries = await this.readDir(currentPath);
217
+ for (const entry of entries) {
218
+ if (!includeHidden && entry.name.startsWith('.'))
219
+ continue;
220
+ if (ignorePatterns.some(p => entry.name === p))
221
+ continue;
222
+ results.push(entry);
223
+ if (entry.isDirectory) {
224
+ await scan(entry.path, depth + 1);
225
+ }
226
+ }
227
+ };
228
+ await scan(dirpath, 0);
229
+ return results;
230
+ }
231
+ async stat(filepath) {
232
+ const resolved = this.resolve(filepath);
233
+ const entry = this.files.get(resolved);
234
+ if (!entry && !this.hasChildrenAt(resolved))
235
+ return null;
236
+ return {
237
+ name: path.basename(filepath),
238
+ path: filepath,
239
+ isDirectory: entry?.isDirectory === true || this.hasChildrenAt(resolved),
240
+ isFile: entry?.content !== undefined,
241
+ size: entry?.content?.length || 0
242
+ };
243
+ }
244
+ resolve(...paths) {
245
+ if (paths.length === 0)
246
+ return this.basePath;
247
+ const firstPath = paths[0];
248
+ if (path.isAbsolute(firstPath)) {
249
+ return path.resolve(...paths);
250
+ }
251
+ return path.resolve(this.basePath, ...paths);
252
+ }
253
+ join(...paths) {
254
+ return path.join(...paths);
255
+ }
256
+ getBasePath() {
257
+ return this.basePath;
258
+ }
259
+ hasChildrenAt(dirpath) {
260
+ for (const filePath of this.files.keys()) {
261
+ if (filePath.startsWith(dirpath + '/')) {
262
+ return true;
263
+ }
264
+ }
265
+ return false;
266
+ }
267
+ }
268
+ // ============================================================================
269
+ // Factory & Default Instance
270
+ // ============================================================================
271
+ let defaultFs = null;
272
+ export function createProjectFs(basePath) {
273
+ return new RealProjectFs(basePath);
274
+ }
275
+ export function getProjectFs() {
276
+ if (!defaultFs) {
277
+ defaultFs = createProjectFs();
278
+ }
279
+ return defaultFs;
280
+ }
281
+ export function setProjectFs(fs) {
282
+ defaultFs = fs;
283
+ }
284
+ export function resetProjectFs() {
285
+ defaultFs = null;
286
+ }
287
+ //# sourceMappingURL=projectFs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectFs.js","sourceRoot":"","sources":["../../src/services/projectFs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Configurable Rules Engine
3
+ * Dynamic rule loading, validation, and configuration
4
+ * @version 3.7.0
5
+ */
6
+ import { z } from 'zod';
7
+ /** Rule severity levels */
8
+ export declare const RuleSeveritySchema: z.ZodEnum<["error", "warning", "info", "suggestion"]>;
9
+ export type RuleSeverity = z.infer<typeof RuleSeveritySchema>;
10
+ /** Rule categories */
11
+ export declare const RuleCategorySchema: z.ZodEnum<["security", "performance", "best-practices", "maintainability", "architecture", "accessibility", "code-style"]>;
12
+ export type RuleCategory = z.infer<typeof RuleCategorySchema>;
13
+ /** Full rule definition schema */
14
+ export declare const RuleDefinitionSchema: z.ZodObject<{
15
+ id: z.ZodString;
16
+ name: z.ZodString;
17
+ description: z.ZodString;
18
+ category: z.ZodEnum<["security", "performance", "best-practices", "maintainability", "architecture", "accessibility", "code-style"]>;
19
+ severity: z.ZodEnum<["error", "warning", "info", "suggestion"]>;
20
+ enabled: z.ZodDefault<z.ZodBoolean>;
21
+ languages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
22
+ filePatterns: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
23
+ pattern: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
24
+ astQuery: z.ZodOptional<z.ZodString>;
25
+ message: z.ZodString;
26
+ suggestion: z.ZodOptional<z.ZodString>;
27
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
28
+ source: z.ZodDefault<z.ZodEnum<["builtin", "custom", "plugin"]>>;
29
+ version: z.ZodOptional<z.ZodString>;
30
+ autoFix: z.ZodOptional<z.ZodObject<{
31
+ replacement: z.ZodString;
32
+ description: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ description: string;
35
+ replacement: string;
36
+ }, {
37
+ description: string;
38
+ replacement: string;
39
+ }>>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ id: string;
42
+ name: string;
43
+ category: "best-practices" | "security" | "performance" | "architecture" | "accessibility" | "maintainability" | "code-style";
44
+ description: string;
45
+ enabled: boolean;
46
+ message: string;
47
+ source: "custom" | "builtin" | "plugin";
48
+ severity: "error" | "warning" | "info" | "suggestion";
49
+ suggestion?: string | undefined;
50
+ pattern?: string | undefined;
51
+ version?: string | undefined;
52
+ languages?: string[] | undefined;
53
+ tags?: string[] | undefined;
54
+ autoFix?: {
55
+ description: string;
56
+ replacement: string;
57
+ } | undefined;
58
+ filePatterns?: string[] | undefined;
59
+ astQuery?: string | undefined;
60
+ }, {
61
+ id: string;
62
+ name: string;
63
+ category: "best-practices" | "security" | "performance" | "architecture" | "accessibility" | "maintainability" | "code-style";
64
+ description: string;
65
+ message: string;
66
+ severity: "error" | "warning" | "info" | "suggestion";
67
+ suggestion?: string | undefined;
68
+ pattern?: string | undefined;
69
+ enabled?: boolean | undefined;
70
+ version?: string | undefined;
71
+ languages?: string[] | undefined;
72
+ source?: "custom" | "builtin" | "plugin" | undefined;
73
+ tags?: string[] | undefined;
74
+ autoFix?: {
75
+ description: string;
76
+ replacement: string;
77
+ } | undefined;
78
+ filePatterns?: string[] | undefined;
79
+ astQuery?: string | undefined;
80
+ }>;
81
+ export type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;
82
+ /** Rule override (partial update) */
83
+ export declare const RuleOverrideSchema: z.ZodObject<{
84
+ enabled: z.ZodOptional<z.ZodBoolean>;
85
+ severity: z.ZodOptional<z.ZodEnum<["error", "warning", "info", "suggestion"]>>;
86
+ message: z.ZodOptional<z.ZodString>;
87
+ }, "strict", z.ZodTypeAny, {
88
+ enabled?: boolean | undefined;
89
+ message?: string | undefined;
90
+ severity?: "error" | "warning" | "info" | "suggestion" | undefined;
91
+ }, {
92
+ enabled?: boolean | undefined;
93
+ message?: string | undefined;
94
+ severity?: "error" | "warning" | "info" | "suggestion" | undefined;
95
+ }>;
96
+ export type RuleOverride = z.infer<typeof RuleOverrideSchema>;
97
+ export interface RuleConfig {
98
+ version: string;
99
+ rules: RuleDefinition[];
100
+ overrides: Record<string, RuleOverride>;
101
+ disabledCategories: RuleCategory[];
102
+ disabledRules: string[];
103
+ settings: RuleEngineSettings;
104
+ }
105
+ export interface RuleEngineSettings {
106
+ maxIssuesPerFile: number;
107
+ maxIssuesTotal: number;
108
+ failOnError: boolean;
109
+ failOnWarning: boolean;
110
+ autoFix: boolean;
111
+ verboseOutput: boolean;
112
+ }
113
+ declare class RulesRegistry {
114
+ private builtinRules;
115
+ private customRules;
116
+ private overrides;
117
+ private disabledCategories;
118
+ private disabledRules;
119
+ private settings;
120
+ constructor();
121
+ /**
122
+ * Register a builtin rule
123
+ */
124
+ registerBuiltin(rule: RuleDefinition): this;
125
+ /**
126
+ * Register multiple builtin rules
127
+ */
128
+ registerBuiltinRules(rules: RuleDefinition[]): this;
129
+ /**
130
+ * Add a custom rule
131
+ */
132
+ addCustomRule(rule: RuleDefinition): {
133
+ success: boolean;
134
+ error?: string;
135
+ };
136
+ /**
137
+ * Remove a custom rule
138
+ */
139
+ removeCustomRule(ruleId: string): boolean;
140
+ /**
141
+ * Override a rule's properties
142
+ */
143
+ setOverride(ruleId: string, override: RuleOverride): {
144
+ success: boolean;
145
+ error?: string;
146
+ };
147
+ /**
148
+ * Remove a rule override
149
+ */
150
+ removeOverride(ruleId: string): boolean;
151
+ /**
152
+ * Enable/disable a specific rule
153
+ */
154
+ setRuleEnabled(ruleId: string, enabled: boolean): boolean;
155
+ /**
156
+ * Enable/disable a category
157
+ */
158
+ setCategoryEnabled(category: RuleCategory, enabled: boolean): boolean;
159
+ /**
160
+ * Update settings
161
+ */
162
+ updateSettings(settings: Partial<RuleEngineSettings>): void;
163
+ /**
164
+ * Get a rule by ID (with overrides applied)
165
+ */
166
+ getRule(ruleId: string): RuleDefinition | null;
167
+ /**
168
+ * Get all rules (with filters)
169
+ */
170
+ getRules(options?: {
171
+ category?: RuleCategory;
172
+ severity?: RuleSeverity;
173
+ language?: string;
174
+ enabledOnly?: boolean;
175
+ source?: 'builtin' | 'custom' | 'all';
176
+ }): RuleDefinition[];
177
+ /**
178
+ * Get rules for a specific file
179
+ */
180
+ getRulesForFile(filePath: string, language?: string): RuleDefinition[];
181
+ /**
182
+ * Get settings
183
+ */
184
+ getSettings(): RuleEngineSettings;
185
+ /**
186
+ * Get statistics
187
+ */
188
+ getStats(): {
189
+ totalBuiltin: number;
190
+ totalCustom: number;
191
+ enabled: number;
192
+ disabled: number;
193
+ overridden: number;
194
+ byCategory: Record<string, number>;
195
+ bySeverity: Record<string, number>;
196
+ };
197
+ private saveToStorage;
198
+ private loadFromStorage;
199
+ /**
200
+ * Reset to defaults
201
+ */
202
+ reset(): void;
203
+ /**
204
+ * Full reset including builtin rules (for testing)
205
+ */
206
+ resetAll(): void;
207
+ /**
208
+ * Export configuration
209
+ */
210
+ exportConfig(): RuleConfig;
211
+ /**
212
+ * Import configuration
213
+ */
214
+ importConfig(config: RuleConfig): {
215
+ success: boolean;
216
+ imported: number;
217
+ errors: string[];
218
+ };
219
+ }
220
+ export declare const rulesRegistry: RulesRegistry;
221
+ export declare function registerBuiltinRule(rule: RuleDefinition): void;
222
+ export declare function registerBuiltinRules(rules: RuleDefinition[]): void;
223
+ export declare function addCustomRule(rule: RuleDefinition): {
224
+ success: boolean;
225
+ error?: string;
226
+ };
227
+ export declare function removeCustomRule(ruleId: string): boolean;
228
+ export declare function getRule(ruleId: string): RuleDefinition | null;
229
+ export declare function getRules(options?: Parameters<RulesRegistry['getRules']>[0]): RuleDefinition[];
230
+ export declare function getRulesForFile(filePath: string, language?: string): RuleDefinition[];
231
+ export declare function setRuleEnabled(ruleId: string, enabled: boolean): boolean;
232
+ export declare function setRuleOverride(ruleId: string, override: RuleOverride): {
233
+ success: boolean;
234
+ error?: string;
235
+ };
236
+ export declare function getRuleSettings(): RuleEngineSettings;
237
+ export declare function updateRuleSettings(settings: Partial<RuleEngineSettings>): void;
238
+ export declare function getRuleStats(): {
239
+ totalBuiltin: number;
240
+ totalCustom: number;
241
+ enabled: number;
242
+ disabled: number;
243
+ overridden: number;
244
+ byCategory: Record<string, number>;
245
+ bySeverity: Record<string, number>;
246
+ };
247
+ export declare function resetRulesEngine(): void;
248
+ export declare function exportRulesConfig(): RuleConfig;
249
+ export declare function importRulesConfig(config: RuleConfig): {
250
+ success: boolean;
251
+ imported: number;
252
+ errors: string[];
253
+ };
254
+ export {};
255
+ //# sourceMappingURL=rulesEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesEngine.d.ts","sourceRoot":"","sources":["../../src/services/rulesEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6CxB,2BAA2B;AAC3B,eAAO,MAAM,kBAAkB,uDAAqD,CAAC;AACrF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,sBAAsB;AACtB,eAAO,MAAM,kBAAkB,4HAQ7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,kCAAkC;AAClC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmC/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,qCAAqC;AACrC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAIpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAM9D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,kBAAkB,EAAE,YAAY,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB;AAeD,cAAM,aAAa;IACjB,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAA+C;;IAQ/D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAM3C;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAOnD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAqBzE;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAWzC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAmBzF;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQvC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAUzD;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAUrE;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAO3D;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAgB9C;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE;QAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;QACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;KAClC,GAAG,cAAc,EAAE;IAyCzB;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IA0BtE;;OAEG;IACH,WAAW,IAAI,kBAAkB;IAIjC;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC;IAyBD,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,eAAe;IA4CvB;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,YAAY,IAAI,UAAU;IAW1B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CA2C3F;AAMD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAMjD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAElE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAExF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAE7D;AAED,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,EAAE,CAE7F;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAErF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAExE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAE5G;AAED,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAE9E;AAED,wBAAgB,YAAY;kBAtOV,MAAM;iBACP,MAAM;aACV,MAAM;cACL,MAAM;gBACJ,MAAM;gBACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;gBACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;EAkOrC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU;aA/GL,OAAO;cAAY,MAAM;YAAU,MAAM,EAAE;EAiHzF"}