codereview-aia 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/dist/analysis/FindingsExtractor.d.ts +105 -0
  2. package/dist/analysis/FindingsExtractor.js +363 -0
  3. package/dist/analysis/FindingsExtractor.js.map +1 -0
  4. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.d.ts +111 -0
  5. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js +215 -0
  6. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js.map +1 -0
  7. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.d.ts +142 -0
  8. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js +503 -0
  9. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js.map +1 -0
  10. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.d.ts +88 -0
  11. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js +343 -0
  12. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js.map +1 -0
  13. package/dist/analysis/ai-detection/core/AIDetectionEngine.d.ts +104 -0
  14. package/dist/analysis/ai-detection/core/AIDetectionEngine.js +369 -0
  15. package/dist/analysis/ai-detection/core/AIDetectionEngine.js.map +1 -0
  16. package/dist/analysis/ai-detection/types/DetectionTypes.d.ts +364 -0
  17. package/dist/analysis/ai-detection/types/DetectionTypes.js +32 -0
  18. package/dist/analysis/ai-detection/types/DetectionTypes.js.map +1 -0
  19. package/dist/analysis/ai-detection/utils/SubmissionConverter.d.ts +97 -0
  20. package/dist/analysis/ai-detection/utils/SubmissionConverter.js +339 -0
  21. package/dist/analysis/ai-detection/utils/SubmissionConverter.js.map +1 -0
  22. package/dist/analysis/context/ReviewContext.d.ts +184 -0
  23. package/dist/analysis/context/ReviewContext.js +294 -0
  24. package/dist/analysis/context/ReviewContext.js.map +1 -0
  25. package/{src/analysis/context/index.ts → dist/analysis/context/index.d.ts} +0 -1
  26. package/dist/analysis/context/index.js +23 -0
  27. package/dist/analysis/context/index.js.map +1 -0
  28. package/{src/analysis/index.ts → dist/analysis/index.d.ts} +0 -1
  29. package/dist/analysis/index.js +24 -0
  30. package/dist/analysis/index.js.map +1 -0
  31. package/dist/analysis/static/wpPhpcsRunner.d.ts +11 -0
  32. package/dist/analysis/static/wpPhpcsRunner.js +219 -0
  33. package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
  34. package/dist/analysis/tokens/TokenAnalysisFormatter.d.ts +27 -0
  35. package/{src/analysis/tokens/TokenAnalysisFormatter.ts → dist/analysis/tokens/TokenAnalysisFormatter.js} +64 -75
  36. package/dist/analysis/tokens/TokenAnalysisFormatter.js.map +1 -0
  37. package/dist/analysis/tokens/TokenAnalyzer.d.ts +155 -0
  38. package/dist/analysis/tokens/TokenAnalyzer.js +502 -0
  39. package/dist/analysis/tokens/TokenAnalyzer.js.map +1 -0
  40. package/{src/analysis/tokens/index.ts → dist/analysis/tokens/index.d.ts} +0 -1
  41. package/dist/analysis/tokens/index.js +24 -0
  42. package/dist/analysis/tokens/index.js.map +1 -0
  43. package/dist/clients/base/abstractClient.d.ts +99 -0
  44. package/dist/clients/base/abstractClient.js +98 -0
  45. package/dist/clients/base/abstractClient.js.map +1 -0
  46. package/dist/clients/base/httpClient.d.ts +24 -0
  47. package/dist/clients/base/httpClient.js +147 -0
  48. package/dist/clients/base/httpClient.js.map +1 -0
  49. package/{src/clients/base/index.ts → dist/clients/base/index.d.ts} +0 -1
  50. package/dist/clients/base/index.js +28 -0
  51. package/dist/clients/base/index.js.map +1 -0
  52. package/dist/clients/base/modelDetection.d.ts +41 -0
  53. package/dist/clients/base/modelDetection.js +88 -0
  54. package/dist/clients/base/modelDetection.js.map +1 -0
  55. package/dist/clients/base/responseProcessor.d.ts +45 -0
  56. package/dist/clients/base/responseProcessor.js +495 -0
  57. package/dist/clients/base/responseProcessor.js.map +1 -0
  58. package/dist/clients/factory/clientFactory.d.ts +23 -0
  59. package/dist/clients/factory/clientFactory.js +50 -0
  60. package/dist/clients/factory/clientFactory.js.map +1 -0
  61. package/{src/clients/factory/index.ts → dist/clients/factory/index.d.ts} +0 -1
  62. package/dist/clients/factory/index.js +24 -0
  63. package/dist/clients/factory/index.js.map +1 -0
  64. package/{src/clients/implementations/index.ts → dist/clients/implementations/index.d.ts} +0 -1
  65. package/dist/clients/implementations/index.js +24 -0
  66. package/dist/clients/implementations/index.js.map +1 -0
  67. package/dist/clients/implementations/openRouterClient.d.ts +69 -0
  68. package/dist/clients/implementations/openRouterClient.js +294 -0
  69. package/dist/clients/implementations/openRouterClient.js.map +1 -0
  70. package/dist/clients/openRouterClient.d.ts +42 -0
  71. package/dist/clients/openRouterClient.js +580 -0
  72. package/dist/clients/openRouterClient.js.map +1 -0
  73. package/{src/clients/openRouterClientWrapper.ts → dist/clients/openRouterClientWrapper.d.ts} +2 -24
  74. package/dist/clients/openRouterClientWrapper.js +64 -0
  75. package/dist/clients/openRouterClientWrapper.js.map +1 -0
  76. package/dist/clients/utils/directoryStructure.d.ts +14 -0
  77. package/dist/clients/utils/directoryStructure.js +48 -0
  78. package/dist/clients/utils/directoryStructure.js.map +1 -0
  79. package/{src/clients/utils/index.ts → dist/clients/utils/index.d.ts} +0 -1
  80. package/dist/clients/utils/index.js +31 -0
  81. package/dist/clients/utils/index.js.map +1 -0
  82. package/dist/clients/utils/languageDetection.d.ts +13 -0
  83. package/dist/clients/utils/languageDetection.js +46 -0
  84. package/dist/clients/utils/languageDetection.js.map +1 -0
  85. package/dist/clients/utils/promptFormatter.d.ts +37 -0
  86. package/dist/clients/utils/promptFormatter.js +150 -0
  87. package/dist/clients/utils/promptFormatter.js.map +1 -0
  88. package/{src/clients/utils/promptLoader.ts → dist/clients/utils/promptLoader.d.ts} +1 -27
  89. package/dist/clients/utils/promptLoader.js +49 -0
  90. package/dist/clients/utils/promptLoader.js.map +1 -0
  91. package/dist/clients/utils/tokenCounter.d.ts +81 -0
  92. package/dist/clients/utils/tokenCounter.js +184 -0
  93. package/dist/clients/utils/tokenCounter.js.map +1 -0
  94. package/dist/core/ApiClientSelector.d.ts +8 -0
  95. package/dist/core/ApiClientSelector.js +29 -0
  96. package/dist/core/ApiClientSelector.js.map +1 -0
  97. package/dist/core/ConfigurationService.d.ts +307 -0
  98. package/dist/core/ConfigurationService.js +516 -0
  99. package/dist/core/ConfigurationService.js.map +1 -0
  100. package/dist/core/ConsolidationService.d.ts +99 -0
  101. package/dist/core/ConsolidationService.js +341 -0
  102. package/dist/core/ConsolidationService.js.map +1 -0
  103. package/dist/core/InteractiveDisplayManager.d.ts +22 -0
  104. package/dist/core/InteractiveDisplayManager.js +70 -0
  105. package/dist/core/InteractiveDisplayManager.js.map +1 -0
  106. package/dist/core/OutputManager.d.ts +26 -0
  107. package/dist/core/OutputManager.js +217 -0
  108. package/dist/core/OutputManager.js.map +1 -0
  109. package/dist/core/ReviewGenerator.d.ts +13 -0
  110. package/dist/core/ReviewGenerator.js +102 -0
  111. package/dist/core/ReviewGenerator.js.map +1 -0
  112. package/dist/core/fileDiscovery.d.ts +35 -0
  113. package/dist/core/fileDiscovery.js +202 -0
  114. package/dist/core/fileDiscovery.js.map +1 -0
  115. package/dist/core/handlers/EstimationHandler.d.ts +18 -0
  116. package/dist/core/handlers/EstimationHandler.js +110 -0
  117. package/dist/core/handlers/EstimationHandler.js.map +1 -0
  118. package/dist/core/handlers/FileProcessingHandler.d.ts +31 -0
  119. package/dist/core/handlers/FileProcessingHandler.js +164 -0
  120. package/dist/core/handlers/FileProcessingHandler.js.map +1 -0
  121. package/dist/core/handlers/OutputHandler.d.ts +27 -0
  122. package/dist/core/handlers/OutputHandler.js +127 -0
  123. package/dist/core/handlers/OutputHandler.js.map +1 -0
  124. package/dist/core/handlers/ReviewExecutor.d.ts +32 -0
  125. package/dist/core/handlers/ReviewExecutor.js +111 -0
  126. package/dist/core/handlers/ReviewExecutor.js.map +1 -0
  127. package/dist/core/reviewOrchestrator.d.ts +24 -0
  128. package/dist/core/reviewOrchestrator.js +354 -0
  129. package/dist/core/reviewOrchestrator.js.map +1 -0
  130. package/dist/core/utils/ModelInfoUtils.d.ts +16 -0
  131. package/dist/core/utils/ModelInfoUtils.js +54 -0
  132. package/dist/core/utils/ModelInfoUtils.js.map +1 -0
  133. package/{src/formatters/outputFormatter.ts → dist/formatters/outputFormatter.d.ts} +2 -33
  134. package/dist/formatters/outputFormatter.js +65 -0
  135. package/dist/formatters/outputFormatter.js.map +1 -0
  136. package/dist/formatters/utils/IssueFormatters.d.ts +20 -0
  137. package/dist/formatters/utils/IssueFormatters.js +67 -0
  138. package/dist/formatters/utils/IssueFormatters.js.map +1 -0
  139. package/dist/formatters/utils/JsonFormatter.d.ts +13 -0
  140. package/dist/formatters/utils/JsonFormatter.js +57 -0
  141. package/dist/formatters/utils/JsonFormatter.js.map +1 -0
  142. package/dist/formatters/utils/MarkdownFormatters.d.ts +51 -0
  143. package/dist/formatters/utils/MarkdownFormatters.js +456 -0
  144. package/dist/formatters/utils/MarkdownFormatters.js.map +1 -0
  145. package/dist/formatters/utils/MetadataFormatter.d.ts +65 -0
  146. package/dist/formatters/utils/MetadataFormatter.js +219 -0
  147. package/dist/formatters/utils/MetadataFormatter.js.map +1 -0
  148. package/dist/formatters/utils/ModelInfoExtractor.d.ts +33 -0
  149. package/dist/formatters/utils/ModelInfoExtractor.js +111 -0
  150. package/dist/formatters/utils/ModelInfoExtractor.js.map +1 -0
  151. package/dist/index.d.ts +1 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/plugins/PluginInterface.d.ts +44 -0
  154. package/dist/plugins/PluginInterface.js +9 -0
  155. package/dist/plugins/PluginInterface.js.map +1 -0
  156. package/dist/plugins/PluginManager.d.ts +51 -0
  157. package/dist/plugins/PluginManager.js +151 -0
  158. package/dist/plugins/PluginManager.js.map +1 -0
  159. package/dist/prompts/PromptManager.d.ts +30 -0
  160. package/dist/prompts/PromptManager.js +62 -0
  161. package/dist/prompts/PromptManager.js.map +1 -0
  162. package/dist/prompts/cache/PromptCache.d.ts +32 -0
  163. package/dist/prompts/cache/PromptCache.js +48 -0
  164. package/dist/prompts/cache/PromptCache.js.map +1 -0
  165. package/dist/runtime/auth/service.d.ts +2 -0
  166. package/dist/runtime/auth/service.js +41 -0
  167. package/dist/runtime/auth/service.js.map +1 -0
  168. package/dist/runtime/auth/session.d.ts +5 -0
  169. package/dist/runtime/auth/session.js +87 -0
  170. package/dist/runtime/auth/session.js.map +1 -0
  171. package/dist/runtime/auth/types.d.ts +9 -0
  172. package/dist/runtime/auth/types.js +3 -0
  173. package/dist/runtime/auth/types.js.map +1 -0
  174. package/dist/runtime/cliEntry.d.ts +1 -0
  175. package/dist/runtime/cliEntry.js +276 -0
  176. package/dist/runtime/cliEntry.js.map +1 -0
  177. package/dist/runtime/debug/logManager.d.ts +5 -0
  178. package/dist/runtime/debug/logManager.js +31 -0
  179. package/dist/runtime/debug/logManager.js.map +1 -0
  180. package/dist/runtime/errors.d.ts +5 -0
  181. package/dist/runtime/errors.js +15 -0
  182. package/dist/runtime/errors.js.map +1 -0
  183. package/dist/runtime/fileCollector.d.ts +14 -0
  184. package/dist/runtime/fileCollector.js +381 -0
  185. package/dist/runtime/fileCollector.js.map +1 -0
  186. package/dist/runtime/manifest.d.ts +1 -0
  187. package/dist/runtime/manifest.js +65 -0
  188. package/dist/runtime/manifest.js.map +1 -0
  189. package/dist/runtime/openrouterProxy.d.ts +4 -0
  190. package/dist/runtime/openrouterProxy.js +43 -0
  191. package/dist/runtime/openrouterProxy.js.map +1 -0
  192. package/dist/runtime/preprod/batchStreamer.d.ts +54 -0
  193. package/dist/runtime/preprod/batchStreamer.js +159 -0
  194. package/dist/runtime/preprod/batchStreamer.js.map +1 -0
  195. package/dist/runtime/preprod/crEdgeServiceClient.d.ts +30 -0
  196. package/dist/runtime/preprod/crEdgeServiceClient.js +133 -0
  197. package/dist/runtime/preprod/crEdgeServiceClient.js.map +1 -0
  198. package/dist/runtime/preprod/progressTracker.d.ts +21 -0
  199. package/dist/runtime/preprod/progressTracker.js +80 -0
  200. package/dist/runtime/preprod/progressTracker.js.map +1 -0
  201. package/dist/runtime/preprod/webCheck.d.ts +1 -0
  202. package/dist/runtime/preprod/webCheck.js +102 -0
  203. package/dist/runtime/preprod/webCheck.js.map +1 -0
  204. package/dist/runtime/proxyConfig.d.ts +6 -0
  205. package/dist/runtime/proxyConfig.js +86 -0
  206. package/dist/runtime/proxyConfig.js.map +1 -0
  207. package/dist/runtime/proxyEnvironment.d.ts +3 -0
  208. package/dist/runtime/proxyEnvironment.js +63 -0
  209. package/dist/runtime/proxyEnvironment.js.map +1 -0
  210. package/dist/runtime/reportMerge.d.ts +30 -0
  211. package/dist/runtime/reportMerge.js +70 -0
  212. package/dist/runtime/reportMerge.js.map +1 -0
  213. package/dist/runtime/reporting/markdownReportBuilder.d.ts +17 -0
  214. package/dist/runtime/reporting/markdownReportBuilder.js +154 -0
  215. package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -0
  216. package/dist/runtime/reporting/reportDataCollector.d.ts +31 -0
  217. package/dist/runtime/reporting/reportDataCollector.js +170 -0
  218. package/dist/runtime/reporting/reportDataCollector.js.map +1 -0
  219. package/dist/runtime/reporting/summaryGenerator.d.ts +10 -0
  220. package/dist/runtime/reporting/summaryGenerator.js +67 -0
  221. package/dist/runtime/reporting/summaryGenerator.js.map +1 -0
  222. package/dist/runtime/reviewPipeline.d.ts +61 -0
  223. package/dist/runtime/reviewPipeline.js +231 -0
  224. package/dist/runtime/reviewPipeline.js.map +1 -0
  225. package/dist/runtime/runAiCodeReview.d.ts +36 -0
  226. package/dist/runtime/runAiCodeReview.js +409 -0
  227. package/dist/runtime/runAiCodeReview.js.map +1 -0
  228. package/dist/runtime/runtimeConfig.d.ts +4 -0
  229. package/dist/runtime/runtimeConfig.js +7 -0
  230. package/dist/runtime/runtimeConfig.js.map +1 -0
  231. package/dist/runtime/ui/Layout.d.ts +11 -0
  232. package/dist/runtime/ui/Layout.js +47 -0
  233. package/dist/runtime/ui/Layout.js.map +1 -0
  234. package/dist/runtime/ui/RuntimeApp.d.ts +6 -0
  235. package/dist/runtime/ui/RuntimeApp.js +275 -0
  236. package/dist/runtime/ui/RuntimeApp.js.map +1 -0
  237. package/dist/runtime/ui/inkModules.d.ts +10 -0
  238. package/dist/runtime/ui/inkModules.js +63 -0
  239. package/dist/runtime/ui/inkModules.js.map +1 -0
  240. package/dist/runtime/ui/screens/AuthScreen.d.ts +6 -0
  241. package/dist/runtime/ui/screens/AuthScreen.js +67 -0
  242. package/dist/runtime/ui/screens/AuthScreen.js.map +1 -0
  243. package/dist/runtime/ui/screens/ModeSelection.d.ts +11 -0
  244. package/dist/runtime/ui/screens/ModeSelection.js +169 -0
  245. package/dist/runtime/ui/screens/ModeSelection.js.map +1 -0
  246. package/dist/runtime/ui/screens/ProgressScreen.d.ts +21 -0
  247. package/dist/runtime/ui/screens/ProgressScreen.js +86 -0
  248. package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -0
  249. package/dist/runtime/ui/screens/ResultsScreen.d.ts +7 -0
  250. package/dist/runtime/ui/screens/ResultsScreen.js +34 -0
  251. package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -0
  252. package/dist/strategies/ArchitecturalReviewStrategy.d.ts +29 -0
  253. package/dist/strategies/ArchitecturalReviewStrategy.js +42 -0
  254. package/dist/strategies/ArchitecturalReviewStrategy.js.map +1 -0
  255. package/dist/strategies/CodingTestReviewStrategy.d.ts +194 -0
  256. package/dist/strategies/CodingTestReviewStrategy.js +681 -0
  257. package/dist/strategies/CodingTestReviewStrategy.js.map +1 -0
  258. package/dist/strategies/ConsolidatedReviewStrategy.d.ts +25 -0
  259. package/dist/strategies/ConsolidatedReviewStrategy.js +45 -0
  260. package/dist/strategies/ConsolidatedReviewStrategy.js.map +1 -0
  261. package/dist/strategies/ExtractPatternsReviewStrategy.d.ts +30 -0
  262. package/dist/strategies/ExtractPatternsReviewStrategy.js +51 -0
  263. package/dist/strategies/ExtractPatternsReviewStrategy.js.map +1 -0
  264. package/dist/strategies/MultiPassReviewStrategy.d.ts +86 -0
  265. package/dist/strategies/MultiPassReviewStrategy.js +590 -0
  266. package/dist/strategies/MultiPassReviewStrategy.js.map +1 -0
  267. package/dist/strategies/ReviewStrategy.d.ts +45 -0
  268. package/dist/strategies/ReviewStrategy.js +24 -0
  269. package/dist/strategies/ReviewStrategy.js.map +1 -0
  270. package/dist/strategies/StrategyFactory.d.ts +19 -0
  271. package/dist/strategies/StrategyFactory.js +72 -0
  272. package/dist/strategies/StrategyFactory.js.map +1 -0
  273. package/{src/strategies/index.ts → dist/strategies/index.d.ts} +0 -1
  274. package/dist/strategies/index.js +30 -0
  275. package/dist/strategies/index.js.map +1 -0
  276. package/dist/tokenizers/baseTokenizer.d.ts +25 -0
  277. package/dist/tokenizers/baseTokenizer.js +48 -0
  278. package/dist/tokenizers/baseTokenizer.js.map +1 -0
  279. package/dist/tokenizers/gptTokenizer.d.ts +7 -0
  280. package/dist/tokenizers/gptTokenizer.js +28 -0
  281. package/dist/tokenizers/gptTokenizer.js.map +1 -0
  282. package/{src/tokenizers/index.ts → dist/tokenizers/index.d.ts} +0 -1
  283. package/dist/tokenizers/index.js +24 -0
  284. package/dist/tokenizers/index.js.map +1 -0
  285. package/dist/types/apiResponses.d.ts +39 -0
  286. package/dist/types/apiResponses.js +9 -0
  287. package/dist/types/apiResponses.js.map +1 -0
  288. package/dist/types/cli.d.ts +22 -0
  289. package/dist/types/cli.js +3 -0
  290. package/dist/types/cli.js.map +1 -0
  291. package/{src/types/common.ts → dist/types/common.d.ts} +2 -19
  292. package/dist/types/common.js +14 -0
  293. package/dist/types/common.js.map +1 -0
  294. package/dist/types/configuration.d.ts +682 -0
  295. package/dist/types/configuration.js +65 -0
  296. package/dist/types/configuration.js.map +1 -0
  297. package/dist/types/review.d.ts +318 -0
  298. package/dist/types/review.js +8 -0
  299. package/dist/types/review.js.map +1 -0
  300. package/dist/types/reviewSchema.d.ts +543 -0
  301. package/{src/types/reviewSchema.ts → dist/types/reviewSchema.js} +44 -104
  302. package/dist/types/reviewSchema.js.map +1 -0
  303. package/dist/types/structuredReview.d.ts +119 -0
  304. package/dist/types/structuredReview.js +6 -0
  305. package/dist/types/structuredReview.js.map +1 -0
  306. package/dist/types/tokenAnalysis.d.ts +44 -0
  307. package/dist/types/tokenAnalysis.js +4 -0
  308. package/dist/types/tokenAnalysis.js.map +1 -0
  309. package/dist/utils/FileReader.d.ts +33 -0
  310. package/dist/utils/FileReader.js +88 -0
  311. package/dist/utils/FileReader.js.map +1 -0
  312. package/dist/utils/FileWriter.d.ts +26 -0
  313. package/dist/utils/FileWriter.js +76 -0
  314. package/dist/utils/FileWriter.js.map +1 -0
  315. package/dist/utils/PathGenerator.d.ts +30 -0
  316. package/dist/utils/PathGenerator.js +82 -0
  317. package/dist/utils/PathGenerator.js.map +1 -0
  318. package/dist/utils/api/apiUtils.d.ts +3 -0
  319. package/dist/utils/api/apiUtils.js +20 -0
  320. package/dist/utils/api/apiUtils.js.map +1 -0
  321. package/dist/utils/api/index.js +18 -0
  322. package/dist/utils/api/index.js.map +1 -0
  323. package/dist/utils/apiErrorHandler.d.ts +130 -0
  324. package/dist/utils/apiErrorHandler.js +256 -0
  325. package/dist/utils/apiErrorHandler.js.map +1 -0
  326. package/dist/utils/ciDataCollector.d.ts +51 -0
  327. package/dist/utils/ciDataCollector.js +197 -0
  328. package/dist/utils/ciDataCollector.js.map +1 -0
  329. package/dist/utils/codingTestConfigLoader.d.ts +66 -0
  330. package/dist/utils/codingTestConfigLoader.js +420 -0
  331. package/dist/utils/codingTestConfigLoader.js.map +1 -0
  332. package/dist/utils/dependencies/aiDependencyAnalyzer.d.ts +30 -0
  333. package/dist/utils/dependencies/aiDependencyAnalyzer.js +343 -0
  334. package/dist/utils/dependencies/aiDependencyAnalyzer.js.map +1 -0
  335. package/dist/utils/detection/frameworkDetector.d.ts +43 -0
  336. package/dist/utils/detection/frameworkDetector.js +850 -0
  337. package/dist/utils/detection/frameworkDetector.js.map +1 -0
  338. package/{src/utils/detection/index.ts → dist/utils/detection/index.d.ts} +0 -1
  339. package/dist/utils/detection/index.js +28 -0
  340. package/dist/utils/detection/index.js.map +1 -0
  341. package/dist/utils/detection/projectTypeDetector.d.ts +27 -0
  342. package/dist/utils/detection/projectTypeDetector.js +469 -0
  343. package/dist/utils/detection/projectTypeDetector.js.map +1 -0
  344. package/dist/utils/diagramGenerator.d.ts +49 -0
  345. package/dist/utils/diagramGenerator.js +218 -0
  346. package/dist/utils/diagramGenerator.js.map +1 -0
  347. package/dist/utils/errorLogger.d.ts +24 -0
  348. package/dist/utils/errorLogger.js +59 -0
  349. package/dist/utils/errorLogger.js.map +1 -0
  350. package/dist/utils/estimationUtils.d.ts +139 -0
  351. package/dist/utils/estimationUtils.js +329 -0
  352. package/dist/utils/estimationUtils.js.map +1 -0
  353. package/dist/utils/fileFilters.d.ts +72 -0
  354. package/dist/utils/fileFilters.js +338 -0
  355. package/dist/utils/fileFilters.js.map +1 -0
  356. package/dist/utils/fileSystem.d.ts +22 -0
  357. package/dist/utils/fileSystem.js +45 -0
  358. package/dist/utils/fileSystem.js.map +1 -0
  359. package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -14
  360. package/dist/utils/index.js +52 -0
  361. package/dist/utils/index.js.map +1 -0
  362. package/dist/utils/logger.d.ts +77 -0
  363. package/dist/utils/logger.js +271 -0
  364. package/dist/utils/logger.js.map +1 -0
  365. package/dist/utils/pathValidator.d.ts +40 -0
  366. package/dist/utils/pathValidator.js +98 -0
  367. package/dist/utils/pathValidator.js.map +1 -0
  368. package/{src/utils/priorityFilter.ts → dist/utils/priorityFilter.d.ts} +1 -26
  369. package/dist/utils/priorityFilter.js +54 -0
  370. package/dist/utils/priorityFilter.js.map +1 -0
  371. package/dist/utils/projectDocs.d.ts +47 -0
  372. package/dist/utils/projectDocs.js +158 -0
  373. package/dist/utils/projectDocs.js.map +1 -0
  374. package/dist/utils/promptPaths.d.ts +6 -0
  375. package/dist/utils/promptPaths.js +33 -0
  376. package/dist/utils/promptPaths.js.map +1 -0
  377. package/dist/utils/promptTemplateManager.d.ts +34 -0
  378. package/dist/utils/promptTemplateManager.js +141 -0
  379. package/dist/utils/promptTemplateManager.js.map +1 -0
  380. package/dist/utils/review/consolidateReview.d.ts +15 -0
  381. package/dist/utils/review/consolidateReview.js +481 -0
  382. package/dist/utils/review/consolidateReview.js.map +1 -0
  383. package/dist/utils/review/fixDisplay.d.ts +20 -0
  384. package/dist/utils/review/fixDisplay.js +84 -0
  385. package/dist/utils/review/fixDisplay.js.map +1 -0
  386. package/dist/utils/review/fixImplementation.d.ts +28 -0
  387. package/dist/utils/review/fixImplementation.js +60 -0
  388. package/dist/utils/review/fixImplementation.js.map +1 -0
  389. package/dist/utils/review/index.d.ts +13 -0
  390. package/dist/utils/review/index.js +50 -0
  391. package/dist/utils/review/index.js.map +1 -0
  392. package/dist/utils/review/interactiveProcessing.d.ts +25 -0
  393. package/dist/utils/review/interactiveProcessing.js +251 -0
  394. package/dist/utils/review/interactiveProcessing.js.map +1 -0
  395. package/dist/utils/review/progressTracker.d.ts +106 -0
  396. package/dist/utils/review/progressTracker.js +227 -0
  397. package/dist/utils/review/progressTracker.js.map +1 -0
  398. package/dist/utils/review/reviewExtraction.d.ts +31 -0
  399. package/dist/utils/review/reviewExtraction.js +324 -0
  400. package/dist/utils/review/reviewExtraction.js.map +1 -0
  401. package/dist/utils/review/types.d.ts +45 -0
  402. package/dist/utils/review/types.js +18 -0
  403. package/dist/utils/review/types.js.map +1 -0
  404. package/{src/utils/reviewActionHandler.ts → dist/utils/reviewActionHandler.d.ts} +0 -2
  405. package/dist/utils/reviewActionHandler.js +34 -0
  406. package/dist/utils/reviewActionHandler.js.map +1 -0
  407. package/dist/utils/reviewParser.d.ts +34 -0
  408. package/dist/utils/reviewParser.js +218 -0
  409. package/dist/utils/reviewParser.js.map +1 -0
  410. package/dist/utils/sanitizer.d.ts +82 -0
  411. package/dist/utils/sanitizer.js +239 -0
  412. package/dist/utils/sanitizer.js.map +1 -0
  413. package/dist/utils/smartFileSelector.d.ts +50 -0
  414. package/dist/utils/smartFileSelector.js +261 -0
  415. package/dist/utils/smartFileSelector.js.map +1 -0
  416. package/dist/utils/templateLoader.d.ts +44 -0
  417. package/dist/utils/templateLoader.js +431 -0
  418. package/dist/utils/templateLoader.js.map +1 -0
  419. package/dist/utils/treeGenerator.d.ts +12 -0
  420. package/dist/utils/treeGenerator.js +133 -0
  421. package/dist/utils/treeGenerator.js.map +1 -0
  422. package/package.json +5 -1
  423. package/.cr-aia.yml +0 -23
  424. package/.crignore +0 -0
  425. package/docs/opt-in-full-context.md +0 -27
  426. package/reports/cr-cr-aia-17-11-2025-20-13.md +0 -354
  427. package/src/analysis/FindingsExtractor.ts +0 -431
  428. package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
  429. package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
  430. package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
  431. package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
  432. package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
  433. package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
  434. package/src/analysis/context/ReviewContext.ts +0 -378
  435. package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
  436. package/src/clients/base/abstractClient.ts +0 -190
  437. package/src/clients/base/httpClient.ts +0 -160
  438. package/src/clients/base/modelDetection.ts +0 -107
  439. package/src/clients/base/responseProcessor.ts +0 -586
  440. package/src/clients/factory/clientFactory.ts +0 -55
  441. package/src/clients/implementations/openRouterClient.ts +0 -413
  442. package/src/clients/openRouterClient.ts +0 -870
  443. package/src/clients/utils/directoryStructure.ts +0 -52
  444. package/src/clients/utils/languageDetection.ts +0 -44
  445. package/src/clients/utils/promptFormatter.ts +0 -182
  446. package/src/clients/utils/tokenCounter.ts +0 -297
  447. package/src/core/ApiClientSelector.ts +0 -37
  448. package/src/core/ConfigurationService.ts +0 -591
  449. package/src/core/ConsolidationService.ts +0 -423
  450. package/src/core/InteractiveDisplayManager.ts +0 -81
  451. package/src/core/OutputManager.ts +0 -275
  452. package/src/core/ReviewGenerator.ts +0 -140
  453. package/src/core/fileDiscovery.ts +0 -237
  454. package/src/core/handlers/EstimationHandler.ts +0 -104
  455. package/src/core/handlers/FileProcessingHandler.ts +0 -210
  456. package/src/core/handlers/OutputHandler.ts +0 -125
  457. package/src/core/handlers/ReviewExecutor.ts +0 -104
  458. package/src/core/reviewOrchestrator.ts +0 -333
  459. package/src/core/utils/ModelInfoUtils.ts +0 -56
  460. package/src/formatters/utils/IssueFormatters.ts +0 -83
  461. package/src/formatters/utils/JsonFormatter.ts +0 -77
  462. package/src/formatters/utils/MarkdownFormatters.ts +0 -609
  463. package/src/formatters/utils/MetadataFormatter.ts +0 -269
  464. package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
  465. package/src/index.ts +0 -25
  466. package/src/plugins/PluginInterface.ts +0 -50
  467. package/src/plugins/PluginManager.ts +0 -126
  468. package/src/prompts/PromptManager.ts +0 -69
  469. package/src/prompts/cache/PromptCache.ts +0 -50
  470. package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
  471. package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
  472. package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
  473. package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
  474. package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
  475. package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
  476. package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
  477. package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
  478. package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
  479. package/src/runtime/auth/service.ts +0 -58
  480. package/src/runtime/auth/session.ts +0 -103
  481. package/src/runtime/auth/types.ts +0 -11
  482. package/src/runtime/cliEntry.ts +0 -214
  483. package/src/runtime/debug/logManager.ts +0 -37
  484. package/src/runtime/errors.ts +0 -13
  485. package/src/runtime/fileCollector.ts +0 -495
  486. package/src/runtime/manifest.ts +0 -64
  487. package/src/runtime/openrouterProxy.ts +0 -45
  488. package/src/runtime/preprod/webCheck.ts +0 -104
  489. package/src/runtime/proxyConfig.ts +0 -94
  490. package/src/runtime/proxyEnvironment.ts +0 -71
  491. package/src/runtime/reportMerge.ts +0 -102
  492. package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
  493. package/src/runtime/reporting/reportDataCollector.ts +0 -234
  494. package/src/runtime/reporting/summaryGenerator.ts +0 -86
  495. package/src/runtime/reviewPipeline.ts +0 -200
  496. package/src/runtime/runAiCodeReview.ts +0 -308
  497. package/src/runtime/runtimeConfig.ts +0 -5
  498. package/src/runtime/ui/Layout.tsx +0 -57
  499. package/src/runtime/ui/RuntimeApp.tsx +0 -262
  500. package/src/runtime/ui/inkModules.ts +0 -73
  501. package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
  502. package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
  503. package/src/runtime/ui/screens/ProgressScreen.tsx +0 -110
  504. package/src/runtime/ui/screens/ResultsScreen.tsx +0 -103
  505. package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
  506. package/src/strategies/CodingTestReviewStrategy.ts +0 -920
  507. package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
  508. package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
  509. package/src/strategies/MultiPassReviewStrategy.ts +0 -785
  510. package/src/strategies/ReviewStrategy.ts +0 -64
  511. package/src/strategies/StrategyFactory.ts +0 -79
  512. package/src/tokenizers/baseTokenizer.ts +0 -61
  513. package/src/tokenizers/gptTokenizer.ts +0 -27
  514. package/src/types/apiResponses.ts +0 -40
  515. package/src/types/cli.ts +0 -24
  516. package/src/types/configuration.ts +0 -201
  517. package/src/types/handlebars.d.ts +0 -5
  518. package/src/types/patch.d.ts +0 -25
  519. package/src/types/review.ts +0 -312
  520. package/src/types/reviewContext.d.ts +0 -65
  521. package/src/types/structuredReview.ts +0 -167
  522. package/src/types/tokenAnalysis.ts +0 -56
  523. package/src/utils/FileReader.ts +0 -93
  524. package/src/utils/FileWriter.ts +0 -76
  525. package/src/utils/PathGenerator.ts +0 -97
  526. package/src/utils/api/apiUtils.ts +0 -14
  527. package/src/utils/apiErrorHandler.ts +0 -287
  528. package/src/utils/ciDataCollector.ts +0 -252
  529. package/src/utils/codingTestConfigLoader.ts +0 -466
  530. package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
  531. package/src/utils/detection/frameworkDetector.ts +0 -879
  532. package/src/utils/detection/projectTypeDetector.ts +0 -518
  533. package/src/utils/diagramGenerator.ts +0 -206
  534. package/src/utils/errorLogger.ts +0 -60
  535. package/src/utils/estimationUtils.ts +0 -407
  536. package/src/utils/fileFilters.ts +0 -373
  537. package/src/utils/fileSystem.ts +0 -57
  538. package/src/utils/logger.ts +0 -290
  539. package/src/utils/pathValidator.ts +0 -98
  540. package/src/utils/projectDocs.ts +0 -189
  541. package/src/utils/promptPaths.ts +0 -29
  542. package/src/utils/promptTemplateManager.ts +0 -157
  543. package/src/utils/review/consolidateReview.ts +0 -553
  544. package/src/utils/review/fixDisplay.ts +0 -100
  545. package/src/utils/review/fixImplementation.ts +0 -61
  546. package/src/utils/review/index.ts +0 -36
  547. package/src/utils/review/interactiveProcessing.ts +0 -294
  548. package/src/utils/review/progressTracker.ts +0 -296
  549. package/src/utils/review/reviewExtraction.ts +0 -382
  550. package/src/utils/review/types.ts +0 -46
  551. package/src/utils/reviewParser.ts +0 -253
  552. package/src/utils/sanitizer.ts +0 -238
  553. package/src/utils/smartFileSelector.ts +0 -255
  554. package/src/utils/templateLoader.ts +0 -514
  555. package/src/utils/treeGenerator.ts +0 -153
  556. package/tsconfig.build.json +0 -14
  557. package/tsconfig.json +0 -59
  558. /package/{src/utils/api/index.ts → dist/utils/api/index.d.ts} +0 -0
@@ -1,870 +0,0 @@
1
- /**
2
- * @fileoverview Client for interacting with the OpenRouter API.
3
- *
4
- * This module provides a client for interacting with OpenRouter's API, which gives
5
- * access to a variety of AI models from different providers. It handles API key
6
- * management, request formatting, response processing, rate limiting, error handling,
7
- * and cost estimation for code reviews.
8
- *
9
- * Key features:
10
- * - Support for various models through OpenRouter (Claude, GPT-4, etc.)
11
- * - Streaming and non-streaming responses
12
- * - Robust error handling and rate limit management
13
- * - Cost estimation for API usage
14
- * - Support for different review types
15
- */
16
-
17
- import type { CostInfo, FileInfo, ReviewOptions, ReviewResult, ReviewType } from '../types/review';
18
- import { ApiError, TokenLimitError } from '../utils/apiErrorHandler';
19
- import { getConfig } from '../core/ConfigurationService';
20
- import logger from '../utils/logger';
21
- import type { ProjectDocs /* , addProjectDocsToPrompt */ } from '../utils/projectDocs'; // addProjectDocsToPrompt not used
22
- import {
23
- buildOpenRouterProxyHeaders,
24
- resolveOpenRouterProxyUrl,
25
- withProxyMetadata,
26
- } from '../runtime/openrouterProxy';
27
- // import { generateDirectoryStructure } from './utils'; // Not used in this file
28
- // import { getLanguageFromExtension } from './utils/languageDetection'; // Not used in this file
29
- import {
30
- formatConsolidatedReviewPrompt,
31
- formatSingleFileReviewPrompt,
32
- } from './utils/promptFormatter';
33
- import { loadPromptTemplate } from './utils/promptLoader';
34
- import { getCostInfoFromText } from './utils/tokenCounter';
35
-
36
- // Track if we've initialized a model successfully
37
- let modelInitialized = false;
38
-
39
-
40
- /**
41
- * Determine appropriate max_tokens based on review type and context
42
- */
43
- function getMaxTokensForReviewType(
44
- reviewType?: string,
45
- isConsolidation?: boolean,
46
- ): number | undefined {
47
- // For consolidation passes, we need unlimited tokens to avoid truncation
48
- if (isConsolidation) {
49
- return undefined; // No limit for consolidating multiple reviews
50
- }
51
-
52
- // For different review types, adjust token limits based on expected output size
53
- switch (reviewType) {
54
- case 'consolidated':
55
- return undefined; // No limit for consolidated reviews to avoid truncation
56
- case 'architectural':
57
- return 8000; // Architectural reviews can be detailed
58
- case 'security':
59
- return 8000; // Security reviews can be detailed
60
- case 'performance':
61
- return 8000; // Performance reviews can be detailed
62
- case 'quick-fixes':
63
- return 8000; // Quick fixes can be substantial for large codebases
64
- default:
65
- return 8000; // Default to higher limit for unknown types
66
- }
67
- }
68
-
69
- /**
70
- * Detect if response was truncated due to token limits
71
- */
72
- function isResponseTruncated(content: string, finishReason?: string): boolean {
73
- if (finishReason === 'length' || finishReason === 'MAX_TOKENS') {
74
- return true;
75
- }
76
-
77
- // Check for common truncation patterns in JSON responses
78
- const trimmed = content.trim();
79
- if (trimmed.startsWith('{') || trimmed.startsWith('```json')) {
80
- // Look for incomplete JSON structures
81
- if (!trimmed.endsWith('}') && !trimmed.endsWith('```')) {
82
- return true;
83
- }
84
-
85
- // Count braces to detect incomplete JSON
86
- const openBraces = (trimmed.match(/\{/g) || []).length;
87
- const closeBraces = (trimmed.match(/\}/g) || []).length;
88
- if (openBraces > closeBraces) {
89
- return true;
90
- }
91
- }
92
-
93
- return false;
94
- }
95
-
96
- // Helper function to check if this is the correct client for the selected model
97
- function isOpenRouterModel(): {
98
- isCorrect: boolean;
99
- adapter: string;
100
- modelName: string;
101
- } {
102
- // Get the model from configuration (CLI override or env)
103
- const selectedModel = getConfig().model || '';
104
-
105
- // Parse the model name
106
- const [adapter, modelName] = selectedModel.includes(':')
107
- ? selectedModel.split(':')
108
- : ['openrouter', selectedModel];
109
-
110
- return {
111
- isCorrect: adapter === 'openrouter',
112
- adapter,
113
- modelName,
114
- };
115
- }
116
-
117
- // This function was removed as it's no longer needed with the improved client selection logic
118
-
119
- /**
120
- * Initialize the OpenRouter client
121
- * @returns Promise resolving to a boolean indicating if initialization was successful
122
- */
123
- export async function initializeAnyOpenRouterModel(): Promise<boolean> {
124
- const { isCorrect, modelName } = isOpenRouterModel();
125
-
126
- // If this is not an OpenRouter model, just return true without initializing
127
- if (!isCorrect) {
128
- return true;
129
- }
130
-
131
- // If we've already initialized, return true
132
- if (modelInitialized) {
133
- return true;
134
- }
135
-
136
- try {
137
- logger.debug(`Initializing OpenRouter model: ${modelName}...`);
138
-
139
- // Mark as initialized
140
- modelInitialized = true;
141
- logger.debug(`Successfully initialized OpenRouter model: ${modelName}`);
142
- return true;
143
- } catch (error) {
144
- console.error(`Error initializing OpenRouter model ${modelName}:`, error);
145
- return false;
146
- }
147
- }
148
-
149
- /**
150
- * Generate a code review using the OpenRouter API
151
- * @param fileContent Content of the file to review
152
- * @param filePath Path to the file
153
- * @param reviewType Type of review to perform
154
- * @param projectDocs Optional project documentation
155
- * @param options Review options
156
- * @returns Promise resolving to the review result
157
- */
158
- export async function generateOpenRouterReview(
159
- fileContent: string,
160
- filePath: string,
161
- reviewType: ReviewType,
162
- projectDocs?: ProjectDocs | null,
163
- options?: ReviewOptions,
164
- ): Promise<ReviewResult> {
165
- try {
166
- // Initialize the model if we haven't already
167
- if (!modelInitialized) {
168
- await initializeAnyOpenRouterModel();
169
- }
170
-
171
- // Use the imported dependencies
172
-
173
- // Get API key from environment variables
174
- let content: string;
175
- let cost: CostInfo | undefined;
176
-
177
- // Get the language from the file extension
178
- // const language = getLanguageFromExtension(filePath); // Currently unused
179
-
180
- // Load the appropriate prompt template
181
- const promptTemplate = await loadPromptTemplate(reviewType, options);
182
-
183
- // Format the prompt
184
- const prompt = formatSingleFileReviewPrompt(
185
- promptTemplate,
186
- fileContent,
187
- filePath,
188
- projectDocs,
189
- options?.runContext,
190
- );
191
-
192
- // For consolidation mode, use the writer model if specified, otherwise use the review model
193
- let modelName: string;
194
- if (options?.isConsolidation) {
195
- // During consolidation, the model is already set in the environment by consolidateReview.ts
196
- const consolidationModel = process.env.AI_CODE_REVIEW_MODEL || '';
197
- const [, model] = consolidationModel.includes(':')
198
- ? consolidationModel.split(':')
199
- : ['openrouter', consolidationModel];
200
- modelName = model;
201
- logger.debug(`[OpenRouter] Using consolidation model for single file: ${modelName}`);
202
- } else {
203
- // Regular review - use the configured model
204
- const result = isOpenRouterModel();
205
- modelName = result.modelName;
206
- logger.debug(`[OpenRouter] Using review model for single file: ${modelName}`);
207
- }
208
-
209
- try {
210
- logger.debug(`Generating review with OpenRouter ${modelName}...`);
211
-
212
- const requestMaxTokens = getMaxTokensForReviewType(reviewType, options?.isConsolidation);
213
- const payload = withProxyMetadata({
214
- model: modelName,
215
- messages: [
216
- {
217
- role: 'system',
218
- content: `You are an expert code reviewer. Focus on providing actionable feedback. IMPORTANT: DO NOT REPEAT THE INSTRUCTIONS IN YOUR RESPONSE. DO NOT ASK FOR CODE TO REVIEW. ASSUME THE CODE IS ALREADY PROVIDED IN THE USER MESSAGE. FOCUS ONLY ON PROVIDING THE CODE REVIEW CONTENT.
219
-
220
- IMPORTANT: Your response MUST be in the following JSON format:
221
-
222
- {
223
- "summary": "A brief summary of the code review",
224
- "issues": [
225
- {
226
- "title": "Issue title",
227
- "priority": "high|medium|low",
228
- "type": "bug|security|performance|maintainability|readability|architecture|best-practice|documentation|testing|other",
229
- "filePath": "Path to the file",
230
- "lineNumbers": "Line number or range (e.g., 10 or 10-15)",
231
- "description": "Detailed description of the issue",
232
- "codeSnippet": "Relevant code snippet",
233
- "suggestedFix": "Suggested code fix",
234
- "impact": "Impact of the issue"
235
- }
236
- ],
237
- "recommendations": [
238
- "General recommendation 1",
239
- "General recommendation 2"
240
- ],
241
- "positiveAspects": [
242
- "Positive aspect 1",
243
- "Positive aspect 2"
244
- ]
245
- }
246
-
247
- Ensure your response is valid JSON. Do not include any text outside the JSON structure.`,
248
- },
249
- {
250
- role: 'user',
251
- content: prompt,
252
- },
253
- ],
254
- temperature: 0.2,
255
- ...(requestMaxTokens ? { max_tokens: requestMaxTokens } : {}),
256
- });
257
-
258
- // Make the API request via proxy
259
- const response = await fetch(resolveOpenRouterProxyUrl(), {
260
- method: 'POST',
261
- headers: buildOpenRouterProxyHeaders(),
262
- body: JSON.stringify(payload),
263
- });
264
-
265
- if (!response.ok) {
266
- const errorData = await response.json();
267
-
268
- // Check for token limit errors
269
- const errorMessage = JSON.stringify(errorData).toLowerCase();
270
- if (
271
- errorMessage.includes('token') &&
272
- (errorMessage.includes('limit') ||
273
- errorMessage.includes('exceed') ||
274
- errorMessage.includes('too long') ||
275
- errorMessage.includes('too many'))
276
- ) {
277
- // Extract token count from prompt if possible
278
- const { countTokens } = await import('../tokenizers');
279
- const tokenCount = countTokens(prompt, modelName);
280
-
281
- throw new TokenLimitError(
282
- `Token limit exceeded for model ${modelName}. Content has ${tokenCount.toLocaleString()} tokens. Consider using --multi-pass flag for large codebases.`,
283
- tokenCount,
284
- undefined,
285
- response.status,
286
- errorData,
287
- );
288
- }
289
-
290
- throw new Error(`OpenRouter API error: ${JSON.stringify(errorData)}`);
291
- }
292
-
293
- const data = await response.json();
294
-
295
- // Enhanced logging for debugging empty content issue
296
- const finishReason = data.choices?.[0]?.finish_reason;
297
- const responseContent = data.choices?.[0]?.message?.content || '';
298
- const isTruncated = isResponseTruncated(responseContent, finishReason);
299
-
300
- logger.debug(`[OpenRouter] API Response structure:`, {
301
- hasChoices: !!data.choices,
302
- choicesLength: data.choices?.length || 0,
303
- firstChoiceExists: !!(data.choices && data.choices[0]),
304
- firstChoiceMessage: data.choices?.[0]?.message ? 'exists' : 'missing',
305
- contentExists: !!responseContent,
306
- contentLength: responseContent.length,
307
- contentPreview: responseContent.substring(0, 100) || 'N/A',
308
- finishReason: finishReason || 'unknown',
309
- isTruncated: isTruncated,
310
- maxTokensUsed:
311
- getMaxTokensForReviewType(reviewType, options?.isConsolidation) || 'unlimited',
312
- fullResponse: JSON.stringify(data).substring(0, 500) + '...',
313
- });
314
-
315
- if (data.choices && data.choices.length > 0) {
316
- content = data.choices[0].message.content;
317
-
318
- // Critical check for empty content
319
- if (!content || content.trim().length === 0) {
320
- logger.error(
321
- `[OpenRouter] CRITICAL: API returned successful response but content is empty!`,
322
- );
323
- logger.error(`[OpenRouter] Response details:`, {
324
- modelName,
325
- promptLength: prompt.length,
326
- responseStatus: response.status,
327
- responseHeaders: Object.fromEntries(response.headers.entries()),
328
- fullApiResponse: JSON.stringify(data, null, 2),
329
- });
330
- throw new Error(`OpenRouter API returned empty content for model ${modelName}`);
331
- }
332
-
333
- // Check for truncated responses
334
- if (isTruncated) {
335
- logger.warn(`[OpenRouter] WARNING: Response appears to be truncated!`);
336
- logger.warn(`[OpenRouter] Truncation details:`, {
337
- modelName,
338
- finishReason,
339
- contentLength: content.length,
340
- maxTokensRequested:
341
- getMaxTokensForReviewType(reviewType, options?.isConsolidation) || 'unlimited',
342
- reviewType,
343
- isConsolidation: options?.isConsolidation || false,
344
- });
345
-
346
- // For now, we'll continue with the truncated response but log it
347
- // In the future, we could implement retry logic with shorter prompts
348
- }
349
-
350
- logger.debug(`Successfully generated review with OpenRouter ${modelName}`);
351
- } else {
352
- logger.error(`[OpenRouter] Invalid response format:`, JSON.stringify(data, null, 2));
353
- throw new Error(`Invalid response format from OpenRouter ${modelName}`);
354
- }
355
-
356
- // Calculate cost information
357
- try {
358
- cost = getCostInfoFromText(prompt, content, `openrouter:${modelName}`);
359
- } catch (error) {
360
- logger.warn(
361
- `Failed to calculate cost information: ${
362
- error instanceof Error ? error.message : String(error)
363
- }`,
364
- );
365
- }
366
- } catch (error) {
367
- // Re-throw TokenLimitError with additional context
368
- if (error instanceof TokenLimitError) {
369
- throw error;
370
- }
371
-
372
- throw new ApiError(
373
- `Failed to generate review with OpenRouter ${modelName}: ${
374
- error instanceof Error ? error.message : String(error)
375
- }`,
376
- );
377
- }
378
-
379
- // Try to parse the response as JSON with robust error recovery
380
- let structuredData = null;
381
- try {
382
- // Try multiple strategies to extract JSON from the response
383
- const jsonExtractionStrategies = [
384
- // Strategy 1: Look for JSON in markdown code blocks
385
- () => {
386
- const patterns = [
387
- /```(?:json)?\s*([\s\S]*?)\s*```/,
388
- /```(?:typescript|javascript|ts|js)?\s*([\s\S]*?)\s*```/,
389
- ];
390
- for (const pattern of patterns) {
391
- const match = content.match(pattern);
392
- if (match && match[1]) {
393
- const extracted = match[1].trim();
394
- if (extracted.startsWith('{') && extracted.endsWith('}')) {
395
- return extracted;
396
- }
397
- }
398
- }
399
- return null;
400
- },
401
-
402
- // Strategy 2: Find balanced JSON object
403
- () => {
404
- const startIdx = content.indexOf('{');
405
- if (startIdx === -1) return null;
406
-
407
- let depth = 0;
408
- let inString = false;
409
- let escapeNext = false;
410
-
411
- for (let i = startIdx; i < content.length; i++) {
412
- const char = content[i];
413
-
414
- if (escapeNext) {
415
- escapeNext = false;
416
- continue;
417
- }
418
-
419
- if (char === '\\') {
420
- escapeNext = true;
421
- continue;
422
- }
423
-
424
- if (char === '"' && !escapeNext) {
425
- inString = !inString;
426
- continue;
427
- }
428
-
429
- if (!inString) {
430
- if (char === '{') depth++;
431
- else if (char === '}') {
432
- depth--;
433
- if (depth === 0) {
434
- return content.substring(startIdx, i + 1);
435
- }
436
- }
437
- }
438
- }
439
-
440
- // If we couldn't find balanced braces, try to fix unterminated strings
441
- if (inString) {
442
- // Add a closing quote and try to close the object
443
- return content.substring(startIdx) + '"}';
444
- }
445
-
446
- return null;
447
- },
448
-
449
- // Strategy 3: Use the content as-is
450
- () => content,
451
- ];
452
-
453
- let jsonContent = null;
454
- for (const strategy of jsonExtractionStrategies) {
455
- try {
456
- const extracted = strategy();
457
- if (extracted) {
458
- // Try to parse the extracted content
459
- structuredData = JSON.parse(extracted);
460
-
461
- // Validate that it has the expected structure
462
- if (structuredData && typeof structuredData === 'object') {
463
- jsonContent = extracted;
464
- logger.debug('Successfully extracted and parsed JSON');
465
- break;
466
- }
467
- }
468
- } catch (err) {
469
- // Continue to next strategy
470
- logger.debug(
471
- `JSON extraction strategy failed: ${err instanceof Error ? err.message : String(err)}`,
472
- );
473
- }
474
- }
475
-
476
- // If we successfully parsed JSON, validate its structure
477
- if (structuredData && !structuredData.summary && !Array.isArray(structuredData.issues)) {
478
- logger.warn('Response is valid JSON but does not have the expected structure');
479
- // Still keep the structured data as it might have partial information
480
- }
481
- } catch (parseError) {
482
- logger.warn(
483
- `Failed to parse response as JSON after all recovery attempts: ${parseError instanceof Error ? parseError.message : String(parseError)}`,
484
- );
485
- // Keep the original response as content
486
- structuredData = null;
487
- }
488
-
489
- // Return the review result
490
- return {
491
- content,
492
- cost,
493
- modelUsed: `openrouter:${modelName}`,
494
- filePath,
495
- reviewType,
496
- timestamp: new Date().toISOString(),
497
- structuredData,
498
- };
499
- } catch (error) {
500
- logger.error(
501
- `Error generating review for ${filePath}: ${
502
- error instanceof Error ? error.message : String(error)
503
- }`,
504
- );
505
- throw error;
506
- }
507
- }
508
-
509
- /**
510
- * Generate a consolidated review for multiple files
511
- * @param files Array of file information objects
512
- * @param projectName Name of the project
513
- * @param reviewType Type of review to perform
514
- * @param projectDocs Optional project documentation
515
- * @param options Review options
516
- * @returns Promise resolving to the review result
517
- */
518
- export async function generateOpenRouterConsolidatedReview(
519
- files: FileInfo[],
520
- projectName: string,
521
- reviewType: ReviewType,
522
- projectDocs?: ProjectDocs | null,
523
- options?: ReviewOptions,
524
- ): Promise<ReviewResult> {
525
- try {
526
- // Initialize the model if we haven't already
527
- if (!modelInitialized) {
528
- await initializeAnyOpenRouterModel();
529
- }
530
-
531
- // Use the imported dependencies
532
-
533
- // Get API key from environment variables
534
- let content: string;
535
- let cost: CostInfo | undefined;
536
-
537
- // Load the appropriate prompt template
538
- const promptTemplate = await loadPromptTemplate(reviewType, options);
539
-
540
- // Format the prompt
541
- const prompt = formatConsolidatedReviewPrompt(
542
- promptTemplate,
543
- projectName,
544
- files.map((file) => ({
545
- relativePath: file.relativePath || '',
546
- content: file.content,
547
- sizeInBytes: file.content.length,
548
- })),
549
- projectDocs,
550
- options?.runContext,
551
- );
552
-
553
- // For consolidation mode, use the writer model if specified, otherwise use the review model
554
- let modelName: string;
555
- if (options?.isConsolidation) {
556
- // During consolidation, the model is already set in the environment by consolidateReview.ts
557
- const consolidationModel = process.env.AI_CODE_REVIEW_MODEL || '';
558
- const [, model] = consolidationModel.includes(':')
559
- ? consolidationModel.split(':')
560
- : ['openrouter', consolidationModel];
561
- modelName = model;
562
- logger.debug(`[OpenRouter] Using consolidation model: ${modelName}`);
563
- } else {
564
- // Regular review - use the configured model
565
- const result = isOpenRouterModel();
566
- modelName = result.modelName;
567
- logger.debug(`[OpenRouter] Using review model: ${modelName}`);
568
- }
569
-
570
- // Validate that we have a non-empty model name
571
- if (!modelName || modelName.trim() === '') {
572
- throw new Error(
573
- `Invalid or empty model name: '${modelName}'. Check your model configuration.`,
574
- );
575
- }
576
-
577
- try {
578
- logger.debug(`Generating consolidated review with OpenRouter ${modelName}...`);
579
-
580
- const consolidationMaxTokens = getMaxTokensForReviewType(reviewType, options?.isConsolidation);
581
- const payload = withProxyMetadata({
582
- model: modelName,
583
- messages: [
584
- {
585
- role: 'system',
586
- content: `You are an expert code reviewer. Focus on providing actionable feedback. IMPORTANT: DO NOT REPEAT THE INSTRUCTIONS IN YOUR RESPONSE. DO NOT ASK FOR CODE TO REVIEW. ASSUME THE CODE IS ALREADY PROVIDED IN THE USER MESSAGE. FOCUS ONLY ON PROVIDING THE CODE REVIEW CONTENT.
587
-
588
- IMPORTANT: Your response MUST be in the following JSON format:
589
-
590
- {
591
- "summary": "A brief summary of the code review",
592
- "issues": [
593
- {
594
- "title": "Issue title",
595
- "priority": "high|medium|low",
596
- "type": "bug|security|performance|maintainability|readability|architecture|best-practice|documentation|testing|other",
597
- "filePath": "Path to the file",
598
- "lineNumbers": "Line number or range (e.g., 10 or 10-15)",
599
- "description": "Detailed description of the issue",
600
- "codeSnippet": "Relevant code snippet",
601
- "suggestedFix": "Suggested code fix",
602
- "impact": "Impact of the issue"
603
- }
604
- ],
605
- "recommendations": [
606
- "General recommendation 1",
607
- "General recommendation 2"
608
- ],
609
- "positiveAspects": [
610
- "Positive aspect 1",
611
- "Positive aspect 2"
612
- ]
613
- }
614
-
615
- Ensure your response is valid JSON. Do not include any text outside the JSON structure.`,
616
- },
617
- {
618
- role: 'user',
619
- content: prompt,
620
- },
621
- ],
622
- temperature: 0.2,
623
- ...(consolidationMaxTokens ? { max_tokens: consolidationMaxTokens } : {}),
624
- });
625
-
626
- // Make the API request
627
- const response = await fetch(resolveOpenRouterProxyUrl(), {
628
- method: 'POST',
629
- headers: buildOpenRouterProxyHeaders(),
630
- body: JSON.stringify(payload),
631
- });
632
-
633
- if (!response.ok) {
634
- const errorData = await response.json();
635
-
636
- // Check for token limit errors
637
- const errorMessage = JSON.stringify(errorData).toLowerCase();
638
- if (
639
- errorMessage.includes('token') &&
640
- (errorMessage.includes('limit') ||
641
- errorMessage.includes('exceed') ||
642
- errorMessage.includes('too long') ||
643
- errorMessage.includes('too many'))
644
- ) {
645
- // Extract token count from prompt if possible
646
- const { countTokens } = await import('../tokenizers');
647
- const tokenCount = countTokens(prompt, modelName);
648
-
649
- throw new TokenLimitError(
650
- `Token limit exceeded for model ${modelName}. Content has ${tokenCount.toLocaleString()} tokens. Consider using --multi-pass flag for large codebases.`,
651
- tokenCount,
652
- undefined,
653
- response.status,
654
- errorData,
655
- );
656
- }
657
-
658
- throw new Error(`OpenRouter API error: ${JSON.stringify(errorData)}`);
659
- }
660
-
661
- const data = await response.json();
662
-
663
- // Enhanced logging for debugging empty content issue
664
- const finishReason = data.choices?.[0]?.finish_reason;
665
- const responseContent = data.choices?.[0]?.message?.content || '';
666
- const isTruncated = isResponseTruncated(responseContent, finishReason);
667
-
668
- logger.debug(`[OpenRouter] API Response structure:`, {
669
- hasChoices: !!data.choices,
670
- choicesLength: data.choices?.length || 0,
671
- firstChoiceExists: !!(data.choices && data.choices[0]),
672
- firstChoiceMessage: data.choices?.[0]?.message ? 'exists' : 'missing',
673
- contentExists: !!responseContent,
674
- contentLength: responseContent.length,
675
- contentPreview: responseContent.substring(0, 100) || 'N/A',
676
- finishReason: finishReason || 'unknown',
677
- isTruncated: isTruncated,
678
- maxTokensUsed:
679
- getMaxTokensForReviewType(reviewType, options?.isConsolidation) || 'unlimited',
680
- fullResponse: JSON.stringify(data).substring(0, 500) + '...',
681
- });
682
-
683
- if (data.choices && data.choices.length > 0) {
684
- content = data.choices[0].message.content;
685
-
686
- // Critical check for empty content
687
- if (!content || content.trim().length === 0) {
688
- logger.error(
689
- `[OpenRouter] CRITICAL: API returned successful response but content is empty!`,
690
- );
691
- logger.error(`[OpenRouter] Response details:`, {
692
- modelName,
693
- promptLength: prompt.length,
694
- responseStatus: response.status,
695
- responseHeaders: Object.fromEntries(response.headers.entries()),
696
- fullApiResponse: JSON.stringify(data, null, 2),
697
- });
698
- throw new Error(`OpenRouter API returned empty content for model ${modelName}`);
699
- }
700
-
701
- // Check for truncated responses
702
- if (isTruncated) {
703
- logger.warn(`[OpenRouter] WARNING: Response appears to be truncated!`);
704
- logger.warn(`[OpenRouter] Truncation details:`, {
705
- modelName,
706
- finishReason,
707
- contentLength: content.length,
708
- maxTokensRequested:
709
- getMaxTokensForReviewType(reviewType, options?.isConsolidation) || 'unlimited',
710
- reviewType,
711
- isConsolidation: options?.isConsolidation || false,
712
- });
713
-
714
- // For now, we'll continue with the truncated response but log it
715
- // In the future, we could implement retry logic with shorter prompts
716
- }
717
-
718
- logger.debug(`Successfully generated review with OpenRouter ${modelName}`);
719
- } else {
720
- logger.error(`[OpenRouter] Invalid response format:`, JSON.stringify(data, null, 2));
721
- throw new Error(`Invalid response format from OpenRouter ${modelName}`);
722
- }
723
-
724
- // Calculate cost information
725
- try {
726
- cost = getCostInfoFromText(prompt, content, `openrouter:${modelName}`);
727
- } catch (error) {
728
- logger.warn(
729
- `Failed to calculate cost information: ${
730
- error instanceof Error ? error.message : String(error)
731
- }`,
732
- );
733
- }
734
- } catch (error) {
735
- throw new ApiError(
736
- `Failed to generate consolidated review with OpenRouter ${modelName}: ${
737
- error instanceof Error ? error.message : String(error)
738
- }`,
739
- );
740
- }
741
-
742
- // Try to parse the response as JSON with robust error recovery
743
- let structuredData = null;
744
- try {
745
- // Try multiple strategies to extract JSON from the response
746
- const jsonExtractionStrategies = [
747
- // Strategy 1: Look for JSON in markdown code blocks
748
- () => {
749
- const patterns = [
750
- /```(?:json)?\s*([\s\S]*?)\s*```/,
751
- /```(?:typescript|javascript|ts|js)?\s*([\s\S]*?)\s*```/,
752
- ];
753
- for (const pattern of patterns) {
754
- const match = content.match(pattern);
755
- if (match && match[1]) {
756
- const extracted = match[1].trim();
757
- if (extracted.startsWith('{') && extracted.endsWith('}')) {
758
- return extracted;
759
- }
760
- }
761
- }
762
- return null;
763
- },
764
-
765
- // Strategy 2: Find balanced JSON object
766
- () => {
767
- const startIdx = content.indexOf('{');
768
- if (startIdx === -1) return null;
769
-
770
- let depth = 0;
771
- let inString = false;
772
- let escapeNext = false;
773
-
774
- for (let i = startIdx; i < content.length; i++) {
775
- const char = content[i];
776
-
777
- if (escapeNext) {
778
- escapeNext = false;
779
- continue;
780
- }
781
-
782
- if (char === '\\') {
783
- escapeNext = true;
784
- continue;
785
- }
786
-
787
- if (char === '"' && !escapeNext) {
788
- inString = !inString;
789
- continue;
790
- }
791
-
792
- if (!inString) {
793
- if (char === '{') depth++;
794
- else if (char === '}') {
795
- depth--;
796
- if (depth === 0) {
797
- return content.substring(startIdx, i + 1);
798
- }
799
- }
800
- }
801
- }
802
-
803
- // If we couldn't find balanced braces, try to fix unterminated strings
804
- if (inString) {
805
- // Add a closing quote and try to close the object
806
- return content.substring(startIdx) + '"}';
807
- }
808
-
809
- return null;
810
- },
811
-
812
- // Strategy 3: Use the content as-is
813
- () => content,
814
- ];
815
-
816
- let jsonContent = null;
817
- for (const strategy of jsonExtractionStrategies) {
818
- try {
819
- const extracted = strategy();
820
- if (extracted) {
821
- // Try to parse the extracted content
822
- structuredData = JSON.parse(extracted);
823
-
824
- // Validate that it has the expected structure
825
- if (structuredData && typeof structuredData === 'object') {
826
- jsonContent = extracted;
827
- logger.debug('Successfully extracted and parsed JSON');
828
- break;
829
- }
830
- }
831
- } catch (err) {
832
- // Continue to next strategy
833
- logger.debug(
834
- `JSON extraction strategy failed: ${err instanceof Error ? err.message : String(err)}`,
835
- );
836
- }
837
- }
838
-
839
- // If we successfully parsed JSON, validate its structure
840
- if (structuredData && !structuredData.summary && !Array.isArray(structuredData.issues)) {
841
- logger.warn('Response is valid JSON but does not have the expected structure');
842
- // Still keep the structured data as it might have partial information
843
- }
844
- } catch (parseError) {
845
- logger.warn(
846
- `Failed to parse response as JSON after all recovery attempts: ${parseError instanceof Error ? parseError.message : String(parseError)}`,
847
- );
848
- // Keep the original response as content
849
- structuredData = null;
850
- }
851
-
852
- // Return the review result
853
- return {
854
- content,
855
- cost,
856
- modelUsed: `openrouter:${modelName}`,
857
- filePath: 'consolidated',
858
- reviewType,
859
- timestamp: new Date().toISOString(),
860
- structuredData,
861
- };
862
- } catch (error) {
863
- logger.error(
864
- `Error generating consolidated review: ${
865
- error instanceof Error ? error.message : String(error)
866
- }`,
867
- );
868
- throw error;
869
- }
870
- }