@xiuper/cli 0.0.1

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 (218) hide show
  1. package/README.md +180 -0
  2. package/dist/jsMain/typescript/agents/LLMService.d.ts +40 -0
  3. package/dist/jsMain/typescript/agents/LLMService.d.ts.map +1 -0
  4. package/dist/jsMain/typescript/agents/LLMService.js +156 -0
  5. package/dist/jsMain/typescript/agents/LLMService.js.map +1 -0
  6. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts +103 -0
  7. package/dist/jsMain/typescript/agents/ServerAgentClient.d.ts.map +1 -0
  8. package/dist/jsMain/typescript/agents/ServerAgentClient.js +142 -0
  9. package/dist/jsMain/typescript/agents/ServerAgentClient.js.map +1 -0
  10. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts +87 -0
  11. package/dist/jsMain/typescript/agents/render/BaseRenderer.d.ts.map +1 -0
  12. package/dist/jsMain/typescript/agents/render/BaseRenderer.js +128 -0
  13. package/dist/jsMain/typescript/agents/render/BaseRenderer.js.map +1 -0
  14. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts +51 -0
  15. package/dist/jsMain/typescript/agents/render/CliRenderer.d.ts.map +1 -0
  16. package/dist/jsMain/typescript/agents/render/CliRenderer.js +564 -0
  17. package/dist/jsMain/typescript/agents/render/CliRenderer.js.map +1 -0
  18. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts +55 -0
  19. package/dist/jsMain/typescript/agents/render/ServerRenderer.d.ts.map +1 -0
  20. package/dist/jsMain/typescript/agents/render/ServerRenderer.js +503 -0
  21. package/dist/jsMain/typescript/agents/render/ServerRenderer.js.map +1 -0
  22. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts +104 -0
  23. package/dist/jsMain/typescript/agents/render/TuiRenderer.d.ts.map +1 -0
  24. package/dist/jsMain/typescript/agents/render/TuiRenderer.js +279 -0
  25. package/dist/jsMain/typescript/agents/render/TuiRenderer.js.map +1 -0
  26. package/dist/jsMain/typescript/config/ConfigManager.d.ts +146 -0
  27. package/dist/jsMain/typescript/config/ConfigManager.d.ts.map +1 -0
  28. package/dist/jsMain/typescript/config/ConfigManager.js +257 -0
  29. package/dist/jsMain/typescript/config/ConfigManager.js.map +1 -0
  30. package/dist/jsMain/typescript/constants/asciiArt.d.ts +9 -0
  31. package/dist/jsMain/typescript/constants/asciiArt.d.ts.map +1 -0
  32. package/dist/jsMain/typescript/constants/asciiArt.js +47 -0
  33. package/dist/jsMain/typescript/constants/asciiArt.js.map +1 -0
  34. package/dist/jsMain/typescript/design-system/colors.d.ts +492 -0
  35. package/dist/jsMain/typescript/design-system/colors.d.ts.map +1 -0
  36. package/dist/jsMain/typescript/design-system/colors.js +333 -0
  37. package/dist/jsMain/typescript/design-system/colors.js.map +1 -0
  38. package/dist/jsMain/typescript/design-system/index.d.ts +31 -0
  39. package/dist/jsMain/typescript/design-system/index.d.ts.map +1 -0
  40. package/dist/jsMain/typescript/design-system/index.js +195 -0
  41. package/dist/jsMain/typescript/design-system/index.js.map +1 -0
  42. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts +161 -0
  43. package/dist/jsMain/typescript/design-system/theme-helpers.d.ts.map +1 -0
  44. package/dist/jsMain/typescript/design-system/theme-helpers.js +153 -0
  45. package/dist/jsMain/typescript/design-system/theme-helpers.js.map +1 -0
  46. package/dist/jsMain/typescript/i18n/index.d.ts +37 -0
  47. package/dist/jsMain/typescript/i18n/index.d.ts.map +1 -0
  48. package/dist/jsMain/typescript/i18n/index.js +139 -0
  49. package/dist/jsMain/typescript/i18n/index.js.map +1 -0
  50. package/dist/jsMain/typescript/i18n/locales/en.d.ts +6 -0
  51. package/dist/jsMain/typescript/i18n/locales/en.d.ts.map +1 -0
  52. package/dist/jsMain/typescript/i18n/locales/en.js +120 -0
  53. package/dist/jsMain/typescript/i18n/locales/en.js.map +1 -0
  54. package/dist/jsMain/typescript/i18n/locales/zh.d.ts +6 -0
  55. package/dist/jsMain/typescript/i18n/locales/zh.d.ts.map +1 -0
  56. package/dist/jsMain/typescript/i18n/locales/zh.js +120 -0
  57. package/dist/jsMain/typescript/i18n/locales/zh.js.map +1 -0
  58. package/dist/jsMain/typescript/i18n/types.d.ts +124 -0
  59. package/dist/jsMain/typescript/i18n/types.d.ts.map +1 -0
  60. package/dist/jsMain/typescript/i18n/types.js +7 -0
  61. package/dist/jsMain/typescript/i18n/types.js.map +1 -0
  62. package/dist/jsMain/typescript/index.d.ts +9 -0
  63. package/dist/jsMain/typescript/index.d.ts.map +1 -0
  64. package/dist/jsMain/typescript/index.js +380 -0
  65. package/dist/jsMain/typescript/index.js.map +1 -0
  66. package/dist/jsMain/typescript/modes/AgentMode.d.ts +33 -0
  67. package/dist/jsMain/typescript/modes/AgentMode.d.ts.map +1 -0
  68. package/dist/jsMain/typescript/modes/AgentMode.js +243 -0
  69. package/dist/jsMain/typescript/modes/AgentMode.js.map +1 -0
  70. package/dist/jsMain/typescript/modes/ChatMode.d.ts +30 -0
  71. package/dist/jsMain/typescript/modes/ChatMode.d.ts.map +1 -0
  72. package/dist/jsMain/typescript/modes/ChatMode.js +260 -0
  73. package/dist/jsMain/typescript/modes/ChatMode.js.map +1 -0
  74. package/dist/jsMain/typescript/modes/DocumentMode.d.ts +26 -0
  75. package/dist/jsMain/typescript/modes/DocumentMode.d.ts.map +1 -0
  76. package/dist/jsMain/typescript/modes/DocumentMode.js +217 -0
  77. package/dist/jsMain/typescript/modes/DocumentMode.js.map +1 -0
  78. package/dist/jsMain/typescript/modes/Mode.d.ts +72 -0
  79. package/dist/jsMain/typescript/modes/Mode.d.ts.map +1 -0
  80. package/dist/jsMain/typescript/modes/Mode.js +7 -0
  81. package/dist/jsMain/typescript/modes/Mode.js.map +1 -0
  82. package/dist/jsMain/typescript/modes/ModeManager.d.ts +76 -0
  83. package/dist/jsMain/typescript/modes/ModeManager.d.ts.map +1 -0
  84. package/dist/jsMain/typescript/modes/ModeManager.js +156 -0
  85. package/dist/jsMain/typescript/modes/ModeManager.js.map +1 -0
  86. package/dist/jsMain/typescript/modes/ReviewMode.d.ts +52 -0
  87. package/dist/jsMain/typescript/modes/ReviewMode.d.ts.map +1 -0
  88. package/dist/jsMain/typescript/modes/ReviewMode.js +435 -0
  89. package/dist/jsMain/typescript/modes/ReviewMode.js.map +1 -0
  90. package/dist/jsMain/typescript/modes/index.d.ts +9 -0
  91. package/dist/jsMain/typescript/modes/index.d.ts.map +1 -0
  92. package/dist/jsMain/typescript/modes/index.js +7 -0
  93. package/dist/jsMain/typescript/modes/index.js.map +1 -0
  94. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts +34 -0
  95. package/dist/jsMain/typescript/processors/AtCommandProcessor.d.ts.map +1 -0
  96. package/dist/jsMain/typescript/processors/AtCommandProcessor.js +118 -0
  97. package/dist/jsMain/typescript/processors/AtCommandProcessor.js.map +1 -0
  98. package/dist/jsMain/typescript/processors/InputRouter.d.ts +84 -0
  99. package/dist/jsMain/typescript/processors/InputRouter.d.ts.map +1 -0
  100. package/dist/jsMain/typescript/processors/InputRouter.js +78 -0
  101. package/dist/jsMain/typescript/processors/InputRouter.js.map +1 -0
  102. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts +25 -0
  103. package/dist/jsMain/typescript/processors/ModeCommandProcessor.d.ts.map +1 -0
  104. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js +127 -0
  105. package/dist/jsMain/typescript/processors/ModeCommandProcessor.js.map +1 -0
  106. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts +68 -0
  107. package/dist/jsMain/typescript/processors/SlashCommandProcessor.d.ts.map +1 -0
  108. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js +391 -0
  109. package/dist/jsMain/typescript/processors/SlashCommandProcessor.js.map +1 -0
  110. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts +44 -0
  111. package/dist/jsMain/typescript/processors/VariableProcessor.d.ts.map +1 -0
  112. package/dist/jsMain/typescript/processors/VariableProcessor.js +105 -0
  113. package/dist/jsMain/typescript/processors/VariableProcessor.js.map +1 -0
  114. package/dist/jsMain/typescript/ui/App.d.ts +16 -0
  115. package/dist/jsMain/typescript/ui/App.d.ts.map +1 -0
  116. package/dist/jsMain/typescript/ui/App.js +208 -0
  117. package/dist/jsMain/typescript/ui/App.js.map +1 -0
  118. package/dist/jsMain/typescript/ui/Banner.d.ts +6 -0
  119. package/dist/jsMain/typescript/ui/Banner.d.ts.map +1 -0
  120. package/dist/jsMain/typescript/ui/Banner.js +13 -0
  121. package/dist/jsMain/typescript/ui/Banner.js.map +1 -0
  122. package/dist/jsMain/typescript/ui/ChatInterface.d.ts +19 -0
  123. package/dist/jsMain/typescript/ui/ChatInterface.d.ts.map +1 -0
  124. package/dist/jsMain/typescript/ui/ChatInterface.js +223 -0
  125. package/dist/jsMain/typescript/ui/ChatInterface.js.map +1 -0
  126. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts +21 -0
  127. package/dist/jsMain/typescript/ui/CommandSuggestions.d.ts.map +1 -0
  128. package/dist/jsMain/typescript/ui/CommandSuggestions.js +43 -0
  129. package/dist/jsMain/typescript/ui/CommandSuggestions.js.map +1 -0
  130. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts +11 -0
  131. package/dist/jsMain/typescript/ui/LanguageSwitcher.d.ts.map +1 -0
  132. package/dist/jsMain/typescript/ui/LanguageSwitcher.js +37 -0
  133. package/dist/jsMain/typescript/ui/LanguageSwitcher.js.map +1 -0
  134. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts +70 -0
  135. package/dist/jsMain/typescript/ui/MessageRenderer.d.ts.map +1 -0
  136. package/dist/jsMain/typescript/ui/MessageRenderer.js +255 -0
  137. package/dist/jsMain/typescript/ui/MessageRenderer.js.map +1 -0
  138. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts +19 -0
  139. package/dist/jsMain/typescript/ui/ModelConfigForm.d.ts.map +1 -0
  140. package/dist/jsMain/typescript/ui/ModelConfigForm.js +257 -0
  141. package/dist/jsMain/typescript/ui/ModelConfigForm.js.map +1 -0
  142. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts +12 -0
  143. package/dist/jsMain/typescript/ui/WelcomeScreen.d.ts.map +1 -0
  144. package/dist/jsMain/typescript/ui/WelcomeScreen.js +93 -0
  145. package/dist/jsMain/typescript/ui/WelcomeScreen.js.map +1 -0
  146. package/dist/jsMain/typescript/utils/commandUtils.d.ts +64 -0
  147. package/dist/jsMain/typescript/utils/commandUtils.d.ts.map +1 -0
  148. package/dist/jsMain/typescript/utils/commandUtils.js +195 -0
  149. package/dist/jsMain/typescript/utils/commandUtils.js.map +1 -0
  150. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts +53 -0
  151. package/dist/jsMain/typescript/utils/domainDictUtils.d.ts.map +1 -0
  152. package/dist/jsMain/typescript/utils/domainDictUtils.js +130 -0
  153. package/dist/jsMain/typescript/utils/domainDictUtils.js.map +1 -0
  154. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts +23 -0
  155. package/dist/jsMain/typescript/utils/markdownSplitter.d.ts.map +1 -0
  156. package/dist/jsMain/typescript/utils/markdownSplitter.js +90 -0
  157. package/dist/jsMain/typescript/utils/markdownSplitter.js.map +1 -0
  158. package/dist/jsMain/typescript/utils/outputFormatter.d.ts +70 -0
  159. package/dist/jsMain/typescript/utils/outputFormatter.d.ts.map +1 -0
  160. package/dist/jsMain/typescript/utils/outputFormatter.js +140 -0
  161. package/dist/jsMain/typescript/utils/outputFormatter.js.map +1 -0
  162. package/dist/jsMain/typescript/utils/renderUtils.d.ts +17 -0
  163. package/dist/jsMain/typescript/utils/renderUtils.d.ts.map +1 -0
  164. package/dist/jsMain/typescript/utils/renderUtils.js +128 -0
  165. package/dist/jsMain/typescript/utils/renderUtils.js.map +1 -0
  166. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts +87 -0
  167. package/dist/test/framework/analyzers/CodeChangeAnalyzer.d.ts.map +1 -0
  168. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js +412 -0
  169. package/dist/test/framework/analyzers/CodeChangeAnalyzer.js.map +1 -0
  170. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts +46 -0
  171. package/dist/test/framework/analyzers/PromptAnalyzer.d.ts.map +1 -0
  172. package/dist/test/framework/analyzers/PromptAnalyzer.js +185 -0
  173. package/dist/test/framework/analyzers/PromptAnalyzer.js.map +1 -0
  174. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts +45 -0
  175. package/dist/test/framework/analyzers/ToolCallAnalyzer.d.ts.map +1 -0
  176. package/dist/test/framework/analyzers/ToolCallAnalyzer.js +215 -0
  177. package/dist/test/framework/analyzers/ToolCallAnalyzer.js.map +1 -0
  178. package/dist/test/framework/cli.d.ts +8 -0
  179. package/dist/test/framework/cli.d.ts.map +1 -0
  180. package/dist/test/framework/cli.js +175 -0
  181. package/dist/test/framework/cli.js.map +1 -0
  182. package/dist/test/framework/core/TestCase.d.ts +100 -0
  183. package/dist/test/framework/core/TestCase.d.ts.map +1 -0
  184. package/dist/test/framework/core/TestCase.js +101 -0
  185. package/dist/test/framework/core/TestCase.js.map +1 -0
  186. package/dist/test/framework/core/TestEngine.d.ts +89 -0
  187. package/dist/test/framework/core/TestEngine.d.ts.map +1 -0
  188. package/dist/test/framework/core/TestEngine.js +552 -0
  189. package/dist/test/framework/core/TestEngine.js.map +1 -0
  190. package/dist/test/framework/core/TestResult.d.ts +143 -0
  191. package/dist/test/framework/core/TestResult.d.ts.map +1 -0
  192. package/dist/test/framework/core/TestResult.js +76 -0
  193. package/dist/test/framework/core/TestResult.js.map +1 -0
  194. package/dist/test/framework/examples/BasicRobustnessTest.d.ts +19 -0
  195. package/dist/test/framework/examples/BasicRobustnessTest.d.ts.map +1 -0
  196. package/dist/test/framework/examples/BasicRobustnessTest.js +116 -0
  197. package/dist/test/framework/examples/BasicRobustnessTest.js.map +1 -0
  198. package/dist/test/framework/index.d.ts +30 -0
  199. package/dist/test/framework/index.d.ts.map +1 -0
  200. package/dist/test/framework/index.js +38 -0
  201. package/dist/test/framework/index.js.map +1 -0
  202. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts +99 -0
  203. package/dist/test/framework/loaders/JsonScenarioLoader.d.ts.map +1 -0
  204. package/dist/test/framework/loaders/JsonScenarioLoader.js +197 -0
  205. package/dist/test/framework/loaders/JsonScenarioLoader.js.map +1 -0
  206. package/dist/test/framework/reporters/ConsoleReporter.d.ts +25 -0
  207. package/dist/test/framework/reporters/ConsoleReporter.d.ts.map +1 -0
  208. package/dist/test/framework/reporters/ConsoleReporter.js +196 -0
  209. package/dist/test/framework/reporters/ConsoleReporter.js.map +1 -0
  210. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts +62 -0
  211. package/dist/test/framework/scenarios/ScenarioBuilder.d.ts.map +1 -0
  212. package/dist/test/framework/scenarios/ScenarioBuilder.js +285 -0
  213. package/dist/test/framework/scenarios/ScenarioBuilder.js.map +1 -0
  214. package/dist/test/framework/validate-framework.d.ts +9 -0
  215. package/dist/test/framework/validate-framework.d.ts.map +1 -0
  216. package/dist/test/framework/validate-framework.js +187 -0
  217. package/dist/test/framework/validate-framework.js.map +1 -0
  218. package/package.json +84 -0
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Review Mode - Automated code review with linting and AI analysis
3
+ *
4
+ * Optimized Version: Uses Data-Driven approach instead of Tool-Driven
5
+ * - Pre-collects all data (code content, lint results, diff context)
6
+ * - Single LLM call with structured prompt
7
+ * - ~87% token savings compared to tool-driven approach
8
+ */
9
+ import mppCore from '@xiuper/mpp-core';
10
+ import { semanticChalk } from '../design-system/theme-helpers.js';
11
+ const { cc: KotlinCC } = mppCore;
12
+ /**
13
+ * Run code review on a project or specific changes
14
+ *
15
+ * Uses Kotlin's CodeReviewAgent with optimizations:
16
+ * 1. Fetch git diff and extract file paths
17
+ * 2. Detect linters (for display)
18
+ * 3. Use CodeReviewAgent with proper prompt rendering
19
+ */
20
+ export async function runReview(options, llmService, renderer) {
21
+ const { projectPath, diff, reviewType = 'COMPREHENSIVE', skipLint = false } = options;
22
+ const startTime = Date.now();
23
+ console.log(semanticChalk.info(`\n🚀 AutoDev Code Review`));
24
+ console.log(semanticChalk.muted(`Project: ${projectPath}`));
25
+ console.log(semanticChalk.muted(`Review Type: ${reviewType}`));
26
+ console.log();
27
+ try {
28
+ // ===== STEP 1: Fetch Git Diff =====
29
+ const { diffContent, filePaths } = await fetchGitDiff(options);
30
+ if (filePaths.length === 0) {
31
+ console.log(semanticChalk.warning('⚠️ No changes found to review'));
32
+ return {
33
+ success: true,
34
+ message: 'No changes found to review',
35
+ findings: []
36
+ };
37
+ }
38
+ // ===== STEP 2: Detect Linters (for display) =====
39
+ if (!skipLint && filePaths.length > 0) {
40
+ try {
41
+ const linterRegistry = KotlinCC.unitmesh.agent.linter.JsLinterRegistry;
42
+ const linterSummary = await linterRegistry.getLinterSummaryForFiles(filePaths);
43
+ let summary = KotlinCC.unitmesh.agent.linter.JsLinterSummary.Companion.format(linterSummary);
44
+ console.log(summary);
45
+ }
46
+ catch (error) {
47
+ console.log(semanticChalk.warning(`Linter detection failed: ${error.message}`));
48
+ }
49
+ }
50
+ // ===== STEP 3: Read Code Files =====
51
+ console.log(semanticChalk.info('📖 Reading code files...'));
52
+ const codeContent = await readCodeFiles(filePaths, projectPath);
53
+ console.log(semanticChalk.success(`✅ Read ${Object.keys(codeContent).length} files`));
54
+ console.log();
55
+ // ===== STEP 4: Run Linters and Collect Results =====
56
+ const lintResults = {};
57
+ if (!skipLint && filePaths.length > 0) {
58
+ try {
59
+ const collectedLintResults = await runLinters(filePaths, projectPath);
60
+ Object.assign(lintResults, collectedLintResults);
61
+ }
62
+ catch (error) {
63
+ console.log(semanticChalk.warning(`⚠️ Linter execution failed: ${error.message}`));
64
+ }
65
+ }
66
+ // Create code review agent
67
+ const reviewAgent = new KotlinCC.unitmesh.agent.JsCodeReviewAgent(projectPath, llmService, 50, renderer || null, null, null);
68
+ // ===== STEP 5: Execute Review Task (like CodeReviewViewModel) =====
69
+ console.log(semanticChalk.info('🧠 Starting code review analysis...'));
70
+ console.log();
71
+ const llmStartTime = Date.now();
72
+ try {
73
+ const analysisResult = await reviewAgent.executeTask(reviewType, filePaths, codeContent, lintResults, diffContent, '', // commitMessage
74
+ '', // commitId
75
+ '', // repoUrl
76
+ '', // issueToken
77
+ false, // useTools
78
+ false, // analyzeIntent
79
+ 'EN');
80
+ const analysisContent = analysisResult.content;
81
+ const llmDuration = Date.now() - llmStartTime;
82
+ console.log();
83
+ console.log(semanticChalk.success('✅ Code review analysis complete!'));
84
+ console.log(semanticChalk.muted(`⏱️ Time: ${llmDuration}ms`));
85
+ console.log();
86
+ // ===== STEP 6: Generate Fixes (like CodeReviewViewModel.generateFixes) =====
87
+ console.log(semanticChalk.info('🔧 Generating actionable fixes...'));
88
+ console.log();
89
+ const fixStartTime = Date.now();
90
+ const fixOutput = await reviewAgent.generateFixes(diffContent, // Use git diff/patch instead of full code content
91
+ convertLintResultsToArray(lintResults, filePaths), analysisContent, 'EN');
92
+ const fixDuration = Date.now() - fixStartTime;
93
+ console.log();
94
+ console.log();
95
+ console.log(semanticChalk.success('✅ Fix generation complete!'));
96
+ console.log(semanticChalk.muted(`⏱️ Time: ${fixDuration}ms`));
97
+ console.log();
98
+ const totalDuration = Date.now() - startTime;
99
+ console.log(semanticChalk.success('✅ Complete review finished!'));
100
+ console.log(semanticChalk.muted(`⏱️ Total: ${totalDuration}ms`));
101
+ console.log();
102
+ // Parse findings from analysis output
103
+ const findings = parseMarkdownFindings(analysisContent);
104
+ if (findings.length > 0) {
105
+ displayKotlinFindings(findings);
106
+ }
107
+ else {
108
+ console.log(semanticChalk.success('✨ No significant issues found! Code looks good.'));
109
+ console.log();
110
+ }
111
+ return {
112
+ success: true,
113
+ message: analysisContent,
114
+ findings: findings,
115
+ analysisOutput: analysisContent
116
+ };
117
+ }
118
+ catch (error) {
119
+ console.error(semanticChalk.error(`Analysis failed: ${error.message}`));
120
+ throw error;
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.error(semanticChalk.error(`Review failed: ${error.message}`));
125
+ console.error(error.stack);
126
+ return {
127
+ success: false,
128
+ message: `Review failed: ${error.message}`,
129
+ findings: []
130
+ };
131
+ }
132
+ }
133
+ // ==================== Helper Functions ====================
134
+ /**
135
+ * Read code files into memory
136
+ */
137
+ async function readCodeFiles(filePaths, projectPath) {
138
+ const fs = await import('fs/promises');
139
+ const path = await import('path');
140
+ const codeContent = {};
141
+ for (const filePath of filePaths) {
142
+ try {
143
+ const fullPath = path.join(projectPath, filePath);
144
+ const content = await fs.readFile(fullPath, 'utf-8');
145
+ codeContent[filePath] = content;
146
+ }
147
+ catch (error) {
148
+ console.log(semanticChalk.warning(`⚠️ Failed to read ${filePath}: ${error.message}`));
149
+ }
150
+ }
151
+ return codeContent;
152
+ }
153
+ /**
154
+ * Run linters on files and collect results
155
+ */
156
+ async function runLinters(filePaths, projectPath) {
157
+ const lintResults = {};
158
+ try {
159
+ const linterRegistry = KotlinCC.unitmesh.agent.linter.JsLinterRegistry;
160
+ const linters = linterRegistry.findLintersForFiles(filePaths);
161
+ if (linters.length === 0) {
162
+ return lintResults;
163
+ }
164
+ console.log(semanticChalk.info(`🔍 Running linters: ${linters.join(', ')}...`));
165
+ // Run linters using child_process
166
+ const { execSync } = await import('child_process');
167
+ for (const linter of linters) {
168
+ try {
169
+ let command = '';
170
+ let output = '';
171
+ // Build linter command based on linter name
172
+ switch (linter) {
173
+ case 'biome':
174
+ command = `npx --yes @biomejs/biome check --diagnostic-level=info ${filePaths.join(' ')}`;
175
+ break;
176
+ case 'eslint':
177
+ command = `npx eslint --format json ${filePaths.join(' ')}`;
178
+ break;
179
+ case 'detekt':
180
+ command = `./gradlew detekt`;
181
+ break;
182
+ default:
183
+ continue;
184
+ }
185
+ try {
186
+ output = execSync(command, {
187
+ cwd: projectPath,
188
+ encoding: 'utf-8',
189
+ stdio: ['pipe', 'pipe', 'pipe']
190
+ });
191
+ }
192
+ catch (error) {
193
+ // Linters often exit with non-zero on issues found
194
+ output = error.stdout || error.message;
195
+ }
196
+ if (output && output.trim().length > 0) {
197
+ lintResults[linter] = output;
198
+ }
199
+ }
200
+ catch (error) {
201
+ console.log(semanticChalk.warning(`⚠️ ${linter} failed: ${error.message}`));
202
+ }
203
+ }
204
+ if (Object.keys(lintResults).length > 0) {
205
+ console.log(semanticChalk.success(`✅ Collected lint results from ${Object.keys(lintResults).length} linters`));
206
+ }
207
+ else {
208
+ console.log(semanticChalk.muted('ℹ️ No lint issues found'));
209
+ }
210
+ }
211
+ catch (error) {
212
+ console.log(semanticChalk.warning(`⚠️ Linter execution error: ${error.message}`));
213
+ }
214
+ return lintResults;
215
+ }
216
+ /**
217
+ * Parse structured findings from markdown output
218
+ * Looks for issues in format: #### #{number}. {title}
219
+ */
220
+ function parseMarkdownFindings(markdown) {
221
+ const findings = [];
222
+ // Split by issue markers (#### #1., #### #2., etc.)
223
+ const issuePattern = /####\s*#(\d+)\.\s*(.+?)(?=####\s*#\d+\.|$)/gs;
224
+ const matches = Array.from(markdown.matchAll(issuePattern));
225
+ for (const match of matches) {
226
+ const issueText = match[0];
227
+ const issueNumber = match[1];
228
+ const issueTitle = match[2].trim();
229
+ // Extract severity
230
+ const severityMatch = issueText.match(/\*\*Severity\*\*:\s*(CRITICAL|HIGH|MEDIUM|LOW|INFO)/i);
231
+ const severity = severityMatch ? severityMatch[1].toUpperCase() : 'MEDIUM';
232
+ // Extract category
233
+ const categoryMatch = issueText.match(/\*\*Category\*\*:\s*(.+?)(?:\n|\*\*)/i);
234
+ const category = categoryMatch ? categoryMatch[1].trim() : 'General';
235
+ // Extract location with method/class name
236
+ const locationMatch = issueText.match(/\*\*Location\*\*:\s*`([^`]+)`(?:\s+in\s+`([^`]+)`)?/i);
237
+ let filePath;
238
+ let lineNumber;
239
+ let methodName;
240
+ let className;
241
+ if (locationMatch) {
242
+ const location = locationMatch[1].trim();
243
+ const parts = location.split(':');
244
+ filePath = parts[0];
245
+ if (parts.length > 1) {
246
+ const lineStr = parts[1].replace(/[^\d]/g, ''); // Extract just the number
247
+ lineNumber = parseInt(lineStr, 10) || undefined;
248
+ }
249
+ // Extract method/class name
250
+ if (locationMatch[2]) {
251
+ const nameInfo = locationMatch[2].trim();
252
+ // Could be "MethodName" or "ClassName" or "MethodName / ClassName"
253
+ if (nameInfo.includes('/')) {
254
+ const [method, cls] = nameInfo.split('/').map(s => s.trim());
255
+ methodName = method;
256
+ className = cls;
257
+ }
258
+ else {
259
+ // Assume it's a method name if it starts with lowercase, else class name
260
+ if (nameInfo[0] === nameInfo[0].toLowerCase()) {
261
+ methodName = nameInfo;
262
+ }
263
+ else {
264
+ className = nameInfo;
265
+ }
266
+ }
267
+ }
268
+ }
269
+ // Extract source (Linter or Manual Analysis)
270
+ const sourceMatch = issueText.match(/\*\*Source\*\*:\s*(.+?)(?:\n|\*\*)/i);
271
+ const source = sourceMatch ? sourceMatch[1].trim() : undefined;
272
+ // Extract problem description
273
+ const problemMatch = issueText.match(/\*\*Problem\*\*:\s*(.+?)(?=\*\*Code\*\*|\*\*Impact\*\*|\*\*|$)/is);
274
+ const description = problemMatch ? problemMatch[1].trim() : issueTitle;
275
+ // Extract code snippet
276
+ const codeMatch = issueText.match(/\*\*Code\*\*:\s*```[\w]*\n([\s\S]+?)```/i);
277
+ const codeSnippet = codeMatch ? codeMatch[1].trim() : undefined;
278
+ // Extract suggested fix
279
+ const fixMatch = issueText.match(/\*\*Suggested Fix\*\*:\s*(.+?)(?=---|\*\*|####|$)/is);
280
+ const suggestion = fixMatch ? fixMatch[1].trim() : undefined;
281
+ findings.push({
282
+ severity,
283
+ category,
284
+ description: `${issueTitle}${description !== issueTitle && description !== issueTitle + ':' ? ': ' + description : ''}`,
285
+ filePath,
286
+ lineNumber,
287
+ methodName,
288
+ className,
289
+ codeSnippet,
290
+ source,
291
+ suggestion
292
+ });
293
+ }
294
+ return findings;
295
+ }
296
+ /**
297
+ * Convert lint results from Record to Array format for generateFixes
298
+ */
299
+ function convertLintResultsToArray(lintResults, filePaths) {
300
+ const lintArray = [];
301
+ for (const [linterName, output] of Object.entries(lintResults)) {
302
+ // Create a simple lint result structure
303
+ // This matches the expected JsLintFileResult format
304
+ lintArray.push({
305
+ filePath: filePaths[0] || 'unknown',
306
+ linterName: linterName,
307
+ errorCount: 0,
308
+ warningCount: 0,
309
+ infoCount: 0,
310
+ issues: []
311
+ });
312
+ }
313
+ return lintArray;
314
+ }
315
+ /**
316
+ * Fetch git diff and extract file paths
317
+ */
318
+ async function fetchGitDiff(options) {
319
+ const { projectPath, diff, commitHash, baseBranch, compareWith } = options;
320
+ let diffContent = diff;
321
+ if (!diffContent) {
322
+ console.log(semanticChalk.info('📥 Fetching git diff...'));
323
+ try {
324
+ const { execSync } = await import('child_process');
325
+ if (commitHash) {
326
+ diffContent = execSync(`git show ${commitHash}`, {
327
+ cwd: projectPath,
328
+ encoding: 'utf-8'
329
+ });
330
+ }
331
+ else if (baseBranch && compareWith) {
332
+ diffContent = execSync(`git diff ${baseBranch}...${compareWith}`, {
333
+ cwd: projectPath,
334
+ encoding: 'utf-8'
335
+ });
336
+ }
337
+ else {
338
+ // Default: review the last commit (HEAD)
339
+ diffContent = execSync('git show HEAD', {
340
+ cwd: projectPath,
341
+ encoding: 'utf-8'
342
+ });
343
+ }
344
+ }
345
+ catch (error) {
346
+ throw new Error(`Failed to get git diff: ${error.message}`);
347
+ }
348
+ }
349
+ if (!diffContent || diffContent.trim().length === 0) {
350
+ return { diffContent: '', filePaths: [] };
351
+ }
352
+ // Parse diff to get changed files
353
+ console.log(semanticChalk.info('📝 Parsing diff...'));
354
+ try {
355
+ const filePaths = KotlinCC.unitmesh.agent.JsDiffUtils.extractFilePaths(diffContent);
356
+ console.log(semanticChalk.success(`Found ${filePaths.length} changed files`));
357
+ filePaths.forEach((file) => {
358
+ console.log(semanticChalk.muted(` - ${file}`));
359
+ });
360
+ console.log();
361
+ return { diffContent, filePaths };
362
+ }
363
+ catch (error) {
364
+ throw new Error(`Failed to parse diff: ${error.message}`);
365
+ }
366
+ }
367
+ /**
368
+ * Display findings from Kotlin CodeReviewAgent with enhanced formatting
369
+ */
370
+ function displayKotlinFindings(findings) {
371
+ console.log(semanticChalk.info(`📋 Found ${findings.length} findings:`));
372
+ console.log();
373
+ // Group by severity
374
+ const critical = findings.filter(f => f.severity === 'CRITICAL');
375
+ const high = findings.filter(f => f.severity === 'HIGH');
376
+ const medium = findings.filter(f => f.severity === 'MEDIUM');
377
+ const low = findings.filter(f => f.severity === 'LOW' || f.severity === 'INFO');
378
+ // Helper to format a single finding
379
+ const formatFinding = (f, color) => {
380
+ // Build location string with method/class info
381
+ let location = f.filePath || 'N/A';
382
+ if (f.lineNumber) {
383
+ location += `:${f.lineNumber}`;
384
+ }
385
+ if (f.methodName || f.className) {
386
+ const context = [f.methodName, f.className].filter(Boolean).join(' / ');
387
+ location += ` in ${context}`;
388
+ }
389
+ console.log(color(` • ${f.description}`));
390
+ console.log(semanticChalk.muted(` 📍 ${location}`));
391
+ // Show source if available
392
+ if (f.source) {
393
+ const sourceIcon = f.source.toLowerCase().includes('linter') ? '🔍' : '👁️';
394
+ console.log(semanticChalk.muted(` ${sourceIcon} ${f.source}`));
395
+ }
396
+ // Show code snippet if available
397
+ if (f.codeSnippet) {
398
+ console.log(semanticChalk.muted(` 📝 Code:`));
399
+ f.codeSnippet.split('\n').forEach((line, idx) => {
400
+ if (idx < 5) { // Show max 5 lines
401
+ console.log(semanticChalk.muted(` ${line}`));
402
+ }
403
+ });
404
+ }
405
+ // Show suggestion
406
+ if (f.suggestion) {
407
+ const shortSuggestion = f.suggestion.length > 150
408
+ ? f.suggestion.substring(0, 150) + '...'
409
+ : f.suggestion;
410
+ console.log(semanticChalk.muted(` 💡 ${shortSuggestion}`));
411
+ }
412
+ console.log();
413
+ };
414
+ if (critical.length > 0) {
415
+ console.log(semanticChalk.error(`🔴 CRITICAL (${critical.length}):`));
416
+ console.log();
417
+ critical.forEach(f => formatFinding(f, semanticChalk.error));
418
+ }
419
+ if (high.length > 0) {
420
+ console.log(semanticChalk.warning(`🟠 HIGH (${high.length}):`));
421
+ console.log();
422
+ high.forEach(f => formatFinding(f, semanticChalk.warning));
423
+ }
424
+ if (medium.length > 0) {
425
+ console.log(semanticChalk.info(`🟡 MEDIUM (${medium.length}):`));
426
+ console.log();
427
+ medium.forEach(f => formatFinding(f, semanticChalk.info));
428
+ }
429
+ if (low.length > 0) {
430
+ console.log(semanticChalk.muted(`🟢 LOW/INFO (${low.length}):`));
431
+ console.log();
432
+ low.forEach(f => formatFinding(f, semanticChalk.muted));
433
+ }
434
+ }
435
+ //# sourceMappingURL=ReviewMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewMode.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/modes/ReviewMode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Modes Module - 模式系统导出
3
+ */
4
+ export type { Mode, ModeContext, ModeResult, ModeFactory } from './Mode.js';
5
+ export { ModeManager } from './ModeManager.js';
6
+ export type { ModeChangeEvent } from './ModeManager.js';
7
+ export { AgentMode, AgentModeFactory } from './AgentMode.js';
8
+ export { ChatMode, ChatModeFactory } from './ChatMode.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Modes Module - 模式系统导出
3
+ */
4
+ export { ModeManager } from './ModeManager.js';
5
+ export { AgentMode, AgentModeFactory } from './AgentMode.js';
6
+ export { ChatMode, ChatModeFactory } from './ChatMode.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/modes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * At Command Processor
3
+ *
4
+ * 处理 @ 符号引用,包括:
5
+ * - 代理引用:@code, @test
6
+ * - 文件引用:@file.txt, @src/main.ts
7
+ *
8
+ * 参考 Gemini CLI 的 atCommandProcessor.ts
9
+ */
10
+ import type { InputProcessor, ProcessorContext, ProcessorResult } from './InputRouter.js';
11
+ /**
12
+ * At 命令处理器
13
+ */
14
+ export declare class AtCommandProcessor implements InputProcessor {
15
+ name: string;
16
+ /**
17
+ * 判断是否可以处理
18
+ */
19
+ canHandle(input: string): boolean;
20
+ /**
21
+ * 处理 @ 引用
22
+ */
23
+ process(input: string, context: ProcessorContext): Promise<ProcessorResult>;
24
+ /**
25
+ * 解析所有 @ 引用
26
+ */
27
+ private parseAtReferences;
28
+ /**
29
+ * 预处理文件引用
30
+ * 读取文件内容并替换到输入中
31
+ */
32
+ private preprocessFileReferences;
33
+ }
34
+ //# sourceMappingURL=AtCommandProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AtCommandProcessor.d.ts","sourceRoot":"","sources":["../../../../src/jsMain/typescript/processors/AtCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAsB1F;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,IAAI,SAAwB;IAE5B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMjC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqCjF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;;OAGG;YACW,wBAAwB;CA6CvC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * At Command Processor
3
+ *
4
+ * 处理 @ 符号引用,包括:
5
+ * - 代理引用:@code, @test
6
+ * - 文件引用:@file.txt, @src/main.ts
7
+ *
8
+ * 参考 Gemini CLI 的 atCommandProcessor.ts
9
+ */
10
+ /**
11
+ * At 命令处理器
12
+ */
13
+ export class AtCommandProcessor {
14
+ name = 'AtCommandProcessor';
15
+ /**
16
+ * 判断是否可以处理
17
+ */
18
+ canHandle(input) {
19
+ // 必须包含有效的 @ 引用(@后面跟字母、数字、下划线、-、.、/)
20
+ const matches = input.match(/@([\w\-./]+)/);
21
+ return matches !== null && matches[1].length > 0;
22
+ }
23
+ /**
24
+ * 处理 @ 引用
25
+ */
26
+ async process(input, context) {
27
+ // 解析所有 @ 引用
28
+ const references = this.parseAtReferences(input);
29
+ if (references.length === 0) {
30
+ return { type: 'skip' };
31
+ }
32
+ context.logger.info(`[AtCommandProcessor] Found ${references.length} @ references`);
33
+ // 分类引用
34
+ const fileReferences = references.filter(ref => ref.isFilePath);
35
+ const agentReferences = references.filter(ref => !ref.isFilePath);
36
+ // 如果只有代理引用(无文件路径),委托给编译器
37
+ if (fileReferences.length === 0) {
38
+ context.logger.info('[AtCommandProcessor] Only agent references, delegating to compiler');
39
+ return { type: 'compile', devins: input };
40
+ }
41
+ // 如果包含文件路径,需要预处理
42
+ try {
43
+ const processedQuery = await this.preprocessFileReferences(input, fileReferences, context);
44
+ return { type: 'llm-query', query: processedQuery };
45
+ }
46
+ catch (error) {
47
+ context.logger.error('[AtCommandProcessor] Failed to preprocess file references:', error);
48
+ // 预处理失败,仍然委托给编译器尝试
49
+ return { type: 'compile', devins: input };
50
+ }
51
+ }
52
+ /**
53
+ * 解析所有 @ 引用
54
+ */
55
+ parseAtReferences(input) {
56
+ const references = [];
57
+ const regex = /@([\w\-./]+)/g;
58
+ let match;
59
+ while ((match = regex.exec(input)) !== null) {
60
+ const raw = match[0];
61
+ const content = match[1];
62
+ const startIndex = match.index;
63
+ const endIndex = startIndex + raw.length;
64
+ // 判断是否是文件路径(包含 / 或 . 或常见扩展名)
65
+ const isFilePath = content.includes('/') ||
66
+ content.includes('.') ||
67
+ /\.(ts|tsx|js|jsx|kt|java|py|md|txt)$/i.test(content);
68
+ references.push({
69
+ raw,
70
+ content,
71
+ isFilePath,
72
+ startIndex,
73
+ endIndex
74
+ });
75
+ }
76
+ return references;
77
+ }
78
+ /**
79
+ * 预处理文件引用
80
+ * 读取文件内容并替换到输入中
81
+ */
82
+ async preprocessFileReferences(input, references, context) {
83
+ if (!context.readFile) {
84
+ context.logger.warn('[AtCommandProcessor] readFile not available in context');
85
+ throw new Error('File reading not supported');
86
+ }
87
+ // 读取所有文件内容
88
+ const fileContents = new Map();
89
+ for (const ref of references) {
90
+ try {
91
+ context.logger.info(`[AtCommandProcessor] Reading file: ${ref.content}`);
92
+ const content = await context.readFile(ref.content);
93
+ fileContents.set(ref.content, content);
94
+ }
95
+ catch (error) {
96
+ context.logger.warn(`[AtCommandProcessor] Failed to read ${ref.content}: ${error}`);
97
+ // 继续处理其他文件
98
+ }
99
+ }
100
+ // 如果没有成功读取任何文件,抛出错误
101
+ if (fileContents.size === 0) {
102
+ throw new Error('Failed to read any referenced files');
103
+ }
104
+ // 替换 @file 为实际内容
105
+ let processedQuery = input;
106
+ for (const [path, content] of fileContents.entries()) {
107
+ // 转义特殊字符用于正则表达式
108
+ const escapedPath = path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
109
+ const pattern = new RegExp(`@${escapedPath}`, 'g');
110
+ // 替换为格式化的文件内容
111
+ const replacement = `\n<file path="${path}">\n${content}\n</file>\n`;
112
+ processedQuery = processedQuery.replace(pattern, replacement);
113
+ }
114
+ context.logger.info('[AtCommandProcessor] File references preprocessed successfully');
115
+ return processedQuery;
116
+ }
117
+ }
118
+ //# sourceMappingURL=AtCommandProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AtCommandProcessor.js","sourceRoot":"","sources":["../../../../src/jsMain/typescript/processors/AtCommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwBH;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B,IAAI,GAAG,oBAAoB,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,KAAa;QACrB,oCAAoC;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC5C,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAyB;QACpD,YAAY;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;QAEpF,OAAO;QACP,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAElE,yBAAyB;QACzB,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YAC1F,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,wBAAwB,CACxD,KAAK,EACL,cAAc,EACd,OAAO,CACR,CAAC;YAEF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,EAAE,KAAK,CAAC,CAAC;YAE1F,mBAAmB;YACnB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAa;QACrC,MAAM,UAAU,GAAkB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;YAC/B,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;YAEzC,6BAA6B;YAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACrB,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAExE,UAAU,CAAC,IAAI,CAAC;gBACd,GAAG;gBACH,OAAO;gBACP,UAAU;gBACV,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CACpC,KAAa,EACb,UAAyB,EACzB,OAAyB;QAEzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,WAAW;QACX,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACpD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;gBACpF,WAAW;YACb,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,iBAAiB;QACjB,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACrD,gBAAgB;YAChB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YAEnD,cAAc;YACd,MAAM,WAAW,GAAG,iBAAiB,IAAI,OAAO,OAAO,aAAa,CAAC;YACrE,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACtF,OAAO,cAAc,CAAC;IACxB,CAAC;CACF"}