codereview-aia 0.1.2 → 0.1.3

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