couchloop-eq-mcp 1.0.3 → 1.0.5

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 (285) hide show
  1. package/README.md +24 -11
  2. package/dist/clients/shrinkChatClient.js +1 -1
  3. package/dist/clients/shrinkChatClient.js.map +1 -1
  4. package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
  5. package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
  6. package/dist/developer/analyzers/bloat-detector.js +483 -0
  7. package/dist/developer/analyzers/bloat-detector.js.map +1 -0
  8. package/dist/developer/backup/auto-backup.d.ts +96 -0
  9. package/dist/developer/backup/auto-backup.d.ts.map +1 -0
  10. package/dist/developer/backup/auto-backup.js +346 -0
  11. package/dist/developer/backup/auto-backup.js.map +1 -0
  12. package/dist/developer/blockers/package-blocker.d.ts +33 -0
  13. package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
  14. package/dist/developer/blockers/package-blocker.js +224 -0
  15. package/dist/developer/blockers/package-blocker.js.map +1 -0
  16. package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
  17. package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
  18. package/dist/developer/evaluators/ai-error-preventer.js +270 -0
  19. package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
  20. package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
  21. package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
  22. package/dist/developer/evaluators/build-context-detector.js +258 -0
  23. package/dist/developer/evaluators/build-context-detector.js.map +1 -0
  24. package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
  25. package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
  26. package/dist/developer/evaluators/package-evaluator.js +278 -0
  27. package/dist/developer/evaluators/package-evaluator.js.map +1 -0
  28. package/dist/developer/guards/file-guardian.d.ts +79 -0
  29. package/dist/developer/guards/file-guardian.d.ts.map +1 -0
  30. package/dist/developer/guards/file-guardian.js +309 -0
  31. package/dist/developer/guards/file-guardian.js.map +1 -0
  32. package/dist/developer/managers/context-manager.d.ts +61 -0
  33. package/dist/developer/managers/context-manager.d.ts.map +1 -0
  34. package/dist/developer/managers/context-manager.js +302 -0
  35. package/dist/developer/managers/context-manager.js.map +1 -0
  36. package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
  37. package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
  38. package/dist/developer/metrics/complexity-calculator.js +259 -0
  39. package/dist/developer/metrics/complexity-calculator.js.map +1 -0
  40. package/dist/developer/reports/review-summary.d.ts +49 -0
  41. package/dist/developer/reports/review-summary.d.ts.map +1 -0
  42. package/dist/developer/reports/review-summary.js +249 -0
  43. package/dist/developer/reports/review-summary.js.map +1 -0
  44. package/dist/developer/scanners/review-assistant.d.ts +41 -0
  45. package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
  46. package/dist/developer/scanners/review-assistant.js +374 -0
  47. package/dist/developer/scanners/review-assistant.js.map +1 -0
  48. package/dist/developer/scanners/secret-scanner.d.ts +66 -0
  49. package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
  50. package/dist/developer/scanners/secret-scanner.js +287 -0
  51. package/dist/developer/scanners/secret-scanner.js.map +1 -0
  52. package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
  53. package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
  54. package/dist/developer/scanners/sql-injection-detector.js +174 -0
  55. package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
  56. package/dist/developer/scanners/xss-detector.d.ts +60 -0
  57. package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
  58. package/dist/developer/scanners/xss-detector.js +229 -0
  59. package/dist/developer/scanners/xss-detector.js.map +1 -0
  60. package/dist/developer/types/ai-errors.d.ts +34 -0
  61. package/dist/developer/types/ai-errors.d.ts.map +1 -0
  62. package/dist/developer/types/ai-errors.js +271 -0
  63. package/dist/developer/types/ai-errors.js.map +1 -0
  64. package/dist/developer/types/package.d.ts +32 -0
  65. package/dist/developer/types/package.d.ts.map +1 -0
  66. package/dist/developer/types/package.js +5 -0
  67. package/dist/developer/types/package.js.map +1 -0
  68. package/dist/developer/updaters/dependency-updater.d.ts +102 -0
  69. package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
  70. package/dist/developer/updaters/dependency-updater.js +472 -0
  71. package/dist/developer/updaters/dependency-updater.js.map +1 -0
  72. package/dist/developer/validators/cargo.d.ts +14 -0
  73. package/dist/developer/validators/cargo.d.ts.map +1 -0
  74. package/dist/developer/validators/cargo.js +132 -0
  75. package/dist/developer/validators/cargo.js.map +1 -0
  76. package/dist/developer/validators/gem.d.ts +14 -0
  77. package/dist/developer/validators/gem.d.ts.map +1 -0
  78. package/dist/developer/validators/gem.js +85 -0
  79. package/dist/developer/validators/gem.js.map +1 -0
  80. package/dist/developer/validators/go.d.ts +14 -0
  81. package/dist/developer/validators/go.d.ts.map +1 -0
  82. package/dist/developer/validators/go.js +138 -0
  83. package/dist/developer/validators/go.js.map +1 -0
  84. package/dist/developer/validators/maven.d.ts +14 -0
  85. package/dist/developer/validators/maven.d.ts.map +1 -0
  86. package/dist/developer/validators/maven.js +99 -0
  87. package/dist/developer/validators/maven.js.map +1 -0
  88. package/dist/developer/validators/npm.d.ts +14 -0
  89. package/dist/developer/validators/npm.d.ts.map +1 -0
  90. package/dist/developer/validators/npm.js +96 -0
  91. package/dist/developer/validators/npm.js.map +1 -0
  92. package/dist/developer/validators/nuget.d.ts +15 -0
  93. package/dist/developer/validators/nuget.d.ts.map +1 -0
  94. package/dist/developer/validators/nuget.js +107 -0
  95. package/dist/developer/validators/nuget.js.map +1 -0
  96. package/dist/developer/validators/pypi.d.ts +14 -0
  97. package/dist/developer/validators/pypi.d.ts.map +1 -0
  98. package/dist/developer/validators/pypi.js +118 -0
  99. package/dist/developer/validators/pypi.js.map +1 -0
  100. package/dist/developer/validators/registry-manager.d.ts +37 -0
  101. package/dist/developer/validators/registry-manager.d.ts.map +1 -0
  102. package/dist/developer/validators/registry-manager.js +89 -0
  103. package/dist/developer/validators/registry-manager.js.map +1 -0
  104. package/dist/developer/validators/version-checker.d.ts +145 -0
  105. package/dist/developer/validators/version-checker.d.ts.map +1 -0
  106. package/dist/developer/validators/version-checker.js +529 -0
  107. package/dist/developer/validators/version-checker.js.map +1 -0
  108. package/dist/server/index.js.map +1 -1
  109. package/dist/server/middleware/auth.d.ts +7 -9
  110. package/dist/server/middleware/auth.d.ts.map +1 -1
  111. package/dist/server/middleware/auth.js.map +1 -1
  112. package/dist/tools/check-versions.d.ts +100 -0
  113. package/dist/tools/check-versions.d.ts.map +1 -0
  114. package/dist/tools/check-versions.js +328 -0
  115. package/dist/tools/check-versions.js.map +1 -0
  116. package/dist/tools/detect-code-smell.d.ts +9 -0
  117. package/dist/tools/detect-code-smell.d.ts.map +1 -0
  118. package/dist/tools/detect-code-smell.js +231 -0
  119. package/dist/tools/detect-code-smell.js.map +1 -0
  120. package/dist/tools/index.d.ts +471 -0
  121. package/dist/tools/index.d.ts.map +1 -1
  122. package/dist/tools/index.js +178 -0
  123. package/dist/tools/index.js.map +1 -1
  124. package/dist/tools/journey.js +1 -1
  125. package/dist/tools/journey.js.map +1 -1
  126. package/dist/tools/pre-review-code.d.ts +71 -0
  127. package/dist/tools/pre-review-code.d.ts.map +1 -0
  128. package/dist/tools/pre-review-code.js +159 -0
  129. package/dist/tools/pre-review-code.js.map +1 -0
  130. package/dist/tools/preserve-context.d.ts +27 -0
  131. package/dist/tools/preserve-context.d.ts.map +1 -0
  132. package/dist/tools/preserve-context.js +98 -0
  133. package/dist/tools/preserve-context.js.map +1 -0
  134. package/dist/tools/protect-files.d.ts +224 -0
  135. package/dist/tools/protect-files.d.ts.map +1 -0
  136. package/dist/tools/protect-files.js +286 -0
  137. package/dist/tools/protect-files.js.map +1 -0
  138. package/dist/tools/scan-security.d.ts +38 -0
  139. package/dist/tools/scan-security.d.ts.map +1 -0
  140. package/dist/tools/scan-security.js +237 -0
  141. package/dist/tools/scan-security.js.map +1 -0
  142. package/dist/tools/validate_packages.d.ts +8 -0
  143. package/dist/tools/validate_packages.d.ts.map +1 -0
  144. package/dist/tools/validate_packages.js +159 -0
  145. package/dist/tools/validate_packages.js.map +1 -0
  146. package/dist/types/auth.d.ts +18 -18
  147. package/dist/types/auth.d.ts.map +1 -1
  148. package/dist/types/auth.js +91 -36
  149. package/dist/types/auth.js.map +1 -1
  150. package/dist/types/context.d.ts +46 -0
  151. package/dist/types/context.d.ts.map +1 -0
  152. package/dist/types/context.js +17 -0
  153. package/dist/types/context.js.map +1 -0
  154. package/dist/types/file-protection.d.ts +50 -0
  155. package/dist/types/file-protection.d.ts.map +1 -0
  156. package/dist/types/file-protection.js +9 -0
  157. package/dist/types/file-protection.js.map +1 -0
  158. package/dist/utils/errorHandler.d.ts.map +1 -1
  159. package/dist/utils/errorHandler.js +2 -1
  160. package/dist/utils/errorHandler.js.map +1 -1
  161. package/package.json +23 -2
  162. package/dist/db/migrate.d.ts +0 -4
  163. package/dist/db/migrate.d.ts.map +0 -1
  164. package/dist/db/migrate.js +0 -34
  165. package/dist/db/migrate.js.map +0 -1
  166. package/dist/db/migrations/schema.d.ts +0 -1074
  167. package/dist/db/migrations/schema.d.ts.map +0 -1
  168. package/dist/db/migrations/schema.js +0 -160
  169. package/dist/db/migrations/schema.js.map +0 -1
  170. package/dist/db/schema.d.ts +0 -1576
  171. package/dist/db/schema.d.ts.map +0 -1
  172. package/dist/db/schema.js +0 -204
  173. package/dist/db/schema.js.map +0 -1
  174. package/dist/db/seed.d.ts +0 -4
  175. package/dist/db/seed.d.ts.map +0 -1
  176. package/dist/db/seed.js +0 -57
  177. package/dist/db/seed.js.map +0 -1
  178. package/dist/db/seedOAuth.d.ts +0 -4
  179. package/dist/db/seedOAuth.d.ts.map +0 -1
  180. package/dist/db/seedOAuth.js +0 -76
  181. package/dist/db/seedOAuth.js.map +0 -1
  182. package/dist/governance/config.d.ts +0 -66
  183. package/dist/governance/config.d.ts.map +0 -1
  184. package/dist/governance/config.js +0 -238
  185. package/dist/governance/config.js.map +0 -1
  186. package/dist/governance/detectors/hallucination.d.ts +0 -61
  187. package/dist/governance/detectors/hallucination.d.ts.map +0 -1
  188. package/dist/governance/detectors/hallucination.js +0 -338
  189. package/dist/governance/detectors/hallucination.js.map +0 -1
  190. package/dist/governance/detectors/inconsistency.d.ts +0 -99
  191. package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
  192. package/dist/governance/detectors/inconsistency.js +0 -548
  193. package/dist/governance/detectors/inconsistency.js.map +0 -1
  194. package/dist/governance/detectors/toneDrift.d.ts +0 -63
  195. package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
  196. package/dist/governance/detectors/toneDrift.js +0 -421
  197. package/dist/governance/detectors/toneDrift.js.map +0 -1
  198. package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
  199. package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
  200. package/dist/governance/detectors/unsafeReasoning.js +0 -473
  201. package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
  202. package/dist/governance/evaluationEngine.d.ts +0 -112
  203. package/dist/governance/evaluationEngine.d.ts.map +0 -1
  204. package/dist/governance/evaluationEngine.js +0 -265
  205. package/dist/governance/evaluationEngine.js.map +0 -1
  206. package/dist/governance/intervention.d.ts +0 -81
  207. package/dist/governance/intervention.d.ts.map +0 -1
  208. package/dist/governance/intervention.js +0 -405
  209. package/dist/governance/intervention.js.map +0 -1
  210. package/dist/server/oauth/anomalyDetection.d.ts +0 -146
  211. package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
  212. package/dist/server/oauth/anomalyDetection.js +0 -405
  213. package/dist/server/oauth/anomalyDetection.js.map +0 -1
  214. package/dist/server/oauth/authServer.d.ts +0 -61
  215. package/dist/server/oauth/authServer.d.ts.map +0 -1
  216. package/dist/server/oauth/authServer.js +0 -283
  217. package/dist/server/oauth/authServer.js.map +0 -1
  218. package/dist/server/oauth/dpop.d.ts +0 -135
  219. package/dist/server/oauth/dpop.d.ts.map +0 -1
  220. package/dist/server/oauth/dpop.js +0 -338
  221. package/dist/server/oauth/dpop.js.map +0 -1
  222. package/dist/server/oauth/gdpr/consent.d.ts +0 -173
  223. package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
  224. package/dist/server/oauth/gdpr/consent.js +0 -388
  225. package/dist/server/oauth/gdpr/consent.js.map +0 -1
  226. package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
  227. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
  228. package/dist/server/oauth/gdpr/dataPortability.js +0 -486
  229. package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
  230. package/dist/server/oauth/gdpr/index.d.ts +0 -103
  231. package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
  232. package/dist/server/oauth/gdpr/index.js +0 -273
  233. package/dist/server/oauth/gdpr/index.js.map +0 -1
  234. package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
  235. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
  236. package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
  237. package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
  238. package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
  239. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
  240. package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
  241. package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
  242. package/dist/server/oauth/pkce.d.ts +0 -61
  243. package/dist/server/oauth/pkce.d.ts.map +0 -1
  244. package/dist/server/oauth/pkce.js +0 -157
  245. package/dist/server/oauth/pkce.js.map +0 -1
  246. package/dist/server/oauth/providers/base.d.ts +0 -147
  247. package/dist/server/oauth/providers/base.d.ts.map +0 -1
  248. package/dist/server/oauth/providers/base.js +0 -312
  249. package/dist/server/oauth/providers/base.js.map +0 -1
  250. package/dist/server/oauth/providers/github.d.ts +0 -55
  251. package/dist/server/oauth/providers/github.d.ts.map +0 -1
  252. package/dist/server/oauth/providers/github.js +0 -225
  253. package/dist/server/oauth/providers/github.js.map +0 -1
  254. package/dist/server/oauth/providers/google.d.ts +0 -49
  255. package/dist/server/oauth/providers/google.d.ts.map +0 -1
  256. package/dist/server/oauth/providers/google.js +0 -153
  257. package/dist/server/oauth/providers/google.js.map +0 -1
  258. package/dist/server/oauth/providers/index.d.ts +0 -9
  259. package/dist/server/oauth/providers/index.d.ts.map +0 -1
  260. package/dist/server/oauth/providers/index.js +0 -24
  261. package/dist/server/oauth/providers/index.js.map +0 -1
  262. package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
  263. package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
  264. package/dist/server/oauth/refreshTokenRotation.js +0 -344
  265. package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
  266. package/dist/server/oauth/security.d.ts +0 -101
  267. package/dist/server/oauth/security.d.ts.map +0 -1
  268. package/dist/server/oauth/security.js +0 -268
  269. package/dist/server/oauth/security.js.map +0 -1
  270. package/dist/server/oauth/tokenEncryption.d.ts +0 -80
  271. package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
  272. package/dist/server/oauth/tokenEncryption.js +0 -218
  273. package/dist/server/oauth/tokenEncryption.js.map +0 -1
  274. package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
  275. package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
  276. package/dist/tools/sendMessage-complex-backup.js +0 -545
  277. package/dist/tools/sendMessage-complex-backup.js.map +0 -1
  278. package/dist/tools/sendMessage-revised.d.ts +0 -11
  279. package/dist/tools/sendMessage-revised.d.ts.map +0 -1
  280. package/dist/tools/sendMessage-revised.js +0 -429
  281. package/dist/tools/sendMessage-revised.js.map +0 -1
  282. package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
  283. package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
  284. package/dist/tools/sendMessage-truly-simple.js +0 -299
  285. package/dist/tools/sendMessage-truly-simple.js.map +0 -1
@@ -0,0 +1,346 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { promisify } from 'util';
4
+ import { logger } from '../../utils/logger.js';
5
+ const readFile = promisify(fs.readFile);
6
+ const writeFile = promisify(fs.writeFile);
7
+ const mkdir = promisify(fs.mkdir);
8
+ const stat = promisify(fs.stat);
9
+ const readdir = promisify(fs.readdir);
10
+ const unlink = promisify(fs.unlink);
11
+ export class AutoBackup {
12
+ backupDir;
13
+ backupMetadata = new Map();
14
+ maxBackupAge = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds
15
+ maxBackupSize = 500 * 1024 * 1024; // 500MB
16
+ cleanupInterval = null;
17
+ constructor(backupDir = './.backup') {
18
+ this.backupDir = backupDir;
19
+ this.initializeBackupDirectory();
20
+ this.startCleanupSchedule();
21
+ }
22
+ /**
23
+ * Initialize backup directory structure
24
+ */
25
+ async initializeBackupDirectory() {
26
+ try {
27
+ const fullPath = path.resolve(this.backupDir);
28
+ if (!fs.existsSync(fullPath)) {
29
+ await mkdir(fullPath, { recursive: true });
30
+ logger.info(`Backup directory created: ${fullPath}`);
31
+ }
32
+ // Create subdirectories for organization
33
+ const subdirs = ['snapshots', 'metadata', 'rollback-logs'];
34
+ for (const subdir of subdirs) {
35
+ const subdirPath = path.join(fullPath, subdir);
36
+ if (!fs.existsSync(subdirPath)) {
37
+ await mkdir(subdirPath, { recursive: true });
38
+ }
39
+ }
40
+ }
41
+ catch (error) {
42
+ logger.error('Failed to initialize backup directory:', error);
43
+ }
44
+ }
45
+ /**
46
+ * Create a backup of a file before modification
47
+ */
48
+ async createBackup(filePath, operation, reason) {
49
+ try {
50
+ const fullPath = path.resolve(filePath);
51
+ // Verify file exists
52
+ if (!fs.existsSync(fullPath)) {
53
+ return {
54
+ success: false,
55
+ error: `File not found: ${filePath}`,
56
+ };
57
+ }
58
+ // Get file stats
59
+ const stats = await stat(fullPath);
60
+ if (!stats.isFile()) {
61
+ return {
62
+ success: false,
63
+ error: `Path is not a file: ${filePath}`,
64
+ };
65
+ }
66
+ // Check file size
67
+ if (stats.size > 50 * 1024 * 1024) {
68
+ return {
69
+ success: false,
70
+ error: `File too large for backup (>50MB): ${filePath}`,
71
+ };
72
+ }
73
+ // Read file content
74
+ const fileContent = await readFile(fullPath);
75
+ // Generate backup ID and paths
76
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
77
+ const backupId = `${timestamp}_${path.basename(fullPath)}`;
78
+ const backupPath = path.join(this.backupDir, 'snapshots', backupId);
79
+ // Write backup file
80
+ await writeFile(backupPath, fileContent);
81
+ // Create metadata
82
+ const metadata = {
83
+ originalPath: fullPath,
84
+ backupPath,
85
+ timestamp: new Date(),
86
+ fileSize: stats.size,
87
+ hash: this.generateSimpleHash(fileContent.toString()),
88
+ operation,
89
+ reason,
90
+ };
91
+ this.backupMetadata.set(backupId, metadata);
92
+ // Save metadata to file
93
+ await this.saveMetadata(backupId, metadata);
94
+ logger.info(`Backup created: ${backupPath} for ${operation} operation on ${filePath}`);
95
+ return {
96
+ success: true,
97
+ backupPath,
98
+ backupId,
99
+ };
100
+ }
101
+ catch (error) {
102
+ logger.error(`Failed to create backup for ${filePath}:`, error);
103
+ return {
104
+ success: false,
105
+ error: error instanceof Error ? error.message : 'Unknown error during backup creation',
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Restore a file from backup (rollback capability)
111
+ */
112
+ async rollback(backupId) {
113
+ try {
114
+ const metadata = this.backupMetadata.get(backupId);
115
+ if (!metadata) {
116
+ return {
117
+ success: false,
118
+ restoredPath: '',
119
+ backupPath: '',
120
+ message: `Backup not found: ${backupId}`,
121
+ timestamp: new Date(),
122
+ };
123
+ }
124
+ // Verify backup exists
125
+ if (!fs.existsSync(metadata.backupPath)) {
126
+ return {
127
+ success: false,
128
+ restoredPath: '',
129
+ backupPath: metadata.backupPath,
130
+ message: `Backup file no longer exists: ${metadata.backupPath}`,
131
+ timestamp: new Date(),
132
+ };
133
+ }
134
+ // Read backup content
135
+ const backupContent = await readFile(metadata.backupPath);
136
+ // Restore to original path
137
+ const restorePath = metadata.originalPath;
138
+ // Create parent directory if needed
139
+ const parentDir = path.dirname(restorePath);
140
+ if (!fs.existsSync(parentDir)) {
141
+ await mkdir(parentDir, { recursive: true });
142
+ }
143
+ // Restore file
144
+ await writeFile(restorePath, backupContent);
145
+ // Log rollback
146
+ await this.logRollback(backupId, restorePath, metadata);
147
+ logger.info(`File rolled back from backup: ${restorePath}`);
148
+ return {
149
+ success: true,
150
+ restoredPath: restorePath,
151
+ backupPath: metadata.backupPath,
152
+ message: `Successfully restored ${path.basename(restorePath)} from backup`,
153
+ timestamp: new Date(),
154
+ };
155
+ }
156
+ catch (error) {
157
+ logger.error(`Failed to rollback backup ${backupId}:`, error);
158
+ return {
159
+ success: false,
160
+ restoredPath: '',
161
+ backupPath: '',
162
+ message: error instanceof Error ? error.message : 'Unknown error during rollback',
163
+ timestamp: new Date(),
164
+ };
165
+ }
166
+ }
167
+ /**
168
+ * Get list of available backups
169
+ */
170
+ async listBackups() {
171
+ const backups = [];
172
+ try {
173
+ const snapshotsDir = path.join(this.backupDir, 'snapshots');
174
+ if (!fs.existsSync(snapshotsDir)) {
175
+ return backups;
176
+ }
177
+ const files = await readdir(snapshotsDir);
178
+ for (const file of files) {
179
+ const backupId = path.basename(file, path.extname(file));
180
+ const metadata = this.backupMetadata.get(backupId);
181
+ if (metadata) {
182
+ backups.push(metadata);
183
+ }
184
+ }
185
+ // Sort by timestamp descending
186
+ backups.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
187
+ return backups;
188
+ }
189
+ catch (error) {
190
+ logger.error('Failed to list backups:', error);
191
+ return backups;
192
+ }
193
+ }
194
+ /**
195
+ * Get backup details
196
+ */
197
+ getBackupDetails(backupId) {
198
+ return this.backupMetadata.get(backupId) || null;
199
+ }
200
+ /**
201
+ * Clean up old backups (>7 days)
202
+ */
203
+ async cleanupOldBackups() {
204
+ let deletedCount = 0;
205
+ let freedSpace = 0;
206
+ try {
207
+ const backups = await this.listBackups();
208
+ const now = new Date().getTime();
209
+ for (const backup of backups) {
210
+ const backupAge = now - backup.timestamp.getTime();
211
+ if (backupAge > this.maxBackupAge) {
212
+ try {
213
+ if (fs.existsSync(backup.backupPath)) {
214
+ const stats = await stat(backup.backupPath);
215
+ await unlink(backup.backupPath);
216
+ freedSpace += stats.size;
217
+ deletedCount++;
218
+ this.backupMetadata.delete(path.basename(backup.backupPath, path.extname(backup.backupPath)));
219
+ }
220
+ }
221
+ catch (error) {
222
+ logger.error(`Failed to delete old backup ${backup.backupPath}:`, error);
223
+ }
224
+ }
225
+ }
226
+ if (deletedCount > 0) {
227
+ logger.info(`Cleanup: Removed ${deletedCount} old backups, freed ${this.formatBytes(freedSpace)}`);
228
+ }
229
+ return { deletedCount, freedSpace };
230
+ }
231
+ catch (error) {
232
+ logger.error('Failed to cleanup old backups:', error);
233
+ return { deletedCount: 0, freedSpace: 0 };
234
+ }
235
+ }
236
+ /**
237
+ * Get backup statistics
238
+ */
239
+ async getBackupStats() {
240
+ try {
241
+ const backups = await this.listBackups();
242
+ let totalSize = 0;
243
+ for (const backup of backups) {
244
+ totalSize += backup.fileSize;
245
+ }
246
+ const oldestBackup = backups.length > 0 ? backups[backups.length - 1]?.timestamp : undefined;
247
+ const newestBackup = backups.length > 0 ? backups[0]?.timestamp : undefined;
248
+ const diskUsagePercent = (totalSize / this.maxBackupSize) * 100;
249
+ return {
250
+ totalBackups: backups.length,
251
+ totalSize,
252
+ oldestBackup,
253
+ newestBackup,
254
+ diskUsagePercent,
255
+ };
256
+ }
257
+ catch (error) {
258
+ logger.error('Failed to get backup stats:', error);
259
+ return {
260
+ totalBackups: 0,
261
+ totalSize: 0,
262
+ diskUsagePercent: 0,
263
+ };
264
+ }
265
+ }
266
+ /**
267
+ * Start automatic cleanup schedule
268
+ */
269
+ startCleanupSchedule() {
270
+ // Run cleanup every 6 hours
271
+ this.cleanupInterval = setInterval(() => {
272
+ this.cleanupOldBackups().catch(error => {
273
+ logger.error('Scheduled backup cleanup failed:', error);
274
+ });
275
+ }, 6 * 60 * 60 * 1000);
276
+ logger.info('Backup cleanup schedule started (every 6 hours)');
277
+ }
278
+ /**
279
+ * Stop cleanup schedule
280
+ */
281
+ stopCleanupSchedule() {
282
+ if (this.cleanupInterval) {
283
+ clearInterval(this.cleanupInterval);
284
+ this.cleanupInterval = null;
285
+ logger.info('Backup cleanup schedule stopped');
286
+ }
287
+ }
288
+ /**
289
+ * Save metadata to file
290
+ */
291
+ async saveMetadata(backupId, metadata) {
292
+ try {
293
+ const metadataPath = path.join(this.backupDir, 'metadata', `${backupId}.json`);
294
+ await writeFile(metadataPath, JSON.stringify(metadata, null, 2));
295
+ }
296
+ catch (error) {
297
+ logger.error(`Failed to save metadata for ${backupId}:`, error);
298
+ }
299
+ }
300
+ /**
301
+ * Log rollback operation
302
+ */
303
+ async logRollback(backupId, restoredPath, metadata) {
304
+ try {
305
+ const rollbackLogPath = path.join(this.backupDir, 'rollback-logs', `rollback_${new Date().toISOString().replace(/[:.]/g, '-')}.json`);
306
+ const logEntry = {
307
+ backupId,
308
+ restoredPath,
309
+ originalPath: metadata.originalPath,
310
+ operation: metadata.operation,
311
+ timestamp: new Date().toISOString(),
312
+ originalBackupTime: metadata.timestamp,
313
+ };
314
+ await writeFile(rollbackLogPath, JSON.stringify(logEntry, null, 2));
315
+ }
316
+ catch (error) {
317
+ logger.error(`Failed to log rollback:`, error);
318
+ }
319
+ }
320
+ /**
321
+ * Generate simple hash of file content for verification
322
+ */
323
+ generateSimpleHash(content) {
324
+ let hash = 0;
325
+ for (let i = 0; i < Math.min(content.length, 1000); i++) {
326
+ const char = content.charCodeAt(i);
327
+ hash = (hash << 5) - hash + char;
328
+ hash = hash & hash; // Convert to 32bit integer
329
+ }
330
+ return Math.abs(hash).toString(16);
331
+ }
332
+ /**
333
+ * Format bytes to human readable
334
+ */
335
+ formatBytes(bytes) {
336
+ if (bytes === 0)
337
+ return '0 Bytes';
338
+ const k = 1024;
339
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
340
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
341
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
342
+ }
343
+ }
344
+ // Export singleton instance
345
+ export const autoBackup = new AutoBackup();
346
+ //# sourceMappingURL=auto-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-backup.js","sourceRoot":"","sources":["../../../src/developer/backup/auto-backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Package Blocker - Intercepts and blocks AI package recommendations
3
+ * This is the enforcement layer that prevents bad packages from being installed
4
+ */
5
+ export interface BlockerResult {
6
+ allowed: boolean;
7
+ original: string;
8
+ modified?: string;
9
+ warnings: string[];
10
+ blockedPackages: string[];
11
+ suggestions: Record<string, string[]>;
12
+ }
13
+ export declare class PackageBlocker {
14
+ private evaluator;
15
+ private autoFix;
16
+ constructor(autoFix?: boolean);
17
+ /**
18
+ * Intercept and validate code with package installations
19
+ */
20
+ interceptCode(code: string, language: 'javascript' | 'typescript' | 'python' | 'java' | 'go' | 'rust' | 'csharp' | 'ruby' | 'unknown'): Promise<BlockerResult>;
21
+ /**
22
+ * Intercept package manager commands (npm install, pip install, etc.)
23
+ */
24
+ interceptCommand(command: string): Promise<BlockerResult>;
25
+ private parseCommand;
26
+ private buildCommand;
27
+ private replacePackage;
28
+ /**
29
+ * Generate a report of blocked packages
30
+ */
31
+ generateReport(results: BlockerResult[]): string;
32
+ }
33
+ //# sourceMappingURL=package-blocker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-blocker.d.ts","sourceRoot":"","sources":["../../../src/developer/blockers/package-blocker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,UAAO;IAK1B;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GACxG,OAAO,CAAC,aAAa,CAAC;IA4DzB;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoD/D,OAAO,CAAC,YAAY;IAuEpB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,cAAc;IAsCtB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM;CAoCjD"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Package Blocker - Intercepts and blocks AI package recommendations
3
+ * This is the enforcement layer that prevents bad packages from being installed
4
+ */
5
+ import { PackageEvaluator } from '../evaluators/package-evaluator.js';
6
+ export class PackageBlocker {
7
+ evaluator;
8
+ autoFix;
9
+ constructor(autoFix = true) {
10
+ this.evaluator = new PackageEvaluator();
11
+ this.autoFix = autoFix;
12
+ }
13
+ /**
14
+ * Intercept and validate code with package installations
15
+ */
16
+ async interceptCode(code, language) {
17
+ const context = { language };
18
+ const result = {
19
+ allowed: true,
20
+ original: code,
21
+ warnings: [],
22
+ blockedPackages: [],
23
+ suggestions: {}
24
+ };
25
+ // Extract packages from code
26
+ const packages = this.evaluator.extractPackages(code, language);
27
+ if (packages.length === 0) {
28
+ return result;
29
+ }
30
+ // Evaluate all packages
31
+ const evaluations = await this.evaluator.evaluateBatch(packages, context);
32
+ // Process evaluation results
33
+ let modifiedCode = code;
34
+ for (const evaluation of evaluations) {
35
+ if (evaluation.blocked) {
36
+ result.allowed = false;
37
+ result.blockedPackages.push(evaluation.package.name);
38
+ if (evaluation.warning) {
39
+ result.warnings.push(evaluation.warning);
40
+ }
41
+ if (evaluation.suggestions && evaluation.suggestions.length > 0) {
42
+ result.suggestions[evaluation.package.name] = evaluation.suggestions;
43
+ // Auto-fix if enabled and we have a clear suggestion
44
+ if (this.autoFix && evaluation.suggestions.length === 1) {
45
+ if (evaluation.suggestions[0]) {
46
+ modifiedCode = this.replacePackage(modifiedCode, evaluation.package.name, evaluation.suggestions[0], language);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ else if (evaluation.warning) {
52
+ result.warnings.push(evaluation.warning);
53
+ }
54
+ }
55
+ // If we modified the code, include it
56
+ if (modifiedCode !== code) {
57
+ result.modified = modifiedCode;
58
+ }
59
+ return result;
60
+ }
61
+ /**
62
+ * Intercept package manager commands (npm install, pip install, etc.)
63
+ */
64
+ async interceptCommand(command) {
65
+ const result = {
66
+ allowed: true,
67
+ original: command,
68
+ warnings: [],
69
+ blockedPackages: [],
70
+ suggestions: {}
71
+ };
72
+ // Detect package manager and extract packages
73
+ const { manager, packages, language } = this.parseCommand(command);
74
+ if (!manager || packages.length === 0) {
75
+ return result;
76
+ }
77
+ const context = { language };
78
+ // Evaluate each package
79
+ for (const pkg of packages) {
80
+ const evaluation = await this.evaluator.evaluate(pkg.name, context, pkg.version);
81
+ if (evaluation.blocked) {
82
+ result.allowed = false;
83
+ result.blockedPackages.push(pkg.name);
84
+ if (evaluation.warning) {
85
+ result.warnings.push(evaluation.warning);
86
+ }
87
+ if (evaluation.suggestions) {
88
+ result.suggestions[pkg.name] = evaluation.suggestions;
89
+ }
90
+ }
91
+ else if (evaluation.warning) {
92
+ result.warnings.push(evaluation.warning);
93
+ }
94
+ }
95
+ // Generate modified command if blocked
96
+ if (!result.allowed && this.autoFix) {
97
+ const validPackages = packages.filter(pkg => !result.blockedPackages.includes(pkg.name));
98
+ if (validPackages.length > 0) {
99
+ result.modified = this.buildCommand(manager, validPackages);
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ parseCommand(command) {
105
+ const result = {
106
+ manager: null,
107
+ packages: [],
108
+ language: 'unknown'
109
+ };
110
+ // npm/yarn/pnpm patterns
111
+ const npmMatch = command.match(/^(npm|yarn|pnpm)\s+(install|add|i)\s+(.+)$/i);
112
+ if (npmMatch) {
113
+ result.manager = npmMatch[1] || null;
114
+ result.language = 'javascript';
115
+ const packageStrings = (npmMatch[3] || '').split(/\s+/);
116
+ for (const pkgStr of packageStrings) {
117
+ if (pkgStr.startsWith('-'))
118
+ continue; // Skip flags
119
+ const [name, version] = pkgStr.split('@').filter(Boolean);
120
+ if (name) {
121
+ result.packages.push({ name, version });
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+ // pip patterns
127
+ const pipMatch = command.match(/^pip3?\s+install\s+(.+)$/i);
128
+ if (pipMatch) {
129
+ result.manager = 'pip';
130
+ result.language = 'python';
131
+ const packageStrings = (pipMatch[1] || '').split(/\s+/);
132
+ for (const pkgStr of packageStrings) {
133
+ if (pkgStr.startsWith('-'))
134
+ continue; // Skip flags
135
+ const [name, version] = pkgStr.split('==');
136
+ if (name) {
137
+ result.packages.push({ name, version });
138
+ }
139
+ }
140
+ return result;
141
+ }
142
+ // Maven patterns (in pom.xml context)
143
+ const mvnMatch = command.match(/mvn\s+dependency:get\s+-Dartifact=(.+)/i);
144
+ if (mvnMatch) {
145
+ result.manager = 'mvn';
146
+ result.language = 'java';
147
+ const [groupId, artifactId, version] = (mvnMatch[1] || '').split(':');
148
+ if (groupId && artifactId) {
149
+ result.packages.push({
150
+ name: `${groupId}:${artifactId}`,
151
+ version
152
+ });
153
+ }
154
+ return result;
155
+ }
156
+ return result;
157
+ }
158
+ buildCommand(manager, packages) {
159
+ const packageStrings = packages.map(pkg => pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name);
160
+ switch (manager) {
161
+ case 'npm':
162
+ return `npm install ${packageStrings.join(' ')}`;
163
+ case 'yarn':
164
+ return `yarn add ${packageStrings.join(' ')}`;
165
+ case 'pnpm':
166
+ return `pnpm add ${packageStrings.join(' ')}`;
167
+ case 'pip':
168
+ return `pip install ${packageStrings.join(' ')}`;
169
+ default:
170
+ return '';
171
+ }
172
+ }
173
+ replacePackage(code, oldPkg, newPkg, language) {
174
+ switch (language) {
175
+ case 'javascript':
176
+ case 'typescript':
177
+ // Replace in import statements
178
+ code = code.replace(new RegExp(`(import\\s+.*?\\s+from\\s+['"])${oldPkg}(['"])`, 'g'), `$1${newPkg}$2`);
179
+ // Replace in require statements
180
+ code = code.replace(new RegExp(`(require\\s*\\(\\s*['"])${oldPkg}(['"]\\s*\\))`, 'g'), `$1${newPkg}$2`);
181
+ break;
182
+ case 'python':
183
+ // Replace in import statements
184
+ code = code.replace(new RegExp(`(^|\\n)(\\s*import\\s+)${oldPkg}(\\s|$)`, 'gm'), `$1$2${newPkg}$3`);
185
+ // Replace in from...import statements
186
+ code = code.replace(new RegExp(`(^|\\n)(\\s*from\\s+)${oldPkg}(\\s+import)`, 'gm'), `$1$2${newPkg}$3`);
187
+ break;
188
+ }
189
+ return code;
190
+ }
191
+ /**
192
+ * Generate a report of blocked packages
193
+ */
194
+ generateReport(results) {
195
+ const totalBlocked = results.reduce((sum, r) => sum + r.blockedPackages.length, 0);
196
+ const report = [
197
+ `Package Validation Report`,
198
+ `========================`,
199
+ `Total commands analyzed: ${results.length}`,
200
+ `Blocked packages: ${totalBlocked}`,
201
+ ``
202
+ ];
203
+ if (totalBlocked > 0) {
204
+ report.push(`Blocked Packages:`);
205
+ for (const result of results) {
206
+ for (const pkg of result.blockedPackages) {
207
+ const suggestions = result.suggestions[pkg];
208
+ report.push(` ❌ ${pkg}`);
209
+ if (suggestions && suggestions.length > 0) {
210
+ report.push(` Suggestions: ${suggestions.join(', ')}`);
211
+ }
212
+ }
213
+ }
214
+ }
215
+ const warnings = results.flatMap(r => r.warnings);
216
+ if (warnings.length > 0) {
217
+ report.push(``);
218
+ report.push(`Warnings:`);
219
+ warnings.forEach(w => report.push(` ⚠️ ${w}`));
220
+ }
221
+ return report.join('\n');
222
+ }
223
+ }
224
+ //# sourceMappingURL=package-blocker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-blocker.js","sourceRoot":"","sources":["../../../src/developer/blockers/package-blocker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAqB,MAAM,oCAAoC,CAAC;AAWzF,MAAM,OAAO,cAAc;IACjB,SAAS,CAAmB;IAC5B,OAAO,CAAU;IAEzB,YAAY,OAAO,GAAG,IAAI;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,IAAY,EACZ,QAAyG;QAEzG,MAAM,OAAO,GAAsB,EAAE,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEhE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE1E,6BAA6B;QAC7B,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAErD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC3C,CAAC;gBAED,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC;oBAErE,qDAAqD;oBACrD,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACxD,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC9B,YAAY,GAAG,IAAI,CAAC,cAAc,CAChC,YAAY,EACZ,UAAU,CAAC,OAAO,CAAC,IAAI,EACvB,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EACzB,QAAQ,CACT,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;QACjC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,EAAE;YACnB,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,8CAA8C;QAC9C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAsB,EAAE,QAAQ,EAAE,CAAC;QAEhD,wBAAwB;QACxB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAEjF,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEtC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC3C,CAAC;gBAED,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC3B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC;gBACxD,CAAC;YACH,CAAC;iBAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CACnC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAClD,CAAC;YAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,OAAe;QAKlC,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAqB;YAC9B,QAAQ,EAAE,EAA+C;YACzD,QAAQ,EAAE,SAAyD;SACpE,CAAC;QAEF,yBAAyB;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,6CAA6C,CAC9C,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACrC,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;YAC/B,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAExD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS,CAAC,aAAa;gBAEnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1D,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,eAAe;QACf,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,2BAA2B,CAC5B,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC3B,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAExD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBACpC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS,CAAC,aAAa;gBAEnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,sCAAsC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,yCAAyC,CAC1C,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;YACzB,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBAC1B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,GAAG,OAAO,IAAI,UAAU,EAAE;oBAChC,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAClB,OAAe,EACf,QAAmD;QAEnD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CACtD,CAAC;QAEF,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,KAAK;gBACR,OAAO,eAAe,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,MAAM;gBACT,OAAO,YAAY,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,MAAM;gBACT,OAAO,YAAY,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,KAAK,KAAK;gBACR,OAAO,eAAe,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,IAAY,EACZ,MAAc,EACd,MAAc,EACd,QAAyG;QAEzG,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACf,+BAA+B;gBAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,kCAAkC,MAAM,QAAQ,EAAE,GAAG,CAAC,EACjE,KAAK,MAAM,IAAI,CAChB,CAAC;gBACF,gCAAgC;gBAChC,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,2BAA2B,MAAM,eAAe,EAAE,GAAG,CAAC,EACjE,KAAK,MAAM,IAAI,CAChB,CAAC;gBACF,MAAM;YAER,KAAK,QAAQ;gBACX,+BAA+B;gBAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,0BAA0B,MAAM,SAAS,EAAE,IAAI,CAAC,EAC3D,OAAO,MAAM,IAAI,CAClB,CAAC;gBACF,sCAAsC;gBACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,wBAAwB,MAAM,cAAc,EAAE,IAAI,CAAC,EAC9D,OAAO,MAAM,IAAI,CAClB,CAAC;gBACF,MAAM;QACV,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAwB;QACrC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CACjC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,EAC1C,CAAC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,2BAA2B;YAC3B,0BAA0B;YAC1B,4BAA4B,OAAO,CAAC,MAAM,EAAE;YAC5C,qBAAqB,YAAY,EAAE;YACnC,EAAE;SACH,CAAC;QAEF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;oBAC1B,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1C,MAAM,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF"}